/* * ATTENTION: An "eval-source-map" devtool has been used. * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ 222: /***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { "use strict"; eval("{\n// UNUSED EXPORTS: CommandBuilder, TerminalUiWriter\n\n// EXTERNAL MODULE: ./node_modules/@xterm/xterm/lib/xterm.js\nvar xterm = __webpack_require__(856);\n// EXTERNAL MODULE: ./node_modules/@xterm/addon-fit/lib/addon-fit.js\nvar addon_fit = __webpack_require__(616);\n// EXTERNAL MODULE: ./node_modules/@xterm/addon-web-links/lib/addon-web-links.js\nvar addon_web_links = __webpack_require__(832);\n// EXTERNAL MODULE: ./src/ts/constants.ts\nvar constants = __webpack_require__(581);\n// EXTERNAL MODULE: ./src/ts/terminal-cli.ts\nvar terminal_cli = __webpack_require__(409);\n;// ./src/ts/types.ts\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * Типы и интерфейсы для терминального клиента\n */\nvar EventTypeConst = {\n CURSOR_STATE: 'cursor',\n CONNECT: 'connect',\n DISCONNECT: 'disconnect',\n CLOSE: 'close',\n IDENTIFY: 'identify',\n COMMAND: 'command',\n RESIZE: 'resize',\n SEND_KEY: 'sendKey',\n HOTKEY: 'hotkey',\n OUTPUT: 'output',\n ERROR: 'error',\n SESSION: 'session',\n NEW_SESSION: 'newSession',\n NEW_CLIENT: 'newClient',\n DELETE_CLIENT: 'deleteClient',\n CLOSE_SESSION: 'closeSession',\n CLIENT_STATUS: 'clientStatus'\n};\nvar IdGenerator = /*#__PURE__*/function () {\n function IdGenerator() {\n _classCallCheck(this, IdGenerator);\n }\n return _createClass(IdGenerator, null, [{\n key: \"generateId\",\n value:\n /**\n * Генерирует случайный ID\n */\n function generateId() {\n return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n }\n }, {\n key: \"isValidId\",\n value: function isValidId(id) {\n return id.length === 10 && id.indexOf('index') === -1;\n }\n }]);\n}();\n;// ./src/ts/connection.ts\nfunction connection_typeof(o) { \"@babel/helpers - typeof\"; return connection_typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, connection_typeof(o); }\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction connection_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction connection_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, connection_toPropertyKey(o.key), o); } }\nfunction connection_createClass(e, r, t) { return r && connection_defineProperties(e.prototype, r), t && connection_defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction connection_toPropertyKey(t) { var i = connection_toPrimitive(t, \"string\"); return \"symbol\" == connection_typeof(i) ? i : i + \"\"; }\nfunction connection_toPrimitive(t, r) { if (\"object\" != connection_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != connection_typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * Connection - управляет WebSocket соединением с сервером\n * Отвечает только за подключение, отправку и получение данных\n */\n\n\nvar Connection = /*#__PURE__*/function () {\n function Connection(serverUrl) {\n var sessionId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n connection_classCallCheck(this, Connection);\n this.socket = null;\n this._isConnected = false;\n this.reconnectAttempts = 0;\n this.maxReconnectAttempts = constants/* DEFAULT_SETTINGS */.a$.MAX_RECONNECT_ATTEMPTS;\n this.reconnectDelay = constants/* DEFAULT_SETTINGS */.a$.RECONNECT_DELAY;\n this.reconnectDelayMax = constants/* DEFAULT_SETTINGS */.a$.RECONNECT_DELAY_MAX;\n this.reconnectBackoffMultiplier = constants/* DEFAULT_SETTINGS */.a$.RECONNECT_BACKOFF_MULTIPLIER;\n this.autoReconnectEnabled = constants/* DEFAULT_SETTINGS */.a$.ENABLE_AUTO_RECONNECT;\n this.reconnectTimer = null;\n this.onConnect = null;\n this.onDisconnect = null;\n this.onCursorState = null;\n this.onError = null;\n this.onSendKey = null;\n this.onCommand = null;\n this.onResize = null;\n this.onTerminal = null;\n this.onClose = null;\n this.onNewClient = null;\n this.onDeleteClient = null;\n this.onCloseSession = null;\n this.onClientStatus = null;\n this.serverUrl = serverUrl;\n // Сохраняем ссылку на оригинальные методы console\n this.originalConsole = {\n log: console.log,\n error: console.error,\n warn: console.warn,\n info: console.info,\n debug: console.debug\n };\n }\n /**\n * Устанавливает callback для события подключения\n * @param callback - функция обратного вызова\n */\n return connection_createClass(Connection, [{\n key: \"setOnConnect\",\n value: function setOnConnect(callback) {\n this.onConnect = callback;\n }\n }, {\n key: \"setOnCursorState\",\n value: function setOnCursorState(callback) {\n this.onCursorState = callback;\n }\n /**\n * Устанавливает callback для события отключения\n * @param callback - функция обратного вызова\n */\n }, {\n key: \"setOnDisconnect\",\n value: function setOnDisconnect(callback) {\n this.onDisconnect = callback;\n }\n /**\n * Устанавливает callback для ошибок\n * @param callback - функция обратного вызова\n */\n }, {\n key: \"setOnError\",\n value: function setOnError(callback) {\n this.onError = callback;\n }\n /**\n * Устанавливает callback для события sendKey\n * @param callback - функция обратного вызова\n */\n }, {\n key: \"setOnSendKey\",\n value: function setOnSendKey(callback) {\n this.onSendKey = callback;\n }\n /**\n * Устанавливает callback для события command\n * @param callback - функция обратного вызова\n */\n }, {\n key: \"setOnCommand\",\n value: function setOnCommand(callback) {\n this.onCommand = callback;\n }\n /**\n * Устанавливает callback для события terminal\n * @param callback - функция обратного вызова\n */\n }, {\n key: \"setOnTerminal\",\n value: function setOnTerminal(callback) {\n this.onTerminal = callback;\n }\n /**\n * Устанавливает callback для события resize\n * @param callback - функция обратного вызова\n */\n }, {\n key: \"setOnResize\",\n value: function setOnResize(callback) {\n this.onResize = callback;\n }\n /**\n * Устанавливает callback для события close\n * @param callback - функция обратного вызова\n */\n }, {\n key: \"setOnClose\",\n value: function setOnClose(callback) {\n this.onClose = callback;\n }\n /**\n * Устанавливает callback для события newClient\n * @param callback - функция обратного вызова\n */\n }, {\n key: \"setOnNewClient\",\n value: function setOnNewClient(callback) {\n this.onNewClient = callback;\n }\n /**\n * Устанавливает callback для события deleteClient\n * @param callback - функция обратного вызова\n */\n }, {\n key: \"setOnDeleteClient\",\n value: function setOnDeleteClient(callback) {\n this.onDeleteClient = callback;\n }\n /**\n * Устанавливает callback для попыток переподключения\n * @param callback - функция обратного вызова\n */\n }, {\n key: \"setOnReconnectAttempt\",\n value: function setOnReconnectAttempt(callback) {\n this.onReconnectAttempt = callback;\n }\n /**\n * Устанавливает callback для неудачных попыток переподключения\n * @param callback - функция обратного вызова\n */\n }, {\n key: \"setOnReconnectFailed\",\n value: function setOnReconnectFailed(callback) {\n this.onReconnectFailed = callback;\n }\n }, {\n key: \"setOnCloseSession\",\n value: function setOnCloseSession(callback) {\n this.onCloseSession = callback;\n }\n }, {\n key: \"setOnClientStatus\",\n value: function setOnClientStatus(callback) {\n this.onClientStatus = callback;\n }\n /**\n * Настраивает параметры автоматического переподключения\n * @param enabled - включить/выключить autoReconnect\n * @param maxAttempts - максимальное количество попыток\n * @param delay - базовая задержка между попытками\n * @param maxDelay - максимальная задержка\n * @param backoffMultiplier - множитель для экспоненциального backoff\n */\n }, {\n key: \"setAutoReconnectSettings\",\n value: function setAutoReconnectSettings() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var maxAttempts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : constants/* DEFAULT_SETTINGS */.a$.MAX_RECONNECT_ATTEMPTS;\n var delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : constants/* DEFAULT_SETTINGS */.a$.RECONNECT_DELAY;\n var maxDelay = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : constants/* DEFAULT_SETTINGS */.a$.RECONNECT_DELAY_MAX;\n var backoffMultiplier = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : constants/* DEFAULT_SETTINGS */.a$.RECONNECT_BACKOFF_MULTIPLIER;\n this.autoReconnectEnabled = enabled;\n this.maxReconnectAttempts = maxAttempts;\n this.reconnectDelay = delay;\n this.reconnectDelayMax = maxDelay;\n this.reconnectBackoffMultiplier = backoffMultiplier;\n this.originalConsole.log(\"AutoReconnect settings updated: enabled=\".concat(enabled, \", maxAttempts=\").concat(maxAttempts, \", delay=\").concat(delay, \"ms, maxDelay=\").concat(maxDelay, \"ms, backoffMultiplier=\").concat(backoffMultiplier));\n }\n /**\n * Получает текущие настройки autoReconnect\n */\n }, {\n key: \"getAutoReconnectSettings\",\n value: function getAutoReconnectSettings() {\n return {\n enabled: this.autoReconnectEnabled,\n maxAttempts: this.maxReconnectAttempts,\n delay: this.reconnectDelay,\n maxDelay: this.reconnectDelayMax,\n backoffMultiplier: this.reconnectBackoffMultiplier,\n currentAttempts: this.reconnectAttempts\n };\n }\n /**\n * Подключается к серверу\n */\n }, {\n key: \"connect\",\n value: function connect(clientType) {\n var _this = this;\n // Проверяем, не подключены ли уже\n if (this._isConnected && this.socket && this.socket.readyState === WebSocket.OPEN) {\n // Если уже подключены, просто отправляем сообщение подключения\n this.sendConnect(clientType);\n return;\n }\n // Если не подключены, создаем новое соединение\n this.connectWs(function () {\n _this.sendConnect(clientType);\n });\n }\n /**\n * Создает WebSocket соединение с callback\n */\n }, {\n key: \"connectWs\",\n value: function connectWs(onConnected) {\n var _this2 = this;\n try {\n // Отменяем предыдущий таймер переподключения\n this.clearReconnectTimer();\n this.originalConsole.log(\"Connecting to server: \".concat(this.serverUrl, \" (attempt \").concat(this.reconnectAttempts + 1, \"/\").concat(this.maxReconnectAttempts + 1, \")\"));\n // Уведомляем о попытке переподключения\n if (this.onReconnectAttempt && this.reconnectAttempts > 0) {\n this.onReconnectAttempt(this.reconnectAttempts, this.maxReconnectAttempts);\n }\n this.socket = new WebSocket(this.serverUrl);\n this.socket.onopen = function () {\n _this2.originalConsole.log('WebSocket connection established');\n _this2._isConnected = true;\n _this2.reconnectAttempts = 0; // Сбрасываем счетчик при успешном подключении\n // Вызываем callback\n onConnected();\n if (_this2.onConnect) {\n _this2.onConnect();\n }\n };\n this.socket.onmessage = function (event) {\n _this2.handleMessage(event.data).then();\n };\n this.socket.onclose = function (event) {\n var _this2$originalConsol;\n (_this2$originalConsol = _this2.originalConsole) === null || _this2$originalConsol === void 0 || _this2$originalConsol.log('WebSocket connection closed:', event.code, event.reason);\n _this2._isConnected = false;\n if (_this2.onDisconnect) {\n _this2.onDisconnect(event.code, event.reason);\n }\n // Попытка переподключения\n _this2.attemptReconnect();\n };\n this.socket.onerror = function (error) {\n var _this2$originalConsol2;\n (_this2$originalConsol2 = _this2.originalConsole) === null || _this2$originalConsol2 === void 0 || _this2$originalConsol2.error('WebSocket error:', error);\n if (_this2.onError) {\n _this2.onError(error);\n }\n };\n } catch (error) {\n var _this$originalConsole;\n (_this$originalConsole = this.originalConsole) === null || _this$originalConsole === void 0 || _this$originalConsole.error('Failed to create WebSocket connection:', error);\n if (this.onError) {\n this.onError(error);\n }\n // Планируем переподключение при ошибке создания соединения\n this.attemptReconnect();\n }\n }\n /**\n * Попытка переподключения\n */\n }, {\n key: \"attemptReconnect\",\n value: function attemptReconnect(clientType) {\n var _this3 = this;\n // Проверяем, включен ли autoReconnect\n if (!this.autoReconnectEnabled) {\n var _this$originalConsole2;\n (_this$originalConsole2 = this.originalConsole) === null || _this$originalConsole2 === void 0 || _this$originalConsole2.log('AutoReconnect is disabled, not attempting to reconnect');\n return;\n }\n if (this.reconnectAttempts < this.maxReconnectAttempts) {\n var _this$originalConsole3;\n this.reconnectAttempts++;\n // Вычисляем задержку с экспоненциальным backoff\n var delay = Math.min(this.reconnectDelay * Math.pow(this.reconnectBackoffMultiplier, this.reconnectAttempts - 1), this.reconnectDelayMax);\n (_this$originalConsole3 = this.originalConsole) === null || _this$originalConsole3 === void 0 || _this$originalConsole3.log(\"Attempting to reconnect (\".concat(this.reconnectAttempts, \"/\").concat(this.maxReconnectAttempts, \") in \").concat(delay, \"ms...\"));\n // Уведомляем о попытке переподключения\n if (this.onReconnectAttempt) {\n this.onReconnectAttempt(this.reconnectAttempts, this.maxReconnectAttempts);\n }\n // Планируем переподключение\n this.reconnectTimer = window.setTimeout(function () {\n if (clientType) {\n _this3.connect(clientType);\n } else {\n // Если clientType не передан, используем connectWs без callback\n _this3.connectWs(function () {});\n }\n }, delay);\n } else {\n var _this$originalConsole4;\n (_this$originalConsole4 = this.originalConsole) === null || _this$originalConsole4 === void 0 || _this$originalConsole4.error('Max reconnection attempts reached');\n // Уведомляем о неудачных попытках переподключения\n if (this.onReconnectFailed) {\n this.onReconnectFailed();\n }\n }\n }\n /**\n * Очищает таймер переподключения\n */\n }, {\n key: \"clearReconnectTimer\",\n value: function clearReconnectTimer() {\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n /**\n * Отправляет сообщение подключения\n * @param clientType - тип клиента\n */\n }, {\n key: \"sendConnect\",\n value: function sendConnect(clientType) {\n var message = {\n event: 'connect',\n data: {\n //name: DEFAULT_SETTINGS.DEFAULT_CLIENT_NAME,\n name: 'webconnection',\n clientType: clientType\n }\n };\n this.sendMessage(message);\n }\n }, {\n key: \"sendCommand\",\n value: function sendCommand(target, command) {\n var message = {\n event: 'command',\n target: target,\n data: {\n command: command\n }\n };\n this.sendMessage(message);\n }\n /**\n * Отправляет сообщение идентификации\n * @param sessionId - ID сессии\n */\n }, {\n key: \"sendIdentify\",\n value: function sendIdentify(sessionId) {\n if (sessionId) {\n var message = {\n event: 'identify',\n data: {\n sessionId: sessionId\n }\n };\n this.sendMessage(message);\n }\n }\n /**\n * Отправляет данные терминала на сервер\n * @param data - данные для отправки\n * @param index - индекс данных\n */\n }, {\n key: \"sendTerminalData\",\n value: function sendTerminalData(sessionId, data) {\n var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var message = {\n event: 'output',\n data: {\n sessionId: sessionId,\n index: index,\n data: data\n }\n };\n this.sendMessage(message);\n }\n }, {\n key: \"sendNewSession\",\n value: function sendNewSession(clientId, sessionId, name) {\n var message = {\n event: 'newSession',\n target: clientId,\n data: {\n sessionId: sessionId,\n name: name\n }\n };\n this.sendMessage(message);\n }\n }, {\n key: \"sendCursorState\",\n value: function sendCursorState(data) {\n var message = {\n event: 'cursor',\n data: data\n };\n this.sendMessage(message);\n }\n }, {\n key: \"sendSendKey\",\n value: function sendSendKey(data) {\n var message = {\n event: 'sendKey',\n data: data\n };\n this.sendMessage(message);\n }\n }, {\n key: \"sendHotKey\",\n value: function sendHotKey(data) {\n var message = {\n event: 'hotkey',\n data: data\n };\n this.sendMessage(message);\n }\n }, {\n key: \"sendNewClient\",\n value: function sendNewClient(data) {\n var message = {\n event: 'newClient',\n data: data\n };\n this.sendMessage(message);\n }\n }, {\n key: \"sendDeleteClient\",\n value: function sendDeleteClient(data) {\n var message = {\n event: 'deleteClient',\n data: data\n };\n this.sendMessage(message);\n }\n /**\n * Отправляет сообщение на сервер\n * @param message - сообщение для отправки\n */\n }, {\n key: \"sendMessage\",\n value: function sendMessage(message) {\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n try {\n var jsonMessage = JSON.stringify(message);\n this.socket.send(jsonMessage);\n this.originalConsole.log('Sent message:', message);\n } catch (error) {\n this.originalConsole.error('Failed to send message:', error);\n if (this.onError) {\n this.onError(error);\n }\n }\n } else {\n this.originalConsole.warn('Cannot send message: WebSocket is not connected');\n }\n }\n /**\n * Обрабатывает входящие сообщения\n * @param data - данные сообщения\n */\n }, {\n key: \"handleMessage\",\n value: (function () {\n var _handleMessage = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(data) {\n var message, _t, _t2;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n _context.p = 0;\n message = JSON.parse(data);\n this.originalConsole.log('Received message:', message);\n // Обрабатываем события через callback'и\n _t = message.event;\n _context.n = _t === EventTypeConst.CURSOR_STATE ? 1 : _t === EventTypeConst.SEND_KEY ? 2 : _t === EventTypeConst.COMMAND ? 3 : _t === EventTypeConst.RESIZE ? 5 : _t === EventTypeConst.OUTPUT ? 6 : _t === EventTypeConst.CLOSE ? 7 : _t === EventTypeConst.NEW_CLIENT ? 8 : _t === EventTypeConst.DELETE_CLIENT ? 9 : _t === EventTypeConst.CLOSE_SESSION ? 10 : _t === EventTypeConst.CLIENT_STATUS ? 11 : 12;\n break;\n case 1:\n if (this.onCursorState) {\n this.onCursorState(message.data);\n }\n return _context.a(3, 13);\n case 2:\n if (this.onSendKey) {\n this.onSendKey(message.data);\n }\n return _context.a(3, 13);\n case 3:\n if (!this.onCommand) {\n _context.n = 4;\n break;\n }\n _context.n = 4;\n return this.onCommand(message.data);\n case 4:\n return _context.a(3, 13);\n case 5:\n if (this.onResize) {\n this.onResize(message.data);\n }\n return _context.a(3, 13);\n case 6:\n if (this.onTerminal) {\n this.onTerminal(message.data);\n }\n return _context.a(3, 13);\n case 7:\n if (this.onClose) {\n this.onClose(message.data);\n }\n return _context.a(3, 13);\n case 8:\n if (this.onNewClient) {\n this.onNewClient(message.data);\n }\n return _context.a(3, 13);\n case 9:\n if (this.onDeleteClient) {\n this.onDeleteClient(message.data);\n }\n return _context.a(3, 13);\n case 10:\n if (this.onCloseSession) {\n this.onCloseSession(message.data);\n }\n return _context.a(3, 13);\n case 11:\n if (this.onClientStatus) {\n this.onClientStatus(message.data);\n }\n return _context.a(3, 13);\n case 12:\n this.originalConsole.log('Unknown event type:', message.event);\n case 13:\n _context.n = 15;\n break;\n case 14:\n _context.p = 14;\n _t2 = _context.v;\n this.originalConsole.error('Failed to parse message:', _t2);\n if (this.onError) {\n this.onError(_t2);\n }\n case 15:\n return _context.a(2);\n }\n }, _callee, this, [[0, 14]]);\n }));\n function handleMessage(_x) {\n return _handleMessage.apply(this, arguments);\n }\n return handleMessage;\n }()\n /**\n * Отключается от сервера\n */\n )\n }, {\n key: \"disconnect\",\n value: function disconnect() {\n // Очищаем таймер переподключения\n this.clearReconnectTimer();\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n this._isConnected = false;\n }\n /**\n * Проверяет, подключен ли клиент\n * @returns статус подключения\n */\n }, {\n key: \"isConnected\",\n value: function isConnected() {\n return this._isConnected;\n }\n /**\n * Очищает ресурсы и восстанавливает оригинальные методы console\n */\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.disconnect();\n this.originalConsole = null;\n this.onConnect = null;\n this.onDisconnect = null;\n this.onError = null;\n this.onSendKey = null;\n this.onCommand = null;\n this.onResize = null;\n this.onClose = null;\n this.onNewClient = null;\n this.onDeleteClient = null;\n }\n }]);\n}();\n;// ./src/ts/command-builder.ts\nfunction command_builder_typeof(o) { \"@babel/helpers - typeof\"; return command_builder_typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, command_builder_typeof(o); }\nfunction command_builder_regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return command_builder_regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (command_builder_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, command_builder_regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, command_builder_regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), command_builder_regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", command_builder_regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), command_builder_regeneratorDefine2(u), command_builder_regeneratorDefine2(u, o, \"Generator\"), command_builder_regeneratorDefine2(u, n, function () { return this; }), command_builder_regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (command_builder_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction command_builder_regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } command_builder_regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { command_builder_regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, command_builder_regeneratorDefine2(e, r, n, t); }\nfunction command_builder_asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction command_builder_asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { command_builder_asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { command_builder_asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction command_builder_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction command_builder_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, command_builder_toPropertyKey(o.key), o); } }\nfunction command_builder_createClass(e, r, t) { return r && command_builder_defineProperties(e.prototype, r), t && command_builder_defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction command_builder_toPropertyKey(t) { var i = command_builder_toPrimitive(t, \"string\"); return \"symbol\" == command_builder_typeof(i) ? i : i + \"\"; }\nfunction command_builder_toPrimitive(t, r) { if (\"object\" != command_builder_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != command_builder_typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * CommandBuilder.ts - Класс для формирования команд в терминале\n * Обрабатывает ввод символов, управление курсором и формирование команд\n * Использует callback'и для уведомления об изменениях и выполнении команд\n */\n/**\n * Класс CommandBuilder - обрабатывает логику формирования команды\n */\nvar CommandBuilder = /*#__PURE__*/function () {\n function CommandBuilder() {\n command_builder_classCallCheck(this, CommandBuilder);\n this.commandBuffer = ''; // Буфер для накопления команды\n this.cursorPosition = 0; // Позиция курсора в буфере\n this.history = []; // История команд\n this.historyIndex = -1; // Индекс в истории\n this.terminalUiWriter = null; // TerminalUiWriter для отрисовки\n // Callbacks\n this.onStateChange = null; // Callback для изменения состояния (команда и позиция курсора)\n this.onExecuteCommand = null; // Callback для выполнения команды\n }\n /**\n * Устанавливает callback для изменения состояния\n * @param callback - функция обратного вызова\n */\n return command_builder_createClass(CommandBuilder, [{\n key: \"setOnStateChange\",\n value: function setOnStateChange(callback) {\n this.onStateChange = callback;\n }\n /**\n * Устанавливает callback для выполнения команды\n * @param callback - функция обратного вызова\n */\n }, {\n key: \"setOnExecuteCommand\",\n value: function setOnExecuteCommand(callback) {\n this.onExecuteCommand = callback;\n }\n /**\n * Устанавливает TerminalUiWriter для отрисовки\n * @param writer - экземпляр TerminalUiWriter\n */\n }, {\n key: \"setTerminalUiWriter\",\n value: function setTerminalUiWriter(writer) {\n this.terminalUiWriter = writer;\n }\n /**\n * Записывает символ в буфер команды\n * @param char - символ для записи\n */\n }, {\n key: \"write\",\n value: (function () {\n var _write = command_builder_asyncToGenerator(/*#__PURE__*/command_builder_regenerator().m(function _callee(_char) {\n return command_builder_regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (!(_char === '\\r' || _char === '\\n')) {\n _context.n = 3;\n break;\n }\n if (!this.commandBuffer.endsWith('\\\\')) {\n _context.n = 1;\n break;\n }\n // Если последний символ \\\\ — добавляем перенос строки, сохраняя \\\\ на экране\n this.commandBuffer = this.commandBuffer + '\\n';\n this.cursorPosition = this.commandBuffer.length;\n this.notifyStateChange();\n _context.n = 2;\n break;\n case 1:\n _context.n = 2;\n return this.executeCommand();\n case 2:\n _context.n = 4;\n break;\n case 3:\n if (_char === '\\b' || _char === '\\x7f') {\n // Backspace - удаляем символ перед курсором\n if (this.cursorPosition > 0) {\n this.commandBuffer = this.commandBuffer.slice(0, this.cursorPosition - 1) + this.commandBuffer.slice(this.cursorPosition);\n this.cursorPosition--;\n this.notifyStateChange();\n }\n } else if (_char === '\\x1b[A') {\n // Стрелка вверх — если есть строка выше, перемещаем курсор по многострочному буферу,\n // иначе переходим по истории\n if (!this.moveCursorUp()) {\n this.navigateHistory(-1);\n }\n } else if (_char === '\\x1b[B') {\n // Стрелка вниз — если есть строка ниже, перемещаем курсор по многострочному буферу,\n // иначе переходим по истории\n if (!this.moveCursorDown()) {\n this.navigateHistory(1);\n }\n } else if (_char === '\\x1b[C') {\n // Стрелка вправо - курсор вправо\n this.moveCursorRight();\n } else if (_char === '\\x1b[D') {\n // Стрелка влево - курсор влево\n this.moveCursorLeft();\n } else if (_char === '\\x03') {\n // Ctrl+C - очищаем буфер\n this.commandBuffer = '';\n this.cursorPosition = 0;\n this.notifyStateChange();\n } else if (_char === '\\x04') {\n // Ctrl+D - выход\n this.notifyStateChange();\n } else if (_char === '\\x0c') {\n // Ctrl+L - очистка экрана\n this.notifyStateChange();\n } else {\n // Обычный символ - добавляем в буфер в позицию курсора\n this.commandBuffer = this.commandBuffer.slice(0, this.cursorPosition) + _char + this.commandBuffer.slice(this.cursorPosition);\n this.cursorPosition++;\n this.notifyStateChange();\n }\n case 4:\n return _context.a(2);\n }\n }, _callee, this);\n }));\n function write(_x) {\n return _write.apply(this, arguments);\n }\n return write;\n }()\n /**\n * Выполняет команду из буфера\n */\n )\n }, {\n key: \"executeCommand\",\n value: (function () {\n var _executeCommand = command_builder_asyncToGenerator(/*#__PURE__*/command_builder_regenerator().m(function _callee2() {\n var prepared, command;\n return command_builder_regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n // Подготовка команды: удаляем последовательности \\\\\\n для многострочных конструкций\n prepared = this.commandBuffer.replace(/\\\\\\n/g, '');\n command = prepared.trim();\n if (!(command.length === 0)) {\n _context2.n = 1;\n break;\n }\n // Пустая команда - просто новая строка\n this.notifyStateChange();\n return _context2.a(2);\n case 1:\n // Добавляем команду в историю\n if (command !== this.history[this.history.length - 1]) {\n this.history.push(command);\n if (this.history.length > 100) {\n this.history.shift(); // Ограничиваем историю 100 командами\n }\n }\n this.historyIndex = this.history.length;\n // Уведомляем о выполнении команды\n if (!this.onExecuteCommand) {\n _context2.n = 2;\n break;\n }\n _context2.n = 2;\n return this.onExecuteCommand(command);\n case 2:\n // Очищаем буфер и сбрасываем позицию курсора\n this.commandBuffer = '';\n this.cursorPosition = 0;\n this.notifyStateChange();\n case 3:\n return _context2.a(2);\n }\n }, _callee2, this);\n }));\n function executeCommand() {\n return _executeCommand.apply(this, arguments);\n }\n return executeCommand;\n }()\n /**\n * Перемещает курсор влево\n */\n )\n }, {\n key: \"moveCursorLeft\",\n value: function moveCursorLeft() {\n if (this.cursorPosition > 0) {\n this.cursorPosition--;\n this.notifyStateChange();\n }\n }\n /**\n * Перемещает курсор вправо\n */\n }, {\n key: \"moveCursorRight\",\n value: function moveCursorRight() {\n if (this.cursorPosition < this.commandBuffer.length) {\n this.cursorPosition++;\n this.notifyStateChange();\n }\n }\n /**\n * Перемещает курсор на строку выше (с сохранением колонки, если возможно)\n * Возвращает true, если перемещение возможно и выполнено\n */\n }, {\n key: \"moveCursorUp\",\n value: function moveCursorUp() {\n if (this.commandBuffer.length === 0) return false;\n var before = this.commandBuffer.slice(0, this.cursorPosition);\n var currentLineStart = before.lastIndexOf('\\n') + 1; // 0, если нет перевода строки слева\n // Найти начало предыдущей строки\n if (currentLineStart === 0) {\n // Мы уже на первой строке — перемещение вверх невозможно\n return false;\n }\n var prevNewline = this.commandBuffer.lastIndexOf('\\n', currentLineStart - 2);\n var prevLineStart = prevNewline >= 0 ? prevNewline + 1 : 0;\n var prevLineEnd = currentLineStart - 1; // индекс перевода строки предыдущей строки\n var currentColumn = this.cursorPosition - currentLineStart;\n var prevLineLength = Math.max(0, prevLineEnd - prevLineStart);\n var targetColumn = Math.min(currentColumn, prevLineLength);\n var newPosition = prevLineStart + targetColumn;\n if (newPosition !== this.cursorPosition) {\n this.cursorPosition = newPosition;\n this.notifyStateChange();\n return true;\n }\n return false;\n }\n /**\n * Перемещает курсор на строку ниже (с сохранением колонки, если возможно)\n * Возвращает true, если перемещение возможно и выполнено\n */\n }, {\n key: \"moveCursorDown\",\n value: function moveCursorDown() {\n if (this.commandBuffer.length === 0) return false;\n var before = this.commandBuffer.slice(0, this.cursorPosition);\n var currentLineStart = before.lastIndexOf('\\n') + 1;\n // Найти конец текущей строки (перевод строки или конец буфера)\n var currentLineEndNewline = this.commandBuffer.indexOf('\\n', currentLineStart);\n var currentLineEnd = currentLineEndNewline >= 0 ? currentLineEndNewline : this.commandBuffer.length;\n if (currentLineEndNewline < 0) {\n // Нет следующей строки — мы на последней\n return false;\n }\n var nextLineStart = currentLineEndNewline + 1;\n var nextLineEndNewline = this.commandBuffer.indexOf('\\n', nextLineStart);\n var nextLineEnd = nextLineEndNewline >= 0 ? nextLineEndNewline : this.commandBuffer.length;\n var currentColumn = this.cursorPosition - currentLineStart;\n var nextLineLength = Math.max(0, nextLineEnd - nextLineStart);\n var targetColumn = Math.min(currentColumn, nextLineLength);\n var newPosition = nextLineStart + targetColumn;\n if (newPosition !== this.cursorPosition) {\n this.cursorPosition = newPosition;\n this.notifyStateChange();\n return true;\n }\n return false;\n }\n /**\n * Навигация по истории команд\n * @param direction - направление (-1 вверх, 1 вниз)\n */\n }, {\n key: \"navigateHistory\",\n value: function navigateHistory(direction) {\n if (this.history.length === 0) return;\n if (direction === -1 && this.historyIndex > 0) {\n var _this$history$this$hi;\n // Вверх по истории\n this.historyIndex--;\n this.commandBuffer = (_this$history$this$hi = this.history[this.historyIndex]) !== null && _this$history$this$hi !== void 0 ? _this$history$this$hi : '';\n this.cursorPosition = this.commandBuffer.length; // Курсор в конец\n } else if (direction === 1 && this.historyIndex < this.history.length - 1) {\n var _this$history$this$hi2;\n // Вниз по истории\n this.historyIndex++;\n this.commandBuffer = (_this$history$this$hi2 = this.history[this.historyIndex]) !== null && _this$history$this$hi2 !== void 0 ? _this$history$this$hi2 : '';\n this.cursorPosition = this.commandBuffer.length; // Курсор в конец\n } else if (direction === 1 && this.historyIndex === this.history.length - 1) {\n // Достигли конца истории - очищаем буфер\n this.historyIndex = this.history.length;\n this.commandBuffer = '';\n this.cursorPosition = 0; // Курсор в начало\n }\n this.notifyStateChange();\n }\n /**\n * Уведомляет об изменении состояния\n */\n }, {\n key: \"notifyStateChange\",\n value: function notifyStateChange() {\n // Обновляем отрисовку через TerminalUiWriter\n if (this.terminalUiWriter) {\n this.terminalUiWriter.write(this.commandBuffer, this.cursorPosition);\n }\n // Уведомляем через callback\n if (this.onStateChange) {\n this.onStateChange({\n postition: this.cursorPosition,\n command: this.commandBuffer\n });\n }\n }\n }, {\n key: \"setState\",\n value: function setState(state) {\n this.commandBuffer = state.command;\n this.cursorPosition = state.postition;\n this.notifyStateChange();\n }\n /**\n * Очищает буфер команды\n */\n }, {\n key: \"clearBuffer\",\n value: function clearBuffer() {\n this.commandBuffer = '';\n this.cursorPosition = 0;\n this.notifyStateChange();\n }\n /**\n * Очищает ресурсы\n */\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.commandBuffer = '';\n this.cursorPosition = 0;\n this.history = [];\n this.historyIndex = -1;\n this.onStateChange = null;\n this.onExecuteCommand = null;\n this.terminalUiWriter = null;\n }\n }]);\n}();\n// EXTERNAL MODULE: ./src/ts/custom-command.ts\nvar custom_command = __webpack_require__(717);\n;// ./src/ts/commands/info.ts\nfunction info_typeof(o) { \"@babel/helpers - typeof\"; return info_typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, info_typeof(o); }\nfunction info_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction info_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, info_toPropertyKey(o.key), o); } }\nfunction info_createClass(e, r, t) { return r && info_defineProperties(e.prototype, r), t && info_defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction info_toPropertyKey(t) { var i = info_toPrimitive(t, \"string\"); return \"symbol\" == info_typeof(i) ? i : i + \"\"; }\nfunction info_toPrimitive(t, r) { if (\"object\" != info_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != info_typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == info_typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\n/**\n * Команда info - показывает информацию о среде выполнения JavaScript\n */\n\nvar InfoCommand = /*#__PURE__*/function (_CustomCommand) {\n function InfoCommand() {\n var _this;\n info_classCallCheck(this, InfoCommand);\n _this = _callSuper(this, InfoCommand, arguments);\n _this.name = 'info';\n _this.description = 'Shows detailed information about JavaScript environment, browser, screen, and available APIs';\n return _this;\n }\n _inherits(InfoCommand, _CustomCommand);\n return info_createClass(InfoCommand, [{\n key: \"execute\",\n value: function execute(command) {\n return getEnvironmentInfo();\n }\n }]);\n}(custom_command/* CustomCommand */.j);\n/**\n * Получает информацию о среде выполнения JavaScript\n * @returns информация о среде\n */\nfunction getEnvironmentInfo() {\n var info = '';\n try {\n // Основная информация о JavaScript\n info += '=== JavaScript Environment ===\\n';\n info += \"JavaScript Engine: \".concat(getJSEngine(), \"\\n\");\n info += \"JavaScript Version: \".concat(getJSVersion(), \"\\n\");\n info += \"Language: \".concat(navigator.language || 'Unknown', \"\\n\");\n info += \"Platform: \".concat(navigator.platform || 'Unknown', \"\\n\");\n info += \"User Agent: \".concat(navigator.userAgent || 'Unknown', \"\\n\");\n // Информация о браузере\n if (typeof window !== 'undefined') {\n info += '\\n=== Browser Information ===\\n';\n info += \"Browser: \".concat(getBrowserInfo(), \"\\n\");\n info += \"Browser Version: \".concat(getBrowserVersion(), \"\\n\");\n info += \"Cookies Enabled: \".concat(navigator.cookieEnabled ? 'Yes' : 'No', \"\\n\");\n info += \"Online: \".concat(navigator.onLine ? 'Yes' : 'No', \"\\n\");\n info += \"Do Not Track: \".concat(navigator.doNotTrack || 'Not specified', \"\\n\");\n }\n // Информация об экране\n if (typeof screen !== 'undefined') {\n info += '\\n=== Screen Information ===\\n';\n info += \"Screen Width: \".concat(screen.width, \"px\\n\");\n info += \"Screen Height: \".concat(screen.height, \"px\\n\");\n info += \"Available Width: \".concat(screen.availWidth, \"px\\n\");\n info += \"Available Height: \".concat(screen.availHeight, \"px\\n\");\n info += \"Color Depth: \".concat(screen.colorDepth, \" bits\\n\");\n info += \"Pixel Depth: \".concat(screen.pixelDepth, \" bits\\n\");\n info += \"Device Pixel Ratio: \".concat(window.devicePixelRatio || 'Not available', \"\\n\");\n }\n // Информация об окне\n if (typeof window !== 'undefined') {\n info += '\\n=== Window Information ===\\n';\n info += \"Window Width: \".concat(window.innerWidth, \"px\\n\");\n info += \"Window Height: \".concat(window.innerHeight, \"px\\n\");\n info += \"Outer Width: \".concat(window.outerWidth, \"px\\n\");\n info += \"Outer Height: \".concat(window.outerHeight, \"px\\n\");\n info += \"Scroll X: \".concat(window.scrollX, \"px\\n\");\n info += \"Scroll Y: \".concat(window.scrollY, \"px\\n\");\n }\n // Информация о времени\n info += '\\n=== Time Information ===\\n';\n info += \"Current Time: \".concat(new Date().toLocaleString(), \"\\n\");\n info += \"Timezone: \".concat(Intl.DateTimeFormat().resolvedOptions().timeZone, \"\\n\");\n info += \"Timezone Offset: \".concat(new Date().getTimezoneOffset(), \" minutes\\n\");\n // Информация о производительности\n if (typeof performance !== 'undefined') {\n info += '\\n=== Performance Information ===\\n';\n info += \"Navigation Type: \".concat(performance.navigation.type, \"\\n\");\n info += \"Page Load Time: \".concat(performance.timing.loadEventEnd - performance.timing.navigationStart, \"ms\\n\");\n info += \"DOM Content Loaded: \".concat(performance.timing.domContentLoadedEventEnd - performance.timing.navigationStart, \"ms\\n\");\n if (performance.memory) {\n info += \"Memory Used: \".concat(Math.round(performance.memory.usedJSHeapSize / 1024 / 1024 * 100) / 100, \"MB\\n\");\n info += \"Memory Total: \".concat(Math.round(performance.memory.totalJSHeapSize / 1024 / 1024 * 100) / 100, \"MB\\n\");\n info += \"Memory Limit: \".concat(Math.round(performance.memory.jsHeapSizeLimit / 1024 / 1024 * 100) / 100, \"MB\\n\");\n }\n }\n // Информация о сети\n if (navigator.connection) {\n info += '\\n=== Network Information ===\\n';\n info += \"Connection Type: \".concat(navigator.connection.effectiveType || 'Unknown', \"\\n\");\n info += \"Downlink: \".concat(navigator.connection.downlink || 'Unknown', \" Mbps\\n\");\n info += \"RTT: \".concat(navigator.connection.rtt || 'Unknown', \" ms\\n\");\n info += \"Save Data: \".concat(navigator.connection.saveData ? 'Yes' : 'No', \"\\n\");\n }\n // Информация о геолокации\n if (navigator.geolocation) {\n info += '\\n=== Geolocation ===\\n';\n info += 'Geolocation: Available\\n';\n } else {\n info += '\\n=== Geolocation ===\\n';\n info += 'Geolocation: Not available\\n';\n }\n // Информация о медиа устройствах\n if (navigator.mediaDevices) {\n info += '\\n=== Media Devices ===\\n';\n info += 'Media Devices: Available\\n';\n } else {\n info += '\\n=== Media Devices ===\\n';\n info += 'Media Devices: Not available\\n';\n }\n // Информация о WebGL\n if (typeof WebGLRenderingContext !== 'undefined') {\n info += '\\n=== WebGL Information ===\\n';\n var canvas = document.createElement('canvas');\n var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n if (gl) {\n info += \"WebGL Version: \".concat(gl.getParameter(gl.VERSION), \"\\n\");\n info += \"WebGL Vendor: \".concat(gl.getParameter(gl.VENDOR), \"\\n\");\n info += \"WebGL Renderer: \".concat(gl.getParameter(gl.RENDERER), \"\\n\");\n } else {\n info += 'WebGL: Not available\\n';\n }\n }\n // Информация о доступных API\n info += '\\n=== Available APIs ===\\n';\n info += \"Local Storage: \".concat(typeof localStorage !== 'undefined' ? 'Yes' : 'No', \"\\n\");\n info += \"Session Storage: \".concat(typeof sessionStorage !== 'undefined' ? 'Yes' : 'No', \"\\n\");\n info += \"IndexedDB: \".concat(typeof indexedDB !== 'undefined' ? 'Yes' : 'No', \"\\n\");\n info += \"Web Workers: \".concat(typeof Worker !== 'undefined' ? 'Yes' : 'No', \"\\n\");\n info += \"Service Workers: \".concat(typeof ServiceWorker !== 'undefined' ? 'Yes' : 'No', \"\\n\");\n info += \"WebSockets: \".concat(typeof WebSocket !== 'undefined' ? 'Yes' : 'No', \"\\n\");\n info += \"Fetch API: \".concat(typeof fetch !== 'undefined' ? 'Yes' : 'No', \"\\n\");\n info += \"Promise: \".concat(typeof Promise !== 'undefined' ? 'Yes' : 'No', \"\\n\");\n info += \"Async/Await: \".concat(isAsyncAwaitSupported() ? 'Yes' : 'No', \"\\n\");\n } catch (error) {\n info += \"Error getting environment info: \".concat(error.message, \"\\n\");\n }\n return info;\n}\n/**\n * Определяет JavaScript движок\n * @returns название движка\n */\nfunction getJSEngine() {\n try {\n if (typeof window !== 'undefined') {\n if (navigator.userAgent.includes('Chrome')) return 'V8 (Chrome)';\n if (navigator.userAgent.includes('Firefox')) return 'SpiderMonkey (Firefox)';\n if (navigator.userAgent.includes('Safari')) return 'JavaScriptCore (Safari)';\n if (navigator.userAgent.includes('Edge')) return 'Chakra (Edge)';\n }\n return 'Unknown';\n } catch (error) {\n return 'Unknown';\n }\n}\n/**\n * Определяет версию JavaScript\n * @returns версия JavaScript\n */\nfunction getJSVersion() {\n try {\n // Проверяем поддержку различных возможностей для определения версии\n if (typeof BigInt !== 'undefined') return 'ES2020+ (BigInt support)';\n if (typeof Promise !== 'undefined' && Promise.prototype[\"finally\"]) return 'ES2018+ (Promise.finally)';\n if (typeof Object.entries !== 'undefined') return 'ES2017+ (Object.entries)';\n if (typeof Array.prototype.includes !== 'undefined') return 'ES2016+ (Array.includes)';\n if (typeof Promise !== 'undefined') return 'ES2015+ (Promise)';\n if (typeof Object.defineProperty !== 'undefined') return 'ES5+ (Object.defineProperty)';\n return 'ES3 or earlier';\n } catch (error) {\n return 'Unknown';\n }\n}\n/**\n * Определяет информацию о браузере\n * @returns название браузера\n */\nfunction getBrowserInfo() {\n try {\n var userAgent = navigator.userAgent;\n if (userAgent.includes('Chrome') && !userAgent.includes('Edg')) return 'Chrome';\n if (userAgent.includes('Firefox')) return 'Firefox';\n if (userAgent.includes('Safari') && !userAgent.includes('Chrome')) return 'Safari';\n if (userAgent.includes('Edg')) return 'Edge';\n if (userAgent.includes('MSIE') || userAgent.includes('Trident/')) return 'Internet Explorer';\n return 'Unknown';\n } catch (error) {\n return 'Unknown';\n }\n}\n/**\n * Определяет версию браузера\n * @returns версия браузера\n */\nfunction getBrowserVersion() {\n try {\n var userAgent = navigator.userAgent;\n var match = userAgent.match(/(chrome|firefox|safari|edge|msie|trident(?=\\/))\\/?\\s*(\\d+)/i);\n return match ? match[2] || 'Unknown' : 'Unknown';\n } catch (error) {\n return 'Unknown';\n }\n}\n/**\n * Проверяет поддержку async/await\n * @returns true если поддерживается\n */\nfunction isAsyncAwaitSupported() {\n try {\n // Пытаемся создать асинхронную функцию\n new Function('async () => {}');\n return true;\n } catch (error) {\n return false;\n }\n}\n;// ./src/ts/commands/help.ts\nfunction help_typeof(o) { \"@babel/helpers - typeof\"; return help_typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, help_typeof(o); }\nfunction help_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction help_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, help_toPropertyKey(o.key), o); } }\nfunction help_createClass(e, r, t) { return r && help_defineProperties(e.prototype, r), t && help_defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction help_toPropertyKey(t) { var i = help_toPrimitive(t, \"string\"); return \"symbol\" == help_typeof(i) ? i : i + \"\"; }\nfunction help_toPrimitive(t, r) { if (\"object\" != help_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != help_typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction help_callSuper(t, o, e) { return o = help_getPrototypeOf(o), help_possibleConstructorReturn(t, help_isNativeReflectConstruct() ? Reflect.construct(o, e || [], help_getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction help_possibleConstructorReturn(t, e) { if (e && (\"object\" == help_typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return help_assertThisInitialized(t); }\nfunction help_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction help_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (help_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction help_getPrototypeOf(t) { return help_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, help_getPrototypeOf(t); }\nfunction help_inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && help_setPrototypeOf(t, e); }\nfunction help_setPrototypeOf(t, e) { return help_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, help_setPrototypeOf(t, e); }\n/**\n * Команда help - показывает справку по доступным командам\n */\n\nvar HelpCommand = /*#__PURE__*/function (_CustomCommand) {\n function HelpCommand(commandStorage) {\n var _this;\n help_classCallCheck(this, HelpCommand);\n _this = help_callSuper(this, HelpCommand);\n _this.commandStorage = commandStorage;\n _this.name = 'help';\n _this.description = 'Shows available commands and help information';\n return _this;\n }\n help_inherits(HelpCommand, _CustomCommand);\n return help_createClass(HelpCommand, [{\n key: \"execute\",\n value: function execute(command) {\n var customCommands = this.commandStorage.getCustomCommands();\n var helpText = 'Available commands:\\n';\n if (customCommands.length > 0) {\n helpText += '\\nCustom commands:\\n';\n customCommands.forEach(function (cmd) {\n helpText += \"- \".concat(cmd.name, \": \").concat(cmd.description, \"\\n\");\n });\n }\n helpText += '\\nYou can also use any JavaScript expression.';\n return helpText;\n }\n }]);\n}(custom_command/* CustomCommand */.j);\n;// ./src/ts/commands/clear.ts\nfunction clear_typeof(o) { \"@babel/helpers - typeof\"; return clear_typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, clear_typeof(o); }\nfunction clear_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction clear_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, clear_toPropertyKey(o.key), o); } }\nfunction clear_createClass(e, r, t) { return r && clear_defineProperties(e.prototype, r), t && clear_defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction clear_toPropertyKey(t) { var i = clear_toPrimitive(t, \"string\"); return \"symbol\" == clear_typeof(i) ? i : i + \"\"; }\nfunction clear_toPrimitive(t, r) { if (\"object\" != clear_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != clear_typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction clear_callSuper(t, o, e) { return o = clear_getPrototypeOf(o), clear_possibleConstructorReturn(t, clear_isNativeReflectConstruct() ? Reflect.construct(o, e || [], clear_getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction clear_possibleConstructorReturn(t, e) { if (e && (\"object\" == clear_typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return clear_assertThisInitialized(t); }\nfunction clear_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction clear_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (clear_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction clear_getPrototypeOf(t) { return clear_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, clear_getPrototypeOf(t); }\nfunction clear_inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && clear_setPrototypeOf(t, e); }\nfunction clear_setPrototypeOf(t, e) { return clear_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, clear_setPrototypeOf(t, e); }\n/**\n * Команда clear - очищает экран терминала\n */\n\n\nvar ClearCommand = /*#__PURE__*/function (_CustomCommand) {\n function ClearCommand() {\n var _this;\n clear_classCallCheck(this, ClearCommand);\n _this = clear_callSuper(this, ClearCommand, arguments);\n _this.name = 'clear';\n _this.description = 'Clears the terminal screen';\n return _this;\n }\n clear_inherits(ClearCommand, _CustomCommand);\n return clear_createClass(ClearCommand, [{\n key: \"execute\",\n value: function execute(command) {\n // Возвращаем ANSI escape sequence для очистки экрана\n return constants/* ANSI_ESCAPES */.hY.CLEAR_SCREEN;\n }\n }]);\n}(custom_command/* CustomCommand */.j);\n;// ./src/ts/utils/curl-utils.ts\nfunction curl_utils_regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return curl_utils_regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (curl_utils_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, curl_utils_regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, curl_utils_regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), curl_utils_regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", curl_utils_regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), curl_utils_regeneratorDefine2(u), curl_utils_regeneratorDefine2(u, o, \"Generator\"), curl_utils_regeneratorDefine2(u, n, function () { return this; }), curl_utils_regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (curl_utils_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction curl_utils_regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } curl_utils_regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { curl_utils_regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, curl_utils_regeneratorDefine2(e, r, n, t); }\nfunction curl_utils_asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction curl_utils_asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { curl_utils_asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { curl_utils_asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n/**\n * Утилиты для работы с HTTP запросами (curl)\n */\n/**\n * Выполняет команду curl\n * @param args - аргументы команды curl\n * @returns результат выполнения\n */\nfunction executeCurl(_x) {\n return _executeCurl.apply(this, arguments);\n}\n/**\n * Возвращает справку по команде curl\n * @returns справка\n */\nfunction _executeCurl() {\n _executeCurl = curl_utils_asyncToGenerator(/*#__PURE__*/curl_utils_regenerator().m(function _callee(args) {\n var commandLine, parts, url, options, result, _t;\n return curl_utils_regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n _context.p = 0;\n // Если args начинается с 'curl', убираем это\n commandLine = args;\n if (commandLine.startsWith('curl')) {\n commandLine = commandLine.substring(4).trim();\n }\n // Парсим аргументы\n parts = commandLine.trim().split(/\\s+/);\n if (!(parts.length === 0 || parts[0] === '')) {\n _context.n = 1;\n break;\n }\n return _context.a(2, getCurlHelp());\n case 1:\n url = parts[0];\n options = parseCurlOptions(parts.slice(1)); // Проверяем URL\n if (isValidUrl(url)) {\n _context.n = 2;\n break;\n }\n return _context.a(2, \"Error: Invalid URL \\\"\".concat(url, \"\\\"\"));\n case 2:\n _context.n = 3;\n return makeHttpRequest(url, options);\n case 3:\n result = _context.v;\n return _context.a(2, result);\n case 4:\n _context.p = 4;\n _t = _context.v;\n return _context.a(2, \"Error executing curl: \".concat(_t.message));\n }\n }, _callee, null, [[0, 4]]);\n }));\n return _executeCurl.apply(this, arguments);\n}\nfunction getCurlHelp() {\n return \"Usage: curl [options]\\n\\nOptions:\\n -X HTTP method (GET, POST, PUT, DELETE)\\n -H
Add header (format: \\\"Name: Value\\\")\\n -d POST data\\n -v Verbose output\\n -i Show response headers\\n -s Silent mode (no progress)\\n\\nExamples:\\n curl https://httpbin.org/get\\n curl -X POST -d \\\"name=test\\\" https://httpbin.org/post\\n curl -H \\\"Authorization: Bearer token\\\" https://api.example.com/data\";\n}\n/**\n * Парсит опции команды curl\n * @param args - массив аргументов\n * @returns объект с опциями\n */\nfunction parseCurlOptions(args) {\n var options = {\n method: 'GET',\n headers: {},\n body: null,\n verbose: false,\n showHeaders: false,\n silent: false\n };\n for (var i = 0; i < args.length; i++) {\n var arg = args[i];\n switch (arg) {\n case '-X':\n if (i + 1 < args.length) {\n options.method = args[++i].toUpperCase();\n }\n break;\n case '-H':\n if (i + 1 < args.length) {\n var header = args[++i];\n var colonIndex = header.indexOf(':');\n if (colonIndex > 0) {\n var name = header.substring(0, colonIndex).trim();\n var value = header.substring(colonIndex + 1).trim();\n options.headers[name] = value;\n }\n }\n break;\n case '-d':\n if (i + 1 < args.length) {\n options.body = args[++i];\n }\n break;\n case '-v':\n options.verbose = true;\n break;\n case '-i':\n options.showHeaders = true;\n break;\n case '-s':\n options.silent = true;\n break;\n }\n }\n return options;\n}\n/**\n * Проверяет валидность URL\n * @param url - URL для проверки\n * @returns true если URL валиден\n */\nfunction isValidUrl(url) {\n try {\n new URL(url);\n return true;\n } catch (_unused) {\n return false;\n }\n}\n/**\n * Выполняет HTTP запрос\n * @param url - URL для запроса\n * @param options - опции запроса\n * @returns результат запроса\n */\nfunction makeHttpRequest(_x2, _x3) {\n return _makeHttpRequest.apply(this, arguments);\n}\nfunction _makeHttpRequest() {\n _makeHttpRequest = curl_utils_asyncToGenerator(/*#__PURE__*/curl_utils_regenerator().m(function _callee2(url, options) {\n var fetchOptions, startTime, response, endTime, result, responseText, contentType, jsonData, blob, _t2;\n return curl_utils_regenerator().w(function (_context2) {\n while (1) switch (_context2.p = _context2.n) {\n case 0:\n _context2.p = 0;\n if (!options.silent) {\n console.log(\"Making \".concat(options.method, \" request to \").concat(url, \"...\"));\n }\n fetchOptions = {\n method: options.method,\n headers: options.headers\n };\n if (options.body && (options.method === 'POST' || options.method === 'PUT' || options.method === 'PATCH')) {\n fetchOptions.body = options.body;\n }\n startTime = Date.now();\n _context2.n = 1;\n return fetch(url, fetchOptions);\n case 1:\n response = _context2.v;\n endTime = Date.now();\n result = '';\n if (options.verbose) {\n result += \"* Connected to \".concat(url, \"\\n\");\n result += \"* \".concat(options.method, \" \").concat(url, \" HTTP/\").concat(response.type || '1.1', \"\\n\");\n }\n if (options.showHeaders) {\n result += \"HTTP/\".concat(response.type || '1.1', \" \").concat(response.status, \" \").concat(response.statusText, \"\\n\");\n response.headers.forEach(function (value, name) {\n result += \"\".concat(name, \": \").concat(value, \"\\n\");\n });\n result += '\\n';\n }\n if (options.verbose) {\n result += \"* Response time: \".concat(endTime - startTime, \"ms\\n\");\n result += \"* Status: \".concat(response.status, \" \").concat(response.statusText, \"\\n\");\n }\n // Получаем тело ответа\n contentType = response.headers.get('content-type') || '';\n if (!contentType.includes('application/json')) {\n _context2.n = 3;\n break;\n }\n _context2.n = 2;\n return response.json();\n case 2:\n jsonData = _context2.v;\n responseText = JSON.stringify(jsonData, null, 2);\n _context2.n = 7;\n break;\n case 3:\n if (!contentType.includes('text/')) {\n _context2.n = 5;\n break;\n }\n _context2.n = 4;\n return response.text();\n case 4:\n responseText = _context2.v;\n _context2.n = 7;\n break;\n case 5:\n _context2.n = 6;\n return response.blob();\n case 6:\n blob = _context2.v;\n responseText = \"[Binary data, size: \".concat(blob.size, \" bytes]\");\n case 7:\n result += responseText;\n if (options.verbose) {\n result += \"\\n* Connection closed\\n\";\n }\n return _context2.a(2, result);\n case 8:\n _context2.p = 8;\n _t2 = _context2.v;\n throw new Error(\"HTTP request failed: \".concat(_t2.message));\n case 9:\n return _context2.a(2);\n }\n }, _callee2, null, [[0, 8]]);\n }));\n return _makeHttpRequest.apply(this, arguments);\n}\n;// ./src/ts/commands/curl.ts\nfunction curl_typeof(o) { \"@babel/helpers - typeof\"; return curl_typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, curl_typeof(o); }\nfunction curl_regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return curl_regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (curl_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, curl_regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, curl_regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), curl_regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", curl_regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), curl_regeneratorDefine2(u), curl_regeneratorDefine2(u, o, \"Generator\"), curl_regeneratorDefine2(u, n, function () { return this; }), curl_regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (curl_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction curl_regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } curl_regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { curl_regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, curl_regeneratorDefine2(e, r, n, t); }\nfunction curl_asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction curl_asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { curl_asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { curl_asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction curl_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction curl_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, curl_toPropertyKey(o.key), o); } }\nfunction curl_createClass(e, r, t) { return r && curl_defineProperties(e.prototype, r), t && curl_defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction curl_toPropertyKey(t) { var i = curl_toPrimitive(t, \"string\"); return \"symbol\" == curl_typeof(i) ? i : i + \"\"; }\nfunction curl_toPrimitive(t, r) { if (\"object\" != curl_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != curl_typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction curl_callSuper(t, o, e) { return o = curl_getPrototypeOf(o), curl_possibleConstructorReturn(t, curl_isNativeReflectConstruct() ? Reflect.construct(o, e || [], curl_getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction curl_possibleConstructorReturn(t, e) { if (e && (\"object\" == curl_typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return curl_assertThisInitialized(t); }\nfunction curl_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction curl_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (curl_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction curl_getPrototypeOf(t) { return curl_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, curl_getPrototypeOf(t); }\nfunction curl_inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && curl_setPrototypeOf(t, e); }\nfunction curl_setPrototypeOf(t, e) { return curl_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, curl_setPrototypeOf(t, e); }\n/**\n * Команда curl - выполняет HTTP запросы\n */\n\n\nvar CurlCommand = /*#__PURE__*/function (_CustomCommand) {\n function CurlCommand() {\n var _this;\n curl_classCallCheck(this, CurlCommand);\n _this = curl_callSuper(this, CurlCommand, arguments);\n _this.name = 'curl';\n _this.description = 'Makes HTTP request. Usage: curl [options]';\n return _this;\n }\n curl_inherits(CurlCommand, _CustomCommand);\n return curl_createClass(CurlCommand, [{\n key: \"execute\",\n value: function () {\n var _execute = curl_asyncToGenerator(/*#__PURE__*/curl_regenerator().m(function _callee(command) {\n return curl_regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.n = 1;\n return executeCurl(command);\n case 1:\n return _context.a(2, _context.v);\n }\n }, _callee);\n }));\n function execute(_x) {\n return _execute.apply(this, arguments);\n }\n return execute;\n }()\n }]);\n}(custom_command/* CustomCommand */.j);\n// EXTERNAL MODULE: ./src/ts/utils/jq-utils.ts\nvar jq_utils = __webpack_require__(985);\n;// ./src/ts/commands/jq.ts\nfunction jq_typeof(o) { \"@babel/helpers - typeof\"; return jq_typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, jq_typeof(o); }\nfunction jq_regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return jq_regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (jq_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, jq_regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, jq_regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), jq_regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", jq_regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), jq_regeneratorDefine2(u), jq_regeneratorDefine2(u, o, \"Generator\"), jq_regeneratorDefine2(u, n, function () { return this; }), jq_regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (jq_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction jq_regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } jq_regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { jq_regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, jq_regeneratorDefine2(e, r, n, t); }\nfunction jq_asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction jq_asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { jq_asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { jq_asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction jq_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction jq_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, jq_toPropertyKey(o.key), o); } }\nfunction jq_createClass(e, r, t) { return r && jq_defineProperties(e.prototype, r), t && jq_defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction jq_toPropertyKey(t) { var i = jq_toPrimitive(t, \"string\"); return \"symbol\" == jq_typeof(i) ? i : i + \"\"; }\nfunction jq_toPrimitive(t, r) { if (\"object\" != jq_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != jq_typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction jq_callSuper(t, o, e) { return o = jq_getPrototypeOf(o), jq_possibleConstructorReturn(t, jq_isNativeReflectConstruct() ? Reflect.construct(o, e || [], jq_getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction jq_possibleConstructorReturn(t, e) { if (e && (\"object\" == jq_typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return jq_assertThisInitialized(t); }\nfunction jq_assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction jq_isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (jq_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction jq_getPrototypeOf(t) { return jq_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, jq_getPrototypeOf(t); }\nfunction jq_inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && jq_setPrototypeOf(t, e); }\nfunction jq_setPrototypeOf(t, e) { return jq_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, jq_setPrototypeOf(t, e); }\n/**\n * Команда jq - JSON процессор\n */\n\n\nvar JqCommand = /*#__PURE__*/function (_CustomCommand) {\n function JqCommand() {\n var _this;\n jq_classCallCheck(this, JqCommand);\n _this = jq_callSuper(this, JqCommand, arguments);\n _this.name = 'jq';\n _this.description = 'JSON processor. Usage: jq [object] or jq ';\n return _this;\n }\n jq_inherits(JqCommand, _CustomCommand);\n return jq_createClass(JqCommand, [{\n key: \"execute\",\n value: function () {\n var _execute = jq_asyncToGenerator(/*#__PURE__*/jq_regenerator().m(function _callee(command) {\n return jq_regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n _context.n = 1;\n return (0,jq_utils/* executeJq */.$x)(command);\n case 1:\n return _context.a(2, _context.v);\n }\n }, _callee);\n }));\n function execute(_x) {\n return _execute.apply(this, arguments);\n }\n return execute;\n }()\n }]);\n}(custom_command/* CustomCommand */.j);\n// EXTERNAL MODULE: ./src/ts/commands/echo.ts\nvar echo = __webpack_require__(506);\n;// ./src/ts/commands/index.ts\n/**\n * Экспорт всех команд\n */\n\n\n\n\n\n\n;// ./src/ts/custom-command-storage.ts\nfunction custom_command_storage_typeof(o) { \"@babel/helpers - typeof\"; return custom_command_storage_typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, custom_command_storage_typeof(o); }\nfunction custom_command_storage_regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return custom_command_storage_regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (custom_command_storage_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, custom_command_storage_regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, custom_command_storage_regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), custom_command_storage_regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", custom_command_storage_regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), custom_command_storage_regeneratorDefine2(u), custom_command_storage_regeneratorDefine2(u, o, \"Generator\"), custom_command_storage_regeneratorDefine2(u, n, function () { return this; }), custom_command_storage_regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (custom_command_storage_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction custom_command_storage_regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } custom_command_storage_regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { custom_command_storage_regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, custom_command_storage_regeneratorDefine2(e, r, n, t); }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _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.\"); }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, 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 o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t[\"return\"] || t[\"return\"](); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction custom_command_storage_asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction custom_command_storage_asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { custom_command_storage_asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { custom_command_storage_asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction custom_command_storage_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction custom_command_storage_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, custom_command_storage_toPropertyKey(o.key), o); } }\nfunction custom_command_storage_createClass(e, r, t) { return r && custom_command_storage_defineProperties(e.prototype, r), t && custom_command_storage_defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction custom_command_storage_toPropertyKey(t) { var i = custom_command_storage_toPrimitive(t, \"string\"); return \"symbol\" == custom_command_storage_typeof(i) ? i : i + \"\"; }\nfunction custom_command_storage_toPrimitive(t, r) { if (\"object\" != custom_command_storage_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != custom_command_storage_typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * CustomCommandStorage - управляет пользовательскими командами\n * Хранит команды и предоставляет их для выполнения\n */\n\n\n// Экспортируем CustomCommand для обратной совместимости\n\nvar CustomCommandStorage = /*#__PURE__*/function () {\n function CustomCommandStorage() {\n custom_command_storage_classCallCheck(this, CustomCommandStorage);\n this.commands = new Map();\n }\n /**\n * Регистрирует команду\n * @param command - экземпляр класса команды\n */\n return custom_command_storage_createClass(CustomCommandStorage, [{\n key: \"registerCommand\",\n value: function registerCommand(command) {\n this.commands.set(command.name, command);\n }\n /**\n * Удаляет команду\n * @param commandName - имя команды\n * @returns успешность удаления\n */\n }, {\n key: \"unregisterCommand\",\n value: function unregisterCommand(commandName) {\n return this.commands[\"delete\"](commandName);\n }\n /**\n * Получает список всех зарегистрированных команд\n * @returns массив объектов с информацией о командах\n */\n }, {\n key: \"getCustomCommands\",\n value: function getCustomCommands() {\n return Array.from(this.commands.values()).map(function (command) {\n return {\n name: command.name,\n description: command.description\n };\n });\n }\n /**\n * Проверяет, зарегистрирована ли команда\n * @param commandName - имя команды\n * @returns true если команда зарегистрирована\n */\n }, {\n key: \"hasCustomCommand\",\n value: function hasCustomCommand(commandName) {\n return this.commands.has(commandName);\n }\n /**\n * Получает информацию о команде\n * @param commandName - имя команды\n * @returns объект с информацией о команде или null\n */\n }, {\n key: \"getCommand\",\n value: function getCommand(commandName) {\n return this.commands.get(commandName) || null;\n }\n /**\n * Очищает все команды\n */\n }, {\n key: \"clear\",\n value: function clear() {\n this.commands.clear();\n }\n /**\n * Получает количество зарегистрированных команд\n * @returns количество команд\n */\n }, {\n key: \"getCommandCount\",\n value: function getCommandCount() {\n return this.commands.size;\n }\n /**\n * Выполняет команду, если она зарегистрирована\n * @param command - команда для выполнения\n * @returns результат выполнения или null если команда не найдена\n */\n }, {\n key: \"executeCommand\",\n value: (function () {\n var _executeCommand = custom_command_storage_asyncToGenerator(/*#__PURE__*/custom_command_storage_regenerator().m(function _callee(command) {\n var _iterator, _step, _step$value, cmdName, cmdInstance, result, _t, _t2;\n return custom_command_storage_regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n // Ищем команду, которая соответствует вводу\n _iterator = _createForOfIteratorHelper(this.commands);\n _context.p = 1;\n _iterator.s();\n case 2:\n if ((_step = _iterator.n()).done) {\n _context.n = 8;\n break;\n }\n _step$value = _slicedToArray(_step.value, 2), cmdName = _step$value[0], cmdInstance = _step$value[1];\n if (!cmdInstance.matches(command)) {\n _context.n = 7;\n break;\n }\n _context.p = 3;\n result = cmdInstance.execute(command); // Проверяем, является ли результат Promise\n if (!(result instanceof Promise)) {\n _context.n = 5;\n break;\n }\n _context.n = 4;\n return result;\n case 4:\n result = _context.v;\n case 5:\n return _context.a(2, String(result));\n case 6:\n _context.p = 6;\n _t = _context.v;\n throw new Error(\"Error in custom command '\".concat(cmdName, \"': \").concat(_t.message));\n case 7:\n _context.n = 2;\n break;\n case 8:\n _context.n = 10;\n break;\n case 9:\n _context.p = 9;\n _t2 = _context.v;\n _iterator.e(_t2);\n case 10:\n _context.p = 10;\n _iterator.f();\n return _context.f(10);\n case 11:\n return _context.a(2, null);\n }\n }, _callee, this, [[3, 6], [1, 9, 10, 11]]);\n }));\n function executeCommand(_x) {\n return _executeCommand.apply(this, arguments);\n }\n return executeCommand;\n }()\n /**\n * Инициализирует встроенные команды\n */\n )\n }, {\n key: \"initBuiltinCommands\",\n value: function initBuiltinCommands(terminalManager) {\n // Команда info для получения информации о среде\n this.registerCommand(new InfoCommand());\n // Команда help для получения справки\n this.registerCommand(new HelpCommand(this));\n // Команда clear для очистки терминала\n this.registerCommand(new ClearCommand());\n // Команда curl для выполнения HTTP запросов\n this.registerCommand(new CurlCommand());\n // Команда jq для работы с JSON объектами\n this.registerCommand(new JqCommand());\n // Команда echo для вывода текста (аналог console.log)\n this.registerCommand(new echo/* EchoCommand */.F());\n console.log('Built-in commands initialized');\n }\n }]);\n}();\n;// ./src/ts/terminal-manager.ts\nfunction terminal_manager_typeof(o) { \"@babel/helpers - typeof\"; return terminal_manager_typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, terminal_manager_typeof(o); }\nfunction terminal_manager_regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return terminal_manager_regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (terminal_manager_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, terminal_manager_regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, terminal_manager_regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), terminal_manager_regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", terminal_manager_regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), terminal_manager_regeneratorDefine2(u), terminal_manager_regeneratorDefine2(u, o, \"Generator\"), terminal_manager_regeneratorDefine2(u, n, function () { return this; }), terminal_manager_regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (terminal_manager_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction terminal_manager_regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } terminal_manager_regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { terminal_manager_regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, terminal_manager_regeneratorDefine2(e, r, n, t); }\nfunction terminal_manager_asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction terminal_manager_asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { terminal_manager_asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { terminal_manager_asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction terminal_manager_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction terminal_manager_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, terminal_manager_toPropertyKey(o.key), o); } }\nfunction terminal_manager_createClass(e, r, t) { return r && terminal_manager_defineProperties(e.prototype, r), t && terminal_manager_defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction terminal_manager_toPropertyKey(t) { var i = terminal_manager_toPrimitive(t, \"string\"); return \"symbol\" == terminal_manager_typeof(i) ? i : i + \"\"; }\nfunction terminal_manager_toPrimitive(t, r) { if (\"object\" != terminal_manager_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != terminal_manager_typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * TerminalManager - управляет терминалом и подключением\n */\n\n\n\n\n\nvar TerminalManager = /*#__PURE__*/function () {\n function TerminalManager() {\n var _this = this;\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n terminal_manager_classCallCheck(this, TerminalManager);\n this.isInitialized = false;\n this.terminal = null;\n this.connection = null;\n this.commandBuilder = null;\n this.handlers = null;\n var workMode = options.workMode || 'local';\n var sessionId = options.sessionId || null;\n this.options = {\n sessionId: sessionId,\n clientName: options.clientName || constants/* DEFAULT_SETTINGS */.a$.DEFAULT_CLIENT_NAME,\n autoConnect: options.autoConnect !== false,\n autoConnectDelay: options.autoConnectDelay || constants/* DEFAULT_SETTINGS */.a$.AUTO_CONNECT_DELAY,\n workMode: workMode,\n clientType: options.clientType || 'web',\n connection: options.connection || null\n };\n // Добавляем connection только если не в offline режиме\n if (workMode !== 'offline') {\n var _options$connectionOp;\n this.options.connectionOptions = {\n serverUrl: ((_options$connectionOp = options.connectionOptions) === null || _options$connectionOp === void 0 ? void 0 : _options$connectionOp.serverUrl) || constants/* DEFAULT_SETTINGS */.a$.DEFAULT_SERVER_URL\n };\n }\n this.customCommandStorage = new CustomCommandStorage();\n this.init();\n // Автоматическое подключение через указанную задержку\n if (this.options.autoConnect) {\n setTimeout(function () {\n if (_this.isInitialized && _this.handlers) {\n _this.connect('web');\n }\n }, this.options.autoConnectDelay);\n }\n }\n /**\n * Устанавливает внешнее соединение (вместо создания нового)\n * @param connection - внешнее соединение для использования\n */\n return terminal_manager_createClass(TerminalManager, [{\n key: \"setExternalConnection\",\n value: function setExternalConnection(connection) {\n if (this.connection) {\n // Уничтожаем существующее соединение\n this.connection.destroy();\n }\n this.connection = connection;\n console.log('External connection set for TerminalManager');\n }\n /**\n * Устанавливает все handlers для терминала и соединения\n * @param handlers - объект с handlers\n */\n }, {\n key: \"setHandlers\",\n value: function setHandlers() {\n var handlers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Настраиваем callbacks для основного терминала\n if (handlers.onData) {\n // this.options.onData = handlers.onData;\n if (this.terminal) {\n this.terminal.setOnData(handlers.onData);\n }\n }\n if (handlers.onError) {\n // this.options.onError = handlers.onError;\n if (this.terminal) {\n this.terminal.setOnError(handlers.onError);\n }\n }\n // Настраиваем callbacks для основного соединения (только если Connection существует)\n if (handlers.onConnect) {\n // this.options.onConnect = handlers.onConnect;\n if (this.connection) {\n this.connection.setOnConnect(handlers.onConnect);\n }\n }\n if (handlers.onCursorState) {\n //this.options.onCursorState = handlers.onCursorState;\n if (this.connection) {\n this.connection.setOnCursorState(function (state) {\n handlers.onCursorState(state.sessionId, state.command, state.position);\n });\n }\n }\n if (handlers.onData) {\n // this.options.onData = handlers.onData;\n if (this.connection) {\n this.connection.setOnTerminal(function (a) {\n handlers.onData(a.data);\n });\n }\n }\n if (handlers.onDisconnect) {\n // this.options.onDisconnect = (code: number, reason: string) => {\n // handlers.onDisconnect!();\n // };\n if (this.connection) {\n this.connection.setOnDisconnect(function (code, reason) {\n handlers.onDisconnect();\n });\n }\n }\n if (handlers.onError) {\n // this.options.onError = handlers.onError;\n if (this.connection) {\n this.connection.setOnError(handlers.onError);\n }\n }\n // if (handlers.onClientStatus) {\n // this.options.onClientStatus = handlers.onClientStatus;\n // if (this.connection) {\n // this.connection.setOnClientStatus(handlers.onClientStatus);\n // }\n // }\n // // closeSession\n // if (handlers.onCloseSession) {\n // this.options.onCloseSession = handlers.onCloseSession;\n // if (this.connection) {\n // this.connection.setOnCloseSession(handlers.onCloseSession);\n // }\n // }\n this.handlers = handlers;\n console.log('Handlers set successfully');\n }\n /**\n * Инициализирует терминал и подключение\n */\n }, {\n key: \"init\",\n value: function init() {\n var _this2 = this;\n try {\n this.commandBuilder = new CommandBuilder();\n // Создаем TerminalCli с CustomCommandStorage\n this.terminal = new terminal_cli/* TerminalCli */.L(this.customCommandStorage);\n // Создаем Connection только если не в offline режиме и нет внешнего соединения\n if (this.options.workMode !== 'offline' && this.options.connection && !this.connection) {\n if (this.options.connection != null) {\n this.connection = this.options.connection;\n } else {\n if (this.options.connectionOptions) {\n this.connection = new Connection(this.options.connectionOptions.serverUrl);\n } else {\n throw new Error('Connection options not available');\n }\n }\n }\n // Настраиваем callback'и для Connection в зависимости от режима работы\n if (this.options.workMode === 'remote' && this.connection) {\n // В удаленном режиме отправляем события SEND_KEY\n this.connection.setOnSendKey(function (data) {\n // Обрабатываем sendKey через CommandBuilder\n if (data.keys) {\n for (var i = 0; i < data.keys.length; i++) {\n _this2.commandBuilder.write(data.keys[i]);\n }\n }\n });\n }\n if (this.connection) {\n this.connection.setOnCommand(/*#__PURE__*/function () {\n var _ref = terminal_manager_asyncToGenerator(/*#__PURE__*/terminal_manager_regenerator().m(function _callee(data) {\n var _this2$terminal;\n return terminal_manager_regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n if (!data.command) {\n _context.n = 1;\n break;\n }\n _context.n = 1;\n return (_this2$terminal = _this2.terminal) === null || _this2$terminal === void 0 ? void 0 : _this2$terminal.executeCommand(data.command);\n case 1:\n return _context.a(2);\n }\n }, _callee);\n }));\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n }());\n }\n // Настраиваем callback'и для CommandBuilder\n this.commandBuilder.setOnExecuteCommand(/*#__PURE__*/function () {\n var _ref2 = terminal_manager_asyncToGenerator(/*#__PURE__*/terminal_manager_regenerator().m(function _callee2(command) {\n var _this2$handlers;\n var options, sessionId;\n return terminal_manager_regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n (_this2$handlers = _this2.handlers) === null || _this2$handlers === void 0 || _this2$handlers.onData(\"\\r\\n\");\n if (!(_this2.options.workMode === 'offline')) {\n _context2.n = 2;\n break;\n }\n _context2.n = 1;\n return _this2.terminal.executeCommand(command);\n case 1:\n _context2.n = 3;\n break;\n case 2:\n options = _this2.options;\n sessionId = options.sessionId;\n _this2.connection.sendCommand(sessionId, command);\n case 3:\n return _context2.a(2);\n }\n }, _callee2);\n }));\n return function (_x2) {\n return _ref2.apply(this, arguments);\n };\n }());\n // В локальном режиме отправляем CURSOR_STATE из CommandBuilder\n if (this.options.workMode === 'local' && this.connection) {\n this.commandBuilder.setOnStateChange(function (state) {\n var _this2$handlers2, _this2$connection;\n if ((_this2$handlers2 = _this2.handlers) !== null && _this2$handlers2 !== void 0 && _this2$handlers2.onCursorState) {\n var _this2$handlers3;\n (_this2$handlers3 = _this2.handlers) === null || _this2$handlers3 === void 0 || _this2$handlers3.onCursorState(_this2.options.sessionId || 'offline', state.command, state.postition);\n }\n (_this2$connection = _this2.connection) === null || _this2$connection === void 0 || _this2$connection.sendCursorState({\n sessionId: _this2.options.sessionId || 'offline',\n command: state.command,\n position: state.postition\n });\n });\n }\n // В offline режиме настраиваем прямую работу с TerminalCli\n if (this.options.workMode === 'offline') {\n this.commandBuilder.setOnStateChange(function (state) {\n var _this2$handlers4;\n // В offline режиме просто уведомляем об изменении состояния\n if ((_this2$handlers4 = _this2.handlers) !== null && _this2$handlers4 !== void 0 && _this2$handlers4.onCursorState) {\n var _this2$handlers5;\n (_this2$handlers5 = _this2.handlers) === null || _this2$handlers5 === void 0 || _this2$handlers5.onCursorState(_this2.options.sessionId || 'offline', state.command, state.postition);\n }\n });\n }\n // Инициализируем встроенные команды\n this.customCommandStorage.initBuiltinCommands();\n this.isInitialized = true;\n console.log('TerminalManager initialized successfully');\n } catch (error) {\n console.error('Failed to initialize TerminalManager:', error);\n throw error;\n }\n }\n /**\n * Подключается к серверу\n */\n }, {\n key: \"connect\",\n value: function connect(clientType) {\n if (!this.isInitialized) {\n throw new Error('TerminalManager not initialized');\n }\n // В offline режиме не подключаемся к серверу\n if (this.options.workMode === 'offline') {\n var _this$handlers;\n console.log('TerminalManager running in offline mode - no server connection needed');\n // Вызываем onConnect callback для уведомления о готовности\n if ((_this$handlers = this.handlers) !== null && _this$handlers !== void 0 && _this$handlers.onConnect) {\n var _this$handlers2;\n (_this$handlers2 = this.handlers) === null || _this$handlers2 === void 0 || _this$handlers2.onConnect();\n }\n return;\n }\n if (this.connection) {\n this.connection.connect(clientType);\n } else {\n throw new Error('Connection not available - check workMode and connection options');\n }\n }\n /**\n * Отключается от сервера\n */\n }, {\n key: \"disconnect\",\n value: function disconnect() {\n // В offline режиме нечего отключать\n if (this.options.workMode === 'offline') {\n console.log('TerminalManager in offline mode - no connection to disconnect');\n return;\n }\n if (this.connection) {\n this.connection.disconnect();\n }\n }\n /**\n * Отправляет данные в терминал\n * @param data - данные для отправки\n */\n }, {\n key: \"write\",\n value: (function () {\n var _write = terminal_manager_asyncToGenerator(/*#__PURE__*/terminal_manager_regenerator().m(function _callee3(data) {\n var _this$commandBuilder, _this$commandBuilder2;\n return terminal_manager_regenerator().w(function (_context3) {\n while (1) switch (_context3.n) {\n case 0:\n if (!(this.options.workMode === 'offline')) {\n _context3.n = 2;\n break;\n }\n _context3.n = 1;\n return (_this$commandBuilder = this.commandBuilder) === null || _this$commandBuilder === void 0 ? void 0 : _this$commandBuilder.write(data);\n case 1:\n _context3.n = 6;\n break;\n case 2:\n if (!(this.options.workMode === 'local')) {\n _context3.n = 4;\n break;\n }\n _context3.n = 3;\n return (_this$commandBuilder2 = this.commandBuilder) === null || _this$commandBuilder2 === void 0 ? void 0 : _this$commandBuilder2.write(data);\n case 3:\n _context3.n = 6;\n break;\n case 4:\n if (!this.connection) {\n _context3.n = 5;\n break;\n }\n this.connection.sendSendKey({\n sessionId: this.options.sessionId,\n keys: [data]\n });\n _context3.n = 6;\n break;\n case 5:\n throw new Error('Connection not available in remote mode');\n case 6:\n return _context3.a(2);\n }\n }, _callee3, this);\n }));\n function write(_x3) {\n return _write.apply(this, arguments);\n }\n return write;\n }()\n /**\n * Очищает ресурсы\n */\n )\n }, {\n key: \"destroy\",\n value: function destroy() {\n // Уничтожаем основной терминал\n if (this.terminal) {\n this.terminal.destroy();\n this.terminal = null;\n }\n // Уничтожаем основной CommandBuilder\n if (this.commandBuilder) {\n this.commandBuilder.destroy();\n this.commandBuilder = null;\n }\n // Уничтожаем основное соединение\n if (this.connection) {\n this.connection.destroy();\n this.connection = null;\n }\n this.isInitialized = false;\n this.handlers = null;\n }\n }]);\n}();\n;// ./src/ts/terminal-ui-writer.ts\nfunction terminal_ui_writer_typeof(o) { \"@babel/helpers - typeof\"; return terminal_ui_writer_typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, terminal_ui_writer_typeof(o); }\nfunction terminal_ui_writer_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction terminal_ui_writer_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, terminal_ui_writer_toPropertyKey(o.key), o); } }\nfunction terminal_ui_writer_createClass(e, r, t) { return r && terminal_ui_writer_defineProperties(e.prototype, r), t && terminal_ui_writer_defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction terminal_ui_writer_toPropertyKey(t) { var i = terminal_ui_writer_toPrimitive(t, \"string\"); return \"symbol\" == terminal_ui_writer_typeof(i) ? i : i + \"\"; }\nfunction terminal_ui_writer_toPrimitive(t, r) { if (\"object\" != terminal_ui_writer_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != terminal_ui_writer_typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * TerminalUiWriter.ts - Класс для согласованной отрисовки терминала\n * Обеспечивает централизованное управление выводами в терминал через xterm.js\n */\n/**\n * Класс TerminalUiWriter - управляет отрисовкой в терминале\n */\nvar TerminalUiWriter = /*#__PURE__*/function () {\n function TerminalUiWriter(terminalUi) {\n terminal_ui_writer_classCallCheck(this, TerminalUiWriter);\n this.currentLine = 0;\n this.currentColumn = 0;\n this.lastCommand = '';\n this.lastPosition = 0;\n this.terminalUi = terminalUi;\n }\n /**\n * Основной метод для записи команды в терминал\n * @param command - текст команды для отображения\n * @param position - позиция курсора в команде\n */\n return terminal_ui_writer_createClass(TerminalUiWriter, [{\n key: \"write\",\n value: function write(command, position) {\n console.log(\"write() called: command=\\\"\".concat(command, \"\\\", position=\").concat(position, \", lastCommand=\\\"\").concat(this.lastCommand, \"\\\", lastPosition=\").concat(this.lastPosition));\n // 0) Быстрый путь вставки в середине строки\n if (this.tryMidlineInsert(this.lastCommand, command, this.lastPosition, position)) {\n console.log(' -> tryMidlineInsert handled');\n return;\n }\n // 0.1) Быстрый путь удаления в середине строки (включая удаление последнего символа в строке)\n if (this.tryMidlineDelete(this.lastCommand, command, this.lastPosition, position)) {\n console.log(' -> tryMidlineDelete handled');\n return;\n }\n // 1) Только перемещение курсора (строка не изменилась)\n if (command === this.lastCommand && position !== this.lastPosition) {\n console.log(' -> moveCursorRelative');\n this.moveCursorRelative(command, this.lastPosition, position);\n this.lastPosition = position;\n return;\n }\n // 2) Быстрый backspace в конце строки\n if (this.lastCommand.length > 0 && position === this.lastCommand.length - 1 && command === this.lastCommand.slice(0, -1)) {\n console.log(' -> fast backspace at end');\n // Выполняем визуальный backspace\n this.terminalUi.write('\\b \\b');\n this.lastCommand = command;\n this.lastPosition = position;\n return;\n }\n // Ничего не делать, если состояние не изменилось\n if (command === this.lastCommand && position === this.lastPosition) {\n console.log(' -> no change, return');\n return;\n }\n // Быстрый путь: дописывание в конец без перемещения курсора\n if (this.tryFastAppend(this.lastCommand, command, position)) {\n console.log(' -> tryFastAppend handled');\n return;\n }\n // Защита: после выполнения команды (очистка буфера) не трогаем экран,\n // чтобы не стереть вывод/ошибки, только обновляем внутреннее состояние\n if (this.lastCommand.length > 0 && command.length === 0 && position === 0) {\n console.log(' -> command execution cleanup');\n this.lastCommand = command;\n this.lastPosition = position;\n return;\n }\n console.log(' -> updateCommandRegion + setCursorPositionInCommand');\n // Дифф-обновление: перерисовываем только изменившиеся строки\n this.updateCommandRegion(this.lastCommand, command);\n // Точное позиционирование курсора с учетом многострочности\n var atEnd = position >= command.length;\n console.log(\" -> atEnd=\".concat(atEnd, \", calling setCursorPositionInCommand with position=\").concat(atEnd ? command.length : position));\n if (atEnd) {\n // Если курсор в конце команды, устанавливаем его в конец последней строки\n this.setCursorPositionInCommand(command, command.length);\n } else {\n this.setCursorPositionInCommand(command, position);\n }\n // Запоминаем текущее состояние\n this.lastCommand = command;\n this.lastPosition = position;\n console.log(\" -> final state: lastCommand=\\\"\".concat(this.lastCommand, \"\\\", lastPosition=\").concat(this.lastPosition));\n }\n /**\n * Относительное перемещение курсора по одной и той же команде\n */\n }, {\n key: \"moveCursorRelative\",\n value: function moveCursorRelative(command, fromPosition, toPosition) {\n var fromInfo = this.getCursorInfo(command, fromPosition);\n var toInfo = this.getCursorInfo(command, toPosition);\n var lineDelta = toInfo.line - fromInfo.line;\n if (lineDelta > 0) {\n this.terminalUi.write(\"\\x1B[\".concat(lineDelta, \"B\"));\n } else if (lineDelta < 0) {\n this.terminalUi.write(\"\\x1B[\".concat(-lineDelta, \"A\"));\n }\n var columnDelta = toInfo.column - fromInfo.column;\n if (columnDelta > 0) {\n this.terminalUi.write(\"\\x1B[\".concat(columnDelta, \"C\"));\n } else if (columnDelta < 0) {\n this.terminalUi.write(\"\\x1B[\".concat(-columnDelta, \"D\"));\n }\n }\n /**\n * Быстрая допись в конец команды без прыжков курсора\n */\n }, {\n key: \"tryFastAppend\",\n value: function tryFastAppend(oldCommand, newCommand, position) {\n if (newCommand.length >= oldCommand.length && newCommand.startsWith(oldCommand) && position === newCommand.length && this.lastPosition === oldCommand.length) {\n var appended = newCommand.slice(oldCommand.length);\n if (appended.length > 0) {\n if (appended.indexOf('\\n') >= 0) {\n var parts = appended.split('\\n');\n for (var i = 0; i < parts.length; i++) {\n var chunk = parts[i];\n if (chunk) {\n this.terminalUi.write(chunk);\n }\n if (i < parts.length - 1) {\n // Переход на новую строку с возвратом каретки\n this.terminalUi.write('\\r\\n');\n }\n }\n } else {\n this.terminalUi.write(appended);\n }\n }\n this.lastCommand = newCommand;\n this.lastPosition = position;\n return true;\n }\n return false;\n }\n /**\n * Быстрый путь вставки в середине строки: переписать остаток строки и вернуть курсор\n */\n }, {\n key: \"tryMidlineInsert\",\n value: function tryMidlineInsert(oldCommand, newCommand, fromPosition, toPosition) {\n var _oldLines$lineIndex, _newLines$lineIndex;\n if (newCommand.length <= oldCommand.length) {\n return false; // не вставка\n }\n var oldLines = oldCommand.split('\\n');\n var newLines = newCommand.split('\\n');\n var fromInfo = this.getCursorInfo(oldCommand, fromPosition);\n var toInfo = this.getCursorInfo(newCommand, toPosition);\n // Вставка только в пределах одной строки\n if (fromInfo.line !== toInfo.line || toInfo.column < fromInfo.column) {\n return false;\n }\n var lineIndex = fromInfo.line;\n var oldLine = (_oldLines$lineIndex = oldLines[lineIndex]) !== null && _oldLines$lineIndex !== void 0 ? _oldLines$lineIndex : '';\n var newLine = (_newLines$lineIndex = newLines[lineIndex]) !== null && _newLines$lineIndex !== void 0 ? _newLines$lineIndex : '';\n // Проверяем, что это именно вставка: префикс совпадает до места вставки и суффикс после вставки совпадает с прежним\n var oldPrefix = oldLine.slice(0, fromInfo.column);\n var oldSuffix = oldLine.slice(fromInfo.column);\n var newPrefix = newLine.slice(0, fromInfo.column);\n var newSuffixFromCursor = newLine.slice(toInfo.column);\n if (newPrefix !== oldPrefix || newSuffixFromCursor !== oldSuffix) {\n return false; // не чистая вставка\n }\n // Перейдём к позиции вставки относительным перемещением (обычно мы уже там)\n this.moveCursorRelative(oldCommand, this.lastPosition, fromPosition);\n // Очистка до конца строки от позиции вставки и запись остатка новой строки (включая вставку)\n var restToWrite = newLine.slice(fromInfo.column);\n this.terminalUi.write('\\x1b[K');\n if (restToWrite.length > 0) {\n this.terminalUi.write(restToWrite);\n }\n // Вернуть курсор в целевую позицию внутри строки\n var moveLeft = newLine.length - toInfo.column;\n if (moveLeft > 0) {\n this.terminalUi.write(\"\\x1B[\".concat(moveLeft, \"D\"));\n }\n // Обновляем состояние\n this.lastCommand = newCommand;\n this.lastPosition = toPosition;\n return true;\n }\n /**\n * Быстрый путь удаления в середине строки: переписать остаток строки и вернуть курсор\n */\n }, {\n key: \"tryMidlineDelete\",\n value: function tryMidlineDelete(oldCommand, newCommand, fromPosition, toPosition) {\n var _oldLines$lineIndex2, _newLines$lineIndex2;\n if (newCommand.length !== oldCommand.length - 1) {\n return false; // поддерживаем только по одному символу для простоты и стабильности\n }\n var oldLines = oldCommand.split('\\n');\n var newLines = newCommand.split('\\n');\n var fromInfo = this.getCursorInfo(oldCommand, fromPosition);\n var toInfo = this.getCursorInfo(newCommand, toPosition);\n // Удаление должно происходить в одной строке, ИЛИ это удаление \\n (переход между строками)\n if (fromInfo.line !== toInfo.line) {\n // Проверяем, не удаляем ли мы \\n\n var deletedChar = oldCommand[fromPosition - 1];\n if (deletedChar !== '\\n') {\n return false;\n }\n // Это удаление \\n - обрабатываем специально\n return this.handleNewlineDeletion(oldCommand, newCommand, fromPosition, toPosition);\n }\n var lineIndex = fromInfo.line;\n var oldLine = (_oldLines$lineIndex2 = oldLines[lineIndex]) !== null && _oldLines$lineIndex2 !== void 0 ? _oldLines$lineIndex2 : '';\n var newLine = (_newLines$lineIndex2 = newLines[lineIndex]) !== null && _newLines$lineIndex2 !== void 0 ? _newLines$lineIndex2 : '';\n // backspace удаляет символ слева от курсора: позиция уменьшилась на 1\n if (toInfo.column !== fromInfo.column - 1) {\n return false;\n }\n // Проверим соответствие префикса и суффикса\n var expectedNewLine = oldLine.slice(0, fromInfo.column - 1) + oldLine.slice(fromInfo.column);\n if (expectedNewLine !== newLine) {\n return false;\n }\n // Перейти в старую позицию курсора\n this.moveCursorRelative(oldCommand, this.lastPosition, fromPosition);\n // Сместиться влево на один символ (позиция удаления)\n this.terminalUi.write('\\x1b[D');\n // Очистить до конца строки и записать остаток новой строки с текущей позиции\n var restToWrite = newLine.slice(toInfo.column);\n this.terminalUi.write('\\x1b[K');\n if (restToWrite.length > 0) {\n this.terminalUi.write(restToWrite);\n // Вернуть курсор назад на длину записанного остатка\n this.terminalUi.write(\"\\x1B[\".concat(restToWrite.length, \"D\"));\n }\n // Обновляем состояние\n this.lastCommand = newCommand;\n this.lastPosition = toPosition;\n return true;\n }\n /**\n * Обрабатывает удаление символа \\n (объединение строк)\n */\n }, {\n key: \"handleNewlineDeletion\",\n value: function handleNewlineDeletion(oldCommand, newCommand, fromPosition, toPosition) {\n console.log('handleNewlineDeletion called');\n var fromInfo = this.getCursorInfo(oldCommand, fromPosition);\n var toInfo = this.getCursorInfo(newCommand, toPosition);\n console.log(\" fromInfo: line=\".concat(fromInfo.line, \", column=\").concat(fromInfo.column));\n console.log(\" toInfo: line=\".concat(toInfo.line, \", column=\").concat(toInfo.column));\n // Перейти в старую позицию курсора\n this.moveCursorRelative(oldCommand, this.lastPosition, fromPosition);\n // Сместиться влево на один символ (позиция удаления \\n)\n this.terminalUi.write('\\x1b[D');\n // Очистить до конца строки\n this.terminalUi.write('\\x1b[K');\n // Записать содержимое следующей строки (которая теперь объединилась с текущей)\n var oldLines = oldCommand.split('\\n');\n var newLines = newCommand.split('\\n');\n if (fromInfo.line < oldLines.length - 1) {\n // Есть следующая строка, которую нужно объединить\n var nextLineContent = oldLines[fromInfo.line + 1] || '';\n console.log(\" nextLineContent: \\\"\".concat(nextLineContent, \"\\\"\"));\n if (nextLineContent.length > 0) {\n this.terminalUi.write(nextLineContent);\n // Вернуть курсор в правильную позицию\n var moveLeft = nextLineContent.length - toInfo.column;\n console.log(\" moveLeft: \".concat(moveLeft));\n if (moveLeft > 0) {\n this.terminalUi.write(\"\\x1B[\".concat(moveLeft, \"D\"));\n }\n }\n } else {\n // Нет следующей строки - просто удаляем \\n\n console.log(' no next line, just removing \\\\n');\n // Важно: нужно подняться на строку выше, если курсор был на второй строке\n if (fromInfo.line > toInfo.line) {\n console.log(\" moving up from line \".concat(fromInfo.line, \" to line \").concat(toInfo.line));\n this.terminalUi.write(\"\\x1B[\".concat(fromInfo.line - toInfo.line, \"A\"));\n // Переместиться в правильную колонку\n if (toInfo.column > 0) {\n this.terminalUi.write(\"\\x1B[\".concat(toInfo.column, \"C\"));\n }\n }\n }\n // Обновляем состояние\n this.lastCommand = newCommand;\n this.lastPosition = toPosition;\n console.log(\" final position: \".concat(toPosition));\n return true;\n }\n /**\n * Записывает текст в терминал без изменения позиции курсора\n * @param text - текст для записи\n */\n }, {\n key: \"writeText\",\n value: function writeText(text) {\n this.terminalUi.write(text);\n }\n /**\n * Записывает текст с переносом строки\n * @param text - текст для записи\n */\n }, {\n key: \"writeLine\",\n value: function writeLine(text) {\n this.terminalUi.write(text + '\\r\\n');\n }\n /**\n * Очищает текущую строку\n */\n }, {\n key: \"clearCurrentLine\",\n value: function clearCurrentLine() {\n // Перемещаемся в начало строки\n this.terminalUi.write('\\r');\n // Очищаем строку\n this.terminalUi.write('\\x1b[2K');\n }\n /**\n * Очищает все строки, которые занимает команда\n * @param command - команда для анализа\n */\n }, {\n key: \"clearCommandLines\",\n value: function clearCommandLines(command) {\n // Сохранено для обратной совместимости, но не используется в новой дифф-логике\n var lines = command.split('\\n');\n var lineCount = lines.length;\n this.terminalUi.write('\\r');\n for (var i = 0; i < lineCount; i++) {\n this.terminalUi.write('\\x1b[2K');\n if (i < lineCount - 1) {\n this.terminalUi.write('\\x1b[B');\n }\n }\n if (lineCount > 1) {\n this.terminalUi.write(\"\\x1B[\".concat(lineCount - 1, \"A\"));\n }\n this.terminalUi.write('\\r');\n }\n /**\n * Обновляет область команды, перерисовывая только изменившиеся строки\n */\n }, {\n key: \"updateCommandRegion\",\n value: function updateCommandRegion(oldCommand, newCommand) {\n var oldLines = oldCommand.split('\\n');\n var newLines = newCommand.split('\\n');\n var maxLines = Math.max(oldLines.length, newLines.length);\n // Поднимаемся к началу региона старой команды относительно предыдущей позиции курсора\n var prevInfo = this.getCursorInfo(oldCommand, this.lastPosition);\n this.terminalUi.write('\\r');\n if (prevInfo.line > 0) {\n this.terminalUi.write(\"\\x1B[\".concat(prevInfo.line, \"A\"));\n }\n for (var i = 0; i < maxLines; i++) {\n var _oldLines$i, _newLines$i;\n var oldLine = i < oldLines.length ? (_oldLines$i = oldLines[i]) !== null && _oldLines$i !== void 0 ? _oldLines$i : '' : '';\n var newLine = i < newLines.length ? (_newLines$i = newLines[i]) !== null && _newLines$i !== void 0 ? _newLines$i : '' : '';\n // Всегда начинаем со старта строки\n this.terminalUi.write('\\r');\n if (oldLine !== newLine) {\n // Очищаем текущую строку и записываем новую версию строки\n this.terminalUi.write('\\x1b[2K');\n if (newLine.length > 0) {\n this.terminalUi.write(newLine);\n }\n }\n // Переходим на следующую строку, если она есть\n if (i < maxLines - 1) {\n this.terminalUi.write('\\r');\n this.terminalUi.write('\\x1b[B');\n }\n }\n // По окончании оставить курсор внизу НОВОЙ области\n // Сейчас мы на нижней строке maxLines. Если старых строк больше новых — поднимемся на разницу\n if (oldLines.length > newLines.length) {\n this.terminalUi.write(\"\\x1B[\".concat(oldLines.length - newLines.length, \"A\"));\n }\n // Важно: после обновления области курсор может быть в неправильной позиции\n // Поэтому мы всегда будем устанавливать его в правильную позицию после updateCommandRegion\n }\n /**\n * Устанавливает позицию курсора в команде с учетом многострочности\n * @param command - команда\n * @param position - позиция курсора в команде\n */\n }, {\n key: \"setCursorPositionInCommand\",\n value: function setCursorPositionInCommand(command, position) {\n var lines = command.split('\\n');\n var totalLength = command.length;\n var currentPosition = 0;\n var targetLine = 0;\n var targetColumn = 0;\n // Корректируем позицию в допустимые пределы\n var safePosition = Math.max(0, Math.min(position, totalLength));\n console.log(\"setCursorPositionInCommand: command=\\\"\".concat(command, \"\\\", position=\").concat(position, \", safePosition=\").concat(safePosition, \", lines=\").concat(lines.length));\n // Находим строку и колонку для заданной позиции (учитываем пустые строки)\n for (var i = 0; i < lines.length; i++) {\n var _lines$i;\n var line = (_lines$i = lines[i]) !== null && _lines$i !== void 0 ? _lines$i : '';\n var lineLength = line.length;\n if (safePosition <= currentPosition + lineLength) {\n targetLine = i;\n targetColumn = safePosition - currentPosition;\n break;\n }\n currentPosition += lineLength + 1; // +1 для символа \\n\n }\n // Если позиция в самом конце, курсор в конец последней строки\n if (safePosition === totalLength && totalLength > 0) {\n var _lines$targetLine$len, _lines$targetLine;\n targetLine = lines.length - 1;\n targetColumn = (_lines$targetLine$len = (_lines$targetLine = lines[targetLine]) === null || _lines$targetLine === void 0 ? void 0 : _lines$targetLine.length) !== null && _lines$targetLine$len !== void 0 ? _lines$targetLine$len : 0;\n }\n // Перемещаемся к началу первой строки команды\n this.terminalUi.write('\\r');\n if (lines.length > 1) {\n this.terminalUi.write(\"\\x1B[\".concat(lines.length - 1, \"A\"));\n }\n // Спускаемся на целевую строку\n if (targetLine > 0) {\n this.terminalUi.write(\"\\x1B[\".concat(targetLine, \"B\"));\n }\n // Переходим к целевой колонке\n if (targetColumn > 0) {\n this.terminalUi.write(\"\\x1B[\".concat(targetColumn, \"C\"));\n }\n console.log(\"setCursorPositionInCommand result: targetLine=\".concat(targetLine, \", targetColumn=\").concat(targetColumn));\n }\n /**\n * Устанавливает позицию курсора в команде (упрощенная версия для обратной совместимости)\n * @param position - позиция курсора\n */\n }, {\n key: \"setCursorPosition\",\n value: function setCursorPosition(position) {\n // Перемещаемся в начало строки\n this.terminalUi.write('\\r');\n // Перемещаемся на нужную позицию\n if (position > 0) {\n this.terminalUi.write(\"\\x1B[\".concat(position, \"C\"));\n }\n }\n /**\n * Перемещает курсор влево\n */\n }, {\n key: \"moveCursorLeft\",\n value: function moveCursorLeft() {\n this.terminalUi.write('\\x1b[D');\n }\n /**\n * Перемещает курсор вправо\n */\n }, {\n key: \"moveCursorRight\",\n value: function moveCursorRight() {\n this.terminalUi.write('\\x1b[C');\n }\n /**\n * Перемещает курсор в начало строки\n */\n }, {\n key: \"moveCursorToStart\",\n value: function moveCursorToStart() {\n this.terminalUi.write('\\r');\n }\n /**\n * Перемещает курсор в конец команды (с учетом многострочности)\n * @param command - команда\n */\n }, {\n key: \"moveCursorToEndOfCommand\",\n value: function moveCursorToEndOfCommand(command) {\n this.setCursorPositionInCommand(command, command.length);\n }\n /**\n * Перемещает курсор в конец строки (упрощенная версия)\n * @param commandLength - длина команды\n */\n }, {\n key: \"moveCursorToEnd\",\n value: function moveCursorToEnd(commandLength) {\n this.terminalUi.write('\\r');\n if (commandLength > 0) {\n this.terminalUi.write(\"\\x1B[\".concat(commandLength, \"C\"));\n }\n }\n /**\n * Очищает весь экран\n */\n }, {\n key: \"clearScreen\",\n value: function clearScreen() {\n this.terminalUi.write('\\x1b[2J');\n this.terminalUi.write('\\x1b[H');\n }\n /**\n * Устанавливает состояние команды в терминале\n * @param state - состояние команды\n */\n }, {\n key: \"setCommandState\",\n value: function setCommandState(state) {\n this.write(state.command, state.position);\n }\n /**\n * Получает текущую позицию курсора\n */\n }, {\n key: \"getCurrentCursorPosition\",\n value: function getCurrentCursorPosition() {\n return {\n x: this.terminalUi.buffer.active.cursorX,\n y: this.terminalUi.buffer.active.cursorY\n };\n }\n /**\n * Записывает приглашение командной строки\n * @param prompt - текст приглашения (например, \"$ \")\n */\n }, {\n key: \"writePrompt\",\n value: function writePrompt() {\n var prompt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '$ ';\n this.terminalUi.write(prompt);\n }\n /**\n * Записывает ошибку в терминал\n * @param error - текст ошибки\n */\n }, {\n key: \"writeError\",\n value: function writeError(error) {\n this.terminalUi.write(\"\\x1B[31m\".concat(error, \"\\x1B[0m\"));\n }\n /**\n * Записывает предупреждение в терминал\n * @param warning - текст предупреждения\n */\n }, {\n key: \"writeWarning\",\n value: function writeWarning(warning) {\n this.terminalUi.write(\"\\x1B[33m\".concat(warning, \"\\x1B[0m\"));\n }\n /**\n * Записывает успешное сообщение в терминал\n * @param message - текст сообщения\n */\n }, {\n key: \"writeSuccess\",\n value: function writeSuccess(message) {\n this.terminalUi.write(\"\\x1B[32m\".concat(message, \"\\x1B[0m\"));\n }\n /**\n * Записывает информационное сообщение в терминал\n * @param message - текст сообщения\n */\n }, {\n key: \"writeInfo\",\n value: function writeInfo(message) {\n this.terminalUi.write(\"\\x1B[34m\".concat(message, \"\\x1B[0m\"));\n }\n /**\n * Выполняет откат (backspace) - удаляет символ перед курсором\n */\n }, {\n key: \"backspace\",\n value: function backspace() {\n this.terminalUi.write('\\b \\b');\n }\n /**\n * Получает информацию о позиции курсора в многострочной команде\n * @param command - команда\n * @param position - позиция в команде\n * @returns объект с информацией о строке и колонке\n */\n }, {\n key: \"getCursorInfo\",\n value: function getCursorInfo(command, position) {\n var lines = command.split('\\n');\n var totalLength = command.length;\n var currentPosition = 0;\n var targetLine = 0;\n var targetColumn = 0;\n var safePosition = Math.max(0, Math.min(position, totalLength));\n for (var i = 0; i < lines.length; i++) {\n var _lines$i2;\n var line = (_lines$i2 = lines[i]) !== null && _lines$i2 !== void 0 ? _lines$i2 : '';\n var lineLength = line.length;\n if (safePosition <= currentPosition + lineLength) {\n targetLine = i;\n targetColumn = safePosition - currentPosition;\n break;\n }\n currentPosition += lineLength + 1; // +1 для символа \\n\n }\n if (safePosition === totalLength) {\n var _lines$targetLine$len2, _lines$targetLine2;\n targetLine = lines.length - 1;\n targetColumn = (_lines$targetLine$len2 = (_lines$targetLine2 = lines[targetLine]) === null || _lines$targetLine2 === void 0 ? void 0 : _lines$targetLine2.length) !== null && _lines$targetLine$len2 !== void 0 ? _lines$targetLine$len2 : 0;\n }\n return {\n line: targetLine,\n column: targetColumn,\n lineText: lines[targetLine] || ''\n };\n }\n /**\n * Получает количество строк в команде\n * @param command - команда\n * @returns количество строк\n */\n }, {\n key: \"getCommandLineCount\",\n value: function getCommandLineCount(command) {\n return command.split('\\n').length;\n }\n /**\n * Получает длину последней строки команды\n * @param command - команда\n * @returns длина последней строки\n */\n }, {\n key: \"getLastLineLength\",\n value: function getLastLineLength(command) {\n var lines = command.split('\\n');\n var lastLine = lines[lines.length - 1];\n return lastLine ? lastLine.length : 0;\n }\n /**\n * Уничтожает writer и очищает ресурсы\n */\n }, {\n key: \"destroy\",\n value: function destroy() {\n // Очищаем ссылку на терминал\n this.terminalUi = null;\n }\n }]);\n}();\n;// ./src/ts/terminal-tab-manager.ts\nfunction terminal_tab_manager_typeof(o) { \"@babel/helpers - typeof\"; return terminal_tab_manager_typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, terminal_tab_manager_typeof(o); }\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || terminal_tab_manager_unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _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.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return terminal_tab_manager_arrayLikeToArray(r); }\nfunction _regeneratorValues(e) { if (null != e) { var t = e[\"function\" == typeof Symbol && Symbol.iterator || \"@@iterator\"], r = 0; if (t) return t.call(e); if (\"function\" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(terminal_tab_manager_typeof(e) + \" is not iterable\"); }\nfunction terminal_tab_manager_createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = terminal_tab_manager_unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, 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 o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t[\"return\"] || t[\"return\"](); } finally { if (u) throw o; } } }; }\nfunction terminal_tab_manager_unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return terminal_tab_manager_arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? terminal_tab_manager_arrayLikeToArray(r, a) : void 0; } }\nfunction terminal_tab_manager_arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction terminal_tab_manager_regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return terminal_tab_manager_regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (terminal_tab_manager_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, terminal_tab_manager_regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, terminal_tab_manager_regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), terminal_tab_manager_regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", terminal_tab_manager_regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), terminal_tab_manager_regeneratorDefine2(u), terminal_tab_manager_regeneratorDefine2(u, o, \"Generator\"), terminal_tab_manager_regeneratorDefine2(u, n, function () { return this; }), terminal_tab_manager_regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (terminal_tab_manager_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction terminal_tab_manager_regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } terminal_tab_manager_regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { terminal_tab_manager_regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, terminal_tab_manager_regeneratorDefine2(e, r, n, t); }\nfunction terminal_tab_manager_asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction terminal_tab_manager_asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { terminal_tab_manager_asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { terminal_tab_manager_asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = terminal_tab_manager_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction terminal_tab_manager_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction terminal_tab_manager_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, terminal_tab_manager_toPropertyKey(o.key), o); } }\nfunction terminal_tab_manager_createClass(e, r, t) { return r && terminal_tab_manager_defineProperties(e.prototype, r), t && terminal_tab_manager_defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction terminal_tab_manager_toPropertyKey(t) { var i = terminal_tab_manager_toPrimitive(t, \"string\"); return \"symbol\" == terminal_tab_manager_typeof(i) ? i : i + \"\"; }\nfunction terminal_tab_manager_toPrimitive(t, r) { if (\"object\" != terminal_tab_manager_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != terminal_tab_manager_typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\n\n// Класс для управления терминалами и табами\nvar TerminalTabManager = /*#__PURE__*/function () {\n function TerminalTabManager() {\n terminal_tab_manager_classCallCheck(this, TerminalTabManager);\n this.clients = [];\n this.activeTabIndex = 0;\n this.tabCounter = 0;\n this.callbacks = {};\n this.apiHost = '';\n this.connection = null;\n this.roomId = '';\n }\n // Настройка callbacks\n return terminal_tab_manager_createClass(TerminalTabManager, [{\n key: \"setCallbacks\",\n value: function setCallbacks(callbacks) {\n this.callbacks = _objectSpread(_objectSpread({}, this.callbacks), callbacks);\n }\n // Настройка API хоста\n }, {\n key: \"setApiHost\",\n value: function setApiHost(apiHost) {\n this.apiHost = apiHost;\n }\n // Настройка roomId\n }, {\n key: \"setRoomId\",\n value: function setRoomId(roomId) {\n this.roomId = roomId;\n }\n }, {\n key: \"connectToUrl\",\n value: function connectToUrl(serverUrl) {\n if (this.connection == null) {\n this.connection = new Connection(serverUrl);\n this.setupConnectionHandlers();\n this.connection.connect('web');\n }\n }\n // Настройка обработчиков соединения\n }, {\n key: \"setupConnectionHandlers\",\n value: function setupConnectionHandlers() {\n var _this = this;\n if (!this.connection) return;\n // Обработчик для новых клиентов\n this.connection.setOnNewClient(function (data) {\n console.log('New client received:', data);\n _this.handleNewClient(data);\n });\n // Обработчик для удаления клиентов\n this.connection.setOnDeleteClient(function (data) {\n console.log('Delete client received:', data);\n _this.handleDeleteClient(data);\n });\n // Обработчик для закрытия сессии\n this.connection.setOnCloseSession(function (data) {\n console.log('Close session received:', data);\n _this.handleCloseSession(data);\n });\n // Обработчик для изменения статуса клиента\n this.connection.setOnClientStatus(function (data) {\n console.log('Client status received:', data);\n _this.handleClientStatus(data);\n });\n // Обработчик для состояния курсора\n this.connection.setOnCursorState(function (data) {\n console.log('Cursor state received:', data);\n _this.handleCursorState(data);\n });\n }\n // Обработка нового клиента\n }, {\n key: \"handleNewClient\",\n value: function handleNewClient(data) {\n var _this$callbacks$onNew, _this$callbacks;\n // Проверяем, не существует ли уже клиент с таким ID\n var existingClient = this.clients.find(function (client) {\n return client.clientId === data.clientId;\n });\n if (existingClient) {\n console.log(\"Client \".concat(data.clientId, \" already exists, updating status\"));\n this.updateClientStatus(data.clientId, 'connected');\n return;\n }\n // Создаем новый клиент\n var newClient = {\n clientId: data.clientId,\n name: data.name,\n type: data.clientType,\n clientType: data.clientType,\n sessions: [],\n isExpanded: false,\n isActive: false,\n status: 'connected'\n };\n // Добавляем клиента в список\n this.clients.push(newClient);\n // Уведомляем callback\n (_this$callbacks$onNew = (_this$callbacks = this.callbacks).onNewClient) === null || _this$callbacks$onNew === void 0 || _this$callbacks$onNew.call(_this$callbacks, newClient);\n console.log(\"New client added: \".concat(data.clientId, \" (\").concat(data.name, \")\"));\n }\n // Обработка удаления клиента\n }, {\n key: \"handleDeleteClient\",\n value: function handleDeleteClient(data) {\n var _this2 = this,\n _this$callbacks$onCli,\n _this$callbacks2;\n // Находим клиента для удаления\n var clientToDelete = this.clients.find(function (client) {\n return client.clientId === data.clientId;\n });\n if (!clientToDelete) {\n console.log(\"Client \".concat(data.clientId, \" not found for deletion\"));\n return;\n }\n // Закрываем все сессии клиента\n clientToDelete.sessions.forEach(function (session) {\n _this2.closeSession(clientToDelete.clientId, session.data.sessionId);\n });\n // Удаляем клиента из списка\n var clientIndex = this.clients.findIndex(function (client) {\n return client.clientId === data.clientId;\n });\n if (clientIndex !== -1) {\n this.clients.splice(clientIndex, 1);\n }\n // Уведомляем callback\n (_this$callbacks$onCli = (_this$callbacks2 = this.callbacks).onClientRemoved) === null || _this$callbacks$onCli === void 0 || _this$callbacks$onCli.call(_this$callbacks2, data.clientId);\n console.log(\"Client deleted: \".concat(data.clientId, \" (\").concat(data.name, \")\"));\n }\n // Обработка закрытия сессии\n }, {\n key: \"handleCloseSession\",\n value: function handleCloseSession(data) {\n var clientId = data.clientId,\n sessionId = data.sessionId;\n console.log(\"Handling close session: clientId=\".concat(clientId, \", sessionId=\").concat(sessionId));\n // Находим клиента\n var client = this.clients.find(function (c) {\n return c.clientId === clientId;\n });\n if (!client) {\n console.log(\"Client \".concat(clientId, \" not found for session closure\"));\n return;\n }\n // Находим сессию\n var session = client.sessions.find(function (s) {\n return s.data.sessionId === sessionId;\n });\n if (!session) {\n console.log(\"Session \".concat(sessionId, \" not found in client \").concat(clientId));\n return;\n }\n // Закрываем сессию\n console.log(\"Closing session \".concat(session.data.sessionId, \" (\").concat(sessionId, \") for client \").concat(clientId));\n this.closeSession(client.clientId, session.data.sessionId);\n }\n // Обработка изменения статуса клиента\n }, {\n key: \"handleClientStatus\",\n value: function handleClientStatus(data) {\n var clientId = data.clientId,\n status = data.status;\n console.log(\"Handling client status change: clientId=\".concat(clientId, \", status=\").concat(status));\n // Обновляем статус клиента\n this.updateClientStatus(clientId, status);\n }\n // Обработка состояния курсора\n }, {\n key: \"handleCursorState\",\n value: function handleCursorState(data) {\n var _this$callbacks$onCur, _this$callbacks3;\n var sessionId = data.sessionId,\n command = data.command,\n position = data.position;\n console.log(\"Handling cursor state: sessionId=\".concat(sessionId, \", command=\").concat(command, \", position=\").concat(position));\n // Проверяем, является ли эта сессия активной\n var activeSession = this.getActiveSession();\n if (!activeSession || activeSession.data.sessionId !== sessionId) {\n console.log(\"Cursor state received for inactive session: \".concat(sessionId));\n return;\n }\n // Уведомляем callback для отрисовки на UI (без изменения локального CommandBuilder)\n (_this$callbacks$onCur = (_this$callbacks3 = this.callbacks).onCursorState) === null || _this$callbacks$onCur === void 0 || _this$callbacks$onCur.call(_this$callbacks3, sessionId, command, position);\n }\n // Получение списка клиентов с сервера\n }, {\n key: \"getClients\",\n value: function () {\n var _getClients = terminal_tab_manager_asyncToGenerator(/*#__PURE__*/terminal_tab_manager_regenerator().m(function _callee() {\n var url, response, data, _data$clients$, _t;\n return terminal_tab_manager_regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n _context.p = 0;\n // Добавляем roomId в query параметры\n url = \"\".concat(this.apiHost, \"/api/connections\").concat(this.roomId ? \"?roomId=\".concat(this.roomId) : '');\n console.log(\"Fetching clients from: \".concat(url));\n _context.n = 1;\n return fetch(url);\n case 1:\n response = _context.v;\n if (response.ok) {\n _context.n = 2;\n break;\n }\n console.error(\"API request failed: \".concat(response.status, \" \").concat(response.statusText));\n return _context.a(2, []);\n case 2:\n _context.n = 3;\n return response.json();\n case 3:\n data = _context.v;\n // Отладочные логи\n console.log('API Response:', data);\n console.log('Clients from API:', data.clients);\n if (data.clients && data.clients.length > 0) {\n console.log('First client data:', data.clients[0]);\n console.log('First client sessions:', (_data$clients$ = data.clients[0]) === null || _data$clients$ === void 0 ? void 0 : _data$clients$.sessions);\n } else {\n console.log('No clients returned from API');\n }\n return _context.a(2, data.clients || []);\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error('Error fetching clients:', _t);\n return _context.a(2, []);\n }\n }, _callee, this, [[0, 4]]);\n }));\n function getClients() {\n return _getClients.apply(this, arguments);\n }\n return getClients;\n }() // Синхронизация состояния с сервером\n }, {\n key: \"syncWithServer\",\n value: function () {\n var _syncWithServer = terminal_tab_manager_asyncToGenerator(/*#__PURE__*/terminal_tab_manager_regenerator().m(function _callee2() {\n var _this3 = this;\n var currentClients, currentClientIds, existingClients, existingClientIds, _iterator, _step, _loop, _t2;\n return terminal_tab_manager_regenerator().w(function (_context3) {\n while (1) switch (_context3.p = _context3.n) {\n case 0:\n _context3.n = 1;\n return this.getClients();\n case 1:\n currentClients = _context3.v;\n currentClientIds = currentClients.map(function (c) {\n return c.clientId;\n });\n existingClients = this.clients;\n existingClientIds = existingClients.map(function (c) {\n return c.clientId;\n }).filter(Boolean); // Добавляем новых клиентов (только тех, которых еще нет)\n _iterator = terminal_tab_manager_createForOfIteratorHelper(currentClients);\n _context3.p = 2;\n _loop = /*#__PURE__*/terminal_tab_manager_regenerator().m(function _loop() {\n var client, _this3$callbacks$onNe, _this3$callbacks2, clientData, _iterator2, _step2, sessionData, clientTab;\n return terminal_tab_manager_regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n client = _step.value;\n if (!existingClientIds.includes(client.clientId)) {\n console.log(\"Creating new client: \".concat(client.clientId, \" (\").concat(client.name, \")\"));\n clientData = _this3.createClient(client.clientId, client.name, client.clientType); // Уведомляем о новом клиенте\n (_this3$callbacks$onNe = (_this3$callbacks2 = _this3.callbacks).onNewClient) === null || _this3$callbacks$onNe === void 0 || _this3$callbacks$onNe.call(_this3$callbacks2, clientData);\n // Создаем сессии для этого клиента\n if (client.sessions && client.sessions.length > 0) {\n console.log(\"Creating \".concat(client.sessions.length, \" sessions for client \").concat(client.clientId));\n _iterator2 = terminal_tab_manager_createForOfIteratorHelper(client.sessions);\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n sessionData = _step2.value;\n clientTab = _this3.clients.find(function (t) {\n return t.clientId === client.clientId;\n });\n if (clientTab) {\n _this3.createSessionFromServer(clientData.clientId, sessionData.id, sessionData.name);\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n }\n case 1:\n return _context2.a(2);\n }\n }, _loop);\n });\n _iterator.s();\n case 3:\n if ((_step = _iterator.n()).done) {\n _context3.n = 5;\n break;\n }\n return _context3.d(_regeneratorValues(_loop()), 4);\n case 4:\n _context3.n = 3;\n break;\n case 5:\n _context3.n = 7;\n break;\n case 6:\n _context3.p = 6;\n _t2 = _context3.v;\n _iterator.e(_t2);\n case 7:\n _context3.p = 7;\n _iterator.f();\n return _context3.f(7);\n case 8:\n // Удаляем клиентов, которых больше нет\n existingClients.forEach(function (client) {\n if (client.clientId && !currentClientIds.includes(client.clientId)) {\n var _this3$callbacks$onCl, _this3$callbacks;\n console.log(\"Removing client: \".concat(client.clientId));\n _this3.closeClient(client.clientId);\n (_this3$callbacks$onCl = (_this3$callbacks = _this3.callbacks).onClientRemoved) === null || _this3$callbacks$onCl === void 0 || _this3$callbacks$onCl.call(_this3$callbacks, client.clientId);\n }\n });\n case 9:\n return _context3.a(2);\n }\n }, _callee2, this, [[2, 6, 7, 8]]);\n }));\n function syncWithServer() {\n return _syncWithServer.apply(this, arguments);\n }\n return syncWithServer;\n }() // Запуск периодического обновления клиентов\n }, {\n key: \"startPolling\",\n value: function startPolling() {\n // Первоначальная синхронизация\n this.syncWithServer();\n }\n // Приватный метод для создания клиента - используется только внутренне при синхронизации с сервером\n }, {\n key: \"createClient\",\n value: function createClient(clientId) {\n var clientName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var clientType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'web';\n return this.createTab(clientId, clientName, clientType);\n }\n // Создание нового клиента (таба верхнего уровня) - приватный метод\n }, {\n key: \"createTab\",\n value: function createTab(clientId) {\n var clientName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var clientType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'web';\n console.log(\"TerminalTabManager.createTab called with clientId: \".concat(clientId, \", clientName: \").concat(clientName, \", clientType: \").concat(clientType));\n // Проверяем, не существует ли уже клиент с таким ID\n if (clientId) {\n var existingClient = this.clients.find(function (tab) {\n return tab.clientId === clientId;\n });\n if (existingClient) {\n console.log(\"Client already exists: \".concat(clientId, \", switching to it\"));\n this.switchToTab(existingClient.clientId);\n return existingClient;\n }\n }\n // const tabId = `client-${this.tabCounter++}`;\n var tabData = {\n clientId: clientId,\n name: clientName || \"Client \".concat(this.tabCounter),\n type: clientType,\n clientType: clientType,\n sessions: [],\n isExpanded: true,\n isActive: false,\n status: 'waiting'\n };\n console.log(\"Creating new client: \".concat(clientId, \" with clientId: \").concat(clientId || 'new'));\n console.log(\"TabData created:\", {\n id: tabData.clientId,\n clientId: tabData.clientId,\n name: tabData.name\n });\n this.clients.push(tabData);\n // Переключаемся на новый клиент только если это первый\n if (this.clients.length === 1) {\n // this.switchToTab(clientId);\n }\n return tabData;\n }\n // Приватный метод для создания сессии (общая логика)\n }, {\n key: \"createSessionInternal\",\n value: function createSessionInternal(clientId, sessionId, sessionName, source) {\n var _this$callbacks$onNew2, _this$callbacks4;\n var client = this.clients.find(function (tab) {\n return tab.clientId === clientId;\n });\n if (!client) {\n throw new Error(\"Client not found: \".concat(clientId));\n }\n //const clientTabId = client.tabId;\n // Проверяем, не существует ли уже сессия с таким ID (только для серверных сессий)\n if (source === 'server' && sessionId) {\n var existingSession = client.sessions.find(function (session) {\n return session.data.sessionId === sessionId;\n });\n if (existingSession) {\n console.log(\"Session already exists: \".concat(sessionId, \", switching to it\"));\n this.switchToSession(client.clientId, existingSession.data.sessionId);\n return existingSession;\n }\n }\n var sessionData = {\n data: {\n sessionId: sessionId,\n name: sessionName,\n clientId: clientId,\n status: 'waiting',\n isActive: false,\n sentKeysIndex: 0\n },\n terminalUi: null,\n terminalUiWriter: null,\n terminalManager: null,\n terminalDiv: null,\n fitAddon: null,\n linkAddon: null\n };\n var logMessage = source === 'ui' ? \"Creating new session: \".concat(sessionId, \" for client: \").concat(clientId) : \"Creating session from server: \".concat(sessionId, \" for client: \").concat(clientId);\n console.log(logMessage);\n client.sessions.push(sessionData);\n var clientTabId = client.clientId;\n // Создаем терминал для этой сессии\n this.createTerminalForSession(clientTabId, sessionData);\n // Уведомляем о новой сессии\n (_this$callbacks$onNew2 = (_this$callbacks4 = this.callbacks).onNewSession) === null || _this$callbacks$onNew2 === void 0 || _this$callbacks$onNew2.call(_this$callbacks4, clientId, sessionData);\n // Переключаемся на новую сессию\n this.switchToSession(client.clientId, sessionId);\n return sessionData;\n }\n // Создание новой сессии для клиента (вызывается из UI)\n }, {\n key: \"createNewSession\",\n value: function createNewSession(clientId) {\n var _this$connection;\n var sessionName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var client = this.clients.find(function (tab) {\n return tab.clientId === clientId;\n });\n if (!client) {\n throw new Error(\"Client not found: \".concat(clientId));\n }\n var finalSessionName = sessionName || \"Session \".concat(client.sessions.length + 1);\n var now = new Date().getTime();\n var sessionId = \"session-\".concat(now);\n var sessionData = this.createSessionInternal(client.clientId, sessionId, finalSessionName, 'ui');\n // Отправляем запрос на сервер для создания новой сессии\n (_this$connection = this.connection) === null || _this$connection === void 0 || _this$connection.sendNewSession(client.clientId, sessionId, sessionData.data.name);\n return sessionData;\n }\n // Создание сессии из данных сервера (вызывается при синхронизации)\n }, {\n key: \"createSessionFromServer\",\n value: function createSessionFromServer(clientId, sessionId, sessionName) {\n return this.createSessionInternal(clientId, sessionId, sessionName, 'server');\n }\n // Создание терминала для сессии\n }, {\n key: \"createTerminalForSession\",\n value: function createTerminalForSession(clientId, sessionData) {\n var _this4 = this,\n _sessionData$terminal2;\n var terminalContainer = document.getElementById('terminal-container');\n if (!terminalContainer) {\n throw new Error('Terminal container not found');\n }\n // Создаем контейнер для терминала\n var terminalDiv = document.createElement('div');\n terminalDiv.id = \"terminal-\".concat(sessionData.data.sessionId);\n terminalDiv.style.display = 'none';\n terminalDiv.style.width = '100%';\n terminalDiv.style.height = '100%';\n terminalDiv.style.position = 'absolute';\n terminalDiv.style.top = '0';\n terminalDiv.style.left = '0';\n terminalContainer.appendChild(terminalDiv);\n // Создаем TerminalUi\n var terminalUi = new xterm.Terminal({\n cursorBlink: true,\n fontFamily: 'Courier New, monospace',\n fontSize: 14,\n theme: {\n background: '#000000',\n foreground: '#ffffff'\n }\n });\n // Добавляем addon'ы\n var fitAddon = new addon_fit.FitAddon();\n var linkAddon = new addon_web_links.WebLinksAddon();\n terminalUi.loadAddon(fitAddon);\n terminalUi.loadAddon(linkAddon);\n terminalUi.open(terminalDiv);\n // Сохраняем ссылки на addon'ы\n sessionData.fitAddon = fitAddon;\n sessionData.linkAddon = linkAddon;\n sessionData.terminalUi = terminalUi;\n sessionData.terminalDiv = terminalDiv;\n // Создаем TerminalUiWriter для согласованной отрисовки\n sessionData.terminalUiWriter = new TerminalUiWriter(terminalUi);\n // Создаем TerminalManager с интеграцией xterm.js\n var terminalManager = new TerminalManager({\n connection: this.connection,\n sessionId: sessionData.data.sessionId,\n clientName: sessionData.data.name,\n autoConnect: false,\n // Не подключаемся автоматически\n autoConnectDelay: 1000,\n workMode: 'local'\n });\n // Устанавливаем handlers через отдельный метод\n terminalManager.setHandlers({\n onData: function onData(data) {\n console.log(\"Session \".concat(sessionData.data.sessionId, \" received data:\"), data);\n // todo replace \\n to \\r\\n\n data = data.replace(/\\n/g, '\\r\\n');\n // Выводим данные в xterm.js через TerminalUiWriter\n if (sessionData.terminalUiWriter) {\n sessionData.terminalUiWriter.writeText(data);\n }\n },\n onError: function onError(error) {\n // Выводим ошибки в xterm.js через TerminalUiWriter\n if (sessionData.terminalUiWriter) {\n sessionData.terminalUiWriter.writeError(error);\n }\n },\n onConnect: function onConnect() {\n _this4.updateSessionConnectionStatus(clientId, sessionData.data.sessionId, 'connected');\n console.log(\"Session \".concat(sessionData.data.sessionId, \" connected to server\"));\n },\n onDisconnect: function onDisconnect() {\n _this4.updateSessionConnectionStatus(clientId, sessionData.data.sessionId, 'disconnected');\n console.log(\"Session \".concat(sessionData.data.sessionId, \" disconnected from server\"));\n },\n onMessage: function onMessage(message) {\n console.log(\"Session \".concat(sessionData.data.sessionId, \" received message:\"), message);\n // Обрабатываем сообщения от сервера\n if (message.event === \"sendKey\" && message.data && message.data.keys) {\n // Отправляем символы в TerminalManager\n terminalManager.write(message.data.keys);\n }\n },\n onCursorState: function onCursorState(sessionId, command, position) {\n // Используем TerminalUiWriter для согласованной отрисовки\n if (sessionData.terminalUiWriter) {\n sessionData.terminalUiWriter.write(command, position);\n }\n }\n });\n // Сохраняем TerminalManager\n sessionData.terminalManager = terminalManager;\n // Обработчик ввода в TerminalUi\n terminalUi.onData(function (data) {\n // Отправляем ввод в TerminalManager\n terminalManager.write(data);\n });\n // Обработчик изменения размера терминала\n terminalUi.onResize(function (size) {\n var _sessionData$terminal;\n // Отправляем новый размер на сервер через TerminalManager\n var connection = (_sessionData$terminal = sessionData.terminalManager) === null || _sessionData$terminal === void 0 ? void 0 : _sessionData$terminal.connection;\n if (connection) {\n var msg = {\n event: \"resize\",\n target: sessionData.data.sessionId,\n data: {\n cols: size.cols,\n rows: size.rows\n }\n };\n // connection.sendMessage(msg);\n }\n });\n // Выводим приветственное сообщение\n //this.printWelcomeMessage(clientId, sessionData.data.tabId);\n // Подключаемся к серверу через TerminalManager\n (_sessionData$terminal2 = sessionData.terminalManager) === null || _sessionData$terminal2 === void 0 || _sessionData$terminal2.connect('web');\n }\n // Вывод приветственного сообщения\n }, {\n key: \"printWelcomeMessage\",\n value: function printWelcomeMessage(clientId, sessionId) {\n var client = this.clients.find(function (t) {\n return t.clientId === clientId;\n });\n if (!client) return;\n var session = client.sessions.find(function (s) {\n return s.data.sessionId === sessionId;\n });\n if (!session || !session.terminalUiWriter) return;\n // session.terminalUiWriter.writeLine(\"Hello from JavaScript Terminal!\");\n // session.terminalUiWriter.writeLine(\"Type 'help' for available commands\");\n // session.terminalUiWriter.writeLine(\"Use test controls in top-right corner\");\n // session.terminalUiWriter.writeLine(\"\");\n }\n // Обновление статуса подключения сессии\n }, {\n key: \"updateSessionConnectionStatus\",\n value: function updateSessionConnectionStatus(clientId, sessionId, status) {\n var client = this.clients.find(function (t) {\n return t.clientId === clientId;\n });\n if (client) {\n var session = client.sessions.find(function (s) {\n return s.data.sessionId === sessionId;\n });\n if (session) {\n var _this$callbacks$onSes, _this$callbacks5;\n session.data.status = status;\n // Уведомляем об изменении статуса сессии\n (_this$callbacks$onSes = (_this$callbacks5 = this.callbacks).onSessionStatusChanged) === null || _this$callbacks$onSes === void 0 || _this$callbacks$onSes.call(_this$callbacks5, clientId, sessionId, status);\n }\n }\n }\n // Обновление статуса клиента\n }, {\n key: \"updateClientStatus\",\n value: function updateClientStatus(clientId, status) {\n var client = this.clients.find(function (c) {\n return c.clientId === clientId;\n });\n if (client) {\n var _this$callbacks$onCli2, _this$callbacks6;\n client.status = status;\n // Уведомляем об изменении статуса клиента\n (_this$callbacks$onCli2 = (_this$callbacks6 = this.callbacks).onClientStatusChanged) === null || _this$callbacks$onCli2 === void 0 || _this$callbacks$onCli2.call(_this$callbacks6, clientId, status);\n }\n }\n // Переключение на клиента\n }, {\n key: \"switchToTab\",\n value: function switchToTab(clientId) {\n var _this$callbacks$onAct, _this$callbacks7;\n console.log('TerminalTabManager.switchToTab called with:', clientId);\n var clientIndex = this.clients.findIndex(function (tab) {\n return tab.clientId === clientId;\n });\n console.log('Found client index:', clientIndex);\n if (clientIndex === -1) return;\n var client = this.clients[clientIndex];\n if (!client) return;\n // Скрываем все терминалы\n this.clients.forEach(function (client) {\n client.sessions.forEach(function (session) {\n session.data.isActive = false;\n });\n client.isActive = false;\n });\n // Показываем выбранного клиента\n var activeClient = this.clients[clientIndex];\n if (!activeClient) return;\n console.log('Setting active client:', activeClient.clientId, activeClient.name);\n // Уведомляем об изменении активного клиента\n console.log('Calling onActiveClientChanged callback with:', activeClient);\n (_this$callbacks$onAct = (_this$callbacks7 = this.callbacks).onActiveClientChanged) === null || _this$callbacks$onAct === void 0 || _this$callbacks$onAct.call(_this$callbacks7, activeClient); // todo fix secuence calling before calling onNewClient\n // Показываем первую активную сессию или первую сессию\n var activeSession = activeClient.sessions.find(function (s) {\n return s.data.isActive;\n }) || activeClient.sessions[0];\n if (activeSession) {\n this.switchToSession(client.clientId, activeSession.data.sessionId);\n }\n // Устанавливаем активного клиента\n this.activeTabIndex = clientIndex;\n activeClient.isActive = true;\n }\n // Переключение на сессию\n }, {\n key: \"switchToSession\",\n value: function switchToSession(clientId, sessionId) {\n var _this$callbacks$onAct2, _this$callbacks8;\n var client = this.clients.find(function (tab) {\n return tab.clientId === clientId;\n });\n if (!client) return;\n var session = client.sessions.find(function (s) {\n return s.data.sessionId === sessionId;\n });\n if (!session) return;\n // Скрываем все терминалы\n this.clients.forEach(function (client) {\n client.sessions.forEach(function (session) {\n session.data.isActive = false;\n });\n });\n // Устанавливаем активную сессию\n session.data.isActive = true;\n // Уведомляем об изменении активной сессии\n (_this$callbacks$onAct2 = (_this$callbacks8 = this.callbacks).onActiveSessionChanged) === null || _this$callbacks$onAct2 === void 0 || _this$callbacks$onAct2.call(_this$callbacks8, session);\n // Фокусируемся на TerminalUi\n if (session.terminalUi) {\n session.terminalUi.focus();\n setTimeout(function () {\n if (session.fitAddon) {\n session.fitAddon.fit();\n }\n }, 100);\n }\n }\n // Закрытие клиента\n }, {\n key: \"closeClient\",\n value: function closeClient(clientId) {\n var _this5 = this,\n _this$callbacks$onCli3,\n _this$callbacks9;\n var clientIndex = this.clients.findIndex(function (tab) {\n return tab.clientId === clientId;\n });\n if (clientIndex === -1) return;\n var client = this.clients[clientIndex];\n if (!client) return;\n // Уничтожаем все сессии клиента\n client.sessions.forEach(function (session) {\n var _this5$callbacks$onSe, _this5$callbacks;\n _this5.destroySession(session);\n (_this5$callbacks$onSe = (_this5$callbacks = _this5.callbacks).onSessionRemoved) === null || _this5$callbacks$onSe === void 0 || _this5$callbacks$onSe.call(_this5$callbacks, clientId, session.data.sessionId);\n });\n // Удаляем из массива\n this.clients.splice(clientIndex, 1);\n // Уведомляем об удалении клиента\n (_this$callbacks$onCli3 = (_this$callbacks9 = this.callbacks).onClientRemoved) === null || _this$callbacks$onCli3 === void 0 || _this$callbacks$onCli3.call(_this$callbacks9, client.clientId);\n // Если закрыли активного клиента, переключаемся на другого\n if (clientIndex === this.activeTabIndex) {\n if (this.clients.length > 0) {\n var newActiveIndex = Math.min(clientIndex, this.clients.length - 1);\n var newClient = this.clients[newActiveIndex];\n if (newClient) {\n this.switchToTab(newClient.clientId);\n }\n }\n } else if (clientIndex < this.activeTabIndex) {\n this.activeTabIndex--;\n }\n }\n // Закрытие сессии\n }, {\n key: \"closeSession\",\n value: function closeSession(clientId, sessionId) {\n var _this$callbacks$onSes2, _this$callbacks0;\n var client = this.clients.find(function (tab) {\n return tab.clientId === clientId;\n });\n if (!client) return;\n var sessionIndex = client.sessions.findIndex(function (s) {\n return s.data.sessionId === sessionId;\n });\n if (sessionIndex === -1) return;\n var session = client.sessions[sessionIndex];\n if (!session) return;\n // Уничтожаем сессию\n this.destroySession(session);\n // Удаляем из массива\n client.sessions.splice(sessionIndex, 1);\n // Уведомляем об удалении сессии\n (_this$callbacks$onSes2 = (_this$callbacks0 = this.callbacks).onSessionRemoved) === null || _this$callbacks$onSes2 === void 0 || _this$callbacks$onSes2.call(_this$callbacks0, clientId, sessionId);\n // Если это была последняя сессия клиента, закрываем клиента\n if (client.sessions.length === 0) {\n this.closeClient(clientId);\n return;\n }\n // Если закрыли активную сессию, переключаемся на другую\n if (session.data.isActive) {\n var newActiveSession = client.sessions[Math.min(sessionIndex, client.sessions.length - 1)];\n if (newActiveSession) {\n this.switchToSession(clientId, newActiveSession.data.sessionId);\n }\n }\n }\n // Уничтожение сессии\n }, {\n key: \"destroySession\",\n value: function destroySession(session) {\n var _this$callbacks$onRem, _this$callbacks1;\n // Уничтожаем TerminalManager\n if (session.terminalManager) {\n session.terminalManager.destroy();\n }\n // Уничтожаем TerminalUiWriter\n if (session.terminalUiWriter) {\n session.terminalUiWriter.destroy();\n }\n // Уничтожаем TerminalUi\n if (session.terminalUi) {\n session.terminalUi.dispose();\n }\n // Удаляем DOM элемент терминала через callback\n (_this$callbacks$onRem = (_this$callbacks1 = this.callbacks).onRemoveTerminalDOM) === null || _this$callbacks$onRem === void 0 || _this$callbacks$onRem.call(_this$callbacks1, session.data.sessionId);\n }\n // Переключение развернутости клиента (заглушка для совместимости)\n }, {\n key: \"toggleClientExpansion\",\n value: function toggleClientExpansion(clientId) {\n // В упрощенной структуре развертывание не используется\n // Сессии отображаются в отдельном контейнере\n console.log('Toggle expansion not implemented in simplified structure');\n }\n // Получение активной сессии\n }, {\n key: \"getActiveSession\",\n value: function getActiveSession() {\n var activeClient = this.clients[this.activeTabIndex];\n if (!activeClient) return null;\n return activeClient.sessions.find(function (s) {\n return s.data.isActive;\n }) || null;\n }\n // Получение активного клиента\n }, {\n key: \"getActiveClient\",\n value: function getActiveClient() {\n return this.clients[this.activeTabIndex] || null;\n }\n // Получение всех клиентов\n }, {\n key: \"getAllClients\",\n value: function getAllClients() {\n return _toConsumableArray(this.clients);\n }\n // Получение всех сессий клиента\n }, {\n key: \"getClientSessions\",\n value: function getClientSessions(clientId) {\n var client = this.clients.find(function (tab) {\n return tab.clientId === clientId;\n });\n return client ? _toConsumableArray(client.sessions) : [];\n }\n }, {\n key: \"sendHotKey\",\n value: function sendHotKey(data) {\n if (this.callbacks.onHotKey) {\n this.callbacks.onHotKey(data);\n }\n }\n // Инициализация менеджера табов\n }, {\n key: \"initialize\",\n value: function initialize() {\n var _this6 = this;\n // Обработчик изменения размера окна\n window.addEventListener(\"resize\", function () {\n var activeSession = _this6.getActiveSession();\n if (activeSession && activeSession.fitAddon) {\n setTimeout(function () {\n var _activeSession$fitAdd;\n (_activeSession$fitAdd = activeSession.fitAddon) === null || _activeSession$fitAdd === void 0 || _activeSession$fitAdd.fit();\n }, 100);\n }\n });\n // Обработчик закрытия страницы\n window.onbeforeunload = function () {\n _this6.clients.forEach(function (client) {\n client.sessions.forEach(function (session) {\n if (session.terminalManager) {\n session.terminalManager.destroy();\n }\n if (session.terminalUiWriter) {\n session.terminalUiWriter.destroy();\n }\n });\n });\n };\n }\n }]);\n}(); // Экспортируем класс для использования в других модулях\n\n;// ./src/ts/index.ts\nfunction ts_typeof(o) { \"@babel/helpers - typeof\"; return ts_typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, ts_typeof(o); }\nfunction ts_regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return ts_regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (ts_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, ts_regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, ts_regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), ts_regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", ts_regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), ts_regeneratorDefine2(u), ts_regeneratorDefine2(u, o, \"Generator\"), ts_regeneratorDefine2(u, n, function () { return this; }), ts_regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (ts_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction ts_regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } ts_regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { ts_regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, ts_regeneratorDefine2(e, r, n, t); }\nfunction ts_asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction ts_asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { ts_asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { ts_asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction ts_classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction ts_defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, ts_toPropertyKey(o.key), o); } }\nfunction ts_createClass(e, r, t) { return r && ts_defineProperties(e.prototype, r), t && ts_defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction ts_toPropertyKey(t) { var i = ts_toPrimitive(t, \"string\"); return \"symbol\" == ts_typeof(i) ? i : i + \"\"; }\nfunction ts_toPrimitive(t, r) { if (\"object\" != ts_typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != ts_typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n// Экспортируем TerminalUiWriter для использования в других модулях\n\n\n/**\n * Основной класс приложения терминала\n * Инкапсулирует всю логику управления табами и сессиями\n */\nvar TerminalApp = /*#__PURE__*/function () {\n function TerminalApp() {\n ts_classCallCheck(this, TerminalApp);\n // Глобальные переменные из шаблона\n this.fontFamily = \"\";\n this.fontSize = \"\";\n this.clientName = \"Union Terminal\";\n this.wsUrl = 'ws://127.0.0.1:8002/ws';\n this.apiHost = '{schame}://127.0.0.1:8002';\n this.isDebug = true;\n this.roomId = '';\n this.clientId = '';\n this.draggedElement = null;\n console.log(\"Is debug : \".concat(this.isDebug));\n // Проверяем и настраиваем roomId (делает redirect если нужно)\n var roomIdResult = this.checkAndSetupRoomId();\n if (roomIdResult === null) {\n // Произошел redirect, прерываем инициализацию\n // return;\n }\n this.roomId = roomIdResult;\n // Получаем или генерируем clientId\n this.clientId = this.getOrGenerateClientId();\n console.log('TerminalApp initialized with roomId:', this.roomId, 'clientId:', this.clientId, 'debug:', this.isDebug);\n // Инициализируем опции терминала\n this.terminalOptions = {\n cursorBlink: true\n };\n if (this.fontFamily) {\n this.terminalOptions.fontFamily = this.fontFamily;\n }\n if (this.fontSize) {\n this.terminalOptions.fontSize = parseInt(this.fontSize);\n }\n if (this.isDebug) {\n // Если шаблон не заменен, используем fallback\n this.wsUrl = \"ws://localhost:9999/ws?roomId=\".concat(this.roomId, \"&clientId=\").concat(this.clientId, \"&clientType=web\");\n } else {\n this.wsUrl = \"ws://\".concat(document.location.host, \"/ws?roomId=\").concat(this.roomId, \"&clientId=\").concat(this.clientId, \"&clientType=web\");\n }\n if (this.isDebug) {\n // Если шаблон не заменен, используем fallback\n this.apiHost = 'http://localhost:9999';\n } else {\n this.apiHost = \"\".concat(document.location.protocol, \"//\").concat(document.location.host);\n }\n // Инициализируем TerminalTabManager\n this.tabManager = new TerminalTabManager();\n // Настраиваем API хост\n this.tabManager.setApiHost(this.apiHost);\n // Настраиваем roomId для фильтрации клиентов\n this.tabManager.setRoomId(this.roomId);\n // Настраиваем callbacks для обновления UI\n this.setupTabManagerCallbacks();\n this.tabManager.connectToUrl(this.wsUrl);\n }\n /**\n * Проверяет и настраивает roomId в URL\n * Возвращает roomId или null если произошел redirect\n */\n return ts_createClass(TerminalApp, [{\n key: \"checkAndSetupRoomId\",\n value: function checkAndSetupRoomId() {\n var urlParams = new URLSearchParams(window.location.search);\n var path = window.location.pathname;\n var roomId = '';\n // Определяем откуда брать roomId в зависимости от режима отладки\n if (roomId == '') {\n // В режиме отладки используем query параметр\n roomId = urlParams.get('roomId') || '';\n console.log('Debug mode: extracting roomId from query parameter:', roomId);\n }\n if (roomId == '') {\n // В production используем path параметр\n roomId = path.substring(1); // Убираем первый слеш\n console.log('Production mode: extracting roomId from path:', roomId);\n }\n if (!IdGenerator.isValidId(roomId)) {\n roomId = '';\n }\n // Если roomId нет в URL или это пустая строка\n if (!roomId || roomId === '') {\n // Пытаемся получить сохраненный roomId из localStorage\n var savedRoomId = localStorage.getItem('roomId');\n if (savedRoomId) {\n roomId = savedRoomId;\n }\n // Если нет сохраненного, генерируем новый\n if (!IdGenerator.isValidId(savedRoomId || '')) {\n savedRoomId = IdGenerator.generateId();\n localStorage.setItem('roomId', savedRoomId);\n console.log('Generated new roomId:', savedRoomId);\n if (savedRoomId) {\n roomId = savedRoomId;\n }\n } else {\n console.log('Using saved roomId:', savedRoomId);\n }\n // Делаем redirect на URL с roomId в зависимости от режима\n if (this.isDebug) {\n // В режиме отладки используем query параметр\n // window.location.href = `/?roomId=${savedRoomId}`;\n } else {\n // В production используем path параметр\n //window.location.href = `/${savedRoomId}`;\n }\n return roomId; // Возвращаем null чтобы указать что был redirect\n }\n // Сохраняем roomId в localStorage\n localStorage.setItem('roomId', roomId);\n console.log('Current roomId:', roomId, 'Debug mode:', this.isDebug);\n return roomId;\n }\n /**\n * Получает или генерирует clientId\n */\n }, {\n key: \"getOrGenerateClientId\",\n value: function getOrGenerateClientId() {\n // Пытаемся получить сохраненный clientId\n var clientId = localStorage.getItem('clientId');\n // Если нет сохраненного, генерируем новый\n if (!clientId) {\n clientId = IdGenerator.generateId();\n localStorage.setItem('clientId', clientId);\n console.log('Generated new clientId:', clientId);\n } else {\n console.log('Using saved clientId:', clientId);\n }\n return clientId;\n }\n /**\n * Настройка callbacks для TerminalTabManager\n */\n }, {\n key: \"setupTabManagerCallbacks\",\n value: function setupTabManagerCallbacks() {\n var _this = this;\n var callbacks = {\n onNewClient: function onNewClient(client) {\n console.log('New client callback:', client);\n _this.createClientDOM(client);\n },\n onClientRemoved: function onClientRemoved(clientId) {\n console.log('Client removed callback:', clientId);\n _this.removeClientDOM(clientId);\n // Если больше нет клиентов, показываем инструкции\n var allClients = _this.tabManager.getAllClients();\n if (allClients.length === 0) {\n _this.showClientInstructions();\n }\n },\n onNewSession: function onNewSession(clientId, session) {\n console.log('New session callback:', clientId, session);\n // Проверяем, является ли клиент активным\n var activeClient = _this.tabManager.getActiveClient();\n if (activeClient && activeClient.clientId === clientId) {\n _this.createSessionDOM(clientId, session);\n // Обновляем активную сессию в DOM\n _this.updateActiveSessionDOM(session);\n }\n },\n onSessionRemoved: function onSessionRemoved(clientId, sessionId) {\n console.log('Session removed callback:', clientId, sessionId);\n _this.removeSessionDOM(sessionId);\n // Обновляем отображение сессий для активного клиента\n var activeClient = _this.tabManager.getActiveClient();\n if (activeClient && activeClient.clientId === clientId) {\n _this.updateSessionsDOM(activeClient);\n }\n },\n onClientStatusChanged: function onClientStatusChanged(clientId, status) {\n console.log('Client status changed callback:', clientId, status);\n _this.updateClientStatusDOM(clientId, status);\n },\n onSessionStatusChanged: function onSessionStatusChanged(clientId, sessionId, status) {\n console.log('Session status changed callback:', clientId, sessionId, status);\n _this.updateSessionStatusDOM(sessionId, status);\n },\n onActiveClientChanged: function onActiveClientChanged(client) {\n console.log('Active client changed callback:', client);\n console.log('Client ID:', client === null || client === void 0 ? void 0 : client.clientId, 'Client name:', client === null || client === void 0 ? void 0 : client.name);\n _this.updateActiveClientDOM(client);\n // Обновляем отображение сессий для активного клиента\n _this.updateSessionsDOM(client);\n if (client) {\n // Скрываем инструкции при переключении на существующего клиента\n _this.hideClientInstructions();\n } else {\n // Если нет активного клиента, показываем инструкции\n _this.showClientInstructions();\n }\n },\n onActiveSessionChanged: function onActiveSessionChanged(session) {\n console.log('Active session changed callback:', session);\n _this.updateActiveSessionDOM(session);\n // Скрываем все терминалы\n _this.hideAllTerminals();\n // Показываем активный терминал\n if (session) {\n _this.showTerminal(session);\n }\n },\n onCursorState: function onCursorState(sessionId, command, position) {\n console.log('Cursor state callback:', {\n sessionId: sessionId,\n command: command,\n position: position\n });\n _this.handleCursorStateUpdate(sessionId, command, position);\n },\n onRemoveTerminalDOM: function onRemoveTerminalDOM(sessionId) {\n console.log('Remove terminal DOM callback:', sessionId);\n _this.removeTerminalDOM(sessionId);\n }\n };\n this.tabManager.setCallbacks(callbacks);\n }\n /**\n * Инициализирует инструкции для подключения клиентов\n * Заменяет плейсхолдеры и настраивает кнопки копирования\n */\n }, {\n key: \"initializeClientInstructions\",\n value: function initializeClientInstructions() {\n var _this2 = this;\n var currentHost = window.location.host;\n var hostParts = currentHost.split(':');\n var hostname = hostParts[0] || 'localhost';\n var port = hostParts[1];\n // Если порт не указан, используем стандартные порты\n var defaultPort = window.location.protocol === 'https:' ? '443' : '80';\n var finalPort = port || defaultPort;\n // Находим все элементы с плейсхолдерами\n var commandBoxes = document.querySelectorAll('.command-box');\n commandBoxes.forEach(function (box) {\n var commandTextElement = box.querySelector('.command-text');\n if (!commandTextElement) return;\n var textContent = commandTextElement.textContent;\n if (!textContent) return;\n // Проверяем, есть ли еще плейсхолдеры\n if (textContent.includes('{server}') || textContent.includes('{port}') || textContent.includes('{roomId}')) {\n // Заменяем плейсхолдеры на актуальные значения\n var updatedText = textContent.replace(/{server}/g, hostname).replace(/{port}/g, finalPort).replace(/{roomId}/g, _this2.roomId);\n // Обновляем текст команды\n commandTextElement.textContent = updatedText;\n }\n // Устанавливаем обработчик кнопки копирования для всех кнопок\n var copyBtn = box.querySelector('.copy-btn');\n if (copyBtn) {\n copyBtn.addEventListener('click', function () {\n var currentText = commandTextElement.textContent || '';\n _this2.copyToClipboard(currentText);\n });\n }\n });\n console.log('Instructions initialized with host:', currentHost, 'roomId:', this.roomId);\n }\n /**\n * Копирует текст в буфер обмена\n */\n }, {\n key: \"copyToClipboard\",\n value: function copyToClipboard(text) {\n navigator.clipboard.writeText(text).then(function () {\n console.log('Command copied to clipboard:', text);\n })[\"catch\"](function (err) {\n console.error('Failed to copy to clipboard:', err);\n // Fallback для старых браузеров\n var textArea = document.createElement('textarea');\n textArea.value = text;\n document.body.appendChild(textArea);\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n });\n }\n /**\n * Инициализирует приложение\n */\n }, {\n key: \"initialize\",\n value: (function () {\n var _initialize = ts_asyncToGenerator(/*#__PURE__*/ts_regenerator().m(function _callee() {\n return ts_regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n // Инициализируем TerminalTabManager\n this.tabManager.initialize();\n // Настраиваем обработчики событий\n this.setupEventHandlers();\n // Инициализируем инструкции подключения\n this.initializeClientInstructions();\n // Показываем инструкции по умолчанию (пока нет клиентов)\n this.showClientInstructions();\n // Запускаем периодическое обновление клиентов\n this.tabManager.startPolling();\n case 1:\n return _context.a(2);\n }\n }, _callee, this);\n }));\n function initialize() {\n return _initialize.apply(this, arguments);\n }\n return initialize;\n }()\n /**\n * Создание DOM элемента для клиента\n */\n )\n }, {\n key: \"createClientDOM\",\n value: function createClientDOM(clientData) {\n var _this3 = this;\n var tabsContainer = document.getElementById('clients');\n var newTabBtn = document.getElementById('new-client-btn');\n if (!tabsContainer || !newTabBtn) {\n throw new Error('Required DOM elements not found');\n }\n // Создаем элемент клиента (соответствует существующему HTML)\n var clientElement = document.createElement('div');\n clientElement.className = 'client';\n clientElement.id = \"\".concat(clientData.clientId);\n clientElement.draggable = true;\n console.log('Creating client DOM element with ID:', \"\".concat(clientData.clientId), 'for client:', clientData);\n clientElement.innerHTML = \"\\n \\n \").concat(clientData.name, \"\\n (\").concat(clientData.clientType, \")\\n \\n \");\n // Обработчик клика на клиента (переключение)\n clientElement.onclick = function (event) {\n // Проверяем, что клик не по кнопке закрытия\n if (!event.target.classList.contains('client-close')) {\n console.log('Client clicked:', clientData.clientId, clientData.name);\n _this3.tabManager.switchToTab(clientData.clientId);\n }\n };\n // Обработчик клика на кнопку закрытия\n var closeButton = clientElement.querySelector('.client-close');\n if (closeButton) {\n closeButton.onclick = function (event) {\n event.stopPropagation(); // Предотвращаем всплытие события\n _this3.closeClient(clientData.clientId || clientData.clientId);\n };\n }\n // Drag and drop обработчики\n this.setupDragAndDrop(clientElement, 'client');\n tabsContainer.insertBefore(clientElement, newTabBtn);\n }\n /**\n * Удаление DOM элемента клиента\n */\n }, {\n key: \"removeClientDOM\",\n value: function removeClientDOM(clientId) {\n var clientElement = document.getElementById(clientId);\n if (clientElement) {\n clientElement.remove();\n }\n }\n /**\n * Создание DOM элемента для сессии\n */\n }, {\n key: \"createSessionDOM\",\n value: function createSessionDOM(clientId, sessionData) {\n var _this4 = this;\n var sessionsContainer = document.getElementById('sessions');\n var newSessionBtn = document.getElementById('new-session-btn');\n if (!sessionsContainer || !newSessionBtn) return;\n var sessionElement = document.createElement('div');\n sessionElement.className = 'session';\n sessionElement.id = \"session-\".concat(sessionData.data.sessionId);\n sessionElement.draggable = true;\n sessionElement.innerHTML = \"\\n \\n \").concat(sessionData.data.name, \"\\n \\n \");\n // Обработчик клика на сессию (переключение)\n sessionElement.onclick = function (event) {\n // Проверяем, что клик не по кнопке закрытия\n if (!event.target.classList.contains('session-close')) {\n _this4.tabManager.switchToSession(clientId, sessionData.data.sessionId);\n }\n };\n // Обработчик клика на кнопку закрытия\n var closeButton = sessionElement.querySelector('.session-close');\n if (closeButton) {\n closeButton.onclick = function (event) {\n event.stopPropagation(); // Предотвращаем всплытие события\n _this4.closeSession(clientId, sessionData.data.sessionId);\n };\n }\n // Drag and drop обработчики\n this.setupDragAndDrop(sessionElement, 'session');\n sessionsContainer.insertBefore(sessionElement, newSessionBtn);\n }\n /**\n * Удаление DOM элемента сессии\n */\n }, {\n key: \"removeSessionDOM\",\n value: function removeSessionDOM(sessionId) {\n var sessionElement = document.getElementById(\"session-\".concat(sessionId));\n if (sessionElement) {\n sessionElement.remove();\n }\n }\n /**\n * Обновление статуса клиента в DOM\n */\n }, {\n key: \"updateClientStatusDOM\",\n value: function updateClientStatusDOM(clientId, status) {\n var statusElement = document.getElementById(\"client-status-\".concat(clientId));\n if (!statusElement) return;\n switch (status) {\n case 'connected':\n statusElement.style.background = '#4CAF50';\n break;\n case 'disconnected':\n statusElement.style.background = '#f44336';\n break;\n case 'waiting':\n statusElement.style.background = '#FF9800';\n break;\n default:\n statusElement.style.background = '#666';\n }\n }\n /**\n * Обновление статуса сессии в DOM\n */\n }, {\n key: \"updateSessionStatusDOM\",\n value: function updateSessionStatusDOM(sessionId, status) {\n var statusElement = document.getElementById(\"session-status-\".concat(sessionId));\n if (!statusElement) return;\n switch (status) {\n case 'connected':\n statusElement.style.background = '#4CAF50';\n break;\n case 'disconnected':\n statusElement.style.background = '#f44336';\n break;\n case 'waiting':\n statusElement.style.background = '#FF9800';\n break;\n default:\n statusElement.style.background = '#666';\n }\n }\n /**\n * Обновление активного клиента в DOM\n */\n }, {\n key: \"updateActiveClientDOM\",\n value: function updateActiveClientDOM(client) {\n var _this5 = this;\n console.log('updateActiveClientDOM called with client:', client);\n // Убираем активный класс со всех клиентов\n document.querySelectorAll('.client').forEach(function (tab) {\n tab.classList.remove('active');\n });\n if (client) {\n // Используем client.id (внутренний ID), а не client.clientId\n var clientElement = document.getElementById(client.clientId);\n console.log('Looking for client element with ID:', \"\".concat(client.clientId), 'Found:', clientElement);\n if (clientElement) {\n // Добавляем активный класс\n clientElement.classList.add('active');\n console.log('Added active class to:', clientElement.id);\n // Обновляем содержимое элемента (синхронизация с createClientDOM)\n var statusElement = clientElement.querySelector('.client-status');\n var nameElement = clientElement.querySelector('.client-name');\n var typeElement = clientElement.querySelector('.client-type');\n if (statusElement) {\n // Обновляем ID статуса для корректной работы updateClientStatusDOM\n statusElement.id = \"client-status-\".concat(client.clientId);\n }\n if (nameElement) {\n nameElement.textContent = client.name;\n }\n if (typeElement) {\n typeElement.textContent = \"(\".concat(client.clientType, \")\");\n }\n // Обновляем обработчики событий (синхронизация с createClientDOM)\n clientElement.onclick = function (event) {\n if (!event.target.classList.contains('client-close')) {\n console.log('Client clicked:', client.clientId, client.name);\n _this5.tabManager.switchToTab(client.clientId);\n }\n };\n var closeButton = clientElement.querySelector('.client-close');\n if (closeButton) {\n closeButton.onclick = function (event) {\n event.stopPropagation();\n _this5.closeClient(client.clientId);\n };\n }\n } else {\n console.error('Client element not found for ID:', \"\".concat(client.clientId));\n // Отладочная информация\n var allClients = document.querySelectorAll('.client');\n console.log('All client elements found:', Array.from(allClients).map(function (el) {\n return el.id;\n }));\n }\n } else {\n console.log('No active client, all clients deactivated');\n }\n }\n /**\n * Обновление активной сессии в DOM\n */\n }, {\n key: \"updateActiveSessionDOM\",\n value: function updateActiveSessionDOM(session) {\n // Убираем активный класс со всех сессий\n document.querySelectorAll('.session').forEach(function (tab) {\n tab.classList.remove('active');\n });\n if (session) {\n var sessionElement = document.getElementById(\"session-\".concat(session.data.sessionId));\n if (sessionElement) {\n sessionElement.classList.add('active');\n }\n }\n }\n /**\n * Обновление отображения сессий для активного клиента\n */\n }, {\n key: \"updateSessionsDOM\",\n value: function updateSessionsDOM(client) {\n var _this6 = this;\n var sessionsContainer = document.getElementById('sessions');\n var newSessionBtn = document.getElementById('new-session-btn');\n if (!sessionsContainer || !newSessionBtn) return;\n // Удаляем все существующие сессии из DOM (кроме кнопки New Session)\n var existingSessions = sessionsContainer.querySelectorAll('.session');\n existingSessions.forEach(function (session) {\n return session.remove();\n });\n if (client && client.sessions.length > 0) {\n // Добавляем сессии активного клиента\n client.sessions.forEach(function (session) {\n _this6.createSessionDOM(client.clientId, session);\n });\n }\n }\n /**\n * Скрытие всех терминалов\n */\n }, {\n key: \"hideAllTerminals\",\n value: function hideAllTerminals() {\n var allClients = this.tabManager.getAllClients();\n allClients.forEach(function (client) {\n client.sessions.forEach(function (session) {\n var terminalDiv = document.getElementById(\"terminal-\".concat(session.data.sessionId));\n if (terminalDiv) {\n terminalDiv.style.display = 'none';\n }\n });\n });\n }\n /**\n * Показ терминалов клиента\n */\n }, {\n key: \"showClientTerminals\",\n value: function showClientTerminals(client) {\n client.sessions.forEach(function (session) {\n var terminalDiv = document.getElementById(\"terminal-\".concat(session.data.sessionId));\n if (terminalDiv) {\n terminalDiv.style.display = 'block';\n }\n });\n }\n /**\n * Показ конкретного терминала\n */\n }, {\n key: \"showTerminal\",\n value: function showTerminal(session) {\n var terminalDiv = document.getElementById(\"terminal-\".concat(session.data.sessionId));\n if (terminalDiv) {\n terminalDiv.style.display = 'block';\n }\n }\n /**\n * Переключение на клиента\n */\n }, {\n key: \"switchToClient\",\n value: function switchToClient(clientId) {\n var client = this.tabManager.getAllClients().find(function (c) {\n return c.clientId === clientId;\n });\n if (client) {\n this.tabManager.switchToTab(client.clientId);\n }\n }\n /**\n * Переключение на сессию\n */\n }, {\n key: \"switchToSession\",\n value: function switchToSession(clientId, sessionId) {\n var client = this.tabManager.getAllClients().find(function (c) {\n return c.clientId === clientId;\n });\n if (client) {\n this.tabManager.switchToSession(client.clientId, sessionId);\n }\n }\n /**\n * Закрытие клиента\n */\n }, {\n key: \"closeClient\",\n value: function closeClient(clientId) {\n var client = this.tabManager.getAllClients().find(function (c) {\n return c.clientId === clientId;\n });\n if (client) {\n this.tabManager.closeClient(client.clientId);\n }\n }\n /**\n * Закрытие сессии\n */\n }, {\n key: \"closeSession\",\n value: function closeSession(clientId, sessionId) {\n var client = this.tabManager.getAllClients().find(function (c) {\n return c.clientId === clientId;\n });\n if (client) {\n this.tabManager.closeSession(client.clientId, sessionId);\n }\n }\n /**\n * Настройка обработчиков событий\n */\n }, {\n key: \"setupEventHandlers\",\n value: function setupEventHandlers() {\n var _this7 = this;\n // Обработчик для кнопки новой сессии\n var newSessionBtn = document.getElementById('new-session-btn');\n if (newSessionBtn) {\n console.log('New session button found and handler attached');\n newSessionBtn.onclick = function () {\n console.log('New session button clicked');\n _this7.createNewSession();\n };\n } else {\n console.error('New session button not found!');\n }\n // Обработчик для кнопки нового клиента\n var newClientBtn = document.getElementById('new-client-btn');\n if (newClientBtn) {\n console.log('New client button found and handler attached');\n newClientBtn.onclick = function () {\n console.log('New client button clicked');\n _this7.showClientInstructions();\n };\n } else {\n console.error('New client button not found!');\n }\n // Обработчик изменения размера окна\n window.addEventListener(\"resize\", function () {\n var activeSession = _this7.tabManager.getActiveSession();\n if (activeSession && activeSession.fitAddon) {\n setTimeout(function () {\n var _activeSession$fitAdd;\n (_activeSession$fitAdd = activeSession.fitAddon) === null || _activeSession$fitAdd === void 0 || _activeSession$fitAdd.fit();\n }, 100);\n }\n });\n if (!this.isDebug) {\n window.addEventListener('keydown', function (e) {\n var isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n // Developer tools hotkeys\n var isDevTools = isMac && e.metaKey && e.altKey && e.key === 'i' ||\n // Cmd+Option+I\n !isMac && e.ctrlKey && e.shiftKey && e.key === 'I' ||\n // Ctrl+Shift+I\n e.key === 'F12';\n if (isDevTools) {\n e.preventDefault();\n return; // Do not prevent default and do not send to server\n }\n if (e.ctrlKey || e.altKey || e.shiftKey) {\n e.preventDefault();\n var activeSession = _this7.tabManager.getActiveSession();\n if (activeSession) {\n _this7.tabManager.sendHotKey({\n sessionId: activeSession.data.sessionId,\n key: e.key,\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey\n });\n }\n }\n });\n }\n // Обработчик клика вне области инструкций для их скрытия\n document.addEventListener(\"click\", function (event) {\n var instructionsElement = document.getElementById('client-instructions');\n var newClientBtn = document.getElementById('new-client-btn');\n if (instructionsElement && instructionsElement.classList.contains('show')) {\n // Проверяем, что клик не по инструкциям и не по кнопке New Client\n if (!instructionsElement.contains(event.target) && !(newClientBtn !== null && newClientBtn !== void 0 && newClientBtn.contains(event.target))) {\n // Скрываем инструкции только если есть активные клиенты\n var activeClient = _this7.tabManager.getActiveClient();\n if (activeClient) {\n _this7.hideClientInstructions();\n }\n }\n }\n });\n }\n /**\n * Создание новой сессии для активного клиента\n */\n }, {\n key: \"createNewSession\",\n value: function createNewSession() {\n console.log('createNewSession called');\n var activeClient = this.tabManager.getActiveClient();\n if (!activeClient) {\n console.log('No active client selected - cannot create session');\n alert('Сначала выберите клиента для создания сессии');\n return;\n }\n console.log('Creating new session for client:', activeClient.name);\n // Используем новый метод createNewSession, который отправит запрос на сервер\n this.tabManager.createNewSession(activeClient.clientId, \"Session \".concat(activeClient.sessions.length + 1));\n }\n /**\n * Показать инструкции для подключения клиента\n */\n }, {\n key: \"showClientInstructions\",\n value: function showClientInstructions() {\n var instructionsElement = document.getElementById('client-instructions');\n var newClientBtn = document.getElementById('new-client-btn');\n var sessionsElement = document.getElementById('sessions');\n this.hideAllTerminals();\n if (instructionsElement) {\n instructionsElement.classList.add('show');\n console.log('Client instructions shown');\n }\n if (newClientBtn) {\n newClientBtn.classList.add('showing-instructions');\n }\n if (sessionsElement) {\n sessionsElement.style.display = 'none';\n console.log('Sessions element hidden');\n }\n }\n /**\n * Скрыть инструкции для подключения клиента\n */\n }, {\n key: \"hideClientInstructions\",\n value: function hideClientInstructions() {\n var instructionsElement = document.getElementById('client-instructions');\n var newClientBtn = document.getElementById('new-client-btn');\n var sessionsElement = document.getElementById('sessions');\n if (instructionsElement) {\n instructionsElement.classList.remove('show');\n console.log('Client instructions hidden');\n }\n if (newClientBtn) {\n newClientBtn.classList.remove('showing-instructions');\n }\n if (sessionsElement) {\n sessionsElement.style.display = 'flex';\n console.log('Sessions element shown');\n }\n }\n /**\n * Обработка обновления состояния курсора\n * Отрисовывает состояние на UI без изменения локального CommandBuilder\n */\n }, {\n key: \"handleCursorStateUpdate\",\n value: function handleCursorStateUpdate(sessionId, command, position) {\n console.log(\"Handling cursor state update for session \".concat(sessionId, \": command=\\\"\").concat(command, \"\\\", position=\").concat(position));\n // Получаем активную сессию\n var activeSession = this.tabManager.getActiveSession();\n if (!activeSession || activeSession.data.sessionId !== sessionId) {\n console.log(\"Session \".concat(sessionId, \" is not active, skipping cursor state update\"));\n return;\n }\n // Отрисовываем состояние через TerminalUiWriter (без изменения CommandBuilder)\n if (activeSession.terminalUiWriter) {\n console.log(\"Rendering cursor state to UI for session \".concat(sessionId));\n activeSession.terminalUiWriter.write(command, position);\n } else {\n console.warn(\"TerminalUiWriter not found for session \".concat(sessionId));\n }\n }\n /**\n * Удаление DOM элемента терминала\n */\n }, {\n key: \"removeTerminalDOM\",\n value: function removeTerminalDOM(sessionId) {\n var terminalDiv = document.getElementById(\"terminal-\".concat(sessionId));\n if (terminalDiv) {\n console.log(\"Removing terminal DOM element for session \".concat(sessionId));\n terminalDiv.remove();\n } else {\n console.warn(\"Terminal DOM element not found for session \".concat(sessionId));\n }\n }\n /**\n * Настройка drag and drop для элемента\n */\n }, {\n key: \"setupDragAndDrop\",\n value: function setupDragAndDrop(element, type) {\n var _this8 = this;\n // Начало перетаскивания\n element.addEventListener('dragstart', function (e) {\n _this8.draggedElement = element;\n element.classList.add('dragging');\n if (e.dataTransfer) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/html', element.innerHTML);\n }\n });\n // Окончание перетаскивания\n element.addEventListener('dragend', function (e) {\n element.classList.remove('dragging');\n // Удаляем визуальные индикаторы со всех элементов\n var container = type === 'client' ? document.getElementById('clients') : document.getElementById('sessions');\n if (container) {\n container.querySelectorAll(\".\".concat(type)).forEach(function (el) {\n el.classList.remove('drag-over');\n });\n }\n _this8.draggedElement = null;\n });\n // Перетаскивание над элементом\n element.addEventListener('dragover', function (e) {\n e.preventDefault();\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = 'move';\n }\n if (_this8.draggedElement && _this8.draggedElement !== element) {\n element.classList.add('drag-over');\n }\n });\n // Покидание области элемента\n element.addEventListener('dragleave', function (e) {\n element.classList.remove('drag-over');\n });\n // Отпускание элемента\n element.addEventListener('drop', function (e) {\n e.preventDefault();\n e.stopPropagation();\n element.classList.remove('drag-over');\n if (_this8.draggedElement && _this8.draggedElement !== element) {\n var container = type === 'client' ? document.getElementById('clients') : document.getElementById('sessions');\n if (container) {\n // Определяем позицию для вставки\n var afterElement = _this8.getDragAfterElement(container, e.clientX, type);\n if (afterElement == null) {\n // Вставляем перед кнопкой New Client/Session\n var newBtn = type === 'client' ? document.getElementById('new-client-btn') : document.getElementById('new-session-btn');\n if (newBtn) {\n container.insertBefore(_this8.draggedElement, newBtn);\n }\n } else {\n // Вставляем после найденного элемента\n container.insertBefore(_this8.draggedElement, afterElement);\n }\n }\n }\n });\n }\n /**\n * Определяет элемент, после которого нужно вставить перетаскиваемый элемент\n */\n }, {\n key: \"getDragAfterElement\",\n value: function getDragAfterElement(container, x, type) {\n var draggableElements = Array.from(container.querySelectorAll(\".\".concat(type, \":not(.dragging)\")));\n return draggableElements.reduce(function (closest, child) {\n var box = child.getBoundingClientRect();\n var offset = x - box.left - box.width / 2;\n if (offset < 0 && (closest === null || offset > closest.offset)) {\n return Object.assign(child, {\n offset: offset\n });\n } else {\n return closest;\n }\n }, null);\n }\n }]);\n}(); // Создаем глобальный экземпляр приложения\nconsole.log('index.ts script loaded');\nvar terminalApp = new TerminalApp();\nwindow.terminalApp = terminalApp;\n// Инициализация при загрузке DOM\nfunction initializeSync() {\n console.log('initializeSync called');\n initializeApp().then();\n}\nfunction initializeApp() {\n return _initializeApp.apply(this, arguments);\n} // Проверяем состояние документа и инициализируем соответственно\nfunction _initializeApp() {\n _initializeApp = ts_asyncToGenerator(/*#__PURE__*/ts_regenerator().m(function _callee2() {\n return ts_regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n console.log('initializeApp called');\n _context2.n = 1;\n return terminalApp.initialize();\n case 1:\n return _context2.a(2);\n }\n }, _callee2);\n }));\n return _initializeApp.apply(this, arguments);\n}\nif (document.readyState === 'loading') {\n // Документ еще загружается\n console.log('Document is loading, adding DOMContentLoaded listener');\n document.addEventListener('DOMContentLoaded', initializeApp);\n} else {\n // Документ уже загружен\n console.log('Document is already loaded, calling initializeApp immediately');\n initializeSync();\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIyLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7OztBQXdCTyxJQUFNQSxjQUFjLEdBQUc7RUFDNUJDLFlBQVksRUFBRSxRQUFRO0VBQ3RCQyxPQUFPLEVBQUUsU0FBUztFQUNsQkMsVUFBVSxFQUFFLFlBQVk7RUFDeEJDLEtBQUssRUFBRSxPQUFPO0VBQ2RDLFFBQVEsRUFBRSxVQUFVO0VBQ3BCQyxPQUFPLEVBQUUsU0FBUztFQUNsQkMsTUFBTSxFQUFFLFFBQVE7RUFDaEJDLFFBQVEsRUFBRSxTQUFTO0VBQ25CQyxNQUFNLEVBQUUsUUFBUTtFQUNoQkMsTUFBTSxFQUFFLFFBQVE7RUFDaEJDLEtBQUssRUFBRSxPQUFPO0VBQ2RDLE9BQU8sRUFBRSxTQUFTO0VBQ2xCQyxXQUFXLEVBQUUsWUFBWTtFQUN6QkMsVUFBVSxFQUFFLFdBQVc7RUFDdkJDLGFBQWEsRUFBRSxjQUFjO0VBQzdCQyxhQUFhLEVBQUUsY0FBYztFQUM3QkMsYUFBYSxFQUFFO0NBQ1A7QUFnTEgsSUFBTUMsV0FBVztFQUFBLFNBQUFBLFlBQUE7SUFBQUMsZUFBQSxPQUFBRCxXQUFBO0VBQUE7RUFBQSxPQUFBRSxZQUFBLENBQUFGLFdBQUE7SUFBQUcsR0FBQTtJQUFBQyxLQUFBO0lBRXRCOzs7SUFHTyxTQUFRQyxVQUFVQSxDQUFBO01BQ3ZCLE9BQU9DLElBQUksQ0FBQ0MsTUFBTSxFQUFFLENBQUNDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQ0MsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBR0gsSUFBSSxDQUFDQyxNQUFNLEVBQUUsQ0FBQ0MsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNsRztFQUFDO0lBQUFOLEdBQUE7SUFBQUMsS0FBQSxFQUNNLFNBQU9NLFNBQVNBLENBQUNDLEVBQVU7TUFDaEMsT0FBT0EsRUFBRSxDQUFDQyxNQUFNLEtBQUssRUFBRSxJQUFJRCxFQUFFLENBQUNFLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQ7RUFBQztBQUFBLEk7Ozs7Ozs7Ozs7OztBQ3BPSDs7OztBQXlCaUI7QUFDK0I7QUFxRHpDLElBQU1FLFVBQVU7RUE0Qm5CLFNBQUFBLFdBQVlDLFNBQWlCLEVBQWlDO0lBQUEsSUFBL0JDLFNBQUEsR0FBQUMsU0FBQSxDQUFBTixNQUFBLFFBQUFNLFNBQUEsUUFBQUMsU0FBQSxHQUFBRCxTQUFBLE1BQTJCLElBQUk7SUFBQWpCLHlCQUFBLE9BQUFjLFVBQUE7SUExQnZELEtBQUFLLE1BQU0sR0FBcUIsSUFBSTtJQUMvQixLQUFBQyxZQUFZLEdBQVksS0FBSztJQUM3QixLQUFBQyxpQkFBaUIsR0FBVyxDQUFDO0lBQzdCLEtBQUFDLG9CQUFvQixHQUFXVCxrQ0FBZ0IsQ0FBQ1Usc0JBQXNCO0lBQ3RFLEtBQUFDLGNBQWMsR0FBV1gsa0NBQWdCLENBQUNZLGVBQWU7SUFDekQsS0FBQUMsaUJBQWlCLEdBQVdiLGtDQUFnQixDQUFDYyxtQkFBbUI7SUFDaEUsS0FBQUMsMEJBQTBCLEdBQVdmLGtDQUFnQixDQUFDZ0IsNEJBQTRCO0lBQ2xGLEtBQUFDLG9CQUFvQixHQUFZakIsa0NBQWdCLENBQUNrQixxQkFBcUI7SUFDdEUsS0FBQUMsY0FBYyxHQUFrQixJQUFJO0lBQ3BDLEtBQUFDLFNBQVMsR0FBd0IsSUFBSTtJQUNyQyxLQUFBQyxZQUFZLEdBQW9ELElBQUk7SUFDcEUsS0FBQUMsYUFBYSxHQUE2QyxJQUFJO0lBQzlELEtBQUFDLE9BQU8sR0FBa0MsSUFBSTtJQUM3QyxLQUFBQyxTQUFTLEdBQXlDLElBQUk7SUFDdEQsS0FBQUMsU0FBUyxHQUFrRCxJQUFJO0lBQy9ELEtBQUFDLFFBQVEsR0FBd0MsSUFBSTtJQUNwRCxLQUFBQyxVQUFVLEdBQTBDLElBQUk7SUFDeEQsS0FBQUMsT0FBTyxHQUFpQyxJQUFJO0lBQzVDLEtBQUFDLFdBQVcsR0FBMkMsSUFBSTtJQUMxRCxLQUFBQyxjQUFjLEdBQThDLElBQUk7SUFDaEUsS0FBQUMsY0FBYyxHQUE4QyxJQUFJO0lBQ2hFLEtBQUFDLGNBQWMsR0FBOEMsSUFBSTtJQU1uRSxJQUFJLENBQUM5QixTQUFTLEdBQUdBLFNBQVM7SUFFMUI7SUFDQSxJQUFJLENBQUMrQixlQUFlLEdBQUc7TUFDbkJDLEdBQUcsRUFBRUMsT0FBTyxDQUFDRCxHQUFHO01BQ2hCRSxLQUFLLEVBQUVELE9BQU8sQ0FBQ0MsS0FBSztNQUNwQkMsSUFBSSxFQUFFRixPQUFPLENBQUNFLElBQUk7TUFDbEJDLElBQUksRUFBRUgsT0FBTyxDQUFDRyxJQUFJO01BQ2xCQyxLQUFLLEVBQUVKLE9BQU8sQ0FBQ0k7S0FDbEI7RUFDTDtFQUVBOzs7O0VBQUEsT0FBQW5ELHNCQUFBLENBQUFhLFVBQUE7SUFBQVosR0FBQTtJQUFBQyxLQUFBLEVBSUEsU0FBQWtELFlBQVlBLENBQUNDLFFBQW9CO01BQzdCLElBQUksQ0FBQ3JCLFNBQVMsR0FBR3FCLFFBQVE7SUFDN0I7RUFBQztJQUFBcEQsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQW9ELGdCQUFnQkEsQ0FBQ0QsUUFBeUM7TUFDdEQsSUFBSSxDQUFDbkIsYUFBYSxHQUFHbUIsUUFBUTtJQUNqQztJQUVBOzs7O0VBQUE7SUFBQXBELEdBQUE7SUFBQUMsS0FBQSxFQUlBLFNBQUFxRCxlQUFlQSxDQUFDRixRQUFnRDtNQUM1RCxJQUFJLENBQUNwQixZQUFZLEdBQUdvQixRQUFRO0lBQ2hDO0lBR0E7Ozs7RUFBQTtJQUFBcEQsR0FBQTtJQUFBQyxLQUFBLEVBSUEsU0FBQXNELFVBQVVBLENBQUNILFFBQThCO01BQ3JDLElBQUksQ0FBQ2xCLE9BQU8sR0FBR2tCLFFBQVE7SUFDM0I7SUFFQTs7OztFQUFBO0lBQUFwRCxHQUFBO0lBQUFDLEtBQUEsRUFJQSxTQUFBdUQsWUFBWUEsQ0FBQ0osUUFBcUM7TUFDOUMsSUFBSSxDQUFDakIsU0FBUyxHQUFHaUIsUUFBUTtJQUM3QjtJQUVBOzs7O0VBQUE7SUFBQXBELEdBQUE7SUFBQUMsS0FBQSxFQUlBLFNBQUF3RCxZQUFZQSxDQUFDTCxRQUE4QztNQUN2RCxJQUFJLENBQUNoQixTQUFTLEdBQUdnQixRQUFRO0lBQzdCO0lBRUE7Ozs7RUFBQTtJQUFBcEQsR0FBQTtJQUFBQyxLQUFBLEVBSUEsU0FBQXlELGFBQWFBLENBQUNOLFFBQXNDO01BQ2hELElBQUksQ0FBQ2QsVUFBVSxHQUFHYyxRQUFRO0lBQzlCO0lBQ0E7Ozs7RUFBQTtJQUFBcEQsR0FBQTtJQUFBQyxLQUFBLEVBSUEsU0FBQTBELFdBQVdBLENBQUNQLFFBQW9DO01BQzVDLElBQUksQ0FBQ2YsUUFBUSxHQUFHZSxRQUFRO0lBQzVCO0lBRUE7Ozs7RUFBQTtJQUFBcEQsR0FBQTtJQUFBQyxLQUFBLEVBSUEsU0FBQTJELFVBQVVBLENBQUNSLFFBQTZCO01BQ3BDLElBQUksQ0FBQ2IsT0FBTyxHQUFHYSxRQUFRO0lBQzNCO0lBRUE7Ozs7RUFBQTtJQUFBcEQsR0FBQTtJQUFBQyxLQUFBLEVBSUEsU0FBQTRELGNBQWNBLENBQUNULFFBQXVDO01BQ2xELElBQUksQ0FBQ1osV0FBVyxHQUFHWSxRQUFRO0lBQy9CO0lBRUE7Ozs7RUFBQTtJQUFBcEQsR0FBQTtJQUFBQyxLQUFBLEVBSUEsU0FBQTZELGlCQUFpQkEsQ0FBQ1YsUUFBMEM7TUFDeEQsSUFBSSxDQUFDWCxjQUFjLEdBQUdXLFFBQVE7SUFDbEM7SUFFQTs7OztFQUFBO0lBQUFwRCxHQUFBO0lBQUFDLEtBQUEsRUFJQSxTQUFBOEQscUJBQXFCQSxDQUFDWCxRQUF3RDtNQUMxRSxJQUFJLENBQUNZLGtCQUFrQixHQUFHWixRQUFRO0lBQ3RDO0lBRUE7Ozs7RUFBQTtJQUFBcEQsR0FBQTtJQUFBQyxLQUFBLEVBSUEsU0FBQWdFLG9CQUFvQkEsQ0FBQ2IsUUFBb0I7TUFDckMsSUFBSSxDQUFDYyxpQkFBaUIsR0FBR2QsUUFBUTtJQUNyQztFQUFDO0lBQUFwRCxHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBa0UsaUJBQWlCQSxDQUFDZixRQUEwQztNQUN4RCxJQUFJLENBQUNWLGNBQWMsR0FBR1UsUUFBUTtJQUNsQztFQUFDO0lBQUFwRCxHQUFBO0lBQUFDLEtBQUEsRUFFRCxTQUFBbUUsaUJBQWlCQSxDQUFDaEIsUUFBMEM7TUFDeEQsSUFBSSxDQUFDVCxjQUFjLEdBQUdTLFFBQVE7SUFDbEM7SUFFQTs7Ozs7Ozs7RUFBQTtJQUFBcEQsR0FBQTtJQUFBQyxLQUFBLEVBUUEsU0FBQW9FLHdCQUF3QkEsQ0FBQSxFQUtxRDtNQUFBLElBSnpFQyxPQUFBLEdBQUF2RCxTQUFBLENBQUFOLE1BQUEsUUFBQU0sU0FBQSxRQUFBQyxTQUFBLEdBQUFELFNBQUEsTUFBbUIsSUFBSTtNQUFBLElBQ3ZCd0QsV0FBQSxHQUFBeEQsU0FBQSxDQUFBTixNQUFBLFFBQUFNLFNBQUEsUUFBQUMsU0FBQSxHQUFBRCxTQUFBLE1BQXNCSixrQ0FBZ0IsQ0FBQ1Usc0JBQXNCO01BQUEsSUFDN0RtRCxLQUFBLEdBQUF6RCxTQUFBLENBQUFOLE1BQUEsUUFBQU0sU0FBQSxRQUFBQyxTQUFBLEdBQUFELFNBQUEsTUFBZ0JKLGtDQUFnQixDQUFDWSxlQUFlO01BQUEsSUFDaERrRCxRQUFBLEdBQUExRCxTQUFBLENBQUFOLE1BQUEsUUFBQU0sU0FBQSxRQUFBQyxTQUFBLEdBQUFELFNBQUEsTUFBbUJKLGtDQUFnQixDQUFDYyxtQkFBbUI7TUFBQSxJQUN2RGlELGlCQUFBLEdBQUEzRCxTQUFBLENBQUFOLE1BQUEsUUFBQU0sU0FBQSxRQUFBQyxTQUFBLEdBQUFELFNBQUEsTUFBNEJKLGtDQUFnQixDQUFDZ0IsNEJBQTRCO01BRXpFLElBQUksQ0FBQ0Msb0JBQW9CLEdBQUcwQyxPQUFPO01BQ25DLElBQUksQ0FBQ2xELG9CQUFvQixHQUFHbUQsV0FBVztNQUN2QyxJQUFJLENBQUNqRCxjQUFjLEdBQUdrRCxLQUFLO01BQzNCLElBQUksQ0FBQ2hELGlCQUFpQixHQUFHaUQsUUFBUTtNQUNqQyxJQUFJLENBQUMvQywwQkFBMEIsR0FBR2dELGlCQUFpQjtNQUVuRCxJQUFJLENBQUM5QixlQUFlLENBQUNDLEdBQUcsNENBQUE4QixNQUFBLENBQTRDTCxPQUFPLG9CQUFBSyxNQUFBLENBQWlCSixXQUFXLGNBQUFJLE1BQUEsQ0FBV0gsS0FBSyxtQkFBQUcsTUFBQSxDQUFnQkYsUUFBUSw0QkFBQUUsTUFBQSxDQUF5QkQsaUJBQWlCLENBQUUsQ0FBQztJQUNoTTtJQUVBOzs7RUFBQTtJQUFBMUUsR0FBQTtJQUFBQyxLQUFBLEVBR0EsU0FBQTJFLHdCQUF3QkEsQ0FBQTtNQUNwQixPQUFPO1FBQ0hOLE9BQU8sRUFBRSxJQUFJLENBQUMxQyxvQkFBb0I7UUFDbEMyQyxXQUFXLEVBQUUsSUFBSSxDQUFDbkQsb0JBQW9CO1FBQ3RDb0QsS0FBSyxFQUFFLElBQUksQ0FBQ2xELGNBQWM7UUFDMUJtRCxRQUFRLEVBQUUsSUFBSSxDQUFDakQsaUJBQWlCO1FBQ2hDa0QsaUJBQWlCLEVBQUUsSUFBSSxDQUFDaEQsMEJBQTBCO1FBQ2xEbUQsZUFBZSxFQUFFLElBQUksQ0FBQzFEO09BQ3pCO0lBQ0w7SUFFQTs7O0VBQUE7SUFBQW5CLEdBQUE7SUFBQUMsS0FBQSxFQUdBLFNBQUE2RSxPQUFPQSxDQUFDQyxVQUFzQjtNQUFBLElBQUFDLEtBQUE7TUFDMUI7TUFDQSxJQUFJLElBQUksQ0FBQzlELFlBQVksSUFBSSxJQUFJLENBQUNELE1BQU0sSUFBSSxJQUFJLENBQUNBLE1BQU0sQ0FBQ2dFLFVBQVUsS0FBS0MsU0FBUyxDQUFDQyxJQUFJLEVBQUU7UUFDL0U7UUFDQSxJQUFJLENBQUNDLFdBQVcsQ0FBQ0wsVUFBVSxDQUFDO1FBQzVCO01BQ0o7TUFFQTtNQUNBLElBQUksQ0FBQ00sU0FBUyxDQUFDLFlBQUs7UUFDaEJMLEtBQUksQ0FBQ0ksV0FBVyxDQUFDTCxVQUFVLENBQUM7TUFDaEMsQ0FBQyxDQUFDO0lBQ047SUFFQTs7O0VBQUE7SUFBQS9FLEdBQUE7SUFBQUMsS0FBQSxFQUdRLFNBQUFvRixTQUFTQSxDQUFDQyxXQUF1QjtNQUFBLElBQUFDLE1BQUE7TUFDckMsSUFBSTtRQUNBO1FBQ0EsSUFBSSxDQUFDQyxtQkFBbUIsRUFBRTtRQUUxQixJQUFJLENBQUM1QyxlQUFlLENBQUNDLEdBQUcsMEJBQUE4QixNQUFBLENBQTBCLElBQUksQ0FBQzlELFNBQVMsZ0JBQUE4RCxNQUFBLENBQWEsSUFBSSxDQUFDeEQsaUJBQWlCLEdBQUcsQ0FBQyxPQUFBd0QsTUFBQSxDQUFJLElBQUksQ0FBQ3ZELG9CQUFvQixHQUFHLENBQUMsTUFBRyxDQUFDO1FBRTVJO1FBQ0EsSUFBSSxJQUFJLENBQUM0QyxrQkFBa0IsSUFBSSxJQUFJLENBQUM3QyxpQkFBaUIsR0FBRyxDQUFDLEVBQUU7VUFDdkQsSUFBSSxDQUFDNkMsa0JBQWtCLENBQUMsSUFBSSxDQUFDN0MsaUJBQWlCLEVBQUUsSUFBSSxDQUFDQyxvQkFBb0IsQ0FBQztRQUM5RTtRQUVBLElBQUksQ0FBQ0gsTUFBTSxHQUFHLElBQUlpRSxTQUFTLENBQUMsSUFBSSxDQUFDckUsU0FBUyxDQUFDO1FBQzNDLElBQUksQ0FBQ0ksTUFBTSxDQUFDd0UsTUFBTSxHQUFHLFlBQUs7VUFDdEJGLE1BQUksQ0FBQzNDLGVBQWUsQ0FBQ0MsR0FBRyxDQUFDLGtDQUFrQyxDQUFDO1VBQzVEMEMsTUFBSSxDQUFDckUsWUFBWSxHQUFHLElBQUk7VUFDeEJxRSxNQUFJLENBQUNwRSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztVQUU1QjtVQUNBbUUsV0FBVyxFQUFFO1VBQ2IsSUFBSUMsTUFBSSxDQUFDeEQsU0FBUyxFQUFFO1lBQ2hCd0QsTUFBSSxDQUFDeEQsU0FBUyxFQUFFO1VBQ3BCO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQ2QsTUFBTSxDQUFDeUUsU0FBUyxHQUFHLFVBQUNDLEtBQW1CLEVBQUk7VUFDNUNKLE1BQUksQ0FBQ0ssYUFBYSxDQUFDRCxLQUFLLENBQUNFLElBQUksQ0FBQyxDQUFDQyxJQUFJLEVBQUU7UUFDekMsQ0FBQztRQUVELElBQUksQ0FBQzdFLE1BQU0sQ0FBQzhFLE9BQU8sR0FBRyxVQUFDSixLQUFpQixFQUFJO1VBQUEsSUFBQUsscUJBQUE7VUFDeEMsQ0FBQUEscUJBQUEsR0FBQVQsTUFBSSxDQUFDM0MsZUFBZSxjQUFBb0QscUJBQUEsZUFBcEJBLHFCQUFBLENBQXNCbkQsR0FBRyxDQUFDLDhCQUE4QixFQUFFOEMsS0FBSyxDQUFDTSxJQUFJLEVBQUVOLEtBQUssQ0FBQ08sTUFBTSxDQUFDO1VBQ25GWCxNQUFJLENBQUNyRSxZQUFZLEdBQUcsS0FBSztVQUV6QixJQUFJcUUsTUFBSSxDQUFDdkQsWUFBWSxFQUFFO1lBQ25CdUQsTUFBSSxDQUFDdkQsWUFBWSxDQUFDMkQsS0FBSyxDQUFDTSxJQUFJLEVBQUVOLEtBQUssQ0FBQ08sTUFBTSxDQUFDO1VBQy9DO1VBRUE7VUFDQVgsTUFBSSxDQUFDWSxnQkFBZ0IsRUFBRTtRQUMzQixDQUFDO1FBRUQsSUFBSSxDQUFDbEYsTUFBTSxDQUFDbUYsT0FBTyxHQUFHLFVBQUNyRCxLQUFZLEVBQUk7VUFBQSxJQUFBc0Qsc0JBQUE7VUFDbkMsQ0FBQUEsc0JBQUEsR0FBQWQsTUFBSSxDQUFDM0MsZUFBZSxjQUFBeUQsc0JBQUEsZUFBcEJBLHNCQUFBLENBQXNCdEQsS0FBSyxDQUFDLGtCQUFrQixFQUFFQSxLQUFLLENBQUM7VUFFdEQsSUFBSXdDLE1BQUksQ0FBQ3JELE9BQU8sRUFBRTtZQUNkcUQsTUFBSSxDQUFDckQsT0FBTyxDQUFDYSxLQUFLLENBQUM7VUFDdkI7UUFDSixDQUFDO01BRUwsQ0FBQyxDQUFDLE9BQU9BLEtBQVUsRUFBRTtRQUFBLElBQUF1RCxxQkFBQTtRQUNqQixDQUFBQSxxQkFBQSxPQUFJLENBQUMxRCxlQUFlLGNBQUEwRCxxQkFBQSxlQUFwQkEscUJBQUEsQ0FBc0J2RCxLQUFLLENBQUMsd0NBQXdDLEVBQUVBLEtBQUssQ0FBQztRQUU1RSxJQUFJLElBQUksQ0FBQ2IsT0FBTyxFQUFFO1VBQ2QsSUFBSSxDQUFDQSxPQUFPLENBQUNhLEtBQUssQ0FBQztRQUN2QjtRQUVBO1FBQ0EsSUFBSSxDQUFDb0QsZ0JBQWdCLEVBQUU7TUFDM0I7SUFDSjtJQUVBOzs7RUFBQTtJQUFBbkcsR0FBQTtJQUFBQyxLQUFBLEVBR0EsU0FBQWtHLGdCQUFnQkEsQ0FBQ3BCLFVBQXVCO01BQUEsSUFBQXdCLE1BQUE7TUFDcEM7TUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDM0Usb0JBQW9CLEVBQUU7UUFBQSxJQUFBNEUsc0JBQUE7UUFDNUIsQ0FBQUEsc0JBQUEsT0FBSSxDQUFDNUQsZUFBZSxjQUFBNEQsc0JBQUEsZUFBcEJBLHNCQUFBLENBQXNCM0QsR0FBRyxDQUFDLHdEQUF3RCxDQUFDO1FBQ25GO01BQ0o7TUFFQSxJQUFJLElBQUksQ0FBQzFCLGlCQUFpQixHQUFHLElBQUksQ0FBQ0Msb0JBQW9CLEVBQUU7UUFBQSxJQUFBcUYsc0JBQUE7UUFDcEQsSUFBSSxDQUFDdEYsaUJBQWlCLEVBQUU7UUFFeEI7UUFDQSxJQUFNcUQsS0FBSyxHQUFHckUsSUFBSSxDQUFDdUcsR0FBRyxDQUNsQixJQUFJLENBQUNwRixjQUFjLEdBQUduQixJQUFJLENBQUN3RyxHQUFHLENBQUMsSUFBSSxDQUFDakYsMEJBQTBCLEVBQUUsSUFBSSxDQUFDUCxpQkFBaUIsR0FBRyxDQUFDLENBQUMsRUFDM0YsSUFBSSxDQUFDSyxpQkFBaUIsQ0FDekI7UUFFRCxDQUFBaUYsc0JBQUEsT0FBSSxDQUFDN0QsZUFBZSxjQUFBNkQsc0JBQUEsZUFBcEJBLHNCQUFBLENBQXNCNUQsR0FBRyw2QkFBQThCLE1BQUEsQ0FBNkIsSUFBSSxDQUFDeEQsaUJBQWlCLE9BQUF3RCxNQUFBLENBQUksSUFBSSxDQUFDdkQsb0JBQW9CLFdBQUF1RCxNQUFBLENBQVFILEtBQUssVUFBTyxDQUFDO1FBRTlIO1FBQ0EsSUFBSSxJQUFJLENBQUNSLGtCQUFrQixFQUFFO1VBQ3pCLElBQUksQ0FBQ0Esa0JBQWtCLENBQUMsSUFBSSxDQUFDN0MsaUJBQWlCLEVBQUUsSUFBSSxDQUFDQyxvQkFBb0IsQ0FBQztRQUM5RTtRQUVBO1FBQ0EsSUFBSSxDQUFDVSxjQUFjLEdBQUc4RSxNQUFNLENBQUNDLFVBQVUsQ0FBQyxZQUFLO1VBQ3pDLElBQUk5QixVQUFVLEVBQUU7WUFDWndCLE1BQUksQ0FBQ3pCLE9BQU8sQ0FBQ0MsVUFBVSxDQUFDO1VBQzVCLENBQUMsTUFBTTtZQUNIO1lBQ0F3QixNQUFJLENBQUNsQixTQUFTLENBQUMsWUFBSyxDQUFFLENBQUMsQ0FBQztVQUM1QjtRQUNKLENBQUMsRUFBRWIsS0FBSyxDQUFDO01BQ2IsQ0FBQyxNQUFNO1FBQUEsSUFBQXNDLHNCQUFBO1FBQ0gsQ0FBQUEsc0JBQUEsT0FBSSxDQUFDbEUsZUFBZSxjQUFBa0Usc0JBQUEsZUFBcEJBLHNCQUFBLENBQXNCL0QsS0FBSyxDQUFDLG1DQUFtQyxDQUFDO1FBRWhFO1FBQ0EsSUFBSSxJQUFJLENBQUNtQixpQkFBaUIsRUFBRTtVQUN4QixJQUFJLENBQUNBLGlCQUFpQixFQUFFO1FBQzVCO01BQ0o7SUFDSjtJQUVBOzs7RUFBQTtJQUFBbEUsR0FBQTtJQUFBQyxLQUFBLEVBR0EsU0FBQXVGLG1CQUFtQkEsQ0FBQTtNQUNmLElBQUksSUFBSSxDQUFDMUQsY0FBYyxLQUFLLElBQUksRUFBRTtRQUM5QmlGLFlBQVksQ0FBQyxJQUFJLENBQUNqRixjQUFjLENBQUM7UUFDakMsSUFBSSxDQUFDQSxjQUFjLEdBQUcsSUFBSTtNQUM5QjtJQUNKO0lBRUE7Ozs7RUFBQTtJQUFBOUIsR0FBQTtJQUFBQyxLQUFBLEVBSUEsU0FBQW1GLFdBQVdBLENBQUNMLFVBQXNCO01BQzlCLElBQU1pQyxPQUFPLEdBQXFCO1FBQzlCckIsS0FBSyxFQUFFLFNBQXNCO1FBQzdCRSxJQUFJLEVBQUU7VUFDRjtVQUNBb0IsSUFBSSxFQUFFLGVBQWU7VUFDckJsQyxVQUFVLEVBQUVBOztPQUVuQjtNQUVELElBQUksQ0FBQ21DLFdBQVcsQ0FBQ0YsT0FBTyxDQUFDO0lBQzdCO0VBQUM7SUFBQWhILEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUFrSCxXQUFXQSxDQUFDQyxNQUFhLEVBQUVDLE9BQWU7TUFDdEMsSUFBTUwsT0FBTyxHQUFxQjtRQUM5QnJCLEtBQUssRUFBRSxTQUFzQjtRQUM3QnlCLE1BQU0sRUFBRUEsTUFBTTtRQUNkdkIsSUFBSSxFQUFFO1VBRUZ3QixPQUFPLEVBQUVBOztPQUVoQjtNQUNELElBQUksQ0FBQ0gsV0FBVyxDQUFDRixPQUFPLENBQUM7SUFDN0I7SUFFQTs7OztFQUFBO0lBQUFoSCxHQUFBO0lBQUFDLEtBQUEsRUFJQSxTQUFBcUgsWUFBWUEsQ0FBQ3hHLFNBQWlCO01BQzFCLElBQUlBLFNBQVMsRUFBRTtRQUNYLElBQU1rRyxPQUFPLEdBQXFCO1VBQzlCckIsS0FBSyxFQUFFLFVBQXVCO1VBRTlCRSxJQUFJLEVBQUU7WUFDRi9FLFNBQVMsRUFBRUE7O1NBRWxCO1FBRUQsSUFBSSxDQUFDb0csV0FBVyxDQUFDRixPQUFPLENBQUM7TUFDN0I7SUFDSjtJQUVBOzs7OztFQUFBO0lBQUFoSCxHQUFBO0lBQUFDLEtBQUEsRUFLQSxTQUFBc0gsZ0JBQWdCQSxDQUFDekcsU0FBZ0IsRUFBQytFLElBQVksRUFBbUI7TUFBQSxJQUFqQjJCLEtBQUEsR0FBQXpHLFNBQUEsQ0FBQU4sTUFBQSxRQUFBTSxTQUFBLFFBQUFDLFNBQUEsR0FBQUQsU0FBQSxNQUFnQixDQUFDO01BQzdELElBQU1pRyxPQUFPLEdBQXFCO1FBQzlCckIsS0FBSyxFQUFFLFFBQXFCO1FBQzVCRSxJQUFJLEVBQUU7VUFDRi9FLFNBQVMsRUFBRUEsU0FBUztVQUNwQjBHLEtBQUssRUFBRUEsS0FBSztVQUNaM0IsSUFBSSxFQUFFQTs7T0FFYjtNQUVELElBQUksQ0FBQ3FCLFdBQVcsQ0FBQ0YsT0FBTyxDQUFDO0lBQzdCO0VBQUM7SUFBQWhILEdBQUE7SUFBQUMsS0FBQSxFQUVELFNBQUF3SCxjQUFjQSxDQUFFQyxRQUFnQixFQUFFNUcsU0FBaUIsRUFBRW1HLElBQVk7TUFDN0QsSUFBTUQsT0FBTyxHQUFxQjtRQUM5QnJCLEtBQUssRUFBRSxZQUF5QjtRQUNoQ3lCLE1BQU0sRUFBRU0sUUFBUTtRQUNoQjdCLElBQUksRUFBRTtVQUNGL0UsU0FBUyxFQUFFQSxTQUFTO1VBQ3BCbUcsSUFBSSxFQUFFQTs7T0FFYjtNQUNELElBQUksQ0FBQ0MsV0FBVyxDQUFDRixPQUFPLENBQUM7SUFDN0I7RUFBQztJQUFBaEgsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQTBILGVBQWVBLENBQUM5QixJQUFxQjtNQUNqQyxJQUFNbUIsT0FBTyxHQUFxQjtRQUM5QnJCLEtBQUssRUFBRSxRQUFxQjtRQUM1QkUsSUFBSSxFQUFFQTtPQUNUO01BQ0QsSUFBSSxDQUFDcUIsV0FBVyxDQUFDRixPQUFPLENBQUM7SUFDN0I7RUFBQztJQUFBaEgsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQTJILFdBQVdBLENBQUMvQixJQUFpQjtNQUN6QixJQUFNbUIsT0FBTyxHQUFxQjtRQUM5QnJCLEtBQUssRUFBRSxTQUFzQjtRQUM3QkUsSUFBSSxFQUFFQTtPQUNUO01BQ0QsSUFBSSxDQUFDcUIsV0FBVyxDQUFDRixPQUFPLENBQUM7SUFDN0I7RUFBQztJQUFBaEgsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQTRILFVBQVVBLENBQUNoQyxJQUFnQjtNQUN2QixJQUFNbUIsT0FBTyxHQUFxQjtRQUM5QnJCLEtBQUssRUFBRSxRQUFxQjtRQUM1QkUsSUFBSSxFQUFFQTtPQUNUO01BQ0QsSUFBSSxDQUFDcUIsV0FBVyxDQUFDRixPQUFPLENBQUM7SUFDN0I7RUFBQztJQUFBaEgsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQTZILGFBQWFBLENBQUNqQyxJQUFtQjtNQUM3QixJQUFNbUIsT0FBTyxHQUFxQjtRQUM5QnJCLEtBQUssRUFBRSxXQUF3QjtRQUMvQkUsSUFBSSxFQUFFQTtPQUNUO01BQ0QsSUFBSSxDQUFDcUIsV0FBVyxDQUFDRixPQUFPLENBQUM7SUFDN0I7RUFBQztJQUFBaEgsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQThILGdCQUFnQkEsQ0FBQ2xDLElBQXNCO01BQ25DLElBQU1tQixPQUFPLEdBQXFCO1FBQzlCckIsS0FBSyxFQUFFLGNBQTJCO1FBQ2xDRSxJQUFJLEVBQUVBO09BQ1Q7TUFDRCxJQUFJLENBQUNxQixXQUFXLENBQUNGLE9BQU8sQ0FBQztJQUM3QjtJQUVBOzs7O0VBQUE7SUFBQWhILEdBQUE7SUFBQUMsS0FBQSxFQUlBLFNBQUFpSCxXQUFXQSxDQUFDRixPQUF5QjtNQUNqQyxJQUFJLElBQUksQ0FBQy9GLE1BQU0sSUFBSSxJQUFJLENBQUNBLE1BQU0sQ0FBQ2dFLFVBQVUsS0FBS0MsU0FBUyxDQUFDQyxJQUFJLEVBQUU7UUFDMUQsSUFBSTtVQUNBLElBQU02QyxXQUFXLEdBQUdDLElBQUksQ0FBQ0MsU0FBUyxDQUFDbEIsT0FBTyxDQUFDO1VBQzNDLElBQUksQ0FBQy9GLE1BQU0sQ0FBQ2tILElBQUksQ0FBQ0gsV0FBVyxDQUFDO1VBQzdCLElBQUksQ0FBQ3BGLGVBQWUsQ0FBQ0MsR0FBRyxDQUFDLGVBQWUsRUFBRW1FLE9BQU8sQ0FBQztRQUN0RCxDQUFDLENBQUMsT0FBT2pFLEtBQVUsRUFBRTtVQUNqQixJQUFJLENBQUNILGVBQWUsQ0FBQ0csS0FBSyxDQUFDLHlCQUF5QixFQUFFQSxLQUFLLENBQUM7VUFFNUQsSUFBSSxJQUFJLENBQUNiLE9BQU8sRUFBRTtZQUNkLElBQUksQ0FBQ0EsT0FBTyxDQUFDYSxLQUFLLENBQUM7VUFDdkI7UUFDSjtNQUNKLENBQUMsTUFBTTtRQUNILElBQUksQ0FBQ0gsZUFBZSxDQUFDSSxJQUFJLENBQUMsaURBQWlELENBQUM7TUFDaEY7SUFDSjtJQUVBOzs7O0VBQUE7SUFBQWhELEdBQUE7SUFBQUMsS0FBQTtNQUFBLElBQUFtSSxjQUFBLEdBQUFDLGlCQUFBLGNBQUFDLFlBQUEsR0FBQUMsQ0FBQSxDQUlELFNBQUFDLFFBQW9CM0MsSUFBWTtRQUFBLElBQUFtQixPQUFBLEVBQUF5QixFQUFBLEVBQUFDLEdBQUE7UUFBQSxPQUFBSixZQUFBLEdBQUFLLENBQUEsV0FBQUMsUUFBQTtVQUFBLGtCQUFBQSxRQUFBLENBQUFDLENBQUEsR0FBQUQsUUFBQSxDQUFBRSxDQUFBO1lBQUE7Y0FBQUYsUUFBQSxDQUFBQyxDQUFBO2NBRWpCN0IsT0FBTyxHQUFxQmlCLElBQUksQ0FBQ2MsS0FBSyxDQUFDbEQsSUFBSSxDQUFDO2NBQ2xELElBQUksQ0FBQ2pELGVBQWUsQ0FBQ0MsR0FBRyxDQUFDLG1CQUFtQixFQUFFbUUsT0FBTyxDQUFDO2NBR3REO2NBQUF5QixFQUFBLEdBQ1F6QixPQUFPLENBQUNyQixLQUFLO2NBQUFpRCxRQUFBLENBQUFFLENBQUEsR0FBQUwsRUFBQSxLQUNaOUosY0FBYyxDQUFDQyxZQUFZLE9BQUE2SixFQUFBLEtBSzNCOUosY0FBYyxDQUFDUSxRQUFRLE9BQUFzSixFQUFBLEtBTXZCOUosY0FBYyxDQUFDTSxPQUFPLE9BQUF3SixFQUFBLEtBTXRCOUosY0FBYyxDQUFDTyxNQUFNLE9BQUF1SixFQUFBLEtBS3JCOUosY0FBYyxDQUFDVSxNQUFNLE9BQUFvSixFQUFBLEtBTXJCOUosY0FBYyxDQUFDSSxLQUFLLE9BQUEwSixFQUFBLEtBTXBCOUosY0FBYyxDQUFDYyxVQUFVLE9BQUFnSixFQUFBLEtBTXpCOUosY0FBYyxDQUFDZSxhQUFhLE9BQUErSSxFQUFBLEtBSzVCOUosY0FBYyxDQUFDZ0IsYUFBYSxRQUFBOEksRUFBQSxLQUs1QjlKLGNBQWMsQ0FBQ2lCLGFBQWE7Y0FBQTtZQUFBO2NBakQ3QixJQUFJLElBQUksQ0FBQ3FDLGFBQWEsRUFBRTtnQkFDcEIsSUFBSSxDQUFDQSxhQUFhLENBQUMrRSxPQUFPLENBQUNuQixJQUF1QixDQUFDO2NBQ3ZEO2NBQUMsT0FBQStDLFFBQUEsQ0FBQUksQ0FBQTtZQUFBO2NBR0QsSUFBSSxJQUFJLENBQUM3RyxTQUFTLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQ0EsU0FBUyxDQUFDNkUsT0FBTyxDQUFDbkIsSUFBbUIsQ0FBQztjQUMvQztjQUFDLE9BQUErQyxRQUFBLENBQUFJLENBQUE7WUFBQTtjQUFBLEtBSUcsSUFBSSxDQUFDNUcsU0FBUztnQkFBQXdHLFFBQUEsQ0FBQUUsQ0FBQTtnQkFBQTtjQUFBO2NBQUFGLFFBQUEsQ0FBQUUsQ0FBQTtjQUFBLE9BQ1IsSUFBSSxDQUFDMUcsU0FBUyxDQUFDNEUsT0FBTyxDQUFDbkIsSUFBbUIsQ0FBQztZQUFBO2NBQUEsT0FBQStDLFFBQUEsQ0FBQUksQ0FBQTtZQUFBO2NBS3JELElBQUksSUFBSSxDQUFDM0csUUFBUSxFQUFFO2dCQUNmLElBQUksQ0FBQ0EsUUFBUSxDQUFDMkUsT0FBTyxDQUFDbkIsSUFBa0IsQ0FBQztjQUM3QztjQUFDLE9BQUErQyxRQUFBLENBQUFJLENBQUE7WUFBQTtjQUdELElBQUksSUFBSSxDQUFDMUcsVUFBVSxFQUFFO2dCQUNqQixJQUFJLENBQUNBLFVBQVUsQ0FBQzBFLE9BQU8sQ0FBQ25CLElBQW9CLENBQUM7Y0FDakQ7Y0FBQyxPQUFBK0MsUUFBQSxDQUFBSSxDQUFBO1lBQUE7Y0FJRCxJQUFJLElBQUksQ0FBQ3pHLE9BQU8sRUFBRTtnQkFDZCxJQUFJLENBQUNBLE9BQU8sQ0FBQ3lFLE9BQU8sQ0FBQ25CLElBQUksQ0FBQztjQUM5QjtjQUFDLE9BQUErQyxRQUFBLENBQUFJLENBQUE7WUFBQTtjQUlELElBQUksSUFBSSxDQUFDeEcsV0FBVyxFQUFFO2dCQUNsQixJQUFJLENBQUNBLFdBQVcsQ0FBQ3dFLE9BQU8sQ0FBQ25CLElBQXFCLENBQUM7Y0FDbkQ7Y0FBQyxPQUFBK0MsUUFBQSxDQUFBSSxDQUFBO1lBQUE7Y0FJRCxJQUFJLElBQUksQ0FBQ3ZHLGNBQWMsRUFBRTtnQkFDckIsSUFBSSxDQUFDQSxjQUFjLENBQUN1RSxPQUFPLENBQUNuQixJQUF3QixDQUFDO2NBQ3pEO2NBQUMsT0FBQStDLFFBQUEsQ0FBQUksQ0FBQTtZQUFBO2NBR0QsSUFBSSxJQUFJLENBQUN0RyxjQUFjLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQ0EsY0FBYyxDQUFDc0UsT0FBTyxDQUFDbkIsSUFBd0IsQ0FBQztjQUN6RDtjQUFDLE9BQUErQyxRQUFBLENBQUFJLENBQUE7WUFBQTtjQUdELElBQUksSUFBSSxDQUFDckcsY0FBYyxFQUFFO2dCQUNyQixJQUFJLENBQUNBLGNBQWMsQ0FBQ3FFLE9BQU8sQ0FBQ25CLElBQXdCLENBQUM7Y0FDekQ7Y0FBQyxPQUFBK0MsUUFBQSxDQUFBSSxDQUFBO1lBQUE7Y0FJRCxJQUFJLENBQUNwRyxlQUFlLENBQUNDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRW1FLE9BQU8sQ0FBQ3JCLEtBQUssQ0FBQztZQUFDO2NBQUFpRCxRQUFBLENBQUFFLENBQUE7Y0FBQTtZQUFBO2NBQUFGLFFBQUEsQ0FBQUMsQ0FBQTtjQUFBSCxHQUFBLEdBQUFFLFFBQUEsQ0FBQUssQ0FBQTtjQUl2RSxJQUFJLENBQUNyRyxlQUFlLENBQUNHLEtBQUssQ0FBQywwQkFBMEIsRUFBQTJGLEdBQU8sQ0FBQztjQUU3RCxJQUFJLElBQUksQ0FBQ3hHLE9BQU8sRUFBRTtnQkFDZCxJQUFJLENBQUNBLE9BQU8sQ0FBQXdHLEdBQU0sQ0FBQztjQUN2QjtZQUFDO2NBQUEsT0FBQUUsUUFBQSxDQUFBSSxDQUFBO1VBQUE7UUFBQSxHQUFBUixPQUFBO01BQUEsQ0FFUjtNQUFBLFNBM0VJNUMsYUFBYUEsQ0FBQXNELEVBQUE7UUFBQSxPQUFBZCxjQUFBLENBQUFlLEtBQUEsT0FBQXBJLFNBQUE7TUFBQTtNQUFBLE9BQWI2RSxhQUFhO0lBQUE7SUE4RWxCOzs7SUFBQTtFQUFBO0lBQUE1RixHQUFBO0lBQUFDLEtBQUEsRUFHQSxTQUFBbUosVUFBVUEsQ0FBQTtNQUNOO01BQ0EsSUFBSSxDQUFDNUQsbUJBQW1CLEVBQUU7TUFFMUIsSUFBSSxJQUFJLENBQUN2RSxNQUFNLEVBQUU7UUFDYixJQUFJLENBQUNBLE1BQU0sQ0FBQ29JLEtBQUssRUFBRTtRQUNuQixJQUFJLENBQUNwSSxNQUFNLEdBQUcsSUFBSTtNQUN0QjtNQUNBLElBQUksQ0FBQ0MsWUFBWSxHQUFHLEtBQUs7SUFDN0I7SUFFQTs7OztFQUFBO0lBQUFsQixHQUFBO0lBQUFDLEtBQUEsRUFJQSxTQUFBcUosV0FBV0EsQ0FBQTtNQUNQLE9BQU8sSUFBSSxDQUFDcEksWUFBWTtJQUM1QjtJQUVBOzs7RUFBQTtJQUFBbEIsR0FBQTtJQUFBQyxLQUFBLEVBR0EsU0FBQXNKLE9BQU9BLENBQUE7TUFDSCxJQUFJLENBQUNILFVBQVUsRUFBRTtNQUNqQixJQUFJLENBQUN4RyxlQUFlLEdBQUcsSUFBVztNQUNsQyxJQUFJLENBQUNiLFNBQVMsR0FBRyxJQUFJO01BQ3JCLElBQUksQ0FBQ0MsWUFBWSxHQUFHLElBQUk7TUFDeEIsSUFBSSxDQUFDRSxPQUFPLEdBQUcsSUFBSTtNQUNuQixJQUFJLENBQUNDLFNBQVMsR0FBRyxJQUFJO01BQ3JCLElBQUksQ0FBQ0MsU0FBUyxHQUFHLElBQUk7TUFDckIsSUFBSSxDQUFDQyxRQUFRLEdBQUcsSUFBSTtNQUNwQixJQUFJLENBQUNFLE9BQU8sR0FBRyxJQUFJO01BQ25CLElBQUksQ0FBQ0MsV0FBVyxHQUFHLElBQUk7TUFDdkIsSUFBSSxDQUFDQyxjQUFjLEdBQUcsSUFBSTtJQUM5QjtFQUFDO0FBQUEsSTs7Ozs7Ozs7Ozs7O0FDcHBCTDs7Ozs7QUFzQkE7OztBQUdPLElBQU0rRyxjQUFjO0VBQTNCLFNBQUFBLGVBQUE7SUFBQTFKLDhCQUFBLE9BQUEwSixjQUFBO0lBQ1UsS0FBQUMsYUFBYSxHQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLEtBQUFDLGNBQWMsR0FBVyxDQUFDLENBQUMsQ0FBQztJQUM1QixLQUFBQyxPQUFPLEdBQWEsRUFBRSxDQUFDLENBQUM7SUFDeEIsS0FBQUMsWUFBWSxHQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsS0FBQUMsZ0JBQWdCLEdBQTRCLElBQUksQ0FBQyxDQUFDO0lBRTFEO0lBQ1EsS0FBQUMsYUFBYSxHQUErQixJQUFJLENBQUMsQ0FBQztJQUNsRCxLQUFBQyxnQkFBZ0IsR0FBa0MsSUFBSSxDQUFDLENBQUM7RUE0UmxFO0VBMVJFOzs7O0VBQUEsT0FBQWhLLDJCQUFBLENBQUF5SixjQUFBO0lBQUF4SixHQUFBO0lBQUFDLEtBQUEsRUFJQSxTQUFBK0osZ0JBQWdCQSxDQUFDNUcsUUFBNkI7TUFDNUMsSUFBSSxDQUFDMEcsYUFBYSxHQUFHMUcsUUFBUTtJQUMvQjtJQUVBOzs7O0VBQUE7SUFBQXBELEdBQUE7SUFBQUMsS0FBQSxFQUlBLFNBQUFnSyxtQkFBbUJBLENBQUM3RyxRQUFnQztNQUNsRCxJQUFJLENBQUMyRyxnQkFBZ0IsR0FBRzNHLFFBQVE7SUFDbEM7SUFFQTs7OztFQUFBO0lBQUFwRCxHQUFBO0lBQUFDLEtBQUEsRUFJQSxTQUFBaUssbUJBQW1CQSxDQUFDQyxNQUF3QjtNQUMxQyxJQUFJLENBQUNOLGdCQUFnQixHQUFHTSxNQUFNO0lBQ2hDO0lBRUE7Ozs7RUFBQTtJQUFBbkssR0FBQTtJQUFBQyxLQUFBO01BQUEsSUFBQW1LLE1BQUEsR0FBQS9CLGdDQUFBLGNBQUFDLDJCQUFBLEdBQUFDLENBQUEsQ0FJQSxTQUFBQyxRQUFZNkIsS0FBWTtRQUFBLE9BQUEvQiwyQkFBQSxHQUFBSyxDQUFBLFdBQUFDLFFBQUE7VUFBQSxrQkFBQUEsUUFBQSxDQUFBRSxDQUFBO1lBQUE7Y0FBQSxNQUNsQnVCLEtBQUksS0FBSyxJQUFJLElBQUlBLEtBQUksS0FBSyxJQUFJO2dCQUFBekIsUUFBQSxDQUFBRSxDQUFBO2dCQUFBO2NBQUE7Y0FBQSxLQUU1QixJQUFJLENBQUNXLGFBQWEsQ0FBQ2EsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFBQTFCLFFBQUEsQ0FBQUUsQ0FBQTtnQkFBQTtjQUFBO2NBQ25DO2NBQ0EsSUFBSSxDQUFDVyxhQUFhLEdBQUcsSUFBSSxDQUFDQSxhQUFhLEdBQUcsSUFBSTtjQUM5QyxJQUFJLENBQUNDLGNBQWMsR0FBRyxJQUFJLENBQUNELGFBQWEsQ0FBQ2hKLE1BQU07Y0FDL0MsSUFBSSxDQUFDOEosaUJBQWlCLEVBQUU7Y0FBQzNCLFFBQUEsQ0FBQUUsQ0FBQTtjQUFBO1lBQUE7Y0FBQUYsUUFBQSxDQUFBRSxDQUFBO2NBQUEsT0FHbkIsSUFBSSxDQUFDMEIsY0FBYyxFQUFFO1lBQUE7Y0FBQTVCLFFBQUEsQ0FBQUUsQ0FBQTtjQUFBO1lBQUE7Y0FFeEIsSUFBSXVCLEtBQUksS0FBSyxJQUFJLElBQUlBLEtBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQzNDO2dCQUNBLElBQUksSUFBSSxDQUFDWCxjQUFjLEdBQUcsQ0FBQyxFQUFFO2tCQUMzQixJQUFJLENBQUNELGFBQWEsR0FBRyxJQUFJLENBQUNBLGFBQWEsQ0FBQ2dCLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDZixjQUFjLEdBQUcsQ0FBQyxDQUFDLEdBQ3RELElBQUksQ0FBQ0QsYUFBYSxDQUFDZ0IsS0FBSyxDQUFDLElBQUksQ0FBQ2YsY0FBYyxDQUFDO2tCQUNoRSxJQUFJLENBQUNBLGNBQWMsRUFBRTtrQkFDckIsSUFBSSxDQUFDYSxpQkFBaUIsRUFBRTtnQkFDMUI7Y0FDRixDQUFDLE1BQU0sSUFBSUYsS0FBSSxLQUFLLFFBQVEsRUFBRTtnQkFDNUI7Z0JBQ0E7Z0JBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQ0ssWUFBWSxFQUFFLEVBQUU7a0JBQ3hCLElBQUksQ0FBQ0MsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQjtjQUNGLENBQUMsTUFBTSxJQUFJTixLQUFJLEtBQUssUUFBUSxFQUFFO2dCQUM1QjtnQkFDQTtnQkFDQSxJQUFJLENBQUMsSUFBSSxDQUFDTyxjQUFjLEVBQUUsRUFBRTtrQkFDMUIsSUFBSSxDQUFDRCxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUN6QjtjQUNGLENBQUMsTUFBTSxJQUFJTixLQUFJLEtBQUssUUFBUSxFQUFFO2dCQUM1QjtnQkFDQSxJQUFJLENBQUNRLGVBQWUsRUFBRTtjQUN4QixDQUFDLE1BQU0sSUFBSVIsS0FBSSxLQUFLLFFBQVEsRUFBRTtnQkFDNUI7Z0JBQ0EsSUFBSSxDQUFDUyxjQUFjLEVBQUU7Y0FDdkIsQ0FBQyxNQUFNLElBQUlULEtBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQzFCO2dCQUNBLElBQUksQ0FBQ1osYUFBYSxHQUFHLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQ0MsY0FBYyxHQUFHLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQ2EsaUJBQWlCLEVBQUU7Y0FDMUIsQ0FBQyxNQUFNLElBQUlGLEtBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQzFCO2dCQUNBLElBQUksQ0FBQ0UsaUJBQWlCLEVBQUU7Y0FDMUIsQ0FBQyxNQUFNLElBQUlGLEtBQUksS0FBSyxNQUFNLEVBQUU7Z0JBQzFCO2dCQUNBLElBQUksQ0FBQ0UsaUJBQWlCLEVBQUU7Y0FDMUIsQ0FBQyxNQUFNO2dCQUNMO2dCQUNBLElBQUksQ0FBQ2QsYUFBYSxHQUFHLElBQUksQ0FBQ0EsYUFBYSxDQUFDZ0IsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUNmLGNBQWMsQ0FBQyxHQUNsRFcsS0FBSSxHQUNKLElBQUksQ0FBQ1osYUFBYSxDQUFDZ0IsS0FBSyxDQUFDLElBQUksQ0FBQ2YsY0FBYyxDQUFDO2dCQUNoRSxJQUFJLENBQUNBLGNBQWMsRUFBRTtnQkFDckIsSUFBSSxDQUFDYSxpQkFBaUIsRUFBRTtjQUMxQjtZQUFDO2NBQUEsT0FBQTNCLFFBQUEsQ0FBQUksQ0FBQTtVQUFBO1FBQUEsR0FBQVIsT0FBQTtNQUFBLENBQ0Y7TUFBQSxTQXpES3VDLEtBQUtBLENBQUE3QixFQUFBO1FBQUEsT0FBQWtCLE1BQUEsQ0FBQWpCLEtBQUEsT0FBQXBJLFNBQUE7TUFBQTtNQUFBLE9BQUxnSyxLQUFLO0lBQUE7SUEyRFg7OztJQUFBO0VBQUE7SUFBQS9LLEdBQUE7SUFBQUMsS0FBQTtNQUFBLElBQUErSyxlQUFBLEdBQUEzQyxnQ0FBQSxjQUFBQywyQkFBQSxHQUFBQyxDQUFBLENBR0EsU0FBQTBDLFNBQUE7UUFBQSxJQUFBQyxRQUFBLEVBQUE3RCxPQUFBO1FBQUEsT0FBQWlCLDJCQUFBLEdBQUFLLENBQUEsV0FBQXdDLFNBQUE7VUFBQSxrQkFBQUEsU0FBQSxDQUFBckMsQ0FBQTtZQUFBO2NBQ0U7Y0FDTW9DLFFBQVEsR0FBRyxJQUFJLENBQUN6QixhQUFhLENBQUMyQixPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztjQUNsRC9ELE9BQU8sR0FBRzZELFFBQVEsQ0FBQ0csSUFBSSxFQUFFO2NBQUEsTUFFM0JoRSxPQUFPLENBQUM1RyxNQUFNLEtBQUssQ0FBQztnQkFBQTBLLFNBQUEsQ0FBQXJDLENBQUE7Z0JBQUE7Y0FBQTtjQUN0QjtjQUNBLElBQUksQ0FBQ3lCLGlCQUFpQixFQUFFO2NBQUMsT0FBQVksU0FBQSxDQUFBbkMsQ0FBQTtZQUFBO2NBSTNCO2NBQ0EsSUFBSTNCLE9BQU8sS0FBSyxJQUFJLENBQUNzQyxPQUFPLENBQUMsSUFBSSxDQUFDQSxPQUFPLENBQUNsSixNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3JELElBQUksQ0FBQ2tKLE9BQU8sQ0FBQzJCLElBQUksQ0FBQ2pFLE9BQU8sQ0FBQztnQkFDMUIsSUFBSSxJQUFJLENBQUNzQyxPQUFPLENBQUNsSixNQUFNLEdBQUcsR0FBRyxFQUFFO2tCQUM3QixJQUFJLENBQUNrSixPQUFPLENBQUM0QixLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QjtjQUNGO2NBQ0EsSUFBSSxDQUFDM0IsWUFBWSxHQUFHLElBQUksQ0FBQ0QsT0FBTyxDQUFDbEosTUFBTTtjQUV2QztjQUFBLEtBQ0ksSUFBSSxDQUFDc0osZ0JBQWdCO2dCQUFBb0IsU0FBQSxDQUFBckMsQ0FBQTtnQkFBQTtjQUFBO2NBQUFxQyxTQUFBLENBQUFyQyxDQUFBO2NBQUEsT0FDakIsSUFBSSxDQUFDaUIsZ0JBQWdCLENBQUMxQyxPQUFPLENBQUM7WUFBQTtjQUd0QztjQUNBLElBQUksQ0FBQ29DLGFBQWEsR0FBRyxFQUFFO2NBQ3ZCLElBQUksQ0FBQ0MsY0FBYyxHQUFHLENBQUM7Y0FDdkIsSUFBSSxDQUFDYSxpQkFBaUIsRUFBRTtZQUFDO2NBQUEsT0FBQVksU0FBQSxDQUFBbkMsQ0FBQTtVQUFBO1FBQUEsR0FBQWlDLFFBQUE7TUFBQSxDQUMxQjtNQUFBLFNBN0JLVCxjQUFjQSxDQUFBO1FBQUEsT0FBQVEsZUFBQSxDQUFBN0IsS0FBQSxPQUFBcEksU0FBQTtNQUFBO01BQUEsT0FBZHlKLGNBQWM7SUFBQTtJQStCcEI7OztJQUFBO0VBQUE7SUFBQXhLLEdBQUE7SUFBQUMsS0FBQSxFQUdBLFNBQUE2SyxjQUFjQSxDQUFBO01BQ1osSUFBSSxJQUFJLENBQUNwQixjQUFjLEdBQUcsQ0FBQyxFQUFFO1FBQzNCLElBQUksQ0FBQ0EsY0FBYyxFQUFFO1FBQ3JCLElBQUksQ0FBQ2EsaUJBQWlCLEVBQUU7TUFDMUI7SUFDRjtJQUVBOzs7RUFBQTtJQUFBdkssR0FBQTtJQUFBQyxLQUFBLEVBR0EsU0FBQTRLLGVBQWVBLENBQUE7TUFDYixJQUFJLElBQUksQ0FBQ25CLGNBQWMsR0FBRyxJQUFJLENBQUNELGFBQWEsQ0FBQ2hKLE1BQU0sRUFBRTtRQUNuRCxJQUFJLENBQUNpSixjQUFjLEVBQUU7UUFDckIsSUFBSSxDQUFDYSxpQkFBaUIsRUFBRTtNQUMxQjtJQUNGO0lBRUE7Ozs7RUFBQTtJQUFBdkssR0FBQTtJQUFBQyxLQUFBLEVBSVEsU0FBQXlLLFlBQVlBLENBQUE7TUFDbEIsSUFBSSxJQUFJLENBQUNqQixhQUFhLENBQUNoSixNQUFNLEtBQUssQ0FBQyxFQUFFLE9BQU8sS0FBSztNQUVqRCxJQUFNK0ssTUFBTSxHQUFHLElBQUksQ0FBQy9CLGFBQWEsQ0FBQ2dCLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDZixjQUFjLENBQUM7TUFDL0QsSUFBTStCLGdCQUFnQixHQUFHRCxNQUFNLENBQUNFLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztNQUV2RDtNQUNBLElBQUlELGdCQUFnQixLQUFLLENBQUMsRUFBRTtRQUMxQjtRQUNBLE9BQU8sS0FBSztNQUNkO01BRUEsSUFBTUUsV0FBVyxHQUFHLElBQUksQ0FBQ2xDLGFBQWEsQ0FBQ2lDLFdBQVcsQ0FBQyxJQUFJLEVBQUVELGdCQUFnQixHQUFHLENBQUMsQ0FBQztNQUM5RSxJQUFNRyxhQUFhLEdBQUdELFdBQVcsSUFBSSxDQUFDLEdBQUdBLFdBQVcsR0FBRyxDQUFDLEdBQUcsQ0FBQztNQUM1RCxJQUFNRSxXQUFXLEdBQUdKLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDO01BRTFDLElBQU1LLGFBQWEsR0FBRyxJQUFJLENBQUNwQyxjQUFjLEdBQUcrQixnQkFBZ0I7TUFDNUQsSUFBTU0sY0FBYyxHQUFHNUwsSUFBSSxDQUFDNkwsR0FBRyxDQUFDLENBQUMsRUFBRUgsV0FBVyxHQUFHRCxhQUFhLENBQUM7TUFDL0QsSUFBTUssWUFBWSxHQUFHOUwsSUFBSSxDQUFDdUcsR0FBRyxDQUFDb0YsYUFBYSxFQUFFQyxjQUFjLENBQUM7TUFDNUQsSUFBTUcsV0FBVyxHQUFHTixhQUFhLEdBQUdLLFlBQVk7TUFFaEQsSUFBSUMsV0FBVyxLQUFLLElBQUksQ0FBQ3hDLGNBQWMsRUFBRTtRQUN2QyxJQUFJLENBQUNBLGNBQWMsR0FBR3dDLFdBQVc7UUFDakMsSUFBSSxDQUFDM0IsaUJBQWlCLEVBQUU7UUFDeEIsT0FBTyxJQUFJO01BQ2I7TUFDQSxPQUFPLEtBQUs7SUFDZDtJQUVBOzs7O0VBQUE7SUFBQXZLLEdBQUE7SUFBQUMsS0FBQSxFQUlRLFNBQUEySyxjQUFjQSxDQUFBO01BQ3BCLElBQUksSUFBSSxDQUFDbkIsYUFBYSxDQUFDaEosTUFBTSxLQUFLLENBQUMsRUFBRSxPQUFPLEtBQUs7TUFFakQsSUFBTStLLE1BQU0sR0FBRyxJQUFJLENBQUMvQixhQUFhLENBQUNnQixLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQ2YsY0FBYyxDQUFDO01BQy9ELElBQU0rQixnQkFBZ0IsR0FBR0QsTUFBTSxDQUFDRSxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztNQUVyRDtNQUNBLElBQU1TLHFCQUFxQixHQUFHLElBQUksQ0FBQzFDLGFBQWEsQ0FBQy9JLE9BQU8sQ0FBQyxJQUFJLEVBQUUrSyxnQkFBZ0IsQ0FBQztNQUNoRixJQUFNVyxjQUFjLEdBQUdELHFCQUFxQixJQUFJLENBQUMsR0FBR0EscUJBQXFCLEdBQUcsSUFBSSxDQUFDMUMsYUFBYSxDQUFDaEosTUFBTTtNQUVyRyxJQUFJMEwscUJBQXFCLEdBQUcsQ0FBQyxFQUFFO1FBQzdCO1FBQ0EsT0FBTyxLQUFLO01BQ2Q7TUFFQSxJQUFNRSxhQUFhLEdBQUdGLHFCQUFxQixHQUFHLENBQUM7TUFDL0MsSUFBTUcsa0JBQWtCLEdBQUcsSUFBSSxDQUFDN0MsYUFBYSxDQUFDL0ksT0FBTyxDQUFDLElBQUksRUFBRTJMLGFBQWEsQ0FBQztNQUMxRSxJQUFNRSxXQUFXLEdBQUdELGtCQUFrQixJQUFJLENBQUMsR0FBR0Esa0JBQWtCLEdBQUcsSUFBSSxDQUFDN0MsYUFBYSxDQUFDaEosTUFBTTtNQUU1RixJQUFNcUwsYUFBYSxHQUFHLElBQUksQ0FBQ3BDLGNBQWMsR0FBRytCLGdCQUFnQjtNQUM1RCxJQUFNZSxjQUFjLEdBQUdyTSxJQUFJLENBQUM2TCxHQUFHLENBQUMsQ0FBQyxFQUFFTyxXQUFXLEdBQUdGLGFBQWEsQ0FBQztNQUMvRCxJQUFNSixZQUFZLEdBQUc5TCxJQUFJLENBQUN1RyxHQUFHLENBQUNvRixhQUFhLEVBQUVVLGNBQWMsQ0FBQztNQUM1RCxJQUFNTixXQUFXLEdBQUdHLGFBQWEsR0FBR0osWUFBWTtNQUVoRCxJQUFJQyxXQUFXLEtBQUssSUFBSSxDQUFDeEMsY0FBYyxFQUFFO1FBQ3ZDLElBQUksQ0FBQ0EsY0FBYyxHQUFHd0MsV0FBVztRQUNqQyxJQUFJLENBQUMzQixpQkFBaUIsRUFBRTtRQUN4QixPQUFPLElBQUk7TUFDYjtNQUNBLE9BQU8sS0FBSztJQUNkO0lBRUE7Ozs7RUFBQTtJQUFBdkssR0FBQTtJQUFBQyxLQUFBLEVBSUEsU0FBQTBLLGVBQWVBLENBQUM4QixTQUFpQjtNQUMvQixJQUFJLElBQUksQ0FBQzlDLE9BQU8sQ0FBQ2xKLE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFFL0IsSUFBSWdNLFNBQVMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM3QyxZQUFZLEdBQUcsQ0FBQyxFQUFFO1FBQUEsSUFBQThDLHFCQUFBO1FBQzdDO1FBQ0EsSUFBSSxDQUFDOUMsWUFBWSxFQUFFO1FBQ25CLElBQUksQ0FBQ0gsYUFBYSxJQUFBaUQscUJBQUEsR0FBRyxJQUFJLENBQUMvQyxPQUFPLENBQUMsSUFBSSxDQUFDQyxZQUFZLENBQUMsY0FBQThDLHFCQUFBLGNBQUFBLHFCQUFBLEdBQUksRUFBRTtRQUMxRCxJQUFJLENBQUNoRCxjQUFjLEdBQUcsSUFBSSxDQUFDRCxhQUFhLENBQUNoSixNQUFNLENBQUMsQ0FBQztNQUNuRCxDQUFDLE1BQU0sSUFBSWdNLFNBQVMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDN0MsWUFBWSxHQUFHLElBQUksQ0FBQ0QsT0FBTyxDQUFDbEosTUFBTSxHQUFHLENBQUMsRUFBRTtRQUFBLElBQUFrTSxzQkFBQTtRQUN6RTtRQUNBLElBQUksQ0FBQy9DLFlBQVksRUFBRTtRQUNuQixJQUFJLENBQUNILGFBQWEsSUFBQWtELHNCQUFBLEdBQUcsSUFBSSxDQUFDaEQsT0FBTyxDQUFDLElBQUksQ0FBQ0MsWUFBWSxDQUFDLGNBQUErQyxzQkFBQSxjQUFBQSxzQkFBQSxHQUFJLEVBQUU7UUFDMUQsSUFBSSxDQUFDakQsY0FBYyxHQUFHLElBQUksQ0FBQ0QsYUFBYSxDQUFDaEosTUFBTSxDQUFDLENBQUM7TUFDbkQsQ0FBQyxNQUFNLElBQUlnTSxTQUFTLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQzdDLFlBQVksS0FBSyxJQUFJLENBQUNELE9BQU8sQ0FBQ2xKLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDM0U7UUFDQSxJQUFJLENBQUNtSixZQUFZLEdBQUcsSUFBSSxDQUFDRCxPQUFPLENBQUNsSixNQUFNO1FBQ3ZDLElBQUksQ0FBQ2dKLGFBQWEsR0FBRyxFQUFFO1FBQ3ZCLElBQUksQ0FBQ0MsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQzNCO01BRUEsSUFBSSxDQUFDYSxpQkFBaUIsRUFBRTtJQUMxQjtJQUVBOzs7RUFBQTtJQUFBdkssR0FBQTtJQUFBQyxLQUFBLEVBR1EsU0FBQXNLLGlCQUFpQkEsQ0FBQTtNQUN2QjtNQUNBLElBQUksSUFBSSxDQUFDVixnQkFBZ0IsRUFBRTtRQUN6QixJQUFJLENBQUNBLGdCQUFnQixDQUFDa0IsS0FBSyxDQUFDLElBQUksQ0FBQ3RCLGFBQWEsRUFBRSxJQUFJLENBQUNDLGNBQWMsQ0FBQztNQUN0RTtNQUVBO01BQ0EsSUFBSSxJQUFJLENBQUNJLGFBQWEsRUFBRTtRQUN0QixJQUFJLENBQUNBLGFBQWEsQ0FBQztVQUNqQjhDLFNBQVMsRUFBRSxJQUFJLENBQUNsRCxjQUFjO1VBQzlCckMsT0FBTyxFQUFFLElBQUksQ0FBQ29DO1NBQ2YsQ0FBQztNQUNKO0lBQ0Y7RUFBQztJQUFBekosR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQTRNLFFBQVFBLENBQUNDLEtBQW1CO01BQzFCLElBQUksQ0FBQ3JELGFBQWEsR0FBR3FELEtBQUssQ0FBQ3pGLE9BQU87TUFDbEMsSUFBSSxDQUFDcUMsY0FBYyxHQUFHb0QsS0FBSyxDQUFDRixTQUFTO01BQ3JDLElBQUksQ0FBQ3JDLGlCQUFpQixFQUFFO0lBQzFCO0lBRUE7OztFQUFBO0lBQUF2SyxHQUFBO0lBQUFDLEtBQUEsRUFHQSxTQUFBOE0sV0FBV0EsQ0FBQTtNQUNULElBQUksQ0FBQ3RELGFBQWEsR0FBRyxFQUFFO01BQ3ZCLElBQUksQ0FBQ0MsY0FBYyxHQUFHLENBQUM7TUFDdkIsSUFBSSxDQUFDYSxpQkFBaUIsRUFBRTtJQUMxQjtJQUVBOzs7RUFBQTtJQUFBdkssR0FBQTtJQUFBQyxLQUFBLEVBR0EsU0FBQXNKLE9BQU9BLENBQUE7TUFDTCxJQUFJLENBQUNFLGFBQWEsR0FBRyxFQUFFO01BQ3ZCLElBQUksQ0FBQ0MsY0FBYyxHQUFHLENBQUM7TUFDdkIsSUFBSSxDQUFDQyxPQUFPLEdBQUcsRUFBRTtNQUNqQixJQUFJLENBQUNDLFlBQVksR0FBRyxDQUFDLENBQUM7TUFDdEIsSUFBSSxDQUFDRSxhQUFhLEdBQUcsSUFBSTtNQUN6QixJQUFJLENBQUNDLGdCQUFnQixHQUFHLElBQUk7TUFDNUIsSUFBSSxDQUFDRixnQkFBZ0IsR0FBRyxJQUFJO0lBQzlCO0VBQUM7QUFBQSxJOzs7Ozs7Ozs7Ozs7Ozs7OztBQzdUSDs7O0FBSWtEO0FBRTNDLElBQU1vRCxXQUFZLDBCQUFBQyxjQUFBO0VBQXpCLFNBQUFELFlBQUE7SUFBQSxJQUFBakksS0FBQTtJQUFBbEYsbUJBQUEsT0FBQW1OLFdBQUE7O0lBQ2FqSSxLQUFBLENBQUFpQyxJQUFJLEdBQUcsTUFBTTtJQUNiakMsS0FBQSxDQUFBbUksV0FBVyxHQUFHLDhGQUE4RjtJQUFDLE9BQUFuSSxLQUFBO0VBSzFIO0VBQUNvSSxTQUFBLENBQUFILFdBQUEsRUFBQUMsY0FBQTtFQUFBLE9BQUFuTixnQkFBQSxDQUFBa04sV0FBQTtJQUFBak4sR0FBQTtJQUFBQyxLQUFBLEVBSEcsU0FBQW9OLE9BQU9BLENBQUNoRyxPQUFlO01BQ25CLE9BQU9pRyxrQkFBa0IsRUFBRTtJQUMvQjtFQUFDO0FBQUEsRUFONEJOLG1DQUFhO0FBUzlDOzs7O0FBSUEsU0FBU00sa0JBQWtCQSxDQUFBO0VBQ3ZCLElBQUlySyxJQUFJLEdBQUcsRUFBRTtFQUViLElBQUk7SUFDQTtJQUNBQSxJQUFJLElBQUksa0NBQWtDO0lBQzFDQSxJQUFJLDBCQUFBMEIsTUFBQSxDQUEwQjRJLFdBQVcsRUFBRSxPQUFJO0lBQy9DdEssSUFBSSwyQkFBQTBCLE1BQUEsQ0FBMkI2SSxZQUFZLEVBQUUsT0FBSTtJQUNqRHZLLElBQUksaUJBQUEwQixNQUFBLENBQWlCOEksU0FBUyxDQUFDQyxRQUFRLElBQUksU0FBUyxPQUFJO0lBQ3hEekssSUFBSSxpQkFBQTBCLE1BQUEsQ0FBaUI4SSxTQUFTLENBQUNFLFFBQVEsSUFBSSxTQUFTLE9BQUk7SUFDeEQxSyxJQUFJLG1CQUFBMEIsTUFBQSxDQUFtQjhJLFNBQVMsQ0FBQ0csU0FBUyxJQUFJLFNBQVMsT0FBSTtJQUUzRDtJQUNBLElBQUksT0FBT2hILE1BQU0sS0FBSyxXQUFXLEVBQUU7TUFDL0IzRCxJQUFJLElBQUksaUNBQWlDO01BQ3pDQSxJQUFJLGdCQUFBMEIsTUFBQSxDQUFnQmtKLGNBQWMsRUFBRSxPQUFJO01BQ3hDNUssSUFBSSx3QkFBQTBCLE1BQUEsQ0FBd0JtSixpQkFBaUIsRUFBRSxPQUFJO01BQ25EN0ssSUFBSSx3QkFBQTBCLE1BQUEsQ0FBd0I4SSxTQUFTLENBQUNNLGFBQWEsR0FBRyxLQUFLLEdBQUcsSUFBSSxPQUFJO01BQ3RFOUssSUFBSSxlQUFBMEIsTUFBQSxDQUFlOEksU0FBUyxDQUFDTyxNQUFNLEdBQUcsS0FBSyxHQUFHLElBQUksT0FBSTtNQUN0RC9LLElBQUkscUJBQUEwQixNQUFBLENBQXFCOEksU0FBUyxDQUFDUSxVQUFVLElBQUksZUFBZSxPQUFJO0lBQ3hFO0lBRUE7SUFDQSxJQUFJLE9BQU9DLE1BQU0sS0FBSyxXQUFXLEVBQUU7TUFDL0JqTCxJQUFJLElBQUksZ0NBQWdDO01BQ3hDQSxJQUFJLHFCQUFBMEIsTUFBQSxDQUFxQnVKLE1BQU0sQ0FBQ0MsS0FBSyxTQUFNO01BQzNDbEwsSUFBSSxzQkFBQTBCLE1BQUEsQ0FBc0J1SixNQUFNLENBQUNFLE1BQU0sU0FBTTtNQUM3Q25MLElBQUksd0JBQUEwQixNQUFBLENBQXdCdUosTUFBTSxDQUFDRyxVQUFVLFNBQU07TUFDbkRwTCxJQUFJLHlCQUFBMEIsTUFBQSxDQUF5QnVKLE1BQU0sQ0FBQ0ksV0FBVyxTQUFNO01BQ3JEckwsSUFBSSxvQkFBQTBCLE1BQUEsQ0FBb0J1SixNQUFNLENBQUNLLFVBQVUsWUFBUztNQUNsRHRMLElBQUksb0JBQUEwQixNQUFBLENBQW9CdUosTUFBTSxDQUFDTSxVQUFVLFlBQVM7TUFDbER2TCxJQUFJLDJCQUFBMEIsTUFBQSxDQUE0QmlDLE1BQWMsQ0FBQzZILGdCQUFnQixJQUFJLGVBQWUsT0FBSTtJQUMxRjtJQUVBO0lBQ0EsSUFBSSxPQUFPN0gsTUFBTSxLQUFLLFdBQVcsRUFBRTtNQUMvQjNELElBQUksSUFBSSxnQ0FBZ0M7TUFDeENBLElBQUkscUJBQUEwQixNQUFBLENBQXFCaUMsTUFBTSxDQUFDOEgsVUFBVSxTQUFNO01BQ2hEekwsSUFBSSxzQkFBQTBCLE1BQUEsQ0FBc0JpQyxNQUFNLENBQUMrSCxXQUFXLFNBQU07TUFDbEQxTCxJQUFJLG9CQUFBMEIsTUFBQSxDQUFvQmlDLE1BQU0sQ0FBQ2dJLFVBQVUsU0FBTTtNQUMvQzNMLElBQUkscUJBQUEwQixNQUFBLENBQXFCaUMsTUFBTSxDQUFDaUksV0FBVyxTQUFNO01BQ2pENUwsSUFBSSxpQkFBQTBCLE1BQUEsQ0FBaUJpQyxNQUFNLENBQUNrSSxPQUFPLFNBQU07TUFDekM3TCxJQUFJLGlCQUFBMEIsTUFBQSxDQUFpQmlDLE1BQU0sQ0FBQ21JLE9BQU8sU0FBTTtJQUM3QztJQUVBO0lBQ0E5TCxJQUFJLElBQUksOEJBQThCO0lBQ3RDQSxJQUFJLHFCQUFBMEIsTUFBQSxDQUFxQixJQUFJcUssSUFBSSxFQUFFLENBQUNDLGNBQWMsRUFBRSxPQUFJO0lBQ3hEaE0sSUFBSSxpQkFBQTBCLE1BQUEsQ0FBaUJ1SyxJQUFJLENBQUNDLGNBQWMsRUFBRSxDQUFDQyxlQUFlLEVBQUUsQ0FBQ0MsUUFBUSxPQUFJO0lBQ3pFcE0sSUFBSSx3QkFBQTBCLE1BQUEsQ0FBd0IsSUFBSXFLLElBQUksRUFBRSxDQUFDTSxpQkFBaUIsRUFBRSxlQUFZO0lBRXRFO0lBQ0EsSUFBSSxPQUFPQyxXQUFXLEtBQUssV0FBVyxFQUFFO01BQ3BDdE0sSUFBSSxJQUFJLHFDQUFxQztNQUM3Q0EsSUFBSSx3QkFBQTBCLE1BQUEsQ0FBeUI0SyxXQUFtQixDQUFDQyxVQUFVLENBQUNDLElBQUksT0FBSTtNQUNwRXhNLElBQUksdUJBQUEwQixNQUFBLENBQXdCNEssV0FBbUIsQ0FBQ0csTUFBTSxDQUFDQyxZQUFZLEdBQUlKLFdBQW1CLENBQUNHLE1BQU0sQ0FBQ0UsZUFBZSxTQUFNO01BQ3ZIM00sSUFBSSwyQkFBQTBCLE1BQUEsQ0FBNEI0SyxXQUFtQixDQUFDRyxNQUFNLENBQUNHLHdCQUF3QixHQUFJTixXQUFtQixDQUFDRyxNQUFNLENBQUNFLGVBQWUsU0FBTTtNQUV2SSxJQUFLTCxXQUFtQixDQUFDTyxNQUFNLEVBQUU7UUFDN0I3TSxJQUFJLG9CQUFBMEIsTUFBQSxDQUFvQnhFLElBQUksQ0FBQzRQLEtBQUssQ0FBRVIsV0FBbUIsQ0FBQ08sTUFBTSxDQUFDRSxjQUFjLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLFNBQU07UUFDOUcvTSxJQUFJLHFCQUFBMEIsTUFBQSxDQUFxQnhFLElBQUksQ0FBQzRQLEtBQUssQ0FBRVIsV0FBbUIsQ0FBQ08sTUFBTSxDQUFDRyxlQUFlLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLFNBQU07UUFDaEhoTixJQUFJLHFCQUFBMEIsTUFBQSxDQUFxQnhFLElBQUksQ0FBQzRQLEtBQUssQ0FBRVIsV0FBbUIsQ0FBQ08sTUFBTSxDQUFDSSxlQUFlLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLFNBQU07TUFDcEg7SUFDSjtJQUVBO0lBQ0EsSUFBS3pDLFNBQWlCLENBQUMwQyxVQUFVLEVBQUU7TUFDL0JsTixJQUFJLElBQUksaUNBQWlDO01BQ3pDQSxJQUFJLHdCQUFBMEIsTUFBQSxDQUF5QjhJLFNBQWlCLENBQUMwQyxVQUFVLENBQUNDLGFBQWEsSUFBSSxTQUFTLE9BQUk7TUFDeEZuTixJQUFJLGlCQUFBMEIsTUFBQSxDQUFrQjhJLFNBQWlCLENBQUMwQyxVQUFVLENBQUNFLFFBQVEsSUFBSSxTQUFTLFlBQVM7TUFDakZwTixJQUFJLFlBQUEwQixNQUFBLENBQWE4SSxTQUFpQixDQUFDMEMsVUFBVSxDQUFDRyxHQUFHLElBQUksU0FBUyxVQUFPO01BQ3JFck4sSUFBSSxrQkFBQTBCLE1BQUEsQ0FBbUI4SSxTQUFpQixDQUFDMEMsVUFBVSxDQUFDSSxRQUFRLEdBQUcsS0FBSyxHQUFHLElBQUksT0FBSTtJQUNuRjtJQUVBO0lBQ0EsSUFBSTlDLFNBQVMsQ0FBQytDLFdBQVcsRUFBRTtNQUN2QnZOLElBQUksSUFBSSx5QkFBeUI7TUFDakNBLElBQUksSUFBSSwwQkFBMEI7SUFDdEMsQ0FBQyxNQUFNO01BQ0hBLElBQUksSUFBSSx5QkFBeUI7TUFDakNBLElBQUksSUFBSSw4QkFBOEI7SUFDMUM7SUFFQTtJQUNBLElBQUt3SyxTQUFpQixDQUFDZ0QsWUFBWSxFQUFFO01BQ2pDeE4sSUFBSSxJQUFJLDJCQUEyQjtNQUNuQ0EsSUFBSSxJQUFJLDRCQUE0QjtJQUN4QyxDQUFDLE1BQU07TUFDSEEsSUFBSSxJQUFJLDJCQUEyQjtNQUNuQ0EsSUFBSSxJQUFJLGdDQUFnQztJQUM1QztJQUVBO0lBQ0EsSUFBSSxPQUFPeU4scUJBQXFCLEtBQUssV0FBVyxFQUFFO01BQzlDek4sSUFBSSxJQUFJLCtCQUErQjtNQUN2QyxJQUFNME4sTUFBTSxHQUFHQyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxRQUFRLENBQUM7TUFDL0MsSUFBTUMsRUFBRSxHQUFHSCxNQUFNLENBQUNJLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSUosTUFBTSxDQUFDSSxVQUFVLENBQUMsb0JBQW9CLENBQTBCO01BQ3pHLElBQUlELEVBQUUsRUFBRTtRQUNKN04sSUFBSSxzQkFBQTBCLE1BQUEsQ0FBc0JtTSxFQUFFLENBQUNFLFlBQVksQ0FBQ0YsRUFBRSxDQUFDRyxPQUFPLENBQUMsT0FBSTtRQUN6RGhPLElBQUkscUJBQUEwQixNQUFBLENBQXFCbU0sRUFBRSxDQUFDRSxZQUFZLENBQUNGLEVBQUUsQ0FBQ0ksTUFBTSxDQUFDLE9BQUk7UUFDdkRqTyxJQUFJLHVCQUFBMEIsTUFBQSxDQUF1Qm1NLEVBQUUsQ0FBQ0UsWUFBWSxDQUFDRixFQUFFLENBQUNLLFFBQVEsQ0FBQyxPQUFJO01BQy9ELENBQUMsTUFBTTtRQUNIbE8sSUFBSSxJQUFJLHdCQUF3QjtNQUNwQztJQUNKO0lBRUE7SUFDQUEsSUFBSSxJQUFJLDRCQUE0QjtJQUNwQ0EsSUFBSSxzQkFBQTBCLE1BQUEsQ0FBc0IsT0FBT3lNLFlBQVksS0FBSyxXQUFXLEdBQUcsS0FBSyxHQUFHLElBQUksT0FBSTtJQUNoRm5PLElBQUksd0JBQUEwQixNQUFBLENBQXdCLE9BQU8wTSxjQUFjLEtBQUssV0FBVyxHQUFHLEtBQUssR0FBRyxJQUFJLE9BQUk7SUFDcEZwTyxJQUFJLGtCQUFBMEIsTUFBQSxDQUFrQixPQUFPMk0sU0FBUyxLQUFLLFdBQVcsR0FBRyxLQUFLLEdBQUcsSUFBSSxPQUFJO0lBQ3pFck8sSUFBSSxvQkFBQTBCLE1BQUEsQ0FBb0IsT0FBTzRNLE1BQU0sS0FBSyxXQUFXLEdBQUcsS0FBSyxHQUFHLElBQUksT0FBSTtJQUN4RXRPLElBQUksd0JBQUEwQixNQUFBLENBQXdCLE9BQU82TSxhQUFhLEtBQUssV0FBVyxHQUFHLEtBQUssR0FBRyxJQUFJLE9BQUk7SUFDbkZ2TyxJQUFJLG1CQUFBMEIsTUFBQSxDQUFtQixPQUFPTyxTQUFTLEtBQUssV0FBVyxHQUFHLEtBQUssR0FBRyxJQUFJLE9BQUk7SUFDMUVqQyxJQUFJLGtCQUFBMEIsTUFBQSxDQUFrQixPQUFPOE0sS0FBSyxLQUFLLFdBQVcsR0FBRyxLQUFLLEdBQUcsSUFBSSxPQUFJO0lBQ3JFeE8sSUFBSSxnQkFBQTBCLE1BQUEsQ0FBZ0IsT0FBTytNLE9BQU8sS0FBSyxXQUFXLEdBQUcsS0FBSyxHQUFHLElBQUksT0FBSTtJQUNyRXpPLElBQUksb0JBQUEwQixNQUFBLENBQW9CZ04scUJBQXFCLEVBQUUsR0FBRyxLQUFLLEdBQUcsSUFBSSxPQUFJO0VBRXRFLENBQUMsQ0FBQyxPQUFPNU8sS0FBVSxFQUFFO0lBQ2pCRSxJQUFJLHVDQUFBMEIsTUFBQSxDQUF1QzVCLEtBQUssQ0FBQ2lFLE9BQU8sT0FBSTtFQUNoRTtFQUVBLE9BQU8vRCxJQUFJO0FBQ2Y7QUFFQTs7OztBQUlBLFNBQVNzSyxXQUFXQSxDQUFBO0VBQ2hCLElBQUk7SUFDQSxJQUFJLE9BQU8zRyxNQUFNLEtBQUssV0FBVyxFQUFFO01BQy9CLElBQUk2RyxTQUFTLENBQUNHLFNBQVMsQ0FBQ2dFLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLGFBQWE7TUFDaEUsSUFBSW5FLFNBQVMsQ0FBQ0csU0FBUyxDQUFDZ0UsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sd0JBQXdCO01BQzVFLElBQUluRSxTQUFTLENBQUNHLFNBQVMsQ0FBQ2dFLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLHlCQUF5QjtNQUM1RSxJQUFJbkUsU0FBUyxDQUFDRyxTQUFTLENBQUNnRSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxlQUFlO0lBQ3BFO0lBQ0EsT0FBTyxTQUFTO0VBQ3BCLENBQUMsQ0FBQyxPQUFPN08sS0FBSyxFQUFFO0lBQ1osT0FBTyxTQUFTO0VBQ3BCO0FBQ0o7QUFFQTs7OztBQUlBLFNBQVN5SyxZQUFZQSxDQUFBO0VBQ2pCLElBQUk7SUFDQTtJQUNBLElBQUksT0FBT3FFLE1BQU0sS0FBSyxXQUFXLEVBQUUsT0FBTywwQkFBMEI7SUFDcEUsSUFBSSxPQUFPSCxPQUFPLEtBQUssV0FBVyxJQUFLQSxPQUFPLENBQUNJLFNBQWlCLFdBQVEsRUFBRSxPQUFPLDJCQUEyQjtJQUM1RyxJQUFJLE9BQU9DLE1BQU0sQ0FBQ0MsT0FBTyxLQUFLLFdBQVcsRUFBRSxPQUFPLDBCQUEwQjtJQUM1RSxJQUFJLE9BQU9DLEtBQUssQ0FBQ0gsU0FBUyxDQUFDRixRQUFRLEtBQUssV0FBVyxFQUFFLE9BQU8sMEJBQTBCO0lBQ3RGLElBQUksT0FBT0YsT0FBTyxLQUFLLFdBQVcsRUFBRSxPQUFPLG1CQUFtQjtJQUM5RCxJQUFJLE9BQU9LLE1BQU0sQ0FBQ0csY0FBYyxLQUFLLFdBQVcsRUFBRSxPQUFPLDhCQUE4QjtJQUN2RixPQUFPLGdCQUFnQjtFQUMzQixDQUFDLENBQUMsT0FBT25QLEtBQUssRUFBRTtJQUNaLE9BQU8sU0FBUztFQUNwQjtBQUNKO0FBRUE7Ozs7QUFJQSxTQUFTOEssY0FBY0EsQ0FBQTtFQUNuQixJQUFJO0lBQ0EsSUFBTUQsU0FBUyxHQUFHSCxTQUFTLENBQUNHLFNBQVM7SUFDckMsSUFBSUEsU0FBUyxDQUFDZ0UsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUNoRSxTQUFTLENBQUNnRSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxRQUFRO0lBQy9FLElBQUloRSxTQUFTLENBQUNnRSxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxTQUFTO0lBQ25ELElBQUloRSxTQUFTLENBQUNnRSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQ2hFLFNBQVMsQ0FBQ2dFLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLFFBQVE7SUFDbEYsSUFBSWhFLFNBQVMsQ0FBQ2dFLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLE1BQU07SUFDNUMsSUFBSWhFLFNBQVMsQ0FBQ2dFLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSWhFLFNBQVMsQ0FBQ2dFLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLG1CQUFtQjtJQUM1RixPQUFPLFNBQVM7RUFDcEIsQ0FBQyxDQUFDLE9BQU83TyxLQUFLLEVBQUU7SUFDWixPQUFPLFNBQVM7RUFDcEI7QUFDSjtBQUVBOzs7O0FBSUEsU0FBUytLLGlCQUFpQkEsQ0FBQTtFQUN0QixJQUFJO0lBQ0EsSUFBTUYsU0FBUyxHQUFHSCxTQUFTLENBQUNHLFNBQVM7SUFDckMsSUFBTXVFLEtBQUssR0FBR3ZFLFNBQVMsQ0FBQ3VFLEtBQUssQ0FBQyw2REFBNkQsQ0FBQztJQUM1RixPQUFPQSxLQUFLLEdBQUdBLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLEdBQUcsU0FBUztFQUNwRCxDQUFDLENBQUMsT0FBT3BQLEtBQUssRUFBRTtJQUNaLE9BQU8sU0FBUztFQUNwQjtBQUNKO0FBRUE7Ozs7QUFJQSxTQUFTNE8scUJBQXFCQSxDQUFBO0VBQzFCLElBQUk7SUFDQTtJQUNBLElBQUlTLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztJQUM5QixPQUFPLElBQUk7RUFDZixDQUFDLENBQUMsT0FBT3JQLEtBQUssRUFBRTtJQUNaLE9BQU8sS0FBSztFQUNoQjtBQUNKLEM7Ozs7Ozs7Ozs7Ozs7OztBQ2pPQTs7O0FBSWtEO0FBRzNDLElBQU1zUCxXQUFZLDBCQUFBbkYsY0FBQTtFQUlyQixTQUFBbUYsWUFBb0JDLGNBQW9DO0lBQUEsSUFBQXROLEtBQUE7SUFBQWxGLG1CQUFBLE9BQUF1UyxXQUFBO0lBQ3BEck4sS0FBQSxHQUFBdU4sY0FBQSxPQUFBRixXQUFBO0lBRGdCck4sS0FBQSxDQUFBc04sY0FBYyxHQUFkQSxjQUFjO0lBSHpCdE4sS0FBQSxDQUFBaUMsSUFBSSxHQUFHLE1BQU07SUFDYmpDLEtBQUEsQ0FBQW1JLFdBQVcsR0FBRywrQ0FBK0M7SUFBQyxPQUFBbkksS0FBQTtFQUl2RTtFQUFDb0ksYUFBQSxDQUFBaUYsV0FBQSxFQUFBbkYsY0FBQTtFQUFBLE9BQUFuTixnQkFBQSxDQUFBc1MsV0FBQTtJQUFBclMsR0FBQTtJQUFBQyxLQUFBLEVBRUQsU0FBQW9OLE9BQU9BLENBQUNoRyxPQUFlO01BQ25CLElBQU1tTCxjQUFjLEdBQUcsSUFBSSxDQUFDRixjQUFjLENBQUNHLGlCQUFpQixFQUFFO01BQzlELElBQUlDLFFBQVEsR0FBRyx1QkFBdUI7TUFFdEMsSUFBSUYsY0FBYyxDQUFDL1IsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUMzQmlTLFFBQVEsSUFBSSxzQkFBc0I7UUFDbENGLGNBQWMsQ0FBQ0csT0FBTyxDQUFDLFVBQUFDLEdBQUcsRUFBRztVQUN6QkYsUUFBUSxTQUFBL04sTUFBQSxDQUFTaU8sR0FBRyxDQUFDM0wsSUFBSSxRQUFBdEMsTUFBQSxDQUFLaU8sR0FBRyxDQUFDekYsV0FBVyxPQUFJO1FBQ3JELENBQUMsQ0FBQztNQUNOO01BR0F1RixRQUFRLElBQUksK0NBQStDO01BQzNELE9BQU9BLFFBQVE7SUFDbkI7RUFBQztBQUFBLEVBdEI0QjFGLG1DQUFhLEU7Ozs7Ozs7Ozs7Ozs7OztBQ1A5Qzs7O0FBSWtEO0FBQ047QUFFckMsSUFBTThGLFlBQWEsMEJBQUE1RixjQUFBO0VBQTFCLFNBQUE0RixhQUFBO0lBQUEsSUFBQTlOLEtBQUE7SUFBQWxGLG9CQUFBLE9BQUFnVCxZQUFBOztJQUNhOU4sS0FBQSxDQUFBaUMsSUFBSSxHQUFHLE9BQU87SUFDZGpDLEtBQUEsQ0FBQW1JLFdBQVcsR0FBRyw0QkFBNEI7SUFBQyxPQUFBbkksS0FBQTtFQU14RDtFQUFDb0ksY0FBQSxDQUFBMEYsWUFBQSxFQUFBNUYsY0FBQTtFQUFBLE9BQUFuTixpQkFBQSxDQUFBK1MsWUFBQTtJQUFBOVMsR0FBQTtJQUFBQyxLQUFBLEVBSkcsU0FBQW9OLE9BQU9BLENBQUNoRyxPQUFlO01BQ25CO01BQ0EsT0FBT3dMLDhCQUFZLENBQUNFLFlBQVk7SUFDcEM7RUFBQztBQUFBLEVBUDZCL0YsbUNBQWEsRTs7Ozs7O0FDUC9DOzs7QUFNQTs7Ozs7QUFLTyxTQUFlZ0csV0FBV0EsQ0FBQTlKLEVBQUE7RUFBQSxPQUFBK0osWUFBQSxDQUFBOUosS0FBQSxPQUFBcEksU0FBQTtBQUFBO0FBK0JqQzs7OztBQUFBLFNBQUFrUyxhQUFBO0VBQUFBLFlBQUEsR0FBQTVLLDJCQUFBLGNBQUFDLHNCQUFBLEdBQUFDLENBQUEsQ0EvQk8sU0FBQUMsUUFBMkIwSyxJQUFZO0lBQUEsSUFBQUMsV0FBQSxFQUFBQyxLQUFBLEVBQUFDLEdBQUEsRUFBQUMsT0FBQSxFQUFBQyxNQUFBLEVBQUE5SyxFQUFBO0lBQUEsT0FBQUgsc0JBQUEsR0FBQUssQ0FBQSxXQUFBQyxRQUFBO01BQUEsa0JBQUFBLFFBQUEsQ0FBQUMsQ0FBQSxHQUFBRCxRQUFBLENBQUFFLENBQUE7UUFBQTtVQUFBRixRQUFBLENBQUFDLENBQUE7VUFFdEM7VUFDSXNLLFdBQVcsR0FBR0QsSUFBSTtVQUN0QixJQUFJQyxXQUFXLENBQUNLLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoQ0wsV0FBVyxHQUFHQSxXQUFXLENBQUM3UyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMrSyxJQUFJLEVBQUU7VUFDakQ7VUFFQTtVQUNNK0gsS0FBSyxHQUFHRCxXQUFXLENBQUM5SCxJQUFJLEVBQUUsQ0FBQ29JLEtBQUssQ0FBQyxLQUFLLENBQUM7VUFBQSxNQUN6Q0wsS0FBSyxDQUFDM1MsTUFBTSxLQUFLLENBQUMsSUFBSTJTLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO1lBQUF4SyxRQUFBLENBQUFFLENBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQUYsUUFBQSxDQUFBSSxDQUFBLElBQzlCMEssV0FBVyxFQUFFO1FBQUE7VUFHbEJMLEdBQUcsR0FBR0QsS0FBSyxDQUFDLENBQUMsQ0FBQztVQUNkRSxPQUFPLEdBQUdLLGdCQUFnQixDQUFDUCxLQUFLLENBQUMzSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFFaEQ7VUFBQSxJQUNLbUosVUFBVSxDQUFDUCxHQUFHLENBQUM7WUFBQXpLLFFBQUEsQ0FBQUUsQ0FBQTtZQUFBO1VBQUE7VUFBQSxPQUFBRixRQUFBLENBQUFJLENBQUEsNEJBQUFyRSxNQUFBLENBQ2MwTyxHQUFHO1FBQUE7VUFBQXpLLFFBQUEsQ0FBQUUsQ0FBQTtVQUFBLE9BSWhCK0ssZUFBZSxDQUFDUixHQUFHLEVBQUVDLE9BQU8sQ0FBQztRQUFBO1VBQTVDQyxNQUFNLEdBQUEzSyxRQUFBLENBQUFLLENBQUE7VUFBQSxPQUFBTCxRQUFBLENBQUFJLENBQUEsSUFDTHVLLE1BQU07UUFBQTtVQUFBM0ssUUFBQSxDQUFBQyxDQUFBO1VBQUFKLEVBQUEsR0FBQUcsUUFBQSxDQUFBSyxDQUFBO1VBQUEsT0FBQUwsUUFBQSxDQUFBSSxDQUFBLDZCQUFBckUsTUFBQSxDQUdtQjhELEVBQUEsQ0FBTXpCLE9BQU87TUFBQTtJQUFBLEdBQUF3QixPQUFBO0VBQUEsQ0FFcEQ7RUFBQSxPQUFBeUssWUFBQSxDQUFBOUosS0FBQSxPQUFBcEksU0FBQTtBQUFBO0FBTUssU0FBVTJTLFdBQVdBLENBQUE7RUFDdkI7QUFjSjtBQUVBOzs7OztBQUtNLFNBQVVDLGdCQUFnQkEsQ0FBQ1QsSUFBYztFQUMzQyxJQUFNSSxPQUFPLEdBQWdCO0lBQ3pCUSxNQUFNLEVBQUUsS0FBSztJQUNiQyxPQUFPLEVBQUUsRUFBRTtJQUNYQyxJQUFJLEVBQUUsSUFBSTtJQUNWQyxPQUFPLEVBQUUsS0FBSztJQUNkQyxXQUFXLEVBQUUsS0FBSztJQUNsQkMsTUFBTSxFQUFFO0dBQ1g7RUFFRCxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR2xCLElBQUksQ0FBQ3pTLE1BQU0sRUFBRTJULENBQUMsRUFBRSxFQUFFO0lBQ2xDLElBQU1DLEdBQUcsR0FBR25CLElBQUksQ0FBQ2tCLENBQUMsQ0FBQztJQUVuQixRQUFRQyxHQUFHO01BQ1AsS0FBSyxJQUFJO1FBQ0wsSUFBSUQsQ0FBQyxHQUFHLENBQUMsR0FBR2xCLElBQUksQ0FBQ3pTLE1BQU0sRUFBRTtVQUNyQjZTLE9BQU8sQ0FBQ1EsTUFBTSxHQUFHWixJQUFJLENBQUMsRUFBRWtCLENBQUMsQ0FBQyxDQUFDRSxXQUFXLEVBQUU7UUFDNUM7UUFDQTtNQUVKLEtBQUssSUFBSTtRQUNMLElBQUlGLENBQUMsR0FBRyxDQUFDLEdBQUdsQixJQUFJLENBQUN6UyxNQUFNLEVBQUU7VUFDckIsSUFBTThULE1BQU0sR0FBR3JCLElBQUksQ0FBQyxFQUFFa0IsQ0FBQyxDQUFDO1VBQ3hCLElBQU1JLFVBQVUsR0FBR0QsTUFBTSxDQUFDN1QsT0FBTyxDQUFDLEdBQUcsQ0FBQztVQUN0QyxJQUFJOFQsVUFBVSxHQUFHLENBQUMsRUFBRTtZQUNoQixJQUFNdk4sSUFBSSxHQUFHc04sTUFBTSxDQUFDalUsU0FBUyxDQUFDLENBQUMsRUFBRWtVLFVBQVUsQ0FBQyxDQUFDbkosSUFBSSxFQUFFO1lBQ25ELElBQU1wTCxLQUFLLEdBQUdzVSxNQUFNLENBQUNqVSxTQUFTLENBQUNrVSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUNuSixJQUFJLEVBQUU7WUFDckRpSSxPQUFPLENBQUNTLE9BQU8sQ0FBQzlNLElBQUksQ0FBQyxHQUFHaEgsS0FBSztVQUNqQztRQUNKO1FBQ0E7TUFFSixLQUFLLElBQUk7UUFDTCxJQUFJbVUsQ0FBQyxHQUFHLENBQUMsR0FBR2xCLElBQUksQ0FBQ3pTLE1BQU0sRUFBRTtVQUNyQjZTLE9BQU8sQ0FBQ1UsSUFBSSxHQUFHZCxJQUFJLENBQUMsRUFBRWtCLENBQUMsQ0FBQztRQUM1QjtRQUNBO01BRUosS0FBSyxJQUFJO1FBQ0xkLE9BQU8sQ0FBQ1csT0FBTyxHQUFHLElBQUk7UUFDdEI7TUFFSixLQUFLLElBQUk7UUFDTFgsT0FBTyxDQUFDWSxXQUFXLEdBQUcsSUFBSTtRQUMxQjtNQUVKLEtBQUssSUFBSTtRQUNMWixPQUFPLENBQUNhLE1BQU0sR0FBRyxJQUFJO1FBQ3JCO0lBQ1I7RUFDSjtFQUVBLE9BQU9iLE9BQU87QUFDbEI7QUFFQTs7Ozs7QUFLTSxTQUFVTSxVQUFVQSxDQUFDUCxHQUFXO0VBQ2xDLElBQUk7SUFDQSxJQUFJb0IsR0FBRyxDQUFDcEIsR0FBRyxDQUFDO0lBQ1osT0FBTyxJQUFJO0VBQ2YsQ0FBQyxDQUFDLE9BQUFxQixPQUFBLEVBQU07SUFDSixPQUFPLEtBQUs7RUFDaEI7QUFDSjtBQUVBOzs7Ozs7QUFNTyxTQUFlYixlQUFlQSxDQUFBYyxHQUFBLEVBQUFDLEdBQUE7RUFBQSxPQUFBQyxnQkFBQSxDQUFBMUwsS0FBQSxPQUFBcEksU0FBQTtBQUFBO0FBaUVwQyxTQUFBOFQsaUJBQUE7RUFBQUEsZ0JBQUEsR0FBQXhNLDJCQUFBLGNBQUFDLHNCQUFBLEdBQUFDLENBQUEsQ0FqRU0sU0FBQTBDLFNBQStCb0ksR0FBVyxFQUFFQyxPQUFvQjtJQUFBLElBQUF3QixZQUFBLEVBQUFDLFNBQUEsRUFBQUMsUUFBQSxFQUFBQyxPQUFBLEVBQUExQixNQUFBLEVBQUEyQixZQUFBLEVBQUFDLFdBQUEsRUFBQUMsUUFBQSxFQUFBQyxJQUFBLEVBQUEzTSxHQUFBO0lBQUEsT0FBQUosc0JBQUEsR0FBQUssQ0FBQSxXQUFBd0MsU0FBQTtNQUFBLGtCQUFBQSxTQUFBLENBQUF0QyxDQUFBLEdBQUFzQyxTQUFBLENBQUFyQyxDQUFBO1FBQUE7VUFBQXFDLFNBQUEsQ0FBQXRDLENBQUE7VUFFL0QsSUFBSSxDQUFDeUssT0FBTyxDQUFDYSxNQUFNLEVBQUU7WUFDakJyUixPQUFPLENBQUNELEdBQUcsV0FBQThCLE1BQUEsQ0FBVzJPLE9BQU8sQ0FBQ1EsTUFBTSxrQkFBQW5QLE1BQUEsQ0FBZTBPLEdBQUcsUUFBSyxDQUFDO1VBQ2hFO1VBRU15QixZQUFZLEdBQWdCO1lBQzlCaEIsTUFBTSxFQUFFUixPQUFPLENBQUNRLE1BQU07WUFDdEJDLE9BQU8sRUFBRVQsT0FBTyxDQUFDUztXQUNwQjtVQUVELElBQUlULE9BQU8sQ0FBQ1UsSUFBSSxLQUFLVixPQUFPLENBQUNRLE1BQU0sS0FBSyxNQUFNLElBQUlSLE9BQU8sQ0FBQ1EsTUFBTSxLQUFLLEtBQUssSUFBSVIsT0FBTyxDQUFDUSxNQUFNLEtBQUssT0FBTyxDQUFDLEVBQUU7WUFDdkdnQixZQUFZLENBQUNkLElBQUksR0FBR1YsT0FBTyxDQUFDVSxJQUFJO1VBQ3BDO1VBRU1lLFNBQVMsR0FBRy9GLElBQUksQ0FBQ3NHLEdBQUcsRUFBRTtVQUFBbkssU0FBQSxDQUFBckMsQ0FBQTtVQUFBLE9BQ0wySSxLQUFLLENBQUM0QixHQUFHLEVBQUV5QixZQUFZLENBQUM7UUFBQTtVQUF6Q0UsUUFBUSxHQUFBN0osU0FBQSxDQUFBbEMsQ0FBQTtVQUNSZ00sT0FBTyxHQUFHakcsSUFBSSxDQUFDc0csR0FBRyxFQUFFO1VBRXRCL0IsTUFBTSxHQUFHLEVBQUU7VUFFZixJQUFJRCxPQUFPLENBQUNXLE9BQU8sRUFBRTtZQUNqQlYsTUFBTSxzQkFBQTVPLE1BQUEsQ0FBc0IwTyxHQUFHLE9BQUk7WUFDbkNFLE1BQU0sU0FBQTVPLE1BQUEsQ0FBUzJPLE9BQU8sQ0FBQ1EsTUFBTSxPQUFBblAsTUFBQSxDQUFJME8sR0FBRyxZQUFBMU8sTUFBQSxDQUFTcVEsUUFBUSxDQUFDdkYsSUFBSSxJQUFJLEtBQUssT0FBSTtVQUMzRTtVQUVBLElBQUk2RCxPQUFPLENBQUNZLFdBQVcsRUFBRTtZQUNyQlgsTUFBTSxZQUFBNU8sTUFBQSxDQUFZcVEsUUFBUSxDQUFDdkYsSUFBSSxJQUFJLEtBQUssT0FBQTlLLE1BQUEsQ0FBSXFRLFFBQVEsQ0FBQ08sTUFBTSxPQUFBNVEsTUFBQSxDQUFJcVEsUUFBUSxDQUFDUSxVQUFVLE9BQUk7WUFDdEZSLFFBQVEsQ0FBQ2pCLE9BQU8sQ0FBQ3BCLE9BQU8sQ0FBQyxVQUFDMVMsS0FBSyxFQUFFZ0gsSUFBSSxFQUFJO2NBQ3JDc00sTUFBTSxPQUFBNU8sTUFBQSxDQUFPc0MsSUFBSSxRQUFBdEMsTUFBQSxDQUFLMUUsS0FBSyxPQUFJO1lBQ25DLENBQUMsQ0FBQztZQUNGc1QsTUFBTSxJQUFJLElBQUk7VUFDbEI7VUFFQSxJQUFJRCxPQUFPLENBQUNXLE9BQU8sRUFBRTtZQUNqQlYsTUFBTSx3QkFBQTVPLE1BQUEsQ0FBd0JzUSxPQUFPLEdBQUdGLFNBQVMsU0FBTTtZQUN2RHhCLE1BQU0saUJBQUE1TyxNQUFBLENBQWlCcVEsUUFBUSxDQUFDTyxNQUFNLE9BQUE1USxNQUFBLENBQUlxUSxRQUFRLENBQUNRLFVBQVUsT0FBSTtVQUNyRTtVQUVBO1VBRU1MLFdBQVcsR0FBR0gsUUFBUSxDQUFDakIsT0FBTyxDQUFDMEIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUU7VUFBQSxLQUUxRE4sV0FBVyxDQUFDdkQsUUFBUSxDQUFDLGtCQUFrQixDQUFDO1lBQUF6RyxTQUFBLENBQUFyQyxDQUFBO1lBQUE7VUFBQTtVQUFBcUMsU0FBQSxDQUFBckMsQ0FBQTtVQUFBLE9BQ2pCa00sUUFBUSxDQUFDVSxJQUFJLEVBQUU7UUFBQTtVQUFoQ04sUUFBUSxHQUFBakssU0FBQSxDQUFBbEMsQ0FBQTtVQUNkaU0sWUFBWSxHQUFHak4sSUFBSSxDQUFDQyxTQUFTLENBQUNrTixRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztVQUFDakssU0FBQSxDQUFBckMsQ0FBQTtVQUFBO1FBQUE7VUFBQSxLQUMxQ3FNLFdBQVcsQ0FBQ3ZELFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFBQXpHLFNBQUEsQ0FBQXJDLENBQUE7WUFBQTtVQUFBO1VBQUFxQyxTQUFBLENBQUFyQyxDQUFBO1VBQUEsT0FDZmtNLFFBQVEsQ0FBQ1csSUFBSSxFQUFFO1FBQUE7VUFBcENULFlBQVksR0FBQS9KLFNBQUEsQ0FBQWxDLENBQUE7VUFBQWtDLFNBQUEsQ0FBQXJDLENBQUE7VUFBQTtRQUFBO1VBQUFxQyxTQUFBLENBQUFyQyxDQUFBO1VBQUEsT0FHT2tNLFFBQVEsQ0FBQ0ssSUFBSSxFQUFFO1FBQUE7VUFBNUJBLElBQUksR0FBQWxLLFNBQUEsQ0FBQWxDLENBQUE7VUFDVmlNLFlBQVksMEJBQUF2USxNQUFBLENBQTBCMFEsSUFBSSxDQUFDTyxJQUFJLFlBQVM7UUFBQztVQUc3RHJDLE1BQU0sSUFBSTJCLFlBQVk7VUFFdEIsSUFBSTVCLE9BQU8sQ0FBQ1csT0FBTyxFQUFFO1lBQ2pCVixNQUFNLDZCQUE2QjtVQUN2QztVQUFDLE9BQUFwSSxTQUFBLENBQUFuQyxDQUFBLElBRU11SyxNQUFNO1FBQUE7VUFBQXBJLFNBQUEsQ0FBQXRDLENBQUE7VUFBQUgsR0FBQSxHQUFBeUMsU0FBQSxDQUFBbEMsQ0FBQTtVQUFBLE1BR1AsSUFBSTRNLEtBQUsseUJBQUFsUixNQUFBLENBQXlCK0QsR0FBQSxDQUFNMUIsT0FBTyxDQUFFLENBQUM7UUFBQTtVQUFBLE9BQUFtRSxTQUFBLENBQUFuQyxDQUFBO01BQUE7SUFBQSxHQUFBaUMsUUFBQTtFQUFBLENBRS9EO0VBQUEsT0FBQTRKLGdCQUFBLENBQUExTCxLQUFBLE9BQUFwSSxTQUFBO0FBQUEsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hORDs7O0FBSWtEO0FBQ0E7QUFFM0MsSUFBTStVLFdBQVksMEJBQUE1SSxjQUFBO0VBQXpCLFNBQUE0SSxZQUFBO0lBQUEsSUFBQTlRLEtBQUE7SUFBQWxGLG1CQUFBLE9BQUFnVyxXQUFBOztJQUNhOVEsS0FBQSxDQUFBaUMsSUFBSSxHQUFHLE1BQU07SUFDYmpDLEtBQUEsQ0FBQW1JLFdBQVcsR0FBRyxpREFBaUQ7SUFBQyxPQUFBbkksS0FBQTtFQUs3RTtFQUFDb0ksYUFBQSxDQUFBMEksV0FBQSxFQUFBNUksY0FBQTtFQUFBLE9BQUFuTixnQkFBQSxDQUFBK1YsV0FBQTtJQUFBOVYsR0FBQTtJQUFBQyxLQUFBO01BQUEsSUFBQThWLFFBQUEsR0FBQTFOLHFCQUFBLGNBQUFDLGdCQUFBLEdBQUFDLENBQUEsQ0FIRyxTQUFBQyxRQUFjbkIsT0FBZTtRQUFBLE9BQUFpQixnQkFBQSxHQUFBSyxDQUFBLFdBQUFDLFFBQUE7VUFBQSxrQkFBQUEsUUFBQSxDQUFBRSxDQUFBO1lBQUE7Y0FBQUYsUUFBQSxDQUFBRSxDQUFBO2NBQUEsT0FDWmtLLFdBQVcsQ0FBQzNMLE9BQU8sQ0FBQztZQUFBO2NBQUEsT0FBQXVCLFFBQUEsQ0FBQUksQ0FBQSxJQUFBSixRQUFBLENBQUFLLENBQUE7VUFBQTtRQUFBLEdBQUFULE9BQUE7TUFBQSxDQUNwQztNQUFBLFNBRks2RSxPQUFPQSxDQUFBbkUsRUFBQTtRQUFBLE9BQUE2TSxRQUFBLENBQUE1TSxLQUFBLE9BQUFwSSxTQUFBO01BQUE7TUFBQSxPQUFQc00sT0FBTztJQUFBO0VBQUE7QUFBQSxFQUpnQkwsbUNBQWEsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDUDlDOzs7QUFJa0Q7QUFDSjtBQUV2QyxJQUFNaUosU0FBVSwwQkFBQS9JLGNBQUE7RUFBdkIsU0FBQStJLFVBQUE7SUFBQSxJQUFBalIsS0FBQTtJQUFBbEYsaUJBQUEsT0FBQW1XLFNBQUE7O0lBQ2FqUixLQUFBLENBQUFpQyxJQUFJLEdBQUcsSUFBSTtJQUNYakMsS0FBQSxDQUFBbUksV0FBVyxHQUFHLGdFQUFnRTtJQUFDLE9BQUFuSSxLQUFBO0VBSzVGO0VBQUNvSSxXQUFBLENBQUE2SSxTQUFBLEVBQUEvSSxjQUFBO0VBQUEsT0FBQW5OLGNBQUEsQ0FBQWtXLFNBQUE7SUFBQWpXLEdBQUE7SUFBQUMsS0FBQTtNQUFBLElBQUE4VixRQUFBLEdBQUExTixtQkFBQSxjQUFBQyxjQUFBLEdBQUFDLENBQUEsQ0FIRyxTQUFBQyxRQUFjbkIsT0FBZTtRQUFBLE9BQUFpQixjQUFBLEdBQUFLLENBQUEsV0FBQUMsUUFBQTtVQUFBLGtCQUFBQSxRQUFBLENBQUFFLENBQUE7WUFBQTtjQUFBRixRQUFBLENBQUFFLENBQUE7Y0FBQSxPQUNaa04sOEJBQVMsQ0FBQzNPLE9BQU8sQ0FBQztZQUFBO2NBQUEsT0FBQXVCLFFBQUEsQ0FBQUksQ0FBQSxJQUFBSixRQUFBLENBQUFLLENBQUE7VUFBQTtRQUFBLEdBQUFULE9BQUE7TUFBQSxDQUNsQztNQUFBLFNBRks2RSxPQUFPQSxDQUFBbkUsRUFBQTtRQUFBLE9BQUE2TSxRQUFBLENBQUE1TSxLQUFBLE9BQUFwSSxTQUFBO01BQUE7TUFBQSxPQUFQc00sT0FBTztJQUFBO0VBQUE7QUFBQSxFQUpjTCxtQ0FBYSxFOzs7O0FDUDVDOzs7QUFJcUM7QUFDQTtBQUNFO0FBQ0Y7QUFDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNSakM7Ozs7QUFLaUQ7QUFRN0I7QUFFcEI7QUFDeUI7QUFFbEIsSUFBTW1KLG9CQUFvQjtFQUFqQyxTQUFBQSxxQkFBQTtJQUFBclcscUNBQUEsT0FBQXFXLG9CQUFBO0lBQ1ksS0FBQUMsUUFBUSxHQUErQixJQUFJQyxHQUFHLEVBQUU7RUFtSDVEO0VBakhJOzs7O0VBQUEsT0FBQXRXLGtDQUFBLENBQUFvVyxvQkFBQTtJQUFBblcsR0FBQTtJQUFBQyxLQUFBLEVBSUEsU0FBQXFXLGVBQWVBLENBQUNqUCxPQUFzQjtNQUNsQyxJQUFJLENBQUMrTyxRQUFRLENBQUNHLEdBQUcsQ0FBQ2xQLE9BQU8sQ0FBQ0osSUFBSSxFQUFFSSxPQUFPLENBQUM7SUFDNUM7SUFFQTs7Ozs7RUFBQTtJQUFBckgsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQXVXLGlCQUFpQkEsQ0FBQ0MsV0FBbUI7TUFDakMsT0FBTyxJQUFJLENBQUNMLFFBQVEsVUFBTyxDQUFDSyxXQUFXLENBQUM7SUFDNUM7SUFFQTs7OztFQUFBO0lBQUF6VyxHQUFBO0lBQUFDLEtBQUEsRUFJQSxTQUFBd1MsaUJBQWlCQSxDQUFBO01BQ2IsT0FBT1IsS0FBSyxDQUFDeUUsSUFBSSxDQUFDLElBQUksQ0FBQ04sUUFBUSxDQUFDTyxNQUFNLEVBQUUsQ0FBQyxDQUFDQyxHQUFHLENBQUMsVUFBQXZQLE9BQU87UUFBQSxPQUFLO1VBQ3RESixJQUFJLEVBQUVJLE9BQU8sQ0FBQ0osSUFBSTtVQUNsQmtHLFdBQVcsRUFBRTlGLE9BQU8sQ0FBQzhGO1NBQ3hCO01BQUEsQ0FBQyxDQUFDO0lBQ1A7SUFFQTs7Ozs7RUFBQTtJQUFBbk4sR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQTRXLGdCQUFnQkEsQ0FBQ0osV0FBbUI7TUFDaEMsT0FBTyxJQUFJLENBQUNMLFFBQVEsQ0FBQ1UsR0FBRyxDQUFDTCxXQUFXLENBQUM7SUFDekM7SUFFQTs7Ozs7RUFBQTtJQUFBelcsR0FBQTtJQUFBQyxLQUFBLEVBS0EsU0FBQThXLFVBQVVBLENBQUNOLFdBQW1CO01BQzFCLE9BQU8sSUFBSSxDQUFDTCxRQUFRLENBQUNYLEdBQUcsQ0FBQ2dCLFdBQVcsQ0FBQyxJQUFJLElBQUk7SUFDakQ7SUFFQTs7O0VBQUE7SUFBQXpXLEdBQUE7SUFBQUMsS0FBQSxFQUdBLFNBQUErVyxLQUFLQSxDQUFBO01BQ0QsSUFBSSxDQUFDWixRQUFRLENBQUNZLEtBQUssRUFBRTtJQUN6QjtJQUVBOzs7O0VBQUE7SUFBQWhYLEdBQUE7SUFBQUMsS0FBQSxFQUlBLFNBQUFnWCxlQUFlQSxDQUFBO01BQ1gsT0FBTyxJQUFJLENBQUNiLFFBQVEsQ0FBQ1IsSUFBSTtJQUM3QjtJQUVBOzs7OztFQUFBO0lBQUE1VixHQUFBO0lBQUFDLEtBQUE7TUFBQSxJQUFBK0ssZUFBQSxHQUFBM0MsdUNBQUEsY0FBQUMsa0NBQUEsR0FBQUMsQ0FBQSxDQUtBLFNBQUFDLFFBQXFCbkIsT0FBZTtRQUFBLElBQUE2UCxTQUFBLEVBQUFDLEtBQUEsRUFBQUMsV0FBQSxFQUFBQyxPQUFBLEVBQUFDLFdBQUEsRUFBQS9ELE1BQUEsRUFBQTlLLEVBQUEsRUFBQUMsR0FBQTtRQUFBLE9BQUFKLGtDQUFBLEdBQUFLLENBQUEsV0FBQUMsUUFBQTtVQUFBLGtCQUFBQSxRQUFBLENBQUFDLENBQUEsR0FBQUQsUUFBQSxDQUFBRSxDQUFBO1lBQUE7Y0FDaEM7Y0FBQW9PLFNBQUEsR0FBQUssMEJBQUEsQ0FDcUMsSUFBSSxDQUFDbkIsUUFBUTtjQUFBeE4sUUFBQSxDQUFBQyxDQUFBO2NBQUFxTyxTQUFBLENBQUFNLENBQUE7WUFBQTtjQUFBLEtBQUFMLEtBQUEsR0FBQUQsU0FBQSxDQUFBcE8sQ0FBQSxJQUFBMk8sSUFBQTtnQkFBQTdPLFFBQUEsQ0FBQUUsQ0FBQTtnQkFBQTtjQUFBO2NBQUFzTyxXQUFBLEdBQUFNLGNBQUEsQ0FBQVAsS0FBQSxDQUFBbFgsS0FBQSxNQUF0Q29YLE9BQU8sR0FBQUQsV0FBQSxLQUFFRSxXQUFXLEdBQUFGLFdBQUE7Y0FBQSxLQUN4QkUsV0FBVyxDQUFDSyxPQUFPLENBQUN0USxPQUFPLENBQUM7Z0JBQUF1QixRQUFBLENBQUFFLENBQUE7Z0JBQUE7Y0FBQTtjQUFBRixRQUFBLENBQUFDLENBQUE7Y0FFcEIwSyxNQUFNLEdBQUcrRCxXQUFXLENBQUNqSyxPQUFPLENBQUNoRyxPQUFPLENBQUMsRUFFekM7Y0FBQSxNQUNJa00sTUFBTSxZQUFZN0IsT0FBTztnQkFBQTlJLFFBQUEsQ0FBQUUsQ0FBQTtnQkFBQTtjQUFBO2NBQUFGLFFBQUEsQ0FBQUUsQ0FBQTtjQUFBLE9BQ1Z5SyxNQUFNO1lBQUE7Y0FBckJBLE1BQU0sR0FBQTNLLFFBQUEsQ0FBQUssQ0FBQTtZQUFBO2NBQUEsT0FBQUwsUUFBQSxDQUFBSSxDQUFBLElBR0g0TyxNQUFNLENBQUNyRSxNQUFNLENBQUM7WUFBQTtjQUFBM0ssUUFBQSxDQUFBQyxDQUFBO2NBQUFKLEVBQUEsR0FBQUcsUUFBQSxDQUFBSyxDQUFBO2NBQUEsTUFFZixJQUFJNE0sS0FBSyw2QkFBQWxSLE1BQUEsQ0FBNkIwUyxPQUFPLFNBQUExUyxNQUFBLENBQU04RCxFQUFBLENBQU16QixPQUFPLENBQUUsQ0FBQztZQUFBO2NBQUE0QixRQUFBLENBQUFFLENBQUE7Y0FBQTtZQUFBO2NBQUFGLFFBQUEsQ0FBQUUsQ0FBQTtjQUFBO1lBQUE7Y0FBQUYsUUFBQSxDQUFBQyxDQUFBO2NBQUFILEdBQUEsR0FBQUUsUUFBQSxDQUFBSyxDQUFBO2NBQUFpTyxTQUFBLENBQUFXLENBQUEsQ0FBQW5QLEdBQUE7WUFBQTtjQUFBRSxRQUFBLENBQUFDLENBQUE7Y0FBQXFPLFNBQUEsQ0FBQVksQ0FBQTtjQUFBLE9BQUFsUCxRQUFBLENBQUFrUCxDQUFBO1lBQUE7Y0FBQSxPQUFBbFAsUUFBQSxDQUFBSSxDQUFBLElBSzlFLElBQUk7VUFBQTtRQUFBLEdBQUFSLE9BQUE7TUFBQSxDQUNkO01BQUEsU0FwQktnQyxjQUFjQSxDQUFBdEIsRUFBQTtRQUFBLE9BQUE4QixlQUFBLENBQUE3QixLQUFBLE9BQUFwSSxTQUFBO01BQUE7TUFBQSxPQUFkeUosY0FBYztJQUFBO0lBc0JwQjs7O0lBQUE7RUFBQTtJQUFBeEssR0FBQTtJQUFBQyxLQUFBLEVBR0EsU0FBQThYLG1CQUFtQkEsQ0FBQ0MsZUFBcUI7TUFDckM7TUFDQSxJQUFJLENBQUMxQixlQUFlLENBQUMsSUFBSXJKLFdBQVcsRUFBRSxDQUFDO01BRXZDO01BQ0EsSUFBSSxDQUFDcUosZUFBZSxDQUFDLElBQUlqRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7TUFFM0M7TUFDQSxJQUFJLENBQUNpRSxlQUFlLENBQUMsSUFBSXhELFlBQVksRUFBRSxDQUFDO01BRXhDO01BQ0EsSUFBSSxDQUFDd0QsZUFBZSxDQUFDLElBQUlSLFdBQVcsRUFBRSxDQUFDO01BRXZDO01BQ0EsSUFBSSxDQUFDUSxlQUFlLENBQUMsSUFBSUwsU0FBUyxFQUFFLENBQUM7TUFFckM7TUFDQSxJQUFJLENBQUNLLGVBQWUsQ0FBQyxJQUFJSix1QkFBVyxFQUFFLENBQUM7TUFHdkNwVCxPQUFPLENBQUNELEdBQUcsQ0FBQywrQkFBK0IsQ0FBQztJQUNoRDtFQUFDO0FBQUEsSTs7Ozs7Ozs7Ozs7O0FDcklMOzs7QUFTZ0Q7QUFDSDtBQUNVO0FBQ0o7QUFFYTtBQUV6RCxJQUFNcVYsZUFBZTtFQVV4QixTQUFBQSxnQkFBQSxFQUF5RDtJQUFBLElBQUFsVCxLQUFBO0lBQUEsSUFBN0NzTyxPQUFBLEdBQUF2UyxTQUFBLENBQUFOLE1BQUEsUUFBQU0sU0FBQSxRQUFBQyxTQUFBLEdBQUFELFNBQUEsTUFBMkMsRUFBRTtJQUFBakIsK0JBQUEsT0FBQW9ZLGVBQUE7SUFSbEQsS0FBQUMsYUFBYSxHQUFZLEtBQUs7SUFFOUIsS0FBQUMsUUFBUSxHQUF1QixJQUFJO0lBQ25DLEtBQUFqSSxVQUFVLEdBQXVCLElBQUk7SUFDckMsS0FBQWtJLGNBQWMsR0FBMEIsSUFBSTtJQUM1QyxLQUFBQyxRQUFRLEdBQWtCLElBQUk7SUFJakMsSUFBTUMsUUFBUSxHQUFHakYsT0FBTyxDQUFDaUYsUUFBUSxJQUFJLE9BQU87SUFDNUMsSUFBTXpYLFNBQVMsR0FBR3dTLE9BQU8sQ0FBQ3hTLFNBQVMsSUFBSSxJQUFJO0lBQzNDLElBQUksQ0FBQ3dTLE9BQU8sR0FBRztNQUNYeFMsU0FBUyxFQUFFQSxTQUFTO01BQ3BCMFgsVUFBVSxFQUFFbEYsT0FBTyxDQUFDa0YsVUFBVSxJQUFJN1gsa0NBQWdCLENBQUM4WCxtQkFBbUI7TUFDdEVDLFdBQVcsRUFBRXBGLE9BQU8sQ0FBQ29GLFdBQVcsS0FBSyxLQUFLO01BQzFDQyxnQkFBZ0IsRUFBRXJGLE9BQU8sQ0FBQ3FGLGdCQUFnQixJQUFJaFksa0NBQWdCLENBQUNpWSxrQkFBa0I7TUFDakZMLFFBQVEsRUFBRUEsUUFBUTtNQUNsQnhULFVBQVUsRUFBRXVPLE9BQU8sQ0FBQ3ZPLFVBQVUsSUFBSSxLQUFLO01BQ3ZDb0wsVUFBVSxFQUFFbUQsT0FBTyxDQUFDbkQsVUFBVSxJQUFJO0tBQ3JDO0lBQ0Q7SUFDQSxJQUFJb0ksUUFBUSxLQUFLLFNBQVMsRUFBRTtNQUFBLElBQUFNLHFCQUFBO01BQ3hCLElBQUksQ0FBQ3ZGLE9BQU8sQ0FBQ3dGLGlCQUFpQixHQUFHO1FBQzdCalksU0FBUyxFQUFFLEVBQUFnWSxxQkFBQSxHQUFBdkYsT0FBTyxDQUFDd0YsaUJBQWlCLGNBQUFELHFCQUFBLHVCQUF6QkEscUJBQUEsQ0FBMkJoWSxTQUFTLEtBQUlGLGtDQUFnQixDQUFDb1k7T0FDdkU7SUFDTDtJQUVBLElBQUksQ0FBQ0Msb0JBQW9CLEdBQUcsSUFBSTdDLG9CQUFvQixFQUFFO0lBQ3RELElBQUksQ0FBQzhDLElBQUksRUFBRTtJQUVYO0lBQ0EsSUFBSSxJQUFJLENBQUMzRixPQUFPLENBQUNvRixXQUFXLEVBQUU7TUFDMUI3UixVQUFVLENBQUMsWUFBSztRQUNaLElBQUk3QixLQUFJLENBQUNtVCxhQUFhLElBQUluVCxLQUFJLENBQUNzVCxRQUFRLEVBQUU7VUFDckN0VCxLQUFJLENBQUNGLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDdkI7TUFDSixDQUFDLEVBQUUsSUFBSSxDQUFDd08sT0FBTyxDQUFDcUYsZ0JBQWdCLENBQUM7SUFDckM7RUFDSjtFQUVBOzs7O0VBQUEsT0FBQTVZLDRCQUFBLENBQUFtWSxlQUFBO0lBQUFsWSxHQUFBO0lBQUFDLEtBQUEsRUFJTyxTQUFBaVoscUJBQXFCQSxDQUFDL0ksVUFBc0I7TUFDL0MsSUFBSSxJQUFJLENBQUNBLFVBQVUsRUFBRTtRQUNqQjtRQUNBLElBQUksQ0FBQ0EsVUFBVSxDQUFDNUcsT0FBTyxFQUFFO01BQzdCO01BRUEsSUFBSSxDQUFDNEcsVUFBVSxHQUFHQSxVQUFVO01BQzVCck4sT0FBTyxDQUFDRCxHQUFHLENBQUMsNkNBQTZDLENBQUM7SUFDOUQ7SUFFQTs7OztFQUFBO0lBQUE3QyxHQUFBO0lBQUFDLEtBQUEsRUFJQSxTQUFBa1osV0FBV0EsQ0FBQSxFQUF3QjtNQUFBLElBQXZCYixRQUFBLEdBQUF2WCxTQUFBLENBQUFOLE1BQUEsUUFBQU0sU0FBQSxRQUFBQyxTQUFBLEdBQUFELFNBQUEsTUFBcUIsRUFBRTtNQUMvQjtNQUNBLElBQUl1WCxRQUFRLENBQUNjLE1BQU0sRUFBRTtRQUNuQjtRQUNFLElBQUksSUFBSSxDQUFDaEIsUUFBUSxFQUFFO1VBQ2YsSUFBSSxDQUFDQSxRQUFRLENBQUNpQixTQUFTLENBQUNmLFFBQVEsQ0FBQ2MsTUFBTSxDQUFDO1FBQzVDO01BQ0o7TUFFQSxJQUFJZCxRQUFRLENBQUNwVyxPQUFPLEVBQUU7UUFDcEI7UUFDRSxJQUFJLElBQUksQ0FBQ2tXLFFBQVEsRUFBRTtVQUNmLElBQUksQ0FBQ0EsUUFBUSxDQUFDN1UsVUFBVSxDQUFDK1UsUUFBUSxDQUFDcFcsT0FBTyxDQUFDO1FBQzlDO01BQ0o7TUFFQTtNQUNBLElBQUlvVyxRQUFRLENBQUN2VyxTQUFTLEVBQUU7UUFDdEI7UUFDRSxJQUFJLElBQUksQ0FBQ29PLFVBQVUsRUFBRTtVQUNqQixJQUFJLENBQUNBLFVBQVUsQ0FBQ2hOLFlBQVksQ0FBQ21WLFFBQVEsQ0FBQ3ZXLFNBQVMsQ0FBQztRQUNwRDtNQUNKO01BRUEsSUFBSXVXLFFBQVEsQ0FBQ3JXLGFBQWEsRUFBRTtRQUN4QjtRQUNBLElBQUksSUFBSSxDQUFDa08sVUFBVSxFQUFFO1VBQ2pCLElBQUksQ0FBQ0EsVUFBVSxDQUFDOU0sZ0JBQWdCLENBQUMsVUFBQXlKLEtBQUssRUFBRztZQUNyQ3dMLFFBQVEsQ0FBQ3JXLGFBQWMsQ0FBQzZLLEtBQUssQ0FBQ2hNLFNBQVMsRUFBRWdNLEtBQUssQ0FBQ3pGLE9BQU8sRUFBRXlGLEtBQUssQ0FBQ3dNLFFBQVEsQ0FBQztVQUMzRSxDQUFDLENBQUM7UUFDTjtNQUNKO01BQ0EsSUFBSWhCLFFBQVEsQ0FBQ2MsTUFBTSxFQUFFO1FBQ25CO1FBQ0UsSUFBSSxJQUFJLENBQUNqSixVQUFVLEVBQUU7VUFDbEIsSUFBSSxDQUFDQSxVQUFVLENBQUN6TSxhQUFhLENBQUMsVUFBQXNGLENBQUMsRUFBRTtZQUNoQ3NQLFFBQVEsQ0FBQ2MsTUFBTyxDQUFDcFEsQ0FBQyxDQUFDbkQsSUFBSSxDQUFDO1VBQ3pCLENBQUMsQ0FBQztRQUNMO01BQ0o7TUFFQSxJQUFJeVMsUUFBUSxDQUFDdFcsWUFBWSxFQUFFO1FBQ3ZCO1FBQ0E7UUFDQTtRQUNBLElBQUksSUFBSSxDQUFDbU8sVUFBVSxFQUFFO1VBQ2pCLElBQUksQ0FBQ0EsVUFBVSxDQUFDN00sZUFBZSxDQUFDLFVBQUMyQyxJQUFZLEVBQUVDLE1BQWMsRUFBSTtZQUM3RG9TLFFBQVEsQ0FBQ3RXLFlBQWEsRUFBRTtVQUM1QixDQUFDLENBQUM7UUFDTjtNQUNKO01BR0EsSUFBSXNXLFFBQVEsQ0FBQ3BXLE9BQU8sRUFBRTtRQUNwQjtRQUNFLElBQUksSUFBSSxDQUFDaU8sVUFBVSxFQUFFO1VBQ2pCLElBQUksQ0FBQ0EsVUFBVSxDQUFDNU0sVUFBVSxDQUFDK1UsUUFBUSxDQUFDcFcsT0FBTyxDQUFDO1FBQ2hEO01BQ0o7TUFFQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUtBLElBQUksQ0FBQ29XLFFBQVEsR0FBR0EsUUFBUTtNQUN4QnhWLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLDJCQUEyQixDQUFDO0lBQzVDO0lBRUE7OztFQUFBO0lBQUE3QyxHQUFBO0lBQUFDLEtBQUEsRUFHQSxTQUFBZ1osSUFBSUEsQ0FBQTtNQUFBLElBQUExVCxNQUFBO01BQ0EsSUFBSTtRQUVBLElBQUksQ0FBQzhTLGNBQWMsR0FBRyxJQUFJN08sY0FBYyxFQUFFO1FBRTFDO1FBQ0EsSUFBSSxDQUFDNE8sUUFBUSxHQUFHLElBQUlILCtCQUFXLENBQUMsSUFBSSxDQUFDZSxvQkFBb0IsQ0FBQztRQUMxRDtRQUNBLElBQUksSUFBSSxDQUFDMUYsT0FBTyxDQUFDaUYsUUFBUSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUNqRixPQUFPLENBQUNuRCxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUNBLFVBQVUsRUFBRTtVQUVwRixJQUFJLElBQUksQ0FBQ21ELE9BQU8sQ0FBQ25ELFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDakMsSUFBSSxDQUFDQSxVQUFVLEdBQUcsSUFBSSxDQUFDbUQsT0FBTyxDQUFDbkQsVUFBVTtVQUM3QyxDQUFDLE1BQU07WUFDSCxJQUFJLElBQUksQ0FBQ21ELE9BQU8sQ0FBQ3dGLGlCQUFpQixFQUFFO2NBQ2hDLElBQUksQ0FBQzNJLFVBQVUsR0FBRyxJQUFJdlAsVUFBVSxDQUFDLElBQUksQ0FBQzBTLE9BQU8sQ0FBQ3dGLGlCQUFrQixDQUFDalksU0FBUyxDQUFDO1lBQy9FLENBQUMsTUFBTTtjQUNILE1BQU0sSUFBSWdWLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQztZQUN2RDtVQUNKO1FBQ0o7UUFFQTtRQUNBLElBQUksSUFBSSxDQUFDdkMsT0FBTyxDQUFDaUYsUUFBUSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUNwSSxVQUFVLEVBQUU7VUFDdkQ7VUFDQSxJQUFJLENBQUNBLFVBQVUsQ0FBQzNNLFlBQVksQ0FBQyxVQUFDcUMsSUFBUyxFQUFJO1lBQ3ZDO1lBQ0EsSUFBSUEsSUFBSSxDQUFDMFQsSUFBSSxFQUFFO2NBQ1gsS0FBSyxJQUFJbkYsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHdk8sSUFBSSxDQUFDMFQsSUFBSSxDQUFDOVksTUFBTSxFQUFFMlQsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDN08sTUFBSSxDQUFDOFMsY0FBZSxDQUFDdE4sS0FBSyxDQUFDbEYsSUFBSSxDQUFDMFQsSUFBSSxDQUFDbkYsQ0FBQyxDQUFDLENBQUM7Y0FDNUM7WUFDSjtVQUNKLENBQUMsQ0FBQztRQUNOO1FBRUEsSUFBSSxJQUFJLENBQUNqRSxVQUFVLEVBQUU7VUFDakIsSUFBSSxDQUFDQSxVQUFVLENBQUMxTSxZQUFZO1lBQUEsSUFBQStWLElBQUEsR0FBQW5SLGlDQUFBLGNBQUFDLDRCQUFBLEdBQUFDLENBQUEsQ0FBQyxTQUFBQyxRQUFPM0MsSUFBUztjQUFBLElBQUE0VCxlQUFBO2NBQUEsT0FBQW5SLDRCQUFBLEdBQUFLLENBQUEsV0FBQUMsUUFBQTtnQkFBQSxrQkFBQUEsUUFBQSxDQUFBRSxDQUFBO2tCQUFBO29CQUFBLEtBRXJDakQsSUFBSSxDQUFDd0IsT0FBTztzQkFBQXVCLFFBQUEsQ0FBQUUsQ0FBQTtzQkFBQTtvQkFBQTtvQkFBQUYsUUFBQSxDQUFBRSxDQUFBO29CQUFBLFFBQUEyUSxlQUFBLEdBQ05sVSxNQUFJLENBQUM2UyxRQUFRLGNBQUFxQixlQUFBLHVCQUFiQSxlQUFBLENBQWVqUCxjQUFjLENBQUMzRSxJQUFJLENBQUN3QixPQUFPLENBQUM7a0JBQUE7b0JBQUEsT0FBQXVCLFFBQUEsQ0FBQUksQ0FBQTtnQkFBQTtjQUFBLEdBQUFSLE9BQUE7WUFBQSxDQUl4RDtZQUFBLGlCQUFBVSxFQUFBO2NBQUEsT0FBQXNRLElBQUEsQ0FBQXJRLEtBQUEsT0FBQXBJLFNBQUE7WUFBQTtVQUFBLElBQUM7UUFDTjtRQUVBO1FBQ0EsSUFBSSxDQUFDc1gsY0FBYyxDQUFDcE8sbUJBQW1CO1VBQUEsSUFBQXlQLEtBQUEsR0FBQXJSLGlDQUFBLGNBQUFDLDRCQUFBLEdBQUFDLENBQUEsQ0FBQyxTQUFBMEMsU0FBTzVELE9BQWU7WUFBQSxJQUFBc1MsZUFBQTtZQUFBLElBQUFyRyxPQUFBLEVBQUF4UyxTQUFBO1lBQUEsT0FBQXdILDRCQUFBLEdBQUFLLENBQUEsV0FBQXdDLFNBQUE7Y0FBQSxrQkFBQUEsU0FBQSxDQUFBckMsQ0FBQTtnQkFBQTtrQkFDMUQsQ0FBQTZRLGVBQUEsR0FBQXBVLE1BQUksQ0FBQytTLFFBQVEsY0FBQXFCLGVBQUEsZUFBYkEsZUFBQSxDQUFlUCxNQUFPLENBQUMsTUFBTSxDQUFDO2tCQUFDLE1BQzNCN1QsTUFBSSxDQUFDK04sT0FBTyxDQUFDaUYsUUFBUSxLQUFLLFNBQVM7b0JBQUFwTixTQUFBLENBQUFyQyxDQUFBO29CQUFBO2tCQUFBO2tCQUFBcUMsU0FBQSxDQUFBckMsQ0FBQTtrQkFBQSxPQUM3QnZELE1BQUksQ0FBQzZTLFFBQVMsQ0FBQzVOLGNBQWMsQ0FBQ25ELE9BQU8sQ0FBQztnQkFBQTtrQkFBQThELFNBQUEsQ0FBQXJDLENBQUE7a0JBQUE7Z0JBQUE7a0JBRXhDd0ssT0FBTyxHQUFHL04sTUFBSSxDQUFDK04sT0FBTztrQkFDdEJ4UyxTQUFTLEdBQUd3UyxPQUFPLENBQUN4UyxTQUFVO2tCQUNsQ3lFLE1BQUksQ0FBQzRLLFVBQVcsQ0FBQ2hKLFdBQVcsQ0FBQ3JHLFNBQVMsRUFBRXVHLE9BQU8sQ0FBQztnQkFBQztrQkFBQSxPQUFBOEQsU0FBQSxDQUFBbkMsQ0FBQTtjQUFBO1lBQUEsR0FBQWlDLFFBQUE7VUFBQSxDQUV4RDtVQUFBLGlCQUFBMEosR0FBQTtZQUFBLE9BQUErRSxLQUFBLENBQUF2USxLQUFBLE9BQUFwSSxTQUFBO1VBQUE7UUFBQSxJQUFDO1FBRUY7UUFDQSxJQUFJLElBQUksQ0FBQ3VTLE9BQU8sQ0FBQ2lGLFFBQVEsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDcEksVUFBVSxFQUFFO1VBQ3RELElBQUksQ0FBQ2tJLGNBQWMsQ0FBQ3JPLGdCQUFnQixDQUFDLFVBQUE4QyxLQUFLLEVBQUc7WUFBQSxJQUFBOE0sZ0JBQUEsRUFBQUMsaUJBQUE7WUFDekMsS0FBQUQsZ0JBQUEsR0FBSXJVLE1BQUksQ0FBQytTLFFBQVEsY0FBQXNCLGdCQUFBLGVBQWJBLGdCQUFBLENBQWUzWCxhQUFhLEVBQUU7Y0FBQSxJQUFBNlgsZ0JBQUE7Y0FDOUIsQ0FBQUEsZ0JBQUEsR0FBQXZVLE1BQUksQ0FBQytTLFFBQVEsY0FBQXdCLGdCQUFBLGVBQWJBLGdCQUFBLENBQWU3WCxhQUFhLENBQUNzRCxNQUFJLENBQUMrTixPQUFPLENBQUN4UyxTQUFTLElBQUksU0FBUyxFQUFFZ00sS0FBSyxDQUFDekYsT0FBTyxFQUFFeUYsS0FBSyxDQUFDRixTQUFTLENBQUM7WUFDckc7WUFDQSxDQUFBaU4saUJBQUEsR0FBQXRVLE1BQUksQ0FBQzRLLFVBQVUsY0FBQTBKLGlCQUFBLGVBQWZBLGlCQUFBLENBQWlCbFMsZUFBZSxDQUFDO2NBQzdCN0csU0FBUyxFQUFFeUUsTUFBSSxDQUFDK04sT0FBTyxDQUFDeFMsU0FBUyxJQUFJLFNBQVM7Y0FDOUN1RyxPQUFPLEVBQUV5RixLQUFLLENBQUN6RixPQUFPO2NBQ3RCaVMsUUFBUSxFQUFFeE0sS0FBSyxDQUFDRjthQUNuQixDQUFDO1VBQ04sQ0FBQyxDQUFDO1FBQ047UUFFQTtRQUNBLElBQUksSUFBSSxDQUFDMEcsT0FBTyxDQUFDaUYsUUFBUSxLQUFLLFNBQVMsRUFBRTtVQUNyQyxJQUFJLENBQUNGLGNBQWMsQ0FBQ3JPLGdCQUFnQixDQUFDLFVBQUE4QyxLQUFLLEVBQUc7WUFBQSxJQUFBaU4sZ0JBQUE7WUFDekM7WUFDQSxLQUFBQSxnQkFBQSxHQUFJeFUsTUFBSSxDQUFDK1MsUUFBUSxjQUFBeUIsZ0JBQUEsZUFBYkEsZ0JBQUEsQ0FBZTlYLGFBQWEsRUFBRTtjQUFBLElBQUErWCxnQkFBQTtjQUM5QixDQUFBQSxnQkFBQSxHQUFBelUsTUFBSSxDQUFDK1MsUUFBUSxjQUFBMEIsZ0JBQUEsZUFBYkEsZ0JBQUEsQ0FBZS9YLGFBQWEsQ0FBQ3NELE1BQUksQ0FBQytOLE9BQU8sQ0FBQ3hTLFNBQVMsSUFBSSxTQUFTLEVBQUVnTSxLQUFLLENBQUN6RixPQUFPLEVBQUV5RixLQUFLLENBQUNGLFNBQVMsQ0FBQztZQUNyRztVQUNKLENBQUMsQ0FBQztRQUNOO1FBRUE7UUFDQSxJQUFJLENBQUNvTSxvQkFBb0IsQ0FBQ2pCLG1CQUFtQixFQUFFO1FBRS9DLElBQUksQ0FBQ0ksYUFBYSxHQUFHLElBQUk7UUFDekJyVixPQUFPLENBQUNELEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQztNQUUzRCxDQUFDLENBQUMsT0FBT0UsS0FBVSxFQUFFO1FBQ2pCRCxPQUFPLENBQUNDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRUEsS0FBSyxDQUFDO1FBQzdELE1BQU1BLEtBQUs7TUFDZjtJQUNKO0lBSUE7OztFQUFBO0lBQUEvQyxHQUFBO0lBQUFDLEtBQUEsRUFHQSxTQUFBNkUsT0FBT0EsQ0FBQ0MsVUFBc0I7TUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQ29ULGFBQWEsRUFBRTtRQUNyQixNQUFNLElBQUl0QyxLQUFLLENBQUMsaUNBQWlDLENBQUM7TUFDdEQ7TUFHQTtNQUNBLElBQUksSUFBSSxDQUFDdkMsT0FBTyxDQUFDaUYsUUFBUSxLQUFLLFNBQVMsRUFBRTtRQUFBLElBQUEwQixjQUFBO1FBQ3JDblgsT0FBTyxDQUFDRCxHQUFHLENBQUMsdUVBQXVFLENBQUM7UUFDcEY7UUFDQSxLQUFBb1gsY0FBQSxHQUFJLElBQUksQ0FBQzNCLFFBQVEsY0FBQTJCLGNBQUEsZUFBYkEsY0FBQSxDQUFlbFksU0FBUyxFQUFFO1VBQUEsSUFBQW1ZLGVBQUE7VUFDMUIsQ0FBQUEsZUFBQSxPQUFJLENBQUM1QixRQUFRLGNBQUE0QixlQUFBLGVBQWJBLGVBQUEsQ0FBZW5ZLFNBQVMsRUFBRTtRQUM5QjtRQUNBO01BQ0o7TUFFQSxJQUFJLElBQUksQ0FBQ29PLFVBQVUsRUFBRTtRQUNqQixJQUFJLENBQUNBLFVBQVUsQ0FBQ3JMLE9BQU8sQ0FBQ0MsVUFBVSxDQUFDO01BQ3ZDLENBQUMsTUFBTTtRQUNILE1BQU0sSUFBSThRLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQztNQUN2RjtJQUNKO0lBR0E7OztFQUFBO0lBQUE3VixHQUFBO0lBQUFDLEtBQUEsRUFHQSxTQUFBbUosVUFBVUEsQ0FBQTtNQUNOO01BQ0EsSUFBSSxJQUFJLENBQUNrSyxPQUFPLENBQUNpRixRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ3JDelYsT0FBTyxDQUFDRCxHQUFHLENBQUMsK0RBQStELENBQUM7UUFDNUU7TUFDSjtNQUVBLElBQUksSUFBSSxDQUFDc04sVUFBVSxFQUFFO1FBQ2pCLElBQUksQ0FBQ0EsVUFBVSxDQUFDL0csVUFBVSxFQUFFO01BQ2hDO0lBQ0o7SUFFQTs7OztFQUFBO0lBQUFwSixHQUFBO0lBQUFDLEtBQUE7TUFBQSxJQUFBbUssTUFBQSxHQUFBL0IsaUNBQUEsY0FBQUMsNEJBQUEsR0FBQUMsQ0FBQSxDQUlBLFNBQUE0UixTQUFZdFUsSUFBWTtRQUFBLElBQUF1VSxvQkFBQSxFQUFBQyxxQkFBQTtRQUFBLE9BQUEvUiw0QkFBQSxHQUFBSyxDQUFBLFdBQUEyUixTQUFBO1VBQUEsa0JBQUFBLFNBQUEsQ0FBQXhSLENBQUE7WUFBQTtjQUFBLE1BQ2hCLElBQUksQ0FBQ3dLLE9BQU8sQ0FBQ2lGLFFBQVEsS0FBSyxTQUFTO2dCQUFBK0IsU0FBQSxDQUFBeFIsQ0FBQTtnQkFBQTtjQUFBO2NBQUF3UixTQUFBLENBQUF4UixDQUFBO2NBQUEsUUFBQXNSLG9CQUFBLEdBRTdCLElBQUksQ0FBQy9CLGNBQWMsY0FBQStCLG9CQUFBLHVCQUFuQkEsb0JBQUEsQ0FBcUJyUCxLQUFLLENBQUNsRixJQUFJLENBQUM7WUFBQTtjQUFBeVUsU0FBQSxDQUFBeFIsQ0FBQTtjQUFBO1lBQUE7Y0FBQSxNQUMvQixJQUFJLENBQUN3SyxPQUFPLENBQUNpRixRQUFRLEtBQUssT0FBTztnQkFBQStCLFNBQUEsQ0FBQXhSLENBQUE7Z0JBQUE7Y0FBQTtjQUFBd1IsU0FBQSxDQUFBeFIsQ0FBQTtjQUFBLFFBQUF1UixxQkFBQSxHQUNsQyxJQUFJLENBQUNoQyxjQUFjLGNBQUFnQyxxQkFBQSx1QkFBbkJBLHFCQUFBLENBQXFCdFAsS0FBSyxDQUFDbEYsSUFBSSxDQUFDO1lBQUE7Y0FBQXlVLFNBQUEsQ0FBQXhSLENBQUE7Y0FBQTtZQUFBO2NBQUEsS0FHbEMsSUFBSSxDQUFDcUgsVUFBVTtnQkFBQW1LLFNBQUEsQ0FBQXhSLENBQUE7Z0JBQUE7Y0FBQTtjQUNmLElBQUksQ0FBQ3FILFVBQVUsQ0FBQ3ZJLFdBQVcsQ0FBQztnQkFDeEI5RyxTQUFTLEVBQUUsSUFBSSxDQUFDd1MsT0FBTyxDQUFDeFMsU0FBVTtnQkFDbEN5WSxJQUFJLEVBQUUsQ0FBQzFULElBQUk7ZUFDZCxDQUFDO2NBQUN5VSxTQUFBLENBQUF4UixDQUFBO2NBQUE7WUFBQTtjQUFBLE1BRUcsSUFBSStNLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQztZQUFBO2NBQUEsT0FBQXlFLFNBQUEsQ0FBQXRSLENBQUE7VUFBQTtRQUFBLEdBQUFtUixRQUFBO01BQUEsQ0FHckU7TUFBQSxTQWpCS3BQLEtBQUtBLENBQUE2SixHQUFBO1FBQUEsT0FBQXhLLE1BQUEsQ0FBQWpCLEtBQUEsT0FBQXBJLFNBQUE7TUFBQTtNQUFBLE9BQUxnSyxLQUFLO0lBQUE7SUFzQlg7OztJQUFBO0VBQUE7SUFBQS9LLEdBQUE7SUFBQUMsS0FBQSxFQUdBLFNBQUFzSixPQUFPQSxDQUFBO01BRUg7TUFDQSxJQUFJLElBQUksQ0FBQzZPLFFBQVEsRUFBRTtRQUNmLElBQUksQ0FBQ0EsUUFBUSxDQUFDN08sT0FBTyxFQUFFO1FBQ3ZCLElBQUksQ0FBQzZPLFFBQVEsR0FBRyxJQUFJO01BQ3hCO01BRUE7TUFDQSxJQUFJLElBQUksQ0FBQ0MsY0FBYyxFQUFFO1FBQ3JCLElBQUksQ0FBQ0EsY0FBYyxDQUFDOU8sT0FBTyxFQUFFO1FBQzdCLElBQUksQ0FBQzhPLGNBQWMsR0FBRyxJQUFJO01BQzlCO01BRUE7TUFDQSxJQUFJLElBQUksQ0FBQ2xJLFVBQVUsRUFBRTtRQUNqQixJQUFJLENBQUNBLFVBQVUsQ0FBQzVHLE9BQU8sRUFBRTtRQUN6QixJQUFJLENBQUM0RyxVQUFVLEdBQUcsSUFBSTtNQUMxQjtNQUVBLElBQUksQ0FBQ2dJLGFBQWEsR0FBRyxLQUFLO01BQzFCLElBQUksQ0FBQ0csUUFBUSxHQUFHLElBQUk7SUFDeEI7RUFBQztBQUFBLEk7Ozs7Ozs7O0FDNVZMOzs7O0FBZUE7OztBQUdPLElBQU1pQyxnQkFBZ0I7RUFPM0IsU0FBQUEsaUJBQVlDLFVBQW9CO0lBQUExYSxpQ0FBQSxPQUFBeWEsZ0JBQUE7SUFMeEIsS0FBQUUsV0FBVyxHQUFXLENBQUM7SUFDdkIsS0FBQTNPLGFBQWEsR0FBVyxDQUFDO0lBQ3pCLEtBQUE0TyxXQUFXLEdBQVcsRUFBRTtJQUN4QixLQUFBQyxZQUFZLEdBQVcsQ0FBQztJQUc5QixJQUFJLENBQUNILFVBQVUsR0FBR0EsVUFBVTtFQUM5QjtFQUVBOzs7OztFQUFBLE9BQUF6YSw4QkFBQSxDQUFBd2EsZ0JBQUE7SUFBQXZhLEdBQUE7SUFBQUMsS0FBQSxFQUtPLFNBQUE4SyxLQUFLQSxDQUFDMUQsT0FBZSxFQUFFaVMsUUFBZ0I7TUFDNUN4VyxPQUFPLENBQUNELEdBQUcsOEJBQUE4QixNQUFBLENBQTZCMEMsT0FBTyxtQkFBQTFDLE1BQUEsQ0FBZTJVLFFBQVEsc0JBQUEzVSxNQUFBLENBQWtCLElBQUksQ0FBQytWLFdBQVcsdUJBQUEvVixNQUFBLENBQW1CLElBQUksQ0FBQ2dXLFlBQVksQ0FBRSxDQUFDO01BRS9JO01BQ0EsSUFBSSxJQUFJLENBQUNDLGdCQUFnQixDQUFDLElBQUksQ0FBQ0YsV0FBVyxFQUFFclQsT0FBTyxFQUFFLElBQUksQ0FBQ3NULFlBQVksRUFBRXJCLFFBQVEsQ0FBQyxFQUFFO1FBQ2pGeFcsT0FBTyxDQUFDRCxHQUFHLENBQUMsK0JBQStCLENBQUM7UUFDNUM7TUFDRjtNQUVBO01BQ0EsSUFBSSxJQUFJLENBQUNnWSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUNILFdBQVcsRUFBRXJULE9BQU8sRUFBRSxJQUFJLENBQUNzVCxZQUFZLEVBQUVyQixRQUFRLENBQUMsRUFBRTtRQUNqRnhXLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLCtCQUErQixDQUFDO1FBQzVDO01BQ0Y7TUFFQTtNQUNBLElBQUl3RSxPQUFPLEtBQUssSUFBSSxDQUFDcVQsV0FBVyxJQUFJcEIsUUFBUSxLQUFLLElBQUksQ0FBQ3FCLFlBQVksRUFBRTtRQUNsRTdYLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHlCQUF5QixDQUFDO1FBQ3RDLElBQUksQ0FBQ2lZLGtCQUFrQixDQUFDelQsT0FBTyxFQUFFLElBQUksQ0FBQ3NULFlBQVksRUFBRXJCLFFBQVEsQ0FBQztRQUM3RCxJQUFJLENBQUNxQixZQUFZLEdBQUdyQixRQUFRO1FBQzVCO01BQ0Y7TUFFQTtNQUNBLElBQ0UsSUFBSSxDQUFDb0IsV0FBVyxDQUFDamEsTUFBTSxHQUFHLENBQUMsSUFDM0I2WSxRQUFRLEtBQUssSUFBSSxDQUFDb0IsV0FBVyxDQUFDamEsTUFBTSxHQUFHLENBQUMsSUFDeEM0RyxPQUFPLEtBQUssSUFBSSxDQUFDcVQsV0FBVyxDQUFDalEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUN6QztRQUNBM0gsT0FBTyxDQUFDRCxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDekM7UUFDQSxJQUFJLENBQUMyWCxVQUFVLENBQUN6UCxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzlCLElBQUksQ0FBQzJQLFdBQVcsR0FBR3JULE9BQU87UUFDMUIsSUFBSSxDQUFDc1QsWUFBWSxHQUFHckIsUUFBUTtRQUM1QjtNQUNGO01BRUE7TUFDQSxJQUFJalMsT0FBTyxLQUFLLElBQUksQ0FBQ3FULFdBQVcsSUFBSXBCLFFBQVEsS0FBSyxJQUFJLENBQUNxQixZQUFZLEVBQUU7UUFDbEU3WCxPQUFPLENBQUNELEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztRQUNyQztNQUNGO01BRUE7TUFDQSxJQUFJLElBQUksQ0FBQ2tZLGFBQWEsQ0FBQyxJQUFJLENBQUNMLFdBQVcsRUFBRXJULE9BQU8sRUFBRWlTLFFBQVEsQ0FBQyxFQUFFO1FBQzNEeFcsT0FBTyxDQUFDRCxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDekM7TUFDRjtNQUVBO01BQ0E7TUFDQSxJQUFJLElBQUksQ0FBQzZYLFdBQVcsQ0FBQ2phLE1BQU0sR0FBRyxDQUFDLElBQUk0RyxPQUFPLENBQUM1RyxNQUFNLEtBQUssQ0FBQyxJQUFJNlksUUFBUSxLQUFLLENBQUMsRUFBRTtRQUN6RXhXLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLGdDQUFnQyxDQUFDO1FBQzdDLElBQUksQ0FBQzZYLFdBQVcsR0FBR3JULE9BQU87UUFDMUIsSUFBSSxDQUFDc1QsWUFBWSxHQUFHckIsUUFBUTtRQUM1QjtNQUNGO01BRUF4VyxPQUFPLENBQUNELEdBQUcsQ0FBQyx1REFBdUQsQ0FBQztNQUNwRTtNQUNBLElBQUksQ0FBQ21ZLG1CQUFtQixDQUFDLElBQUksQ0FBQ04sV0FBVyxFQUFFclQsT0FBTyxDQUFDO01BRW5EO01BQ0EsSUFBTTRULEtBQUssR0FBRzNCLFFBQVEsSUFBSWpTLE9BQU8sQ0FBQzVHLE1BQU07TUFDeENxQyxPQUFPLENBQUNELEdBQUcsZUFBQThCLE1BQUEsQ0FBZXNXLEtBQUsseURBQUF0VyxNQUFBLENBQXNEc1csS0FBSyxHQUFHNVQsT0FBTyxDQUFDNUcsTUFBTSxHQUFHNlksUUFBUSxDQUFFLENBQUM7TUFDekgsSUFBSTJCLEtBQUssRUFBRTtRQUNUO1FBQ0EsSUFBSSxDQUFDQywwQkFBMEIsQ0FBQzdULE9BQU8sRUFBRUEsT0FBTyxDQUFDNUcsTUFBTSxDQUFDO01BQzFELENBQUMsTUFBTTtRQUNMLElBQUksQ0FBQ3lhLDBCQUEwQixDQUFDN1QsT0FBTyxFQUFFaVMsUUFBUSxDQUFDO01BQ3BEO01BRUE7TUFDQSxJQUFJLENBQUNvQixXQUFXLEdBQUdyVCxPQUFPO01BQzFCLElBQUksQ0FBQ3NULFlBQVksR0FBR3JCLFFBQVE7TUFDNUJ4VyxPQUFPLENBQUNELEdBQUcsb0NBQUE4QixNQUFBLENBQW1DLElBQUksQ0FBQytWLFdBQVcsdUJBQUEvVixNQUFBLENBQW1CLElBQUksQ0FBQ2dXLFlBQVksQ0FBRSxDQUFDO0lBQ3ZHO0lBRUE7OztFQUFBO0lBQUEzYSxHQUFBO0lBQUFDLEtBQUEsRUFHUSxTQUFBNmEsa0JBQWtCQSxDQUFDelQsT0FBZSxFQUFFOFQsWUFBb0IsRUFBRUMsVUFBa0I7TUFDbEYsSUFBTUMsUUFBUSxHQUFHLElBQUksQ0FBQ0MsYUFBYSxDQUFDalUsT0FBTyxFQUFFOFQsWUFBWSxDQUFDO01BQzFELElBQU1JLE1BQU0sR0FBRyxJQUFJLENBQUNELGFBQWEsQ0FBQ2pVLE9BQU8sRUFBRStULFVBQVUsQ0FBQztNQUV0RCxJQUFNSSxTQUFTLEdBQUdELE1BQU0sQ0FBQ0UsSUFBSSxHQUFHSixRQUFRLENBQUNJLElBQUk7TUFDN0MsSUFBSUQsU0FBUyxHQUFHLENBQUMsRUFBRTtRQUNqQixJQUFJLENBQUNoQixVQUFVLENBQUN6UCxLQUFLLFNBQUFwRyxNQUFBLENBQVM2VyxTQUFTLE1BQUcsQ0FBQztNQUM3QyxDQUFDLE1BQU0sSUFBSUEsU0FBUyxHQUFHLENBQUMsRUFBRTtRQUN4QixJQUFJLENBQUNoQixVQUFVLENBQUN6UCxLQUFLLFNBQUFwRyxNQUFBLENBQVMsQ0FBQzZXLFNBQVMsTUFBRyxDQUFDO01BQzlDO01BRUEsSUFBTUUsV0FBVyxHQUFHSCxNQUFNLENBQUNJLE1BQU0sR0FBR04sUUFBUSxDQUFDTSxNQUFNO01BQ25ELElBQUlELFdBQVcsR0FBRyxDQUFDLEVBQUU7UUFDbkIsSUFBSSxDQUFDbEIsVUFBVSxDQUFDelAsS0FBSyxTQUFBcEcsTUFBQSxDQUFTK1csV0FBVyxNQUFHLENBQUM7TUFDL0MsQ0FBQyxNQUFNLElBQUlBLFdBQVcsR0FBRyxDQUFDLEVBQUU7UUFDMUIsSUFBSSxDQUFDbEIsVUFBVSxDQUFDelAsS0FBSyxTQUFBcEcsTUFBQSxDQUFTLENBQUMrVyxXQUFXLE1BQUcsQ0FBQztNQUNoRDtJQUNGO0lBRUE7OztFQUFBO0lBQUExYixHQUFBO0lBQUFDLEtBQUEsRUFHUSxTQUFBOGEsYUFBYUEsQ0FBQ2EsVUFBa0IsRUFBRUMsVUFBa0IsRUFBRXZDLFFBQWdCO01BQzVFLElBQ0V1QyxVQUFVLENBQUNwYixNQUFNLElBQUltYixVQUFVLENBQUNuYixNQUFNLElBQ3RDb2IsVUFBVSxDQUFDckksVUFBVSxDQUFDb0ksVUFBVSxDQUFDLElBQ2pDdEMsUUFBUSxLQUFLdUMsVUFBVSxDQUFDcGIsTUFBTSxJQUM5QixJQUFJLENBQUNrYSxZQUFZLEtBQUtpQixVQUFVLENBQUNuYixNQUFNLEVBQ3ZDO1FBQ0EsSUFBTXFiLFFBQVEsR0FBV0QsVUFBVSxDQUFDcFIsS0FBSyxDQUFDbVIsVUFBVSxDQUFDbmIsTUFBTSxDQUFDO1FBQzVELElBQUlxYixRQUFRLENBQUNyYixNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQ3ZCLElBQUlxYixRQUFRLENBQUNwYixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9CLElBQU0wUyxLQUFLLEdBQUcwSSxRQUFRLENBQUNySSxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ2xDLEtBQUssSUFBSVcsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHaEIsS0FBSyxDQUFDM1MsTUFBTSxFQUFFMlQsQ0FBQyxFQUFFLEVBQUU7Y0FDckMsSUFBTTJILEtBQUssR0FBRzNJLEtBQUssQ0FBQ2dCLENBQUMsQ0FBQztjQUN0QixJQUFJMkgsS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQ3ZCLFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQ2dSLEtBQUssQ0FBQztjQUM5QjtjQUNBLElBQUkzSCxDQUFDLEdBQUdoQixLQUFLLENBQUMzUyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QjtnQkFDQSxJQUFJLENBQUMrWixVQUFVLENBQUN6UCxLQUFLLENBQUMsTUFBTSxDQUFDO2NBQy9CO1lBQ0Y7VUFDRixDQUFDLE1BQU07WUFDTCxJQUFJLENBQUN5UCxVQUFVLENBQUN6UCxLQUFLLENBQUMrUSxRQUFRLENBQUM7VUFDakM7UUFDRjtRQUNBLElBQUksQ0FBQ3BCLFdBQVcsR0FBR21CLFVBQVU7UUFDN0IsSUFBSSxDQUFDbEIsWUFBWSxHQUFHckIsUUFBUTtRQUM1QixPQUFPLElBQUk7TUFDYjtNQUNBLE9BQU8sS0FBSztJQUNkO0lBRUE7OztFQUFBO0lBQUF0WixHQUFBO0lBQUFDLEtBQUEsRUFHUSxTQUFBMmEsZ0JBQWdCQSxDQUFDZ0IsVUFBa0IsRUFBRUMsVUFBa0IsRUFBRVYsWUFBb0IsRUFBRUMsVUFBa0I7TUFBQSxJQUFBWSxtQkFBQSxFQUFBQyxtQkFBQTtNQUN2RyxJQUFJSixVQUFVLENBQUNwYixNQUFNLElBQUltYixVQUFVLENBQUNuYixNQUFNLEVBQUU7UUFDMUMsT0FBTyxLQUFLLENBQUMsQ0FBQztNQUNoQjtNQUVBLElBQU15YixRQUFRLEdBQUdOLFVBQVUsQ0FBQ25JLEtBQUssQ0FBQyxJQUFJLENBQUM7TUFDdkMsSUFBTTBJLFFBQVEsR0FBR04sVUFBVSxDQUFDcEksS0FBSyxDQUFDLElBQUksQ0FBQztNQUV2QyxJQUFNNEgsUUFBUSxHQUFHLElBQUksQ0FBQ0MsYUFBYSxDQUFDTSxVQUFVLEVBQUVULFlBQVksQ0FBQztNQUM3RCxJQUFNSSxNQUFNLEdBQUcsSUFBSSxDQUFDRCxhQUFhLENBQUNPLFVBQVUsRUFBRVQsVUFBVSxDQUFDO01BRXpEO01BQ0EsSUFBSUMsUUFBUSxDQUFDSSxJQUFJLEtBQUtGLE1BQU0sQ0FBQ0UsSUFBSSxJQUFJRixNQUFNLENBQUNJLE1BQU0sR0FBR04sUUFBUSxDQUFDTSxNQUFNLEVBQUU7UUFDcEUsT0FBTyxLQUFLO01BQ2Q7TUFFQSxJQUFNUyxTQUFTLEdBQUdmLFFBQVEsQ0FBQ0ksSUFBSTtNQUMvQixJQUFNWSxPQUFPLElBQUFMLG1CQUFBLEdBQVdFLFFBQVEsQ0FBQ0UsU0FBUyxDQUFDLGNBQUFKLG1CQUFBLGNBQUFBLG1CQUFBLEdBQUksRUFBRTtNQUNqRCxJQUFNTSxPQUFPLElBQUFMLG1CQUFBLEdBQVdFLFFBQVEsQ0FBQ0MsU0FBUyxDQUFDLGNBQUFILG1CQUFBLGNBQUFBLG1CQUFBLEdBQUksRUFBRTtNQUVqRDtNQUNBLElBQU1NLFNBQVMsR0FBR0YsT0FBTyxDQUFDNVIsS0FBSyxDQUFDLENBQUMsRUFBRTRRLFFBQVEsQ0FBQ00sTUFBTSxDQUFDO01BQ25ELElBQU1hLFNBQVMsR0FBR0gsT0FBTyxDQUFDNVIsS0FBSyxDQUFDNFEsUUFBUSxDQUFDTSxNQUFNLENBQUM7TUFDaEQsSUFBTWMsU0FBUyxHQUFHSCxPQUFPLENBQUM3UixLQUFLLENBQUMsQ0FBQyxFQUFFNFEsUUFBUSxDQUFDTSxNQUFNLENBQUM7TUFDbkQsSUFBTWUsbUJBQW1CLEdBQUdKLE9BQU8sQ0FBQzdSLEtBQUssQ0FBQzhRLE1BQU0sQ0FBQ0ksTUFBTSxDQUFDO01BRXhELElBQUljLFNBQVMsS0FBS0YsU0FBUyxJQUFJRyxtQkFBbUIsS0FBS0YsU0FBUyxFQUFFO1FBQ2hFLE9BQU8sS0FBSyxDQUFDLENBQUM7TUFDaEI7TUFFQTtNQUNBLElBQUksQ0FBQzFCLGtCQUFrQixDQUFDYyxVQUFVLEVBQUUsSUFBSSxDQUFDakIsWUFBWSxFQUFFUSxZQUFZLENBQUM7TUFFcEU7TUFDQSxJQUFNd0IsV0FBVyxHQUFHTCxPQUFPLENBQUM3UixLQUFLLENBQUM0USxRQUFRLENBQUNNLE1BQU0sQ0FBQztNQUNsRCxJQUFJLENBQUNuQixVQUFVLENBQUN6UCxLQUFLLENBQUMsUUFBUSxDQUFDO01BQy9CLElBQUk0UixXQUFXLENBQUNsYyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzFCLElBQUksQ0FBQytaLFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQzRSLFdBQVcsQ0FBQztNQUNwQztNQUVBO01BQ0EsSUFBTUMsUUFBUSxHQUFHTixPQUFPLENBQUM3YixNQUFNLEdBQUc4YSxNQUFNLENBQUNJLE1BQU07TUFDL0MsSUFBSWlCLFFBQVEsR0FBRyxDQUFDLEVBQUU7UUFDaEIsSUFBSSxDQUFDcEMsVUFBVSxDQUFDelAsS0FBSyxTQUFBcEcsTUFBQSxDQUFTaVksUUFBUSxNQUFHLENBQUM7TUFDNUM7TUFFQTtNQUNBLElBQUksQ0FBQ2xDLFdBQVcsR0FBR21CLFVBQVU7TUFDN0IsSUFBSSxDQUFDbEIsWUFBWSxHQUFHUyxVQUFVO01BQzlCLE9BQU8sSUFBSTtJQUNiO0lBRUE7OztFQUFBO0lBQUFwYixHQUFBO0lBQUFDLEtBQUEsRUFHUSxTQUFBNGEsZ0JBQWdCQSxDQUFDZSxVQUFrQixFQUFFQyxVQUFrQixFQUFFVixZQUFvQixFQUFFQyxVQUFrQjtNQUFBLElBQUF5QixvQkFBQSxFQUFBQyxvQkFBQTtNQUN2RyxJQUFJakIsVUFBVSxDQUFDcGIsTUFBTSxLQUFLbWIsVUFBVSxDQUFDbmIsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUMvQyxPQUFPLEtBQUssQ0FBQyxDQUFDO01BQ2hCO01BRUEsSUFBTXliLFFBQVEsR0FBR04sVUFBVSxDQUFDbkksS0FBSyxDQUFDLElBQUksQ0FBQztNQUN2QyxJQUFNMEksUUFBUSxHQUFHTixVQUFVLENBQUNwSSxLQUFLLENBQUMsSUFBSSxDQUFDO01BRXZDLElBQU00SCxRQUFRLEdBQUcsSUFBSSxDQUFDQyxhQUFhLENBQUNNLFVBQVUsRUFBRVQsWUFBWSxDQUFDO01BQzdELElBQU1JLE1BQU0sR0FBRyxJQUFJLENBQUNELGFBQWEsQ0FBQ08sVUFBVSxFQUFFVCxVQUFVLENBQUM7TUFFekQ7TUFDQSxJQUFJQyxRQUFRLENBQUNJLElBQUksS0FBS0YsTUFBTSxDQUFDRSxJQUFJLEVBQUU7UUFDakM7UUFDQSxJQUFNc0IsV0FBVyxHQUFHbkIsVUFBVSxDQUFDVCxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELElBQUk0QixXQUFXLEtBQUssSUFBSSxFQUFFO1VBQ3hCLE9BQU8sS0FBSztRQUNkO1FBQ0E7UUFDQSxPQUFPLElBQUksQ0FBQ0MscUJBQXFCLENBQUNwQixVQUFVLEVBQUVDLFVBQVUsRUFBRVYsWUFBWSxFQUFFQyxVQUFVLENBQUM7TUFDckY7TUFFQSxJQUFNZ0IsU0FBUyxHQUFHZixRQUFRLENBQUNJLElBQUk7TUFDL0IsSUFBTVksT0FBTyxJQUFBUSxvQkFBQSxHQUFXWCxRQUFRLENBQUNFLFNBQVMsQ0FBQyxjQUFBUyxvQkFBQSxjQUFBQSxvQkFBQSxHQUFJLEVBQUU7TUFDakQsSUFBTVAsT0FBTyxJQUFBUSxvQkFBQSxHQUFXWCxRQUFRLENBQUNDLFNBQVMsQ0FBQyxjQUFBVSxvQkFBQSxjQUFBQSxvQkFBQSxHQUFJLEVBQUU7TUFFakQ7TUFDQSxJQUFJdkIsTUFBTSxDQUFDSSxNQUFNLEtBQUtOLFFBQVEsQ0FBQ00sTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN6QyxPQUFPLEtBQUs7TUFDZDtNQUVBO01BQ0EsSUFBTXNCLGVBQWUsR0FBR1osT0FBTyxDQUFDNVIsS0FBSyxDQUFDLENBQUMsRUFBRTRRLFFBQVEsQ0FBQ00sTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHVSxPQUFPLENBQUM1UixLQUFLLENBQUM0USxRQUFRLENBQUNNLE1BQU0sQ0FBQztNQUM5RixJQUFJc0IsZUFBZSxLQUFLWCxPQUFPLEVBQUU7UUFDL0IsT0FBTyxLQUFLO01BQ2Q7TUFFQTtNQUNBLElBQUksQ0FBQ3hCLGtCQUFrQixDQUFDYyxVQUFVLEVBQUUsSUFBSSxDQUFDakIsWUFBWSxFQUFFUSxZQUFZLENBQUM7TUFFcEU7TUFDQSxJQUFJLENBQUNYLFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQyxRQUFRLENBQUM7TUFFL0I7TUFDQSxJQUFNNFIsV0FBVyxHQUFHTCxPQUFPLENBQUM3UixLQUFLLENBQUM4USxNQUFNLENBQUNJLE1BQU0sQ0FBQztNQUNoRCxJQUFJLENBQUNuQixVQUFVLENBQUN6UCxLQUFLLENBQUMsUUFBUSxDQUFDO01BQy9CLElBQUk0UixXQUFXLENBQUNsYyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzFCLElBQUksQ0FBQytaLFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQzRSLFdBQVcsQ0FBQztRQUNsQztRQUNBLElBQUksQ0FBQ25DLFVBQVUsQ0FBQ3pQLEtBQUssU0FBQXBHLE1BQUEsQ0FBU2dZLFdBQVcsQ0FBQ2xjLE1BQU0sTUFBRyxDQUFDO01BQ3REO01BRUE7TUFDQSxJQUFJLENBQUNpYSxXQUFXLEdBQUdtQixVQUFVO01BQzdCLElBQUksQ0FBQ2xCLFlBQVksR0FBR1MsVUFBVTtNQUM5QixPQUFPLElBQUk7SUFDYjtJQUVBOzs7RUFBQTtJQUFBcGIsR0FBQTtJQUFBQyxLQUFBLEVBR1EsU0FBQStjLHFCQUFxQkEsQ0FBQ3BCLFVBQWtCLEVBQUVDLFVBQWtCLEVBQUVWLFlBQW9CLEVBQUVDLFVBQWtCO01BQzVHdFksT0FBTyxDQUFDRCxHQUFHLENBQUMsOEJBQThCLENBQUM7TUFFM0MsSUFBTXdZLFFBQVEsR0FBRyxJQUFJLENBQUNDLGFBQWEsQ0FBQ00sVUFBVSxFQUFFVCxZQUFZLENBQUM7TUFDN0QsSUFBTUksTUFBTSxHQUFHLElBQUksQ0FBQ0QsYUFBYSxDQUFDTyxVQUFVLEVBQUVULFVBQVUsQ0FBQztNQUV6RHRZLE9BQU8sQ0FBQ0QsR0FBRyxxQkFBQThCLE1BQUEsQ0FBcUIwVyxRQUFRLENBQUNJLElBQUksZUFBQTlXLE1BQUEsQ0FBWTBXLFFBQVEsQ0FBQ00sTUFBTSxDQUFFLENBQUM7TUFDM0U3WSxPQUFPLENBQUNELEdBQUcsbUJBQUE4QixNQUFBLENBQW1CNFcsTUFBTSxDQUFDRSxJQUFJLGVBQUE5VyxNQUFBLENBQVk0VyxNQUFNLENBQUNJLE1BQU0sQ0FBRSxDQUFDO01BRXJFO01BQ0EsSUFBSSxDQUFDYixrQkFBa0IsQ0FBQ2MsVUFBVSxFQUFFLElBQUksQ0FBQ2pCLFlBQVksRUFBRVEsWUFBWSxDQUFDO01BRXBFO01BQ0EsSUFBSSxDQUFDWCxVQUFVLENBQUN6UCxLQUFLLENBQUMsUUFBUSxDQUFDO01BRS9CO01BQ0EsSUFBSSxDQUFDeVAsVUFBVSxDQUFDelAsS0FBSyxDQUFDLFFBQVEsQ0FBQztNQUUvQjtNQUNBLElBQU1tUixRQUFRLEdBQUdOLFVBQVUsQ0FBQ25JLEtBQUssQ0FBQyxJQUFJLENBQUM7TUFDdkMsSUFBTTBJLFFBQVEsR0FBR04sVUFBVSxDQUFDcEksS0FBSyxDQUFDLElBQUksQ0FBQztNQUV2QyxJQUFJNEgsUUFBUSxDQUFDSSxJQUFJLEdBQUdTLFFBQVEsQ0FBQ3piLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdkM7UUFDQSxJQUFNeWMsZUFBZSxHQUFHaEIsUUFBUSxDQUFDYixRQUFRLENBQUNJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFO1FBQ3pEM1ksT0FBTyxDQUFDRCxHQUFHLHlCQUFBOEIsTUFBQSxDQUF3QnVZLGVBQWUsT0FBRyxDQUFDO1FBQ3RELElBQUlBLGVBQWUsQ0FBQ3pjLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDOUIsSUFBSSxDQUFDK1osVUFBVSxDQUFDelAsS0FBSyxDQUFDbVMsZUFBZSxDQUFDO1VBQ3RDO1VBQ0EsSUFBTU4sUUFBUSxHQUFHTSxlQUFlLENBQUN6YyxNQUFNLEdBQUc4YSxNQUFNLENBQUNJLE1BQU07VUFDdkQ3WSxPQUFPLENBQUNELEdBQUcsZ0JBQUE4QixNQUFBLENBQWdCaVksUUFBUSxDQUFFLENBQUM7VUFDdEMsSUFBSUEsUUFBUSxHQUFHLENBQUMsRUFBRTtZQUNoQixJQUFJLENBQUNwQyxVQUFVLENBQUN6UCxLQUFLLFNBQUFwRyxNQUFBLENBQVNpWSxRQUFRLE1BQUcsQ0FBQztVQUM1QztRQUNGO01BQ0YsQ0FBQyxNQUFNO1FBQ0w7UUFDQTlaLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLG1DQUFtQyxDQUFDO1FBQ2hEO1FBQ0EsSUFBSXdZLFFBQVEsQ0FBQ0ksSUFBSSxHQUFHRixNQUFNLENBQUNFLElBQUksRUFBRTtVQUMvQjNZLE9BQU8sQ0FBQ0QsR0FBRywwQkFBQThCLE1BQUEsQ0FBMEIwVyxRQUFRLENBQUNJLElBQUksZUFBQTlXLE1BQUEsQ0FBWTRXLE1BQU0sQ0FBQ0UsSUFBSSxDQUFFLENBQUM7VUFDNUUsSUFBSSxDQUFDakIsVUFBVSxDQUFDelAsS0FBSyxTQUFBcEcsTUFBQSxDQUFTMFcsUUFBUSxDQUFDSSxJQUFJLEdBQUdGLE1BQU0sQ0FBQ0UsSUFBSSxNQUFHLENBQUM7VUFDN0Q7VUFDQSxJQUFJRixNQUFNLENBQUNJLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckIsSUFBSSxDQUFDbkIsVUFBVSxDQUFDelAsS0FBSyxTQUFBcEcsTUFBQSxDQUFTNFcsTUFBTSxDQUFDSSxNQUFNLE1BQUcsQ0FBQztVQUNqRDtRQUNGO01BQ0Y7TUFFQTtNQUNBLElBQUksQ0FBQ2pCLFdBQVcsR0FBR21CLFVBQVU7TUFDN0IsSUFBSSxDQUFDbEIsWUFBWSxHQUFHUyxVQUFVO01BQzlCdFksT0FBTyxDQUFDRCxHQUFHLHNCQUFBOEIsTUFBQSxDQUFzQnlXLFVBQVUsQ0FBRSxDQUFDO01BQzlDLE9BQU8sSUFBSTtJQUNiO0lBRUE7Ozs7RUFBQTtJQUFBcGIsR0FBQTtJQUFBQyxLQUFBLEVBSU8sU0FBQWtkLFNBQVNBLENBQUN4SCxJQUFZO01BQzNCLElBQUksQ0FBQzZFLFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQzRLLElBQUksQ0FBQztJQUM3QjtJQUVBOzs7O0VBQUE7SUFBQTNWLEdBQUE7SUFBQUMsS0FBQSxFQUlPLFNBQUFtZCxTQUFTQSxDQUFDekgsSUFBWTtNQUMzQixJQUFJLENBQUM2RSxVQUFVLENBQUN6UCxLQUFLLENBQUM0SyxJQUFJLEdBQUcsTUFBTSxDQUFDO0lBQ3RDO0lBRUE7OztFQUFBO0lBQUEzVixHQUFBO0lBQUFDLEtBQUEsRUFHTyxTQUFBb2QsZ0JBQWdCQSxDQUFBO01BQ3JCO01BQ0EsSUFBSSxDQUFDN0MsVUFBVSxDQUFDelAsS0FBSyxDQUFDLElBQUksQ0FBQztNQUMzQjtNQUNBLElBQUksQ0FBQ3lQLFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDbEM7SUFFQTs7OztFQUFBO0lBQUEvSyxHQUFBO0lBQUFDLEtBQUEsRUFJUSxTQUFBcWQsaUJBQWlCQSxDQUFDalcsT0FBZTtNQUN2QztNQUNBLElBQU1rVyxLQUFLLEdBQUdsVyxPQUFPLENBQUNvTSxLQUFLLENBQUMsSUFBSSxDQUFDO01BQ2pDLElBQU0rSixTQUFTLEdBQUdELEtBQUssQ0FBQzljLE1BQU07TUFDOUIsSUFBSSxDQUFDK1osVUFBVSxDQUFDelAsS0FBSyxDQUFDLElBQUksQ0FBQztNQUMzQixLQUFLLElBQUlxSixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdvSixTQUFTLEVBQUVwSixDQUFDLEVBQUUsRUFBRTtRQUNsQyxJQUFJLENBQUNvRyxVQUFVLENBQUN6UCxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUlxSixDQUFDLEdBQUdvSixTQUFTLEdBQUcsQ0FBQyxFQUFFO1VBQ3JCLElBQUksQ0FBQ2hELFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDakM7TUFDRjtNQUNBLElBQUl5UyxTQUFTLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLElBQUksQ0FBQ2hELFVBQVUsQ0FBQ3pQLEtBQUssU0FBQXBHLE1BQUEsQ0FBUzZZLFNBQVMsR0FBRyxDQUFDLE1BQUcsQ0FBQztNQUNqRDtNQUNBLElBQUksQ0FBQ2hELFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDN0I7SUFFQTs7O0VBQUE7SUFBQS9LLEdBQUE7SUFBQUMsS0FBQSxFQUdRLFNBQUErYSxtQkFBbUJBLENBQUNZLFVBQWtCLEVBQUVDLFVBQWtCO01BQ2hFLElBQU1LLFFBQVEsR0FBR04sVUFBVSxDQUFDbkksS0FBSyxDQUFDLElBQUksQ0FBQztNQUN2QyxJQUFNMEksUUFBUSxHQUFHTixVQUFVLENBQUNwSSxLQUFLLENBQUMsSUFBSSxDQUFDO01BQ3ZDLElBQU1nSyxRQUFRLEdBQUd0ZCxJQUFJLENBQUM2TCxHQUFHLENBQUNrUSxRQUFRLENBQUN6YixNQUFNLEVBQUUwYixRQUFRLENBQUMxYixNQUFNLENBQUM7TUFFM0Q7TUFDQSxJQUFNaWQsUUFBUSxHQUFHLElBQUksQ0FBQ3BDLGFBQWEsQ0FBQ00sVUFBVSxFQUFFLElBQUksQ0FBQ2pCLFlBQVksQ0FBQztNQUNsRSxJQUFJLENBQUNILFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQyxJQUFJLENBQUM7TUFDM0IsSUFBSTJTLFFBQVEsQ0FBQ2pDLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDckIsSUFBSSxDQUFDakIsVUFBVSxDQUFDelAsS0FBSyxTQUFBcEcsTUFBQSxDQUFTK1ksUUFBUSxDQUFDakMsSUFBSSxNQUFHLENBQUM7TUFDakQ7TUFFQSxLQUFLLElBQUlySCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdxSixRQUFRLEVBQUVySixDQUFDLEVBQUUsRUFBRTtRQUFBLElBQUF1SixXQUFBLEVBQUFDLFdBQUE7UUFDakMsSUFBTXZCLE9BQU8sR0FBV2pJLENBQUMsR0FBRzhILFFBQVEsQ0FBQ3piLE1BQU0sSUFBQWtkLFdBQUEsR0FBSXpCLFFBQVEsQ0FBQzlILENBQUMsQ0FBQyxjQUFBdUosV0FBQSxjQUFBQSxXQUFBLEdBQUksRUFBRSxHQUFJLEVBQUU7UUFDdEUsSUFBTXJCLE9BQU8sR0FBV2xJLENBQUMsR0FBRytILFFBQVEsQ0FBQzFiLE1BQU0sSUFBQW1kLFdBQUEsR0FBSXpCLFFBQVEsQ0FBQy9ILENBQUMsQ0FBQyxjQUFBd0osV0FBQSxjQUFBQSxXQUFBLEdBQUksRUFBRSxHQUFJLEVBQUU7UUFFdEU7UUFDQSxJQUFJLENBQUNwRCxVQUFVLENBQUN6UCxLQUFLLENBQUMsSUFBSSxDQUFDO1FBRTNCLElBQUlzUixPQUFPLEtBQUtDLE9BQU8sRUFBRTtVQUN2QjtVQUNBLElBQUksQ0FBQzlCLFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQyxTQUFTLENBQUM7VUFDaEMsSUFBSXVSLE9BQU8sQ0FBQzdiLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDK1osVUFBVSxDQUFDelAsS0FBSyxDQUFDdVIsT0FBTyxDQUFDO1VBQ2hDO1FBQ0Y7UUFFQTtRQUNBLElBQUlsSSxDQUFDLEdBQUdxSixRQUFRLEdBQUcsQ0FBQyxFQUFFO1VBQ3BCLElBQUksQ0FBQ2pELFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQyxJQUFJLENBQUM7VUFDM0IsSUFBSSxDQUFDeVAsVUFBVSxDQUFDelAsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNqQztNQUNGO01BRUE7TUFDQTtNQUNBLElBQUltUixRQUFRLENBQUN6YixNQUFNLEdBQUcwYixRQUFRLENBQUMxYixNQUFNLEVBQUU7UUFDckMsSUFBSSxDQUFDK1osVUFBVSxDQUFDelAsS0FBSyxTQUFBcEcsTUFBQSxDQUFTdVgsUUFBUSxDQUFDemIsTUFBTSxHQUFHMGIsUUFBUSxDQUFDMWIsTUFBTSxNQUFHLENBQUM7TUFDckU7TUFFQTtNQUNBO0lBQ0Y7SUFFQTs7Ozs7RUFBQTtJQUFBVCxHQUFBO0lBQUFDLEtBQUEsRUFLUSxTQUFBaWIsMEJBQTBCQSxDQUFDN1QsT0FBZSxFQUFFaVMsUUFBZ0I7TUFDbEUsSUFBTWlFLEtBQUssR0FBR2xXLE9BQU8sQ0FBQ29NLEtBQUssQ0FBQyxJQUFJLENBQUM7TUFDakMsSUFBTW9LLFdBQVcsR0FBR3hXLE9BQU8sQ0FBQzVHLE1BQU07TUFDbEMsSUFBSXFkLGVBQWUsR0FBRyxDQUFDO01BQ3ZCLElBQUlDLFVBQVUsR0FBRyxDQUFDO01BQ2xCLElBQUk5UixZQUFZLEdBQUcsQ0FBQztNQUVwQjtNQUNBLElBQU0rUixZQUFZLEdBQUc3ZCxJQUFJLENBQUM2TCxHQUFHLENBQUMsQ0FBQyxFQUFFN0wsSUFBSSxDQUFDdUcsR0FBRyxDQUFDNFMsUUFBUSxFQUFFdUUsV0FBVyxDQUFDLENBQUM7TUFFakUvYSxPQUFPLENBQUNELEdBQUcsMENBQUE4QixNQUFBLENBQXlDMEMsT0FBTyxtQkFBQTFDLE1BQUEsQ0FBZTJVLFFBQVEscUJBQUEzVSxNQUFBLENBQWtCcVosWUFBWSxjQUFBclosTUFBQSxDQUFXNFksS0FBSyxDQUFDOWMsTUFBTSxDQUFFLENBQUM7TUFFMUk7TUFDQSxLQUFLLElBQUkyVCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdtSixLQUFLLENBQUM5YyxNQUFNLEVBQUUyVCxDQUFDLEVBQUUsRUFBRTtRQUFBLElBQUE2SixRQUFBO1FBQ3JDLElBQU14QyxJQUFJLElBQUF3QyxRQUFBLEdBQVdWLEtBQUssQ0FBQ25KLENBQUMsQ0FBQyxjQUFBNkosUUFBQSxjQUFBQSxRQUFBLEdBQUksRUFBRTtRQUNuQyxJQUFNQyxVQUFVLEdBQUd6QyxJQUFJLENBQUNoYixNQUFNO1FBQzlCLElBQUl1ZCxZQUFZLElBQUlGLGVBQWUsR0FBR0ksVUFBVSxFQUFFO1VBQ2hESCxVQUFVLEdBQUczSixDQUFDO1VBQ2RuSSxZQUFZLEdBQUcrUixZQUFZLEdBQUdGLGVBQWU7VUFDN0M7UUFDRjtRQUNBQSxlQUFlLElBQUlJLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztNQUNyQztNQUVBO01BQ0EsSUFBSUYsWUFBWSxLQUFLSCxXQUFXLElBQUlBLFdBQVcsR0FBRyxDQUFDLEVBQUU7UUFBQSxJQUFBTSxxQkFBQSxFQUFBQyxpQkFBQTtRQUNuREwsVUFBVSxHQUFHUixLQUFLLENBQUM5YyxNQUFNLEdBQUcsQ0FBQztRQUM3QndMLFlBQVksSUFBQWtTLHFCQUFBLElBQUFDLGlCQUFBLEdBQUdiLEtBQUssQ0FBQ1EsVUFBVSxDQUFDLGNBQUFLLGlCQUFBLHVCQUFqQkEsaUJBQUEsQ0FBbUIzZCxNQUFNLGNBQUEwZCxxQkFBQSxjQUFBQSxxQkFBQSxHQUFJLENBQUM7TUFDL0M7TUFFQTtNQUNBLElBQUksQ0FBQzNELFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQyxJQUFJLENBQUM7TUFDM0IsSUFBSXdTLEtBQUssQ0FBQzljLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDK1osVUFBVSxDQUFDelAsS0FBSyxTQUFBcEcsTUFBQSxDQUFTNFksS0FBSyxDQUFDOWMsTUFBTSxHQUFHLENBQUMsTUFBRyxDQUFDO01BQ3BEO01BRUE7TUFDQSxJQUFJc2QsVUFBVSxHQUFHLENBQUMsRUFBRTtRQUNsQixJQUFJLENBQUN2RCxVQUFVLENBQUN6UCxLQUFLLFNBQUFwRyxNQUFBLENBQVNvWixVQUFVLE1BQUcsQ0FBQztNQUM5QztNQUVBO01BQ0EsSUFBSTlSLFlBQVksR0FBRyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDdU8sVUFBVSxDQUFDelAsS0FBSyxTQUFBcEcsTUFBQSxDQUFTc0gsWUFBWSxNQUFHLENBQUM7TUFDaEQ7TUFFQW5KLE9BQU8sQ0FBQ0QsR0FBRyxrREFBQThCLE1BQUEsQ0FBa0RvWixVQUFVLHFCQUFBcFosTUFBQSxDQUFrQnNILFlBQVksQ0FBRSxDQUFDO0lBQzFHO0lBRUE7Ozs7RUFBQTtJQUFBak0sR0FBQTtJQUFBQyxLQUFBLEVBSU8sU0FBQW9lLGlCQUFpQkEsQ0FBQy9FLFFBQWdCO01BQ3ZDO01BQ0EsSUFBSSxDQUFDa0IsVUFBVSxDQUFDelAsS0FBSyxDQUFDLElBQUksQ0FBQztNQUMzQjtNQUNBLElBQUl1TyxRQUFRLEdBQUcsQ0FBQyxFQUFFO1FBQ2hCLElBQUksQ0FBQ2tCLFVBQVUsQ0FBQ3pQLEtBQUssU0FBQXBHLE1BQUEsQ0FBUzJVLFFBQVEsTUFBRyxDQUFDO01BQzVDO0lBQ0Y7SUFFQTs7O0VBQUE7SUFBQXRaLEdBQUE7SUFBQUMsS0FBQSxFQUdPLFNBQUE2SyxjQUFjQSxDQUFBO01BQ25CLElBQUksQ0FBQzBQLFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDakM7SUFFQTs7O0VBQUE7SUFBQS9LLEdBQUE7SUFBQUMsS0FBQSxFQUdPLFNBQUE0SyxlQUFlQSxDQUFBO01BQ3BCLElBQUksQ0FBQzJQLFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDakM7SUFFQTs7O0VBQUE7SUFBQS9LLEdBQUE7SUFBQUMsS0FBQSxFQUdPLFNBQUFxZSxpQkFBaUJBLENBQUE7TUFDdEIsSUFBSSxDQUFDOUQsVUFBVSxDQUFDelAsS0FBSyxDQUFDLElBQUksQ0FBQztJQUM3QjtJQUVBOzs7O0VBQUE7SUFBQS9LLEdBQUE7SUFBQUMsS0FBQSxFQUlPLFNBQUFzZSx3QkFBd0JBLENBQUNsWCxPQUFlO01BQzdDLElBQUksQ0FBQzZULDBCQUEwQixDQUFDN1QsT0FBTyxFQUFFQSxPQUFPLENBQUM1RyxNQUFNLENBQUM7SUFDMUQ7SUFFQTs7OztFQUFBO0lBQUFULEdBQUE7SUFBQUMsS0FBQSxFQUlPLFNBQUF1ZSxlQUFlQSxDQUFDQyxhQUFxQjtNQUMxQyxJQUFJLENBQUNqRSxVQUFVLENBQUN6UCxLQUFLLENBQUMsSUFBSSxDQUFDO01BQzNCLElBQUkwVCxhQUFhLEdBQUcsQ0FBQyxFQUFFO1FBQ3JCLElBQUksQ0FBQ2pFLFVBQVUsQ0FBQ3pQLEtBQUssU0FBQXBHLE1BQUEsQ0FBUzhaLGFBQWEsTUFBRyxDQUFDO01BQ2pEO0lBQ0Y7SUFFQTs7O0VBQUE7SUFBQXplLEdBQUE7SUFBQUMsS0FBQSxFQUdPLFNBQUF5ZSxXQUFXQSxDQUFBO01BQ2hCLElBQUksQ0FBQ2xFLFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQyxTQUFTLENBQUM7TUFDaEMsSUFBSSxDQUFDeVAsVUFBVSxDQUFDelAsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNqQztJQUVBOzs7O0VBQUE7SUFBQS9LLEdBQUE7SUFBQUMsS0FBQSxFQUlPLFNBQUEwZSxlQUFlQSxDQUFDN1IsS0FBbUI7TUFDeEMsSUFBSSxDQUFDL0IsS0FBSyxDQUFDK0IsS0FBSyxDQUFDekYsT0FBTyxFQUFFeUYsS0FBSyxDQUFDd00sUUFBUSxDQUFDO0lBQzNDO0lBRUE7OztFQUFBO0lBQUF0WixHQUFBO0lBQUFDLEtBQUEsRUFHTyxTQUFBMmUsd0JBQXdCQSxDQUFBO01BQzdCLE9BQU87UUFDTEMsQ0FBQyxFQUFFLElBQUksQ0FBQ3JFLFVBQVUsQ0FBQ3NFLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDQyxPQUFPO1FBQ3hDQyxDQUFDLEVBQUUsSUFBSSxDQUFDekUsVUFBVSxDQUFDc0UsTUFBTSxDQUFDQyxNQUFNLENBQUNHO09BQ2xDO0lBQ0g7SUFFQTs7OztFQUFBO0lBQUFsZixHQUFBO0lBQUFDLEtBQUEsRUFJTyxTQUFBa2YsV0FBV0EsQ0FBQSxFQUFzQjtNQUFBLElBQXJCQyxNQUFBLEdBQUFyZSxTQUFBLENBQUFOLE1BQUEsUUFBQU0sU0FBQSxRQUFBQyxTQUFBLEdBQUFELFNBQUEsTUFBaUIsSUFBSTtNQUN0QyxJQUFJLENBQUN5WixVQUFVLENBQUN6UCxLQUFLLENBQUNxVSxNQUFNLENBQUM7SUFDL0I7SUFFQTs7OztFQUFBO0lBQUFwZixHQUFBO0lBQUFDLEtBQUEsRUFJTyxTQUFBb2YsVUFBVUEsQ0FBQ3RjLEtBQWE7TUFDN0IsSUFBSSxDQUFDeVgsVUFBVSxDQUFDelAsS0FBSyxZQUFBcEcsTUFBQSxDQUFZNUIsS0FBSyxZQUFTLENBQUM7SUFDbEQ7SUFFQTs7OztFQUFBO0lBQUEvQyxHQUFBO0lBQUFDLEtBQUEsRUFJTyxTQUFBcWYsWUFBWUEsQ0FBQ0MsT0FBZTtNQUNqQyxJQUFJLENBQUMvRSxVQUFVLENBQUN6UCxLQUFLLFlBQUFwRyxNQUFBLENBQVk0YSxPQUFPLFlBQVMsQ0FBQztJQUNwRDtJQUVBOzs7O0VBQUE7SUFBQXZmLEdBQUE7SUFBQUMsS0FBQSxFQUlPLFNBQUF1ZixZQUFZQSxDQUFDeFksT0FBZTtNQUNqQyxJQUFJLENBQUN3VCxVQUFVLENBQUN6UCxLQUFLLFlBQUFwRyxNQUFBLENBQVlxQyxPQUFPLFlBQVMsQ0FBQztJQUNwRDtJQUVBOzs7O0VBQUE7SUFBQWhILEdBQUE7SUFBQUMsS0FBQSxFQUlPLFNBQUF3ZixTQUFTQSxDQUFDelksT0FBZTtNQUM5QixJQUFJLENBQUN3VCxVQUFVLENBQUN6UCxLQUFLLFlBQUFwRyxNQUFBLENBQVlxQyxPQUFPLFlBQVMsQ0FBQztJQUNwRDtJQUVBOzs7RUFBQTtJQUFBaEgsR0FBQTtJQUFBQyxLQUFBLEVBR08sU0FBQXlmLFNBQVNBLENBQUE7TUFDZCxJQUFJLENBQUNsRixVQUFVLENBQUN6UCxLQUFLLENBQUMsT0FBTyxDQUFDO0lBQ2hDO0lBRUE7Ozs7OztFQUFBO0lBQUEvSyxHQUFBO0lBQUFDLEtBQUEsRUFNTyxTQUFBcWIsYUFBYUEsQ0FBQ2pVLE9BQWUsRUFBRWlTLFFBQWdCO01BQ3BELElBQU1pRSxLQUFLLEdBQUdsVyxPQUFPLENBQUNvTSxLQUFLLENBQUMsSUFBSSxDQUFDO01BQ2pDLElBQU1vSyxXQUFXLEdBQUd4VyxPQUFPLENBQUM1RyxNQUFNO01BQ2xDLElBQUlxZCxlQUFlLEdBQUcsQ0FBQztNQUN2QixJQUFJQyxVQUFVLEdBQUcsQ0FBQztNQUNsQixJQUFJOVIsWUFBWSxHQUFHLENBQUM7TUFFcEIsSUFBTStSLFlBQVksR0FBRzdkLElBQUksQ0FBQzZMLEdBQUcsQ0FBQyxDQUFDLEVBQUU3TCxJQUFJLENBQUN1RyxHQUFHLENBQUM0UyxRQUFRLEVBQUV1RSxXQUFXLENBQUMsQ0FBQztNQUVqRSxLQUFLLElBQUl6SixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdtSixLQUFLLENBQUM5YyxNQUFNLEVBQUUyVCxDQUFDLEVBQUUsRUFBRTtRQUFBLElBQUF1TCxTQUFBO1FBQ3JDLElBQU1sRSxJQUFJLElBQUFrRSxTQUFBLEdBQVdwQyxLQUFLLENBQUNuSixDQUFDLENBQUMsY0FBQXVMLFNBQUEsY0FBQUEsU0FBQSxHQUFJLEVBQUU7UUFDbkMsSUFBTXpCLFVBQVUsR0FBR3pDLElBQUksQ0FBQ2hiLE1BQU07UUFDOUIsSUFBSXVkLFlBQVksSUFBSUYsZUFBZSxHQUFHSSxVQUFVLEVBQUU7VUFDaERILFVBQVUsR0FBRzNKLENBQUM7VUFDZG5JLFlBQVksR0FBRytSLFlBQVksR0FBR0YsZUFBZTtVQUM3QztRQUNGO1FBQ0FBLGVBQWUsSUFBSUksVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQ3JDO01BRUEsSUFBSUYsWUFBWSxLQUFLSCxXQUFXLEVBQUU7UUFBQSxJQUFBK0Isc0JBQUEsRUFBQUMsa0JBQUE7UUFDaEM5QixVQUFVLEdBQUdSLEtBQUssQ0FBQzljLE1BQU0sR0FBRyxDQUFDO1FBQzdCd0wsWUFBWSxJQUFBMlQsc0JBQUEsSUFBQUMsa0JBQUEsR0FBR3RDLEtBQUssQ0FBQ1EsVUFBVSxDQUFDLGNBQUE4QixrQkFBQSx1QkFBakJBLGtCQUFBLENBQW1CcGYsTUFBTSxjQUFBbWYsc0JBQUEsY0FBQUEsc0JBQUEsR0FBSSxDQUFDO01BQy9DO01BRUEsT0FBTztRQUNMbkUsSUFBSSxFQUFFc0MsVUFBVTtRQUNoQnBDLE1BQU0sRUFBRTFQLFlBQVk7UUFDcEI2VCxRQUFRLEVBQUV2QyxLQUFLLENBQUNRLFVBQVUsQ0FBQyxJQUFJO09BQ2hDO0lBQ0g7SUFFQTs7Ozs7RUFBQTtJQUFBL2QsR0FBQTtJQUFBQyxLQUFBLEVBS08sU0FBQThmLG1CQUFtQkEsQ0FBQzFZLE9BQWU7TUFDeEMsT0FBT0EsT0FBTyxDQUFDb00sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDaFQsTUFBTTtJQUNuQztJQUVBOzs7OztFQUFBO0lBQUFULEdBQUE7SUFBQUMsS0FBQSxFQUtPLFNBQUErZixpQkFBaUJBLENBQUMzWSxPQUFlO01BQ3RDLElBQU1rVyxLQUFLLEdBQUdsVyxPQUFPLENBQUNvTSxLQUFLLENBQUMsSUFBSSxDQUFDO01BQ2pDLElBQU13TSxRQUFRLEdBQUcxQyxLQUFLLENBQUNBLEtBQUssQ0FBQzljLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFDeEMsT0FBT3dmLFFBQVEsR0FBR0EsUUFBUSxDQUFDeGYsTUFBTSxHQUFHLENBQUM7SUFDdkM7SUFFQTs7O0VBQUE7SUFBQVQsR0FBQTtJQUFBQyxLQUFBLEVBR08sU0FBQXNKLE9BQU9BLENBQUE7TUFDWjtNQUNBLElBQUksQ0FBQ2lSLFVBQVUsR0FBRyxJQUFXO0lBQy9CO0VBQUM7QUFBQSxJOzs7Ozs7Ozs7Ozs4Q0N6cUJILHVLQUFBM0MsQ0FBQSxFQUFBcUksQ0FBQSxFQUFBQyxDQUFBLHdCQUFBQyxNQUFBLEdBQUFBLE1BQUEsT0FBQXRYLENBQUEsR0FBQXFYLENBQUEsQ0FBQUUsUUFBQSxrQkFBQUMsQ0FBQSxHQUFBSCxDQUFBLENBQUFJLFdBQUEsOEJBQUFuTSxFQUFBK0wsQ0FBQSxFQUFBclgsQ0FBQSxFQUFBd1gsQ0FBQSxFQUFBbE0sQ0FBQSxRQUFBb00sQ0FBQSxHQUFBMVgsQ0FBQSxJQUFBQSxDQUFBLENBQUFnSixTQUFBLFlBQUEyTyxTQUFBLEdBQUEzWCxDQUFBLEdBQUEyWCxTQUFBLEVBQUFDLENBQUEsR0FBQTNPLE1BQUEsQ0FBQTRPLE1BQUEsQ0FBQUgsQ0FBQSxDQUFBMU8sU0FBQSxVQUFBOE8sdUNBQUEsQ0FBQUYsQ0FBQSx1QkFBQVAsQ0FBQSxFQUFBclgsQ0FBQSxFQUFBd1gsQ0FBQSxRQUFBbE0sQ0FBQSxFQUFBb00sQ0FBQSxFQUFBRSxDQUFBLEVBQUE1SSxDQUFBLE1BQUFqUCxDQUFBLEdBQUF5WCxDQUFBLFFBQUFyQixDQUFBLE9BQUE0QixDQUFBLEtBQUFoWSxDQUFBLEtBQUFDLENBQUEsS0FBQUcsQ0FBQSxFQUFBNE8sQ0FBQSxFQUFBN08sQ0FBQSxFQUFBOFgsQ0FBQSxFQUFBaEosQ0FBQSxFQUFBZ0osQ0FBQSxDQUFBQyxJQUFBLENBQUFsSixDQUFBLE1BQUFpSixDQUFBLFdBQUFBLEVBQUFaLENBQUEsRUFBQUMsQ0FBQSxXQUFBL0wsQ0FBQSxHQUFBOEwsQ0FBQSxFQUFBTSxDQUFBLE1BQUFFLENBQUEsR0FBQTdJLENBQUEsRUFBQWdKLENBQUEsQ0FBQS9YLENBQUEsR0FBQXFYLENBQUEsRUFBQW5YLENBQUEsZ0JBQUE4WCxFQUFBWCxDQUFBLEVBQUFyWCxDQUFBLFNBQUEwWCxDQUFBLEdBQUFMLENBQUEsRUFBQU8sQ0FBQSxHQUFBNVgsQ0FBQSxFQUFBb1gsQ0FBQSxPQUFBakIsQ0FBQSxJQUFBbkgsQ0FBQSxLQUFBd0ksQ0FBQSxJQUFBSixDQUFBLEdBQUFyWCxDQUFBLENBQUFwSSxNQUFBLEVBQUF5ZixDQUFBLFVBQUFJLENBQUEsRUFBQWxNLENBQUEsR0FBQXZMLENBQUEsQ0FBQXFYLENBQUEsR0FBQVksQ0FBQSxHQUFBRCxDQUFBLENBQUFoWSxDQUFBLEVBQUFtWSxDQUFBLEdBQUE1TSxDQUFBLEtBQUErTCxDQUFBLFFBQUFHLENBQUEsR0FBQVUsQ0FBQSxLQUFBbFksQ0FBQSxNQUFBNFgsQ0FBQSxHQUFBdE0sQ0FBQSxFQUFBb00sQ0FBQSxHQUFBcE0sQ0FBQSxZQUFBb00sQ0FBQSxXQUFBcE0sQ0FBQSxNQUFBQSxDQUFBLE1BQUF5RCxDQUFBLElBQUF6RCxDQUFBLE9BQUEwTSxDQUFBLE1BQUFSLENBQUEsR0FBQUgsQ0FBQSxRQUFBVyxDQUFBLEdBQUExTSxDQUFBLFFBQUFvTSxDQUFBLE1BQUFLLENBQUEsQ0FBQTVYLENBQUEsR0FBQUgsQ0FBQSxFQUFBK1gsQ0FBQSxDQUFBL1gsQ0FBQSxHQUFBc0wsQ0FBQSxPQUFBME0sQ0FBQSxHQUFBRSxDQUFBLEtBQUFWLENBQUEsR0FBQUgsQ0FBQSxRQUFBL0wsQ0FBQSxNQUFBdEwsQ0FBQSxJQUFBQSxDQUFBLEdBQUFrWSxDQUFBLE1BQUE1TSxDQUFBLE1BQUErTCxDQUFBLEVBQUEvTCxDQUFBLE1BQUF0TCxDQUFBLEVBQUErWCxDQUFBLENBQUEvWCxDQUFBLEdBQUFrWSxDQUFBLEVBQUFSLENBQUEsY0FBQUYsQ0FBQSxJQUFBSCxDQUFBLGFBQUFuWCxDQUFBLFFBQUFpVyxDQUFBLE9BQUFuVyxDQUFBLHFCQUFBd1gsQ0FBQSxFQUFBelgsQ0FBQSxFQUFBbVksQ0FBQSxRQUFBbEosQ0FBQSxZQUFBbUosU0FBQSx1Q0FBQWhDLENBQUEsVUFBQXBXLENBQUEsSUFBQWlZLENBQUEsQ0FBQWpZLENBQUEsRUFBQW1ZLENBQUEsR0FBQVIsQ0FBQSxHQUFBM1gsQ0FBQSxFQUFBNlgsQ0FBQSxHQUFBTSxDQUFBLEdBQUFkLENBQUEsR0FBQU0sQ0FBQSxPQUFBM0ksQ0FBQSxHQUFBNkksQ0FBQSxNQUFBekIsQ0FBQSxLQUFBN0ssQ0FBQSxLQUFBb00sQ0FBQSxHQUFBQSxDQUFBLFFBQUFBLENBQUEsU0FBQUssQ0FBQSxDQUFBL1gsQ0FBQSxRQUFBZ1ksQ0FBQSxDQUFBTixDQUFBLEVBQUFFLENBQUEsS0FBQUcsQ0FBQSxDQUFBL1gsQ0FBQSxHQUFBNFgsQ0FBQSxHQUFBRyxDQUFBLENBQUE1WCxDQUFBLEdBQUF5WCxDQUFBLGFBQUE1SSxDQUFBLE1BQUExRCxDQUFBLFFBQUFvTSxDQUFBLEtBQUFGLENBQUEsWUFBQUosQ0FBQSxHQUFBOUwsQ0FBQSxDQUFBa00sQ0FBQSxXQUFBSixDQUFBLEdBQUFBLENBQUEsQ0FBQWdCLElBQUEsQ0FBQTlNLENBQUEsRUFBQXNNLENBQUEsVUFBQU8sU0FBQSwyQ0FBQWYsQ0FBQSxDQUFBekksSUFBQSxTQUFBeUksQ0FBQSxFQUFBUSxDQUFBLEdBQUFSLENBQUEsQ0FBQWpnQixLQUFBLEVBQUF1Z0IsQ0FBQSxTQUFBQSxDQUFBLG9CQUFBQSxDQUFBLEtBQUFOLENBQUEsR0FBQTlMLENBQUEsZUFBQThMLENBQUEsQ0FBQWdCLElBQUEsQ0FBQTlNLENBQUEsR0FBQW9NLENBQUEsU0FBQUUsQ0FBQSxHQUFBTyxTQUFBLHVDQUFBWCxDQUFBLGdCQUFBRSxDQUFBLE9BQUFwTSxDQUFBLEdBQUF5RCxDQUFBLGNBQUFxSSxDQUFBLElBQUFqQixDQUFBLEdBQUE0QixDQUFBLENBQUEvWCxDQUFBLFFBQUE0WCxDQUFBLEdBQUFQLENBQUEsQ0FBQWUsSUFBQSxDQUFBcFksQ0FBQSxFQUFBK1gsQ0FBQSxPQUFBN1gsQ0FBQSxrQkFBQWtYLENBQUEsSUFBQTlMLENBQUEsR0FBQXlELENBQUEsRUFBQTJJLENBQUEsTUFBQUUsQ0FBQSxHQUFBUixDQUFBLGNBQUFwSSxDQUFBLG1CQUFBN1gsS0FBQSxFQUFBaWdCLENBQUEsRUFBQXpJLElBQUEsRUFBQXdILENBQUEsU0FBQWtCLENBQUEsRUFBQUcsQ0FBQSxFQUFBbE0sQ0FBQSxRQUFBc00sQ0FBQSxRQUFBMVgsQ0FBQSxnQkFBQXlYLFVBQUEsY0FBQVUsa0JBQUEsY0FBQUMsMkJBQUEsS0FBQWxCLENBQUEsR0FBQW5PLE1BQUEsQ0FBQXNQLGNBQUEsTUFBQWIsQ0FBQSxNQUFBMVgsQ0FBQSxJQUFBb1gsQ0FBQSxDQUFBQSxDQUFBLElBQUFwWCxDQUFBLFNBQUE4WCx1Q0FBQSxDQUFBVixDQUFBLE9BQUFwWCxDQUFBLGlDQUFBb1gsQ0FBQSxHQUFBUSxDQUFBLEdBQUFVLDBCQUFBLENBQUF0UCxTQUFBLEdBQUEyTyxTQUFBLENBQUEzTyxTQUFBLEdBQUFDLE1BQUEsQ0FBQTRPLE1BQUEsQ0FBQUgsQ0FBQSxZQUFBMUksRUFBQUQsQ0FBQSxXQUFBOUYsTUFBQSxDQUFBdVAsY0FBQSxHQUFBdlAsTUFBQSxDQUFBdVAsY0FBQSxDQUFBekosQ0FBQSxFQUFBdUosMEJBQUEsS0FBQXZKLENBQUEsQ0FBQTBKLFNBQUEsR0FBQUgsMEJBQUEsRUFBQVIsdUNBQUEsQ0FBQS9JLENBQUEsRUFBQXlJLENBQUEseUJBQUF6SSxDQUFBLENBQUEvRixTQUFBLEdBQUFDLE1BQUEsQ0FBQTRPLE1BQUEsQ0FBQUQsQ0FBQSxHQUFBN0ksQ0FBQSxXQUFBc0osaUJBQUEsQ0FBQXJQLFNBQUEsR0FBQXNQLDBCQUFBLEVBQUFSLHVDQUFBLENBQUFGLENBQUEsaUJBQUFVLDBCQUFBLEdBQUFSLHVDQUFBLENBQUFRLDBCQUFBLGlCQUFBRCxpQkFBQSxHQUFBQSxpQkFBQSxDQUFBSyxXQUFBLHdCQUFBWix1Q0FBQSxDQUFBUSwwQkFBQSxFQUFBZCxDQUFBLHdCQUFBTSx1Q0FBQSxDQUFBRixDQUFBLEdBQUFFLHVDQUFBLENBQUFGLENBQUEsRUFBQUosQ0FBQSxnQkFBQU0sdUNBQUEsQ0FBQUYsQ0FBQSxFQUFBNVgsQ0FBQSxpQ0FBQThYLHVDQUFBLENBQUFGLENBQUEsOERBQUFwWSxnQ0FBQSxZQUFBQSxhQUFBLGFBQUFLLENBQUEsRUFBQXlMLENBQUEsRUFBQTdMLENBQUEsRUFBQXVQLENBQUE7QUFBQSxTQUFBOEksdUNBQUFBLENBQUEvSSxDQUFBLEVBQUFzSSxDQUFBLEVBQUFyWCxDQUFBLEVBQUFvWCxDQUFBLFFBQUE5TCxDQUFBLEdBQUFyQyxNQUFBLENBQUFHLGNBQUEsUUFBQWtDLENBQUEsdUJBQUF5RCxDQUFBLElBQUF6RCxDQUFBLFFBQUF3TSx1Q0FBQSxZQUFBYSxtQkFBQTVKLENBQUEsRUFBQXNJLENBQUEsRUFBQXJYLENBQUEsRUFBQW9YLENBQUEsYUFBQUksRUFBQUgsQ0FBQSxFQUFBclgsQ0FBQSxJQUFBOFgsdUNBQUEsQ0FBQS9JLENBQUEsRUFBQXNJLENBQUEsWUFBQXRJLENBQUEsZ0JBQUE2SixPQUFBLENBQUF2QixDQUFBLEVBQUFyWCxDQUFBLEVBQUErTyxDQUFBLFNBQUFzSSxDQUFBLEdBQUEvTCxDQUFBLEdBQUFBLENBQUEsQ0FBQXlELENBQUEsRUFBQXNJLENBQUEsSUFBQWxnQixLQUFBLEVBQUE2SSxDQUFBLEVBQUE2WSxVQUFBLEdBQUF6QixDQUFBLEVBQUEwQixZQUFBLEdBQUExQixDQUFBLEVBQUEyQixRQUFBLEdBQUEzQixDQUFBLE1BQUFySSxDQUFBLENBQUFzSSxDQUFBLElBQUFyWCxDQUFBLElBQUF3WCxDQUFBLGFBQUFBLENBQUEsY0FBQUEsQ0FBQSxtQkFBQU0sdUNBQUEsQ0FBQS9JLENBQUEsRUFBQXNJLENBQUEsRUFBQXJYLENBQUEsRUFBQW9YLENBQUE7QUFBQSxTQUFBNEIsdUNBQUFBLENBQUFoWixDQUFBLEVBQUFvWCxDQUFBLEVBQUFySSxDQUFBLEVBQUFzSSxDQUFBLEVBQUFHLENBQUEsRUFBQXRYLENBQUEsRUFBQXdYLENBQUEsY0FBQXBNLENBQUEsR0FBQXRMLENBQUEsQ0FBQUUsQ0FBQSxFQUFBd1gsQ0FBQSxHQUFBRSxDQUFBLEdBQUF0TSxDQUFBLENBQUFuVSxLQUFBLFdBQUE2SSxDQUFBLGdCQUFBK08sQ0FBQSxDQUFBL08sQ0FBQSxLQUFBc0wsQ0FBQSxDQUFBcUQsSUFBQSxHQUFBeUksQ0FBQSxDQUFBUSxDQUFBLElBQUFoUCxPQUFBLENBQUFxUSxPQUFBLENBQUFyQixDQUFBLEVBQUE1YSxJQUFBLENBQUFxYSxDQUFBLEVBQUFHLENBQUE7QUFBQSxTQUFBalkscUNBQUFBLENBQUFTLENBQUEsNkJBQUFvWCxDQUFBLFNBQUFySSxDQUFBLEdBQUE5VyxTQUFBLGFBQUEyUSxPQUFBLFdBQUF5TyxDQUFBLEVBQUFHLENBQUEsUUFBQXRYLENBQUEsR0FBQUYsQ0FBQSxDQUFBSyxLQUFBLENBQUErVyxDQUFBLEVBQUFySSxDQUFBLFlBQUFtSyxNQUFBbFosQ0FBQSxJQUFBZ1osdUNBQUEsQ0FBQTlZLENBQUEsRUFBQW1YLENBQUEsRUFBQUcsQ0FBQSxFQUFBMEIsS0FBQSxFQUFBQyxNQUFBLFVBQUFuWixDQUFBLGNBQUFtWixPQUFBblosQ0FBQSxJQUFBZ1osdUNBQUEsQ0FBQTlZLENBQUEsRUFBQW1YLENBQUEsRUFBQUcsQ0FBQSxFQUFBMEIsS0FBQSxFQUFBQyxNQUFBLFdBQUFuWixDQUFBLEtBQUFrWixLQUFBO0FBQUEsU0FBQUUsUUFBQXJLLENBQUEsRUFBQXNJLENBQUEsUUFBQUQsQ0FBQSxHQUFBbk8sTUFBQSxDQUFBd0gsSUFBQSxDQUFBMUIsQ0FBQSxPQUFBOUYsTUFBQSxDQUFBb1EscUJBQUEsUUFBQTdCLENBQUEsR0FBQXZPLE1BQUEsQ0FBQW9RLHFCQUFBLENBQUF0SyxDQUFBLEdBQUFzSSxDQUFBLEtBQUFHLENBQUEsR0FBQUEsQ0FBQSxDQUFBOEIsTUFBQSxXQUFBakMsQ0FBQSxXQUFBcE8sTUFBQSxDQUFBc1Esd0JBQUEsQ0FBQXhLLENBQUEsRUFBQXNJLENBQUEsRUFBQXdCLFVBQUEsT0FBQXpCLENBQUEsQ0FBQTVVLElBQUEsQ0FBQW5DLEtBQUEsQ0FBQStXLENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQW9DLGNBQUF6SyxDQUFBLGFBQUFzSSxDQUFBLE1BQUFBLENBQUEsR0FBQXBmLFNBQUEsQ0FBQU4sTUFBQSxFQUFBMGYsQ0FBQSxVQUFBRCxDQUFBLFdBQUFuZixTQUFBLENBQUFvZixDQUFBLElBQUFwZixTQUFBLENBQUFvZixDQUFBLFFBQUFBLENBQUEsT0FBQStCLE9BQUEsQ0FBQW5RLE1BQUEsQ0FBQW1PLENBQUEsT0FBQXZOLE9BQUEsV0FBQXdOLENBQUEsSUFBQW9DLGVBQUEsQ0FBQTFLLENBQUEsRUFBQXNJLENBQUEsRUFBQUQsQ0FBQSxDQUFBQyxDQUFBLFNBQUFwTyxNQUFBLENBQUF5USx5QkFBQSxHQUFBelEsTUFBQSxDQUFBMFEsZ0JBQUEsQ0FBQTVLLENBQUEsRUFBQTlGLE1BQUEsQ0FBQXlRLHlCQUFBLENBQUF0QyxDQUFBLEtBQUFnQyxPQUFBLENBQUFuUSxNQUFBLENBQUFtTyxDQUFBLEdBQUF2TixPQUFBLFdBQUF3TixDQUFBLElBQUFwTyxNQUFBLENBQUFHLGNBQUEsQ0FBQTJGLENBQUEsRUFBQXNJLENBQUEsRUFBQXBPLE1BQUEsQ0FBQXNRLHdCQUFBLENBQUFuQyxDQUFBLEVBQUFDLENBQUEsaUJBQUF0SSxDQUFBO0FBQUEsU0FBQTBLLGdCQUFBMUssQ0FBQSxFQUFBc0ksQ0FBQSxFQUFBRCxDQUFBLFlBQUFDLENBQUEsR0FBQXVDLGtDQUFBLENBQUF2QyxDQUFBLE1BQUF0SSxDQUFBLEdBQUE5RixNQUFBLENBQUFHLGNBQUEsQ0FBQTJGLENBQUEsRUFBQXNJLENBQUEsSUFBQWxnQixLQUFBLEVBQUFpZ0IsQ0FBQSxFQUFBeUIsVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsVUFBQWhLLENBQUEsQ0FBQXNJLENBQUEsSUFBQUQsQ0FBQSxFQUFBckksQ0FBQTtBQUFBLFNBQUEvWCxtQ0FBQUEsQ0FBQWtKLENBQUEsRUFBQUYsQ0FBQSxVQUFBRSxDQUFBLFlBQUFGLENBQUEsYUFBQW1ZLFNBQUE7QUFBQSxTQUFBMEIscUNBQUFBLENBQUE5SyxDQUFBLEVBQUFzSSxDQUFBLGFBQUFELENBQUEsTUFBQUEsQ0FBQSxHQUFBQyxDQUFBLENBQUExZixNQUFBLEVBQUF5ZixDQUFBLFVBQUFJLENBQUEsR0FBQUgsQ0FBQSxDQUFBRCxDQUFBLEdBQUFJLENBQUEsQ0FBQXFCLFVBQUEsR0FBQXJCLENBQUEsQ0FBQXFCLFVBQUEsUUFBQXJCLENBQUEsQ0FBQXNCLFlBQUEsa0JBQUF0QixDQUFBLEtBQUFBLENBQUEsQ0FBQXVCLFFBQUEsUUFBQTlQLE1BQUEsQ0FBQUcsY0FBQSxDQUFBMkYsQ0FBQSxFQUFBNkssa0NBQUEsQ0FBQXBDLENBQUEsQ0FBQXRnQixHQUFBLEdBQUFzZ0IsQ0FBQTtBQUFBLFNBQUF2Z0IsZ0NBQUFBLENBQUE4WCxDQUFBLEVBQUFzSSxDQUFBLEVBQUFELENBQUEsV0FBQUMsQ0FBQSxJQUFBd0MscUNBQUEsQ0FBQTlLLENBQUEsQ0FBQS9GLFNBQUEsRUFBQXFPLENBQUEsR0FBQUQsQ0FBQSxJQUFBeUMscUNBQUEsQ0FBQTlLLENBQUEsRUFBQXFJLENBQUEsR0FBQW5PLE1BQUEsQ0FBQUcsY0FBQSxDQUFBMkYsQ0FBQSxpQkFBQWdLLFFBQUEsU0FBQWhLLENBQUE7QUFBQSxTQUFBNkssa0NBQUFBLENBQUF4QyxDQUFBLFFBQUE5TCxDQUFBLEdBQUF3TyxnQ0FBQSxDQUFBMUMsQ0FBQSxnQ0FBQTJDLDJCQUFBLENBQUF6TyxDQUFBLElBQUFBLENBQUEsR0FBQUEsQ0FBQTtBQUFBLFNBQUF3TyxnQ0FBQUEsQ0FBQTFDLENBQUEsRUFBQUMsQ0FBQSxvQkFBQTBDLDJCQUFBLENBQUEzQyxDQUFBLE1BQUFBLENBQUEsU0FBQUEsQ0FBQSxNQUFBckksQ0FBQSxHQUFBcUksQ0FBQSxDQUFBRSxNQUFBLENBQUEwQyxXQUFBLGtCQUFBakwsQ0FBQSxRQUFBekQsQ0FBQSxHQUFBeUQsQ0FBQSxDQUFBcUosSUFBQSxDQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLGdDQUFBMEMsMkJBQUEsQ0FBQXpPLENBQUEsVUFBQUEsQ0FBQSxZQUFBNk0sU0FBQSx5RUFBQWQsQ0FBQSxHQUFBdkksTUFBQSxHQUFBbUwsTUFBQSxFQUFBN0MsQ0FBQTtBQUR3QztBQUNJO0FBQ1c7QUFDRjtBQUNHO0FBQ0Q7QUFxRXZEO0FBQUEsSUFDTWlELGtCQUFrQjtFQUF4QixTQUFBQSxtQkFBQTtJQUFBcmpCLG1DQUFBLE9BQUFxakIsa0JBQUE7SUFDVSxLQUFBQyxPQUFPLEdBQWlCLEVBQUU7SUFDMUIsS0FBQUMsY0FBYyxHQUFXLENBQUM7SUFDMUIsS0FBQUMsVUFBVSxHQUFXLENBQUM7SUFDdEIsS0FBQUMsU0FBUyxHQUFnQyxFQUFFO0lBQzNDLEtBQUFDLE9BQU8sR0FBVyxFQUFFO0lBQ3JCLEtBQUFyVCxVQUFVLEdBQXVCLElBQUk7SUFDcEMsS0FBQXNULE1BQU0sR0FBVyxFQUFFO0VBb3dCN0I7RUFsd0JFO0VBQUEsT0FBQTFqQixnQ0FBQSxDQUFBb2pCLGtCQUFBO0lBQUFuakIsR0FBQTtJQUFBQyxLQUFBLEVBQ08sU0FBQXlqQixZQUFZQSxDQUFDSCxTQUFzQztNQUN4RCxJQUFJLENBQUNBLFNBQVMsR0FBQWpCLGFBQUEsQ0FBQUEsYUFBQSxLQUFRLElBQUksQ0FBQ2lCLFNBQVMsR0FBS0EsU0FBUyxDQUFFO0lBQ3REO0lBRUE7RUFBQTtJQUFBdmpCLEdBQUE7SUFBQUMsS0FBQSxFQUNPLFNBQUEwakIsVUFBVUEsQ0FBQ0gsT0FBZTtNQUMvQixJQUFJLENBQUNBLE9BQU8sR0FBR0EsT0FBTztJQUN4QjtJQUVBO0VBQUE7SUFBQXhqQixHQUFBO0lBQUFDLEtBQUEsRUFDTyxTQUFBMmpCLFNBQVNBLENBQUNILE1BQWM7TUFDN0IsSUFBSSxDQUFDQSxNQUFNLEdBQUdBLE1BQU07SUFDdEI7RUFBQztJQUFBempCLEdBQUE7SUFBQUMsS0FBQSxFQUVNLFNBQUE0akIsWUFBWUEsQ0FBQ2hqQixTQUFpQjtNQUNuQyxJQUFJLElBQUksQ0FBQ3NQLFVBQVUsSUFBSSxJQUFJLEVBQUU7UUFDM0IsSUFBSSxDQUFDQSxVQUFVLEdBQUcsSUFBSXZQLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO1FBQzNDLElBQUksQ0FBQ2lqQix1QkFBdUIsRUFBRTtRQUM5QixJQUFJLENBQUMzVCxVQUFVLENBQUNyTCxPQUFPLENBQUMsS0FBSyxDQUFDO01BQ2hDO0lBQ0Y7SUFFQTtFQUFBO0lBQUE5RSxHQUFBO0lBQUFDLEtBQUEsRUFDUSxTQUFBNmpCLHVCQUF1QkEsQ0FBQTtNQUFBLElBQUE5ZSxLQUFBO01BQzdCLElBQUksQ0FBQyxJQUFJLENBQUNtTCxVQUFVLEVBQUU7TUFFdEI7TUFDQSxJQUFJLENBQUNBLFVBQVUsQ0FBQ3RNLGNBQWMsQ0FBQyxVQUFDZ0MsSUFBbUIsRUFBSTtRQUNyRC9DLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHNCQUFzQixFQUFFZ0QsSUFBSSxDQUFDO1FBQ3pDYixLQUFJLENBQUMrZSxlQUFlLENBQUNsZSxJQUFJLENBQUM7TUFDNUIsQ0FBQyxDQUFDO01BRUY7TUFDQSxJQUFJLENBQUNzSyxVQUFVLENBQUNyTSxpQkFBaUIsQ0FBQyxVQUFDK0IsSUFBc0IsRUFBSTtRQUMzRC9DLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHlCQUF5QixFQUFFZ0QsSUFBSSxDQUFDO1FBQzVDYixLQUFJLENBQUNnZixrQkFBa0IsQ0FBQ25lLElBQUksQ0FBQztNQUMvQixDQUFDLENBQUM7TUFFRjtNQUNBLElBQUksQ0FBQ3NLLFVBQVUsQ0FBQ2hNLGlCQUFpQixDQUFDLFVBQUMwQixJQUFzQixFQUFJO1FBQzNEL0MsT0FBTyxDQUFDRCxHQUFHLENBQUMseUJBQXlCLEVBQUVnRCxJQUFJLENBQUM7UUFDNUNiLEtBQUksQ0FBQ2lmLGtCQUFrQixDQUFDcGUsSUFBSSxDQUFDO01BQy9CLENBQUMsQ0FBQztNQUVGO01BQ0EsSUFBSSxDQUFDc0ssVUFBVSxDQUFDL0wsaUJBQWlCLENBQUMsVUFBQ3lCLElBQXNCLEVBQUk7UUFDM0QvQyxPQUFPLENBQUNELEdBQUcsQ0FBQyx5QkFBeUIsRUFBRWdELElBQUksQ0FBQztRQUM1Q2IsS0FBSSxDQUFDa2Ysa0JBQWtCLENBQUNyZSxJQUFJLENBQUM7TUFDL0IsQ0FBQyxDQUFDO01BRUY7TUFDQSxJQUFJLENBQUNzSyxVQUFVLENBQUM5TSxnQkFBZ0IsQ0FBQyxVQUFDd0MsSUFBcUIsRUFBSTtRQUN6RC9DLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHdCQUF3QixFQUFFZ0QsSUFBSSxDQUFDO1FBQzNDYixLQUFJLENBQUNtZixpQkFBaUIsQ0FBQ3RlLElBQUksQ0FBQztNQUM5QixDQUFDLENBQUM7SUFDSjtJQUVBO0VBQUE7SUFBQTdGLEdBQUE7SUFBQUMsS0FBQSxFQUNRLFNBQUE4akIsZUFBZUEsQ0FBQ2xlLElBQW1CO01BQUEsSUFBQXVlLHFCQUFBLEVBQUFDLGVBQUE7TUFDekM7TUFDQSxJQUFNQyxjQUFjLEdBQUcsSUFBSSxDQUFDbEIsT0FBTyxDQUFDbUIsSUFBSSxDQUFDLFVBQUFDLE1BQU07UUFBQSxPQUFJQSxNQUFNLENBQUM5YyxRQUFRLEtBQUs3QixJQUFJLENBQUM2QixRQUFRO01BQUEsRUFBQztNQUNyRixJQUFJNGMsY0FBYyxFQUFFO1FBQ2xCeGhCLE9BQU8sQ0FBQ0QsR0FBRyxXQUFBOEIsTUFBQSxDQUFXa0IsSUFBSSxDQUFDNkIsUUFBUSxxQ0FBa0MsQ0FBQztRQUN0RSxJQUFJLENBQUMrYyxrQkFBa0IsQ0FBQzVlLElBQUksQ0FBQzZCLFFBQVEsRUFBRSxXQUFXLENBQUM7UUFDbkQ7TUFDRjtNQUVBO01BQ0EsSUFBTWdkLFNBQVMsR0FBZTtRQUM1QmhkLFFBQVEsRUFBRTdCLElBQUksQ0FBQzZCLFFBQVE7UUFDdkJULElBQUksRUFBRXBCLElBQUksQ0FBQ29CLElBQUk7UUFDZndJLElBQUksRUFBRTVKLElBQUksQ0FBQ2QsVUFBVTtRQUNyQkEsVUFBVSxFQUFFYyxJQUFJLENBQUNkLFVBQVU7UUFDM0I0ZixRQUFRLEVBQUUsRUFBRTtRQUNaQyxVQUFVLEVBQUUsS0FBSztRQUNqQkMsUUFBUSxFQUFFLEtBQUs7UUFDZnRQLE1BQU0sRUFBRTtPQUNUO01BRUQ7TUFDQSxJQUFJLENBQUM2TixPQUFPLENBQUM5WCxJQUFJLENBQUNvWixTQUFTLENBQUM7TUFFNUI7TUFDQSxDQUFBTixxQkFBQSxJQUFBQyxlQUFBLE9BQUksQ0FBQ2QsU0FBUyxFQUFDL2dCLFdBQVcsY0FBQTRoQixxQkFBQSxlQUExQkEscUJBQUEsQ0FBQWxELElBQUEsQ0FBQW1ELGVBQUEsRUFBNkJLLFNBQVMsQ0FBQztNQUV2QzVoQixPQUFPLENBQUNELEdBQUcsc0JBQUE4QixNQUFBLENBQXNCa0IsSUFBSSxDQUFDNkIsUUFBUSxRQUFBL0MsTUFBQSxDQUFLa0IsSUFBSSxDQUFDb0IsSUFBSSxNQUFHLENBQUM7SUFDbEU7SUFFQTtFQUFBO0lBQUFqSCxHQUFBO0lBQUFDLEtBQUEsRUFDUSxTQUFBK2pCLGtCQUFrQkEsQ0FBQ25lLElBQXNCO01BQUEsSUFBQU4sTUFBQTtRQUFBdWYscUJBQUE7UUFBQUMsZ0JBQUE7TUFDL0M7TUFDQSxJQUFNQyxjQUFjLEdBQUcsSUFBSSxDQUFDNUIsT0FBTyxDQUFDbUIsSUFBSSxDQUFDLFVBQUFDLE1BQU07UUFBQSxPQUFJQSxNQUFNLENBQUM5YyxRQUFRLEtBQUs3QixJQUFJLENBQUM2QixRQUFRO01BQUEsRUFBQztNQUNyRixJQUFJLENBQUNzZCxjQUFjLEVBQUU7UUFDbkJsaUIsT0FBTyxDQUFDRCxHQUFHLFdBQUE4QixNQUFBLENBQVdrQixJQUFJLENBQUM2QixRQUFRLDRCQUF5QixDQUFDO1FBQzdEO01BQ0Y7TUFFQTtNQUNBc2QsY0FBYyxDQUFDTCxRQUFRLENBQUNoUyxPQUFPLENBQUMsVUFBQXNTLE9BQU8sRUFBRztRQUN4QzFmLE1BQUksQ0FBQzJmLFlBQVksQ0FBQ0YsY0FBYyxDQUFDdGQsUUFBUSxFQUFFdWQsT0FBTyxDQUFDcGYsSUFBSSxDQUFDL0UsU0FBUyxDQUFDO01BQ3BFLENBQUMsQ0FBQztNQUVGO01BQ0EsSUFBTXFrQixXQUFXLEdBQUcsSUFBSSxDQUFDL0IsT0FBTyxDQUFDZ0MsU0FBUyxDQUFDLFVBQUFaLE1BQU07UUFBQSxPQUFJQSxNQUFNLENBQUM5YyxRQUFRLEtBQUs3QixJQUFJLENBQUM2QixRQUFRO01BQUEsRUFBQztNQUN2RixJQUFJeWQsV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ3RCLElBQUksQ0FBQy9CLE9BQU8sQ0FBQ2lDLE1BQU0sQ0FBQ0YsV0FBVyxFQUFFLENBQUMsQ0FBQztNQUNyQztNQUVBO01BQ0EsQ0FBQUwscUJBQUEsSUFBQUMsZ0JBQUEsT0FBSSxDQUFDeEIsU0FBUyxFQUFDK0IsZUFBZSxjQUFBUixxQkFBQSxlQUE5QkEscUJBQUEsQ0FBQTVELElBQUEsQ0FBQTZELGdCQUFBLEVBQWlDbGYsSUFBSSxDQUFDNkIsUUFBUSxDQUFDO01BRS9DNUUsT0FBTyxDQUFDRCxHQUFHLG9CQUFBOEIsTUFBQSxDQUFvQmtCLElBQUksQ0FBQzZCLFFBQVEsUUFBQS9DLE1BQUEsQ0FBS2tCLElBQUksQ0FBQ29CLElBQUksTUFBRyxDQUFDO0lBQ2hFO0lBRUE7RUFBQTtJQUFBakgsR0FBQTtJQUFBQyxLQUFBLEVBQ1EsU0FBQWdrQixrQkFBa0JBLENBQUNwZSxJQUFzQjtNQUMvQyxJQUFRNkIsUUFBUSxHQUFnQjdCLElBQUksQ0FBNUI2QixRQUFRO1FBQUU1RyxTQUFTLEdBQUsrRSxJQUFJLENBQWxCL0UsU0FBUztNQUUzQmdDLE9BQU8sQ0FBQ0QsR0FBRyxxQ0FBQThCLE1BQUEsQ0FBcUMrQyxRQUFRLGtCQUFBL0MsTUFBQSxDQUFlN0QsU0FBUyxDQUFFLENBQUM7TUFFbkY7TUFDQSxJQUFNMGpCLE1BQU0sR0FBRyxJQUFJLENBQUNwQixPQUFPLENBQUNtQixJQUFJLENBQUMsVUFBQS9ELENBQUM7UUFBQSxPQUFJQSxDQUFDLENBQUM5WSxRQUFRLEtBQUtBLFFBQVE7TUFBQSxFQUFDO01BQzlELElBQUksQ0FBQzhjLE1BQU0sRUFBRTtRQUNYMWhCLE9BQU8sQ0FBQ0QsR0FBRyxXQUFBOEIsTUFBQSxDQUFXK0MsUUFBUSxtQ0FBZ0MsQ0FBQztRQUMvRDtNQUNGO01BRUE7TUFDQSxJQUFNdWQsT0FBTyxHQUFHVCxNQUFNLENBQUNHLFFBQVEsQ0FBQ0osSUFBSSxDQUFDLFVBQUEvTSxDQUFDO1FBQUEsT0FBSUEsQ0FBQyxDQUFDM1IsSUFBSSxDQUFDL0UsU0FBUyxLQUFLQSxTQUFTO01BQUEsRUFBQztNQUN6RSxJQUFJLENBQUNta0IsT0FBTyxFQUFFO1FBQ1puaUIsT0FBTyxDQUFDRCxHQUFHLFlBQUE4QixNQUFBLENBQVk3RCxTQUFTLDJCQUFBNkQsTUFBQSxDQUF3QitDLFFBQVEsQ0FBRSxDQUFDO1FBQ25FO01BQ0Y7TUFFQTtNQUNBNUUsT0FBTyxDQUFDRCxHQUFHLG9CQUFBOEIsTUFBQSxDQUFvQnNnQixPQUFPLENBQUNwZixJQUFJLENBQUMvRSxTQUFTLFFBQUE2RCxNQUFBLENBQUs3RCxTQUFTLG1CQUFBNkQsTUFBQSxDQUFnQitDLFFBQVEsQ0FBRSxDQUFDO01BQzlGLElBQUksQ0FBQ3dkLFlBQVksQ0FBQ1YsTUFBTSxDQUFDOWMsUUFBUSxFQUFFdWQsT0FBTyxDQUFDcGYsSUFBSSxDQUFDL0UsU0FBUyxDQUFDO0lBQzVEO0lBRUE7RUFBQTtJQUFBZCxHQUFBO0lBQUFDLEtBQUEsRUFDUSxTQUFBaWtCLGtCQUFrQkEsQ0FBQ3JlLElBQXNCO01BQy9DLElBQVE2QixRQUFRLEdBQWE3QixJQUFJLENBQXpCNkIsUUFBUTtRQUFFNk4sTUFBTSxHQUFLMVAsSUFBSSxDQUFmMFAsTUFBTTtNQUV4QnpTLE9BQU8sQ0FBQ0QsR0FBRyw0Q0FBQThCLE1BQUEsQ0FBNEMrQyxRQUFRLGVBQUEvQyxNQUFBLENBQVk0USxNQUFNLENBQUUsQ0FBQztNQUVwRjtNQUNBLElBQUksQ0FBQ2tQLGtCQUFrQixDQUFDL2MsUUFBUSxFQUFFNk4sTUFBTSxDQUFDO0lBQzNDO0lBRUE7RUFBQTtJQUFBdlYsR0FBQTtJQUFBQyxLQUFBLEVBQ1EsU0FBQWtrQixpQkFBaUJBLENBQUN0ZSxJQUFxQjtNQUFBLElBQUEwZixxQkFBQSxFQUFBQyxnQkFBQTtNQUM3QyxJQUFRMWtCLFNBQVMsR0FBd0IrRSxJQUFJLENBQXJDL0UsU0FBUztRQUFFdUcsT0FBTyxHQUFleEIsSUFBSSxDQUExQndCLE9BQU87UUFBRWlTLFFBQVEsR0FBS3pULElBQUksQ0FBakJ5VCxRQUFRO01BRXBDeFcsT0FBTyxDQUFDRCxHQUFHLHFDQUFBOEIsTUFBQSxDQUFxQzdELFNBQVMsZ0JBQUE2RCxNQUFBLENBQWEwQyxPQUFPLGlCQUFBMUMsTUFBQSxDQUFjMlUsUUFBUSxDQUFFLENBQUM7TUFFdEc7TUFDQSxJQUFNbU0sYUFBYSxHQUFHLElBQUksQ0FBQ0MsZ0JBQWdCLEVBQUU7TUFDN0MsSUFBSSxDQUFDRCxhQUFhLElBQUlBLGFBQWEsQ0FBQzVmLElBQUksQ0FBQy9FLFNBQVMsS0FBS0EsU0FBUyxFQUFFO1FBQ2hFZ0MsT0FBTyxDQUFDRCxHQUFHLGdEQUFBOEIsTUFBQSxDQUFnRDdELFNBQVMsQ0FBRSxDQUFDO1FBQ3ZFO01BQ0Y7TUFFQTtNQUNBLENBQUF5a0IscUJBQUEsSUFBQUMsZ0JBQUEsT0FBSSxDQUFDakMsU0FBUyxFQUFDdGhCLGFBQWEsY0FBQXNqQixxQkFBQSxlQUE1QkEscUJBQUEsQ0FBQXJFLElBQUEsQ0FBQXNFLGdCQUFBLEVBQStCMWtCLFNBQVMsRUFBRXVHLE9BQU8sRUFBRWlTLFFBQVEsQ0FBQztJQUM5RDtJQUVBO0VBQUE7SUFBQXRaLEdBQUE7SUFBQUMsS0FBQTtNQUFBLElBQUEwbEIsV0FBQSxHQUFBdGQscUNBQUEsY0FBQUMsZ0NBQUEsR0FBQUMsQ0FBQSxDQUNRLFNBQUFDLFFBQUE7UUFBQSxJQUFBNkssR0FBQSxFQUFBMkIsUUFBQSxFQUFBblAsSUFBQSxFQUFBK2YsY0FBQSxFQUFBbmQsRUFBQTtRQUFBLE9BQUFILGdDQUFBLEdBQUFLLENBQUEsV0FBQUMsUUFBQTtVQUFBLGtCQUFBQSxRQUFBLENBQUFDLENBQUEsR0FBQUQsUUFBQSxDQUFBRSxDQUFBO1lBQUE7Y0FBQUYsUUFBQSxDQUFBQyxDQUFBO2NBRUo7Y0FDTXdLLEdBQUcsTUFBQTFPLE1BQUEsQ0FBTSxJQUFJLENBQUM2ZSxPQUFPLHNCQUFBN2UsTUFBQSxDQUFtQixJQUFJLENBQUM4ZSxNQUFNLGNBQUE5ZSxNQUFBLENBQWMsSUFBSSxDQUFDOGUsTUFBTSxJQUFLLEVBQUU7Y0FDekYzZ0IsT0FBTyxDQUFDRCxHQUFHLDJCQUFBOEIsTUFBQSxDQUEyQjBPLEdBQUcsQ0FBRSxDQUFDO2NBQUN6SyxRQUFBLENBQUFFLENBQUE7Y0FBQSxPQUN0QjJJLEtBQUssQ0FBQzRCLEdBQUcsQ0FBQztZQUFBO2NBQTNCMkIsUUFBUSxHQUFBcE0sUUFBQSxDQUFBSyxDQUFBO2NBQUEsSUFFVCtMLFFBQVEsQ0FBQzZRLEVBQUU7Z0JBQUFqZCxRQUFBLENBQUFFLENBQUE7Z0JBQUE7Y0FBQTtjQUNkaEcsT0FBTyxDQUFDQyxLQUFLLHdCQUFBNEIsTUFBQSxDQUF3QnFRLFFBQVEsQ0FBQ08sTUFBTSxPQUFBNVEsTUFBQSxDQUFJcVEsUUFBUSxDQUFDUSxVQUFVLENBQUUsQ0FBQztjQUFDLE9BQUE1TSxRQUFBLENBQUFJLENBQUEsSUFDeEUsRUFBRTtZQUFBO2NBQUFKLFFBQUEsQ0FBQUUsQ0FBQTtjQUFBLE9BR3FCa00sUUFBUSxDQUFDVSxJQUFJLEVBQUU7WUFBQTtjQUF6QzdQLElBQUksR0FBQStDLFFBQUEsQ0FBQUssQ0FBQTtjQUVWO2NBQ0FuRyxPQUFPLENBQUNELEdBQUcsQ0FBQyxlQUFlLEVBQUVnRCxJQUFJLENBQUM7Y0FDbEMvQyxPQUFPLENBQUNELEdBQUcsQ0FBQyxtQkFBbUIsRUFBRWdELElBQUksQ0FBQ3VkLE9BQU8sQ0FBQztjQUU5QyxJQUFJdmQsSUFBSSxDQUFDdWQsT0FBTyxJQUFJdmQsSUFBSSxDQUFDdWQsT0FBTyxDQUFDM2lCLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzNDcUMsT0FBTyxDQUFDRCxHQUFHLENBQUMsb0JBQW9CLEVBQUVnRCxJQUFJLENBQUN1ZCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xEdGdCLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHdCQUF3QixHQUFBK2lCLGNBQUEsR0FBRS9mLElBQUksQ0FBQ3VkLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBQXdDLGNBQUEsdUJBQWZBLGNBQUEsQ0FBaUJqQixRQUFRLENBQUM7Y0FDbEUsQ0FBQyxNQUFNO2dCQUNMN2hCLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLDhCQUE4QixDQUFDO2NBQzdDO2NBQUMsT0FBQStGLFFBQUEsQ0FBQUksQ0FBQSxJQUVNbkQsSUFBSSxDQUFDdWQsT0FBTyxJQUFJLEVBQUU7WUFBQTtjQUFBeGEsUUFBQSxDQUFBQyxDQUFBO2NBQUFKLEVBQUEsR0FBQUcsUUFBQSxDQUFBSyxDQUFBO2NBRXpCbkcsT0FBTyxDQUFDQyxLQUFLLENBQUMseUJBQXlCLEVBQUEwRixFQUFPLENBQUM7Y0FBQyxPQUFBRyxRQUFBLENBQUFJLENBQUEsSUFDekMsRUFBRTtVQUFBO1FBQUEsR0FBQVIsT0FBQTtNQUFBLENBRVo7TUFBQSxTQTlCYXNkLFVBQVVBLENBQUE7UUFBQSxPQUFBSCxXQUFBLENBQUF4YyxLQUFBLE9BQUFwSSxTQUFBO01BQUE7TUFBQSxPQUFWK2tCLFVBQVU7SUFBQSxJQWdDeEI7RUFBQTtJQUFBOWxCLEdBQUE7SUFBQUMsS0FBQTtNQUFBLElBQUE4bEIsZUFBQSxHQUFBMWQscUNBQUEsY0FBQUMsZ0NBQUEsR0FBQUMsQ0FBQSxDQUNPLFNBQUEwQyxTQUFBO1FBQUEsSUFBQTFFLE1BQUE7UUFBQSxJQUFBeWYsY0FBQSxFQUFBQyxnQkFBQSxFQUFBQyxlQUFBLEVBQUFDLGlCQUFBLEVBQUFqUCxTQUFBLEVBQUFDLEtBQUEsRUFBQWlQLEtBQUEsRUFBQTFkLEdBQUE7UUFBQSxPQUFBSixnQ0FBQSxHQUFBSyxDQUFBLFdBQUEyUixTQUFBO1VBQUEsa0JBQUFBLFNBQUEsQ0FBQXpSLENBQUEsR0FBQXlSLFNBQUEsQ0FBQXhSLENBQUE7WUFBQTtjQUFBd1IsU0FBQSxDQUFBeFIsQ0FBQTtjQUFBLE9BQ3dCLElBQUksQ0FBQ2dkLFVBQVUsRUFBRTtZQUFBO2NBQXhDRSxjQUFjLEdBQUExTCxTQUFBLENBQUFyUixDQUFBO2NBQ2RnZCxnQkFBZ0IsR0FBR0QsY0FBYyxDQUFDcFAsR0FBRyxDQUFDLFVBQUE0SixDQUFDO2dCQUFBLE9BQUlBLENBQUMsQ0FBQzlZLFFBQVE7Y0FBQSxFQUFDO2NBQ3REd2UsZUFBZSxHQUFHLElBQUksQ0FBQzlDLE9BQU87Y0FDOUIrQyxpQkFBaUIsR0FBR0QsZUFBZSxDQUFDdFAsR0FBRyxDQUFDLFVBQUE0SixDQUFDO2dCQUFBLE9BQUlBLENBQUMsQ0FBQzlZLFFBQVE7Y0FBQSxFQUFDLENBQUMwYSxNQUFNLENBQUNpRSxPQUFPLENBQUMsRUFFOUU7Y0FBQW5QLFNBQUEsR0FBQUssOENBQUEsQ0FDcUJ5TyxjQUFjO2NBQUExTCxTQUFBLENBQUF6UixDQUFBO2NBQUF1ZCxLQUFBLGdCQUFBOWQsZ0NBQUEsR0FBQUMsQ0FBQSxVQUFBNmQsTUFBQTtnQkFBQSxJQUFBNUIsTUFBQSxFQUFBOEIscUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsVUFBQSxFQUFBQyxVQUFBLEVBQUFDLE1BQUEsRUFBQUMsV0FBQSxFQUFBQyxTQUFBO2dCQUFBLE9BQUF0ZSxnQ0FBQSxHQUFBSyxDQUFBLFdBQUF3QyxTQUFBO2tCQUFBLGtCQUFBQSxTQUFBLENBQUFyQyxDQUFBO29CQUFBO3NCQUF4QjBiLE1BQU0sR0FBQXJOLEtBQUEsQ0FBQWxYLEtBQUE7c0JBQ2YsSUFBSSxDQUFDa21CLGlCQUFpQixDQUFDdlUsUUFBUSxDQUFDNFMsTUFBTSxDQUFDOWMsUUFBUSxDQUFDLEVBQUU7d0JBQ2hENUUsT0FBTyxDQUFDRCxHQUFHLHlCQUFBOEIsTUFBQSxDQUF5QjZmLE1BQU0sQ0FBQzljLFFBQVEsUUFBQS9DLE1BQUEsQ0FBSzZmLE1BQU0sQ0FBQ3ZkLElBQUksTUFBRyxDQUFDO3dCQUNuRXVmLFVBQVUsR0FBR2pnQixNQUFJLENBQUNzZ0IsWUFBWSxDQUFDckMsTUFBTSxDQUFDOWMsUUFBUSxFQUFFOGMsTUFBTSxDQUFDdmQsSUFBSSxFQUFFdWQsTUFBTSxDQUFDemYsVUFBVSxDQUFDLEVBR25GO3dCQUNBLENBQUF1aEIscUJBQUEsSUFBQUMsaUJBQUEsR0FBQWhnQixNQUFJLENBQUNnZCxTQUFTLEVBQUMvZ0IsV0FBVyxjQUFBOGpCLHFCQUFBLGVBQTFCQSxxQkFBQSxDQUFBcEYsSUFBQSxDQUFBcUYsaUJBQUEsRUFBNkJDLFVBQVUsQ0FBQzt3QkFDeEM7d0JBQ0EsSUFBSWhDLE1BQU0sQ0FBQ0csUUFBUSxJQUFJSCxNQUFNLENBQUNHLFFBQVEsQ0FBQ2xrQixNQUFNLEdBQUcsQ0FBQyxFQUFFOzBCQUNqRHFDLE9BQU8sQ0FBQ0QsR0FBRyxhQUFBOEIsTUFBQSxDQUFhNmYsTUFBTSxDQUFDRyxRQUFRLENBQUNsa0IsTUFBTSwyQkFBQWtFLE1BQUEsQ0FBd0I2ZixNQUFNLENBQUM5YyxRQUFRLENBQUUsQ0FBQzswQkFBQytlLFVBQUEsR0FBQWxQLDhDQUFBLENBQy9EaU4sTUFBTSxDQUFDRyxRQUFROzBCQUFBOzRCQUF6QyxLQUFBOEIsVUFBQSxDQUFBalAsQ0FBQSxNQUFBa1AsTUFBQSxHQUFBRCxVQUFBLENBQUEzZCxDQUFBLElBQUEyTyxJQUFBLEdBQTJDOzhCQUFoQ2tQLFdBQVcsR0FBQUQsTUFBQSxDQUFBem1CLEtBQUE7OEJBQ2QybUIsU0FBUyxHQUFHcmdCLE1BQUksQ0FBQzZjLE9BQU8sQ0FBQ21CLElBQUksQ0FBQyxVQUFBckUsQ0FBQztnQ0FBQSxPQUFJQSxDQUFDLENBQUN4WSxRQUFRLEtBQUs4YyxNQUFNLENBQUM5YyxRQUFROzhCQUFBLEVBQUM7OEJBQ3hFLElBQUlrZixTQUFTLEVBQUU7Z0NBQ2JyZ0IsTUFBSSxDQUFDdWdCLHVCQUF1QixDQUFDTixVQUFVLENBQUM5ZSxRQUFRLEVBQUVpZixXQUFXLENBQUNubUIsRUFBRSxFQUFFbW1CLFdBQVcsQ0FBQzFmLElBQUksQ0FBQzs4QkFDckY7NEJBQ0Y7MEJBQUMsU0FBQThmLEdBQUE7NEJBQUFOLFVBQUEsQ0FBQTVPLENBQUEsQ0FBQWtQLEdBQUE7MEJBQUE7NEJBQUFOLFVBQUEsQ0FBQTNPLENBQUE7MEJBQUE7d0JBQ0g7c0JBQ0Y7b0JBQUM7c0JBQUEsT0FBQTNNLFNBQUEsQ0FBQW5DLENBQUE7a0JBQUE7Z0JBQUEsR0FBQW9kLEtBQUE7Y0FBQTtjQUFBbFAsU0FBQSxDQUFBTSxDQUFBO1lBQUE7Y0FBQSxLQUFBTCxLQUFBLEdBQUFELFNBQUEsQ0FBQXBPLENBQUEsSUFBQTJPLElBQUE7Z0JBQUE2QyxTQUFBLENBQUF4UixDQUFBO2dCQUFBO2NBQUE7Y0FBQSxPQUFBd1IsU0FBQSxDQUFBd0csQ0FBQSxDQUFBa0csa0JBQUEsQ0FBQVosS0FBQTtZQUFBO2NBQUE5TCxTQUFBLENBQUF4UixDQUFBO2NBQUE7WUFBQTtjQUFBd1IsU0FBQSxDQUFBeFIsQ0FBQTtjQUFBO1lBQUE7Y0FBQXdSLFNBQUEsQ0FBQXpSLENBQUE7Y0FBQUgsR0FBQSxHQUFBNFIsU0FBQSxDQUFBclIsQ0FBQTtjQUFBaU8sU0FBQSxDQUFBVyxDQUFBLENBQUFuUCxHQUFBO1lBQUE7Y0FBQTRSLFNBQUEsQ0FBQXpSLENBQUE7Y0FBQXFPLFNBQUEsQ0FBQVksQ0FBQTtjQUFBLE9BQUF3QyxTQUFBLENBQUF4QyxDQUFBO1lBQUE7Y0FFSDtjQUNBb08sZUFBZSxDQUFDdlQsT0FBTyxDQUFDLFVBQUM2UixNQUFpQixFQUFJO2dCQUM1QyxJQUFJQSxNQUFNLENBQUM5YyxRQUFRLElBQUksQ0FBQ3VlLGdCQUFnQixDQUFDclUsUUFBUSxDQUFDNFMsTUFBTSxDQUFDOWMsUUFBUSxDQUFDLEVBQUU7a0JBQUEsSUFBQXVmLHFCQUFBLEVBQUFDLGdCQUFBO2tCQUNsRXBrQixPQUFPLENBQUNELEdBQUcscUJBQUE4QixNQUFBLENBQXFCNmYsTUFBTSxDQUFDOWMsUUFBUSxDQUFFLENBQUM7a0JBQ2xEbkIsTUFBSSxDQUFDNGdCLFdBQVcsQ0FBQzNDLE1BQU0sQ0FBQzljLFFBQVEsQ0FBQztrQkFFakMsQ0FBQXVmLHFCQUFBLElBQUFDLGdCQUFBLEdBQUEzZ0IsTUFBSSxDQUFDZ2QsU0FBUyxFQUFDK0IsZUFBZSxjQUFBMkIscUJBQUEsZUFBOUJBLHFCQUFBLENBQUEvRixJQUFBLENBQUFnRyxnQkFBQSxFQUFpQzFDLE1BQU0sQ0FBQzljLFFBQVEsQ0FBQztnQkFDbkQ7Y0FDRixDQUFDLENBQUM7WUFBQztjQUFBLE9BQUE0UyxTQUFBLENBQUF0UixDQUFBO1VBQUE7UUFBQSxHQUFBaUMsUUFBQTtNQUFBLENBQ0o7TUFBQSxTQXBDWW1jLGNBQWNBLENBQUE7UUFBQSxPQUFBckIsZUFBQSxDQUFBNWMsS0FBQSxPQUFBcEksU0FBQTtNQUFBO01BQUEsT0FBZHFtQixjQUFjO0lBQUEsSUFzQzNCO0VBQUE7SUFBQXBuQixHQUFBO0lBQUFDLEtBQUEsRUFDTyxTQUFBb25CLFlBQVlBLENBQUE7TUFFakI7TUFDQSxJQUFJLENBQUNELGNBQWMsRUFBRTtJQUN2QjtJQUdBO0VBQUE7SUFBQXBuQixHQUFBO0lBQUFDLEtBQUEsRUFDUSxTQUFBNG1CLFlBQVlBLENBQUNuZixRQUFnQixFQUErRDtNQUFBLElBQTVEOFEsVUFBQSxHQUFBelgsU0FBQSxDQUFBTixNQUFBLFFBQUFNLFNBQUEsUUFBQUMsU0FBQSxHQUFBRCxTQUFBLE1BQTRCLElBQUk7TUFBQSxJQUFFZ0UsVUFBQSxHQUFBaEUsU0FBQSxDQUFBTixNQUFBLFFBQUFNLFNBQUEsUUFBQUMsU0FBQSxHQUFBRCxTQUFBLE1BQXFCLEtBQUs7TUFDbEcsT0FBTyxJQUFJLENBQUN1bUIsU0FBUyxDQUFDNWYsUUFBUSxFQUFFOFEsVUFBVSxFQUFFelQsVUFBVSxDQUFDO0lBQ3pEO0lBRUE7RUFBQTtJQUFBL0UsR0FBQTtJQUFBQyxLQUFBLEVBQ1EsU0FBQXFuQixTQUFTQSxDQUFDNWYsUUFBZ0IsRUFBK0Q7TUFBQSxJQUE1RDhRLFVBQUEsR0FBQXpYLFNBQUEsQ0FBQU4sTUFBQSxRQUFBTSxTQUFBLFFBQUFDLFNBQUEsR0FBQUQsU0FBQSxNQUE0QixJQUFJO01BQUEsSUFBRWdFLFVBQUEsR0FBQWhFLFNBQUEsQ0FBQU4sTUFBQSxRQUFBTSxTQUFBLFFBQUFDLFNBQUEsR0FBQUQsU0FBQSxNQUFxQixLQUFLO01BQy9GK0IsT0FBTyxDQUFDRCxHQUFHLHVEQUFBOEIsTUFBQSxDQUF1RCtDLFFBQVEsb0JBQUEvQyxNQUFBLENBQWlCNlQsVUFBVSxvQkFBQTdULE1BQUEsQ0FBaUJJLFVBQVUsQ0FBRSxDQUFDO01BRW5JO01BQ0EsSUFBSTJDLFFBQVEsRUFBRTtRQUNaLElBQU00YyxjQUFjLEdBQUcsSUFBSSxDQUFDbEIsT0FBTyxDQUFDbUIsSUFBSSxDQUFDLFVBQUFnRCxHQUFHO1VBQUEsT0FBSUEsR0FBRyxDQUFDN2YsUUFBUSxLQUFLQSxRQUFRO1FBQUEsRUFBQztRQUMxRSxJQUFJNGMsY0FBYyxFQUFFO1VBQ2xCeGhCLE9BQU8sQ0FBQ0QsR0FBRywyQkFBQThCLE1BQUEsQ0FBMkIrQyxRQUFRLHNCQUFtQixDQUFDO1VBQ2xFLElBQUksQ0FBQzhmLFdBQVcsQ0FBQ2xELGNBQWMsQ0FBQzVjLFFBQVEsQ0FBQztVQUV6QyxPQUFPNGMsY0FBYztRQUN2QjtNQUNGO01BRUE7TUFDQSxJQUFNbUQsT0FBTyxHQUFlO1FBQzFCL2YsUUFBUSxFQUFFQSxRQUFRO1FBQ2xCVCxJQUFJLEVBQUV1UixVQUFVLGNBQUE3VCxNQUFBLENBQWMsSUFBSSxDQUFDMmUsVUFBVSxDQUFFO1FBQy9DN1QsSUFBSSxFQUFFMUssVUFBVTtRQUNoQkEsVUFBVSxFQUFFQSxVQUFVO1FBQ3RCNGYsUUFBUSxFQUFFLEVBQUU7UUFDWkMsVUFBVSxFQUFFLElBQUk7UUFDaEJDLFFBQVEsRUFBRSxLQUFLO1FBQ2Z0UCxNQUFNLEVBQUU7T0FDVDtNQUVEelMsT0FBTyxDQUFDRCxHQUFHLHlCQUFBOEIsTUFBQSxDQUF5QitDLFFBQVEsc0JBQUEvQyxNQUFBLENBQW1CK0MsUUFBUSxJQUFJLEtBQUssQ0FBRSxDQUFDO01BQ25GNUUsT0FBTyxDQUFDRCxHQUFHLHFCQUFxQjtRQUFFckMsRUFBRSxFQUFFaW5CLE9BQU8sQ0FBQy9mLFFBQVE7UUFBRUEsUUFBUSxFQUFFK2YsT0FBTyxDQUFDL2YsUUFBUTtRQUFFVCxJQUFJLEVBQUV3Z0IsT0FBTyxDQUFDeGdCO01BQUksQ0FBRSxDQUFDO01BQ3pHLElBQUksQ0FBQ21jLE9BQU8sQ0FBQzlYLElBQUksQ0FBQ21jLE9BQU8sQ0FBQztNQUcxQjtNQUNBLElBQUksSUFBSSxDQUFDckUsT0FBTyxDQUFDM2lCLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDaEM7TUFBQTtNQUdDLE9BQU9nbkIsT0FBTztJQUNoQjtJQUVBO0VBQUE7SUFBQXpuQixHQUFBO0lBQUFDLEtBQUEsRUFDUSxTQUFBeW5CLHFCQUFxQkEsQ0FDM0JoZ0IsUUFBZ0IsRUFDaEI1RyxTQUFpQixFQUNqQjZtQixXQUFtQixFQUNuQkMsTUFBdUI7TUFBQSxJQUFBQyxzQkFBQSxFQUFBQyxnQkFBQTtNQUV2QixJQUFNdEQsTUFBTSxHQUFHLElBQUksQ0FBQ3BCLE9BQU8sQ0FBQ21CLElBQUksQ0FBQyxVQUFBZ0QsR0FBRztRQUFBLE9BQUlBLEdBQUcsQ0FBQzdmLFFBQVEsS0FBS0EsUUFBUTtNQUFBLEVBQUM7TUFDbEUsSUFBSSxDQUFDOGMsTUFBTSxFQUFFO1FBQ1gsTUFBTSxJQUFJM08sS0FBSyxzQkFBQWxSLE1BQUEsQ0FBc0IrQyxRQUFRLENBQUUsQ0FBQztNQUNsRDtNQUNBO01BRUE7TUFDQSxJQUFJa2dCLE1BQU0sS0FBSyxRQUFRLElBQUk5bUIsU0FBUyxFQUFFO1FBQ3BDLElBQU1pbkIsZUFBZSxHQUFHdkQsTUFBTSxDQUFDRyxRQUFRLENBQUNKLElBQUksQ0FBQyxVQUFBVSxPQUFPO1VBQUEsT0FBSUEsT0FBTyxDQUFDcGYsSUFBSSxDQUFDL0UsU0FBUyxLQUFLQSxTQUFTO1FBQUEsRUFBQztRQUM3RixJQUFJaW5CLGVBQWUsRUFBRTtVQUNuQmpsQixPQUFPLENBQUNELEdBQUcsNEJBQUE4QixNQUFBLENBQTRCN0QsU0FBUyxzQkFBbUIsQ0FBQztVQUNwRSxJQUFJLENBQUNrbkIsZUFBZSxDQUFDeEQsTUFBTSxDQUFDOWMsUUFBUSxFQUFFcWdCLGVBQWUsQ0FBQ2xpQixJQUFJLENBQUMvRSxTQUFTLENBQUM7VUFDckUsT0FBT2luQixlQUFlO1FBQ3hCO01BQ0Y7TUFFQSxJQUFNcEIsV0FBVyxHQUFnQjtRQUMvQjlnQixJQUFJLEVBQUU7VUFDSi9FLFNBQVMsRUFBRUEsU0FBUztVQUNwQm1HLElBQUksRUFBRTBnQixXQUFXO1VBQ2pCamdCLFFBQVEsRUFBRUEsUUFBUTtVQUNsQjZOLE1BQU0sRUFBRSxTQUFTO1VBQ2pCc1AsUUFBUSxFQUFFLEtBQUs7VUFDZm9ELGFBQWEsRUFBRTtTQUNoQjtRQUNEek4sVUFBVSxFQUFFLElBQUk7UUFDaEIzUSxnQkFBZ0IsRUFBRSxJQUFJO1FBQ3RCbU8sZUFBZSxFQUFFLElBQUk7UUFDckJrUSxXQUFXLEVBQUUsSUFBSTtRQUNqQkMsUUFBUSxFQUFFLElBQUk7UUFDZEMsU0FBUyxFQUFFO09BQ1o7TUFFRCxJQUFNQyxVQUFVLEdBQUdULE1BQU0sS0FBSyxJQUFJLDRCQUFBampCLE1BQUEsQ0FDTDdELFNBQVMsbUJBQUE2RCxNQUFBLENBQWdCK0MsUUFBUSxxQ0FBQS9DLE1BQUEsQ0FDekI3RCxTQUFTLG1CQUFBNkQsTUFBQSxDQUFnQitDLFFBQVEsQ0FBRTtNQUN4RTVFLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDd2xCLFVBQVUsQ0FBQztNQUN2QjdELE1BQU0sQ0FBQ0csUUFBUSxDQUFDclosSUFBSSxDQUFDcWIsV0FBVyxDQUFDO01BQ2pDLElBQU0yQixXQUFXLEdBQUc5RCxNQUFNLENBQUM5YyxRQUFRO01BQ25DO01BQ0EsSUFBSSxDQUFDNmdCLHdCQUF3QixDQUFDRCxXQUFXLEVBQUUzQixXQUFXLENBQUM7TUFFdkQ7TUFDQSxDQUFBa0Isc0JBQUEsSUFBQUMsZ0JBQUEsT0FBSSxDQUFDdkUsU0FBUyxFQUFDaUYsWUFBWSxjQUFBWCxzQkFBQSxlQUEzQkEsc0JBQUEsQ0FBQTNHLElBQUEsQ0FBQTRHLGdCQUFBLEVBQThCcGdCLFFBQVEsRUFBRWlmLFdBQVcsQ0FBQztNQUVwRDtNQUNBLElBQUksQ0FBQ3FCLGVBQWUsQ0FBQ3hELE1BQU0sQ0FBQzljLFFBQVEsRUFBRTVHLFNBQVMsQ0FBQztNQUVoRCxPQUFPNmxCLFdBQVc7SUFDcEI7SUFFQTtFQUFBO0lBQUEzbUIsR0FBQTtJQUFBQyxLQUFBLEVBQ08sU0FBQXdvQixnQkFBZ0JBLENBQUMvZ0IsUUFBZ0IsRUFBbUM7TUFBQSxJQUFBZ2hCLGdCQUFBO01BQUEsSUFBakNmLFdBQUEsR0FBQTVtQixTQUFBLENBQUFOLE1BQUEsUUFBQU0sU0FBQSxRQUFBQyxTQUFBLEdBQUFELFNBQUEsTUFBNkIsSUFBSTtNQUN6RSxJQUFNeWpCLE1BQU0sR0FBRyxJQUFJLENBQUNwQixPQUFPLENBQUNtQixJQUFJLENBQUMsVUFBQWdELEdBQUc7UUFBQSxPQUFJQSxHQUFHLENBQUM3ZixRQUFRLEtBQUtBLFFBQVE7TUFBQSxFQUFDO01BQ2xFLElBQUksQ0FBQzhjLE1BQU0sRUFBRTtRQUNYLE1BQU0sSUFBSTNPLEtBQUssc0JBQUFsUixNQUFBLENBQXNCK0MsUUFBUSxDQUFFLENBQUM7TUFDbEQ7TUFFQSxJQUFNaWhCLGdCQUFnQixHQUFHaEIsV0FBVyxlQUFBaGpCLE1BQUEsQ0FBZTZmLE1BQU0sQ0FBQ0csUUFBUSxDQUFDbGtCLE1BQU0sR0FBRyxDQUFDLENBQUU7TUFDL0UsSUFBSTZVLEdBQUcsR0FBRyxJQUFJdEcsSUFBSSxFQUFFLENBQUM0WixPQUFPLEVBQUU7TUFDOUIsSUFBTTluQixTQUFTLGNBQUE2RCxNQUFBLENBQWMyUSxHQUFHLENBQUU7TUFDbEMsSUFBTXFSLFdBQVcsR0FBRyxJQUFJLENBQUNlLHFCQUFxQixDQUFDbEQsTUFBTSxDQUFDOWMsUUFBUSxFQUFFNUcsU0FBUyxFQUFFNm5CLGdCQUFnQixFQUFFLElBQUksQ0FBQztNQUVsRztNQUNBLENBQUFELGdCQUFBLE9BQUksQ0FBQ3ZZLFVBQVUsY0FBQXVZLGdCQUFBLGVBQWZBLGdCQUFBLENBQWlCamhCLGNBQWMsQ0FBQytjLE1BQU0sQ0FBQzljLFFBQVEsRUFBRTVHLFNBQVMsRUFBRTZsQixXQUFXLENBQUM5Z0IsSUFBSSxDQUFDb0IsSUFBSSxDQUFDO01BRWxGLE9BQU8wZixXQUFXO0lBQ3BCO0lBRUE7RUFBQTtJQUFBM21CLEdBQUE7SUFBQUMsS0FBQSxFQUNPLFNBQUE2bUIsdUJBQXVCQSxDQUFDcGYsUUFBZ0IsRUFBRTVHLFNBQWlCLEVBQUU2bUIsV0FBbUI7TUFDckYsT0FBTyxJQUFJLENBQUNELHFCQUFxQixDQUFDaGdCLFFBQVEsRUFBRTVHLFNBQVMsRUFBRTZtQixXQUFXLEVBQUUsUUFBUSxDQUFDO0lBQy9FO0lBR0E7RUFBQTtJQUFBM25CLEdBQUE7SUFBQUMsS0FBQSxFQUNRLFNBQUFzb0Isd0JBQXdCQSxDQUFDN2dCLFFBQWdCLEVBQUVpZixXQUF3QjtNQUFBLElBQUFrQyxNQUFBO1FBQUFDLHNCQUFBO01BQ3pFLElBQU1DLGlCQUFpQixHQUFHblksUUFBUSxDQUFDb1ksY0FBYyxDQUFDLG9CQUFvQixDQUFDO01BRXZFLElBQUksQ0FBQ0QsaUJBQWlCLEVBQUU7UUFDdEIsTUFBTSxJQUFJbFQsS0FBSyxDQUFDLDhCQUE4QixDQUFDO01BQ2pEO01BRUE7TUFDQSxJQUFNcVMsV0FBVyxHQUFHdFgsUUFBUSxDQUFDQyxhQUFhLENBQUMsS0FBSyxDQUFDO01BQ2pEcVgsV0FBVyxDQUFDMW5CLEVBQUUsZUFBQW1FLE1BQUEsQ0FBZWdpQixXQUFXLENBQUM5Z0IsSUFBSSxDQUFDL0UsU0FBUyxDQUFFO01BQ3pEb25CLFdBQVcsQ0FBQ2UsS0FBSyxDQUFDQyxPQUFPLEdBQUcsTUFBTTtNQUNsQ2hCLFdBQVcsQ0FBQ2UsS0FBSyxDQUFDOWEsS0FBSyxHQUFHLE1BQU07TUFDaEMrWixXQUFXLENBQUNlLEtBQUssQ0FBQzdhLE1BQU0sR0FBRyxNQUFNO01BQ2pDOFosV0FBVyxDQUFDZSxLQUFLLENBQUMzUCxRQUFRLEdBQUcsVUFBVTtNQUN2QzRPLFdBQVcsQ0FBQ2UsS0FBSyxDQUFDRSxHQUFHLEdBQUcsR0FBRztNQUMzQmpCLFdBQVcsQ0FBQ2UsS0FBSyxDQUFDRyxJQUFJLEdBQUcsR0FBRztNQUM1QkwsaUJBQWlCLENBQUNNLFdBQVcsQ0FBQ25CLFdBQVcsQ0FBQztNQUUxQztNQUNBLElBQU0xTixVQUFVLEdBQUcsSUFBSXdJLGNBQVEsQ0FBQztRQUM5QnNHLFdBQVcsRUFBRSxJQUFJO1FBQ2pCQyxVQUFVLEVBQUUsd0JBQXdCO1FBQ3BDQyxRQUFRLEVBQUUsRUFBRTtRQUNaQyxLQUFLLEVBQUU7VUFDTEMsVUFBVSxFQUFFLFNBQVM7VUFDckJDLFVBQVUsRUFBRTs7T0FFZixDQUFDO01BRUY7TUFDQSxJQUFNeEIsUUFBUSxHQUFHLElBQUlsRixrQkFBUSxFQUFFO01BQy9CLElBQU1tRixTQUFTLEdBQUcsSUFBSWxGLDZCQUFhLEVBQUU7TUFFckMxSSxVQUFVLENBQUNvUCxTQUFTLENBQUN6QixRQUFRLENBQUM7TUFDOUIzTixVQUFVLENBQUNvUCxTQUFTLENBQUN4QixTQUFTLENBQUM7TUFDL0I1TixVQUFVLENBQUNxUCxJQUFJLENBQUMzQixXQUFXLENBQUM7TUFFNUI7TUFDQXZCLFdBQVcsQ0FBQ3dCLFFBQVEsR0FBR0EsUUFBUTtNQUMvQnhCLFdBQVcsQ0FBQ3lCLFNBQVMsR0FBR0EsU0FBUztNQUNqQ3pCLFdBQVcsQ0FBQ25NLFVBQVUsR0FBR0EsVUFBVTtNQUNuQ21NLFdBQVcsQ0FBQ3VCLFdBQVcsR0FBR0EsV0FBVztNQUVyQztNQUNBdkIsV0FBVyxDQUFDOWMsZ0JBQWdCLEdBQUcsSUFBSTBRLGdCQUFnQixDQUFDQyxVQUFVLENBQUM7TUFFL0Q7TUFDQSxJQUFNeEMsZUFBZSxHQUFHLElBQUlFLGVBQWUsQ0FBQztRQUMxQy9ILFVBQVUsRUFBRSxJQUFJLENBQUNBLFVBQVU7UUFDM0JyUCxTQUFTLEVBQUU2bEIsV0FBVyxDQUFDOWdCLElBQUksQ0FBQy9FLFNBQVM7UUFDckMwWCxVQUFVLEVBQUVtTyxXQUFXLENBQUM5Z0IsSUFBSSxDQUFDb0IsSUFBSTtRQUNqQ3lSLFdBQVcsRUFBRSxLQUFLO1FBQUU7UUFDcEJDLGdCQUFnQixFQUFFLElBQUk7UUFDdEJKLFFBQVEsRUFBRTtPQUNYLENBQUM7TUFDRjtNQUNBUCxlQUFlLENBQUNtQixXQUFXLENBQUM7UUFDMUJDLE1BQU0sRUFBRSxTQUFSQSxNQUFNQSxDQUFHdlQsSUFBWSxFQUFJO1VBQ3ZCL0MsT0FBTyxDQUFDRCxHQUFHLFlBQUE4QixNQUFBLENBQVlnaUIsV0FBVyxDQUFDOWdCLElBQUksQ0FBQy9FLFNBQVMsc0JBQW1CK0UsSUFBSSxDQUFDO1VBQ3pFO1VBQ0FBLElBQUksR0FBR0EsSUFBSSxDQUFDdUYsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7VUFDbEM7VUFDQSxJQUFJdWIsV0FBVyxDQUFDOWMsZ0JBQWdCLEVBQUU7WUFDaEM4YyxXQUFXLENBQUM5YyxnQkFBZ0IsQ0FBQ3NULFNBQVMsQ0FBQ3RYLElBQUksQ0FBQztVQUM5QztRQUNGLENBQUM7UUFDRDNELE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFHYSxLQUFhLEVBQUk7VUFDekI7VUFDQSxJQUFJNGpCLFdBQVcsQ0FBQzljLGdCQUFnQixFQUFFO1lBQ2hDOGMsV0FBVyxDQUFDOWMsZ0JBQWdCLENBQUN3VixVQUFVLENBQUN0YyxLQUFLLENBQUM7VUFDaEQ7UUFDRixDQUFDO1FBQ0RoQixTQUFTLEVBQUUsU0FBWEEsU0FBU0EsQ0FBQSxFQUFPO1VBQ2Q4bUIsTUFBSSxDQUFDaUIsNkJBQTZCLENBQUNwaUIsUUFBUSxFQUFFaWYsV0FBVyxDQUFDOWdCLElBQUksQ0FBQy9FLFNBQVMsRUFBRSxXQUFXLENBQUM7VUFDckZnQyxPQUFPLENBQUNELEdBQUcsWUFBQThCLE1BQUEsQ0FBWWdpQixXQUFXLENBQUM5Z0IsSUFBSSxDQUFDL0UsU0FBUyx5QkFBc0IsQ0FBQztRQUMxRSxDQUFDO1FBQ0RrQixZQUFZLEVBQUUsU0FBZEEsWUFBWUEsQ0FBQSxFQUFPO1VBQ2pCNm1CLE1BQUksQ0FBQ2lCLDZCQUE2QixDQUFDcGlCLFFBQVEsRUFBRWlmLFdBQVcsQ0FBQzlnQixJQUFJLENBQUMvRSxTQUFTLEVBQUUsY0FBYyxDQUFDO1VBQ3hGZ0MsT0FBTyxDQUFDRCxHQUFHLFlBQUE4QixNQUFBLENBQVlnaUIsV0FBVyxDQUFDOWdCLElBQUksQ0FBQy9FLFNBQVMsOEJBQTJCLENBQUM7UUFDL0UsQ0FBQztRQUNEaXBCLFNBQVMsRUFBRSxTQUFYQSxTQUFTQSxDQUFHL2lCLE9BQVksRUFBSTtVQUMxQmxFLE9BQU8sQ0FBQ0QsR0FBRyxZQUFBOEIsTUFBQSxDQUFZZ2lCLFdBQVcsQ0FBQzlnQixJQUFJLENBQUMvRSxTQUFTLHlCQUFzQmtHLE9BQU8sQ0FBQztVQUMvRTtVQUNBLElBQUlBLE9BQU8sQ0FBQ3JCLEtBQUssS0FBSyxTQUFTLElBQUlxQixPQUFPLENBQUNuQixJQUFJLElBQUltQixPQUFPLENBQUNuQixJQUFJLENBQUMwVCxJQUFJLEVBQUU7WUFDcEU7WUFDQXZCLGVBQWUsQ0FBQ2pOLEtBQUssQ0FBQy9ELE9BQU8sQ0FBQ25CLElBQUksQ0FBQzBULElBQUksQ0FBQztVQUMxQztRQUNGLENBQUM7UUFDRHRYLGFBQWEsRUFBRSxTQUFmQSxhQUFhQSxDQUFHbkIsU0FBaUIsRUFBRXVHLE9BQWUsRUFBRWlTLFFBQWdCLEVBQUk7VUFDdEU7VUFDQSxJQUFJcU4sV0FBVyxDQUFDOWMsZ0JBQWdCLEVBQUU7WUFDaEM4YyxXQUFXLENBQUM5YyxnQkFBZ0IsQ0FBQ2tCLEtBQUssQ0FBQzFELE9BQU8sRUFBRWlTLFFBQVEsQ0FBQztVQUN2RDtRQUNGO09BQ0QsQ0FBQztNQUVGO01BQ0FxTixXQUFXLENBQUMzTyxlQUFlLEdBQUdBLGVBQWU7TUFFN0M7TUFDQXdDLFVBQVUsQ0FBQ3BCLE1BQU0sQ0FBQyxVQUFDdlQsSUFBWSxFQUFJO1FBQ2pDO1FBQ0FtUyxlQUFlLENBQUNqTixLQUFLLENBQUNsRixJQUFJLENBQUM7TUFDN0IsQ0FBQyxDQUFDO01BRUY7TUFDQTJVLFVBQVUsQ0FBQ25ZLFFBQVEsQ0FBQyxVQUFDdVQsSUFBb0MsRUFBSTtRQUFBLElBQUFvVSxxQkFBQTtRQUMzRDtRQUNBLElBQU03WixVQUFVLElBQUE2WixxQkFBQSxHQUFHckQsV0FBVyxDQUFDM08sZUFBZSxjQUFBZ1MscUJBQUEsdUJBQTNCQSxxQkFBQSxDQUE2QjdaLFVBQVU7UUFDMUQsSUFBSUEsVUFBVSxFQUFFO1VBQ2QsSUFBTThaLEdBQUcsR0FBRztZQUNWdGtCLEtBQUssRUFBRSxRQUFpQjtZQUN4QnlCLE1BQU0sRUFBRXVmLFdBQVcsQ0FBQzlnQixJQUFJLENBQUMvRSxTQUFTO1lBQ2xDK0UsSUFBSSxFQUFFO2NBQ0pxa0IsSUFBSSxFQUFFdFUsSUFBSSxDQUFDc1UsSUFBSTtjQUNmQyxJQUFJLEVBQUV2VSxJQUFJLENBQUN1VTs7V0FFZDtVQUNGO1FBQ0Q7TUFDRixDQUFDLENBQUM7TUFFRjtNQUNBO01BRUE7TUFDQSxDQUFBckIsc0JBQUEsR0FBQW5DLFdBQVcsQ0FBQzNPLGVBQWUsY0FBQThRLHNCQUFBLGVBQTNCQSxzQkFBQSxDQUE2QmhrQixPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzdDO0lBRUE7RUFBQTtJQUFBOUUsR0FBQTtJQUFBQyxLQUFBLEVBQ1EsU0FBQW1xQixtQkFBbUJBLENBQUMxaUIsUUFBZ0IsRUFBRTVHLFNBQWlCO01BQzdELElBQU0wakIsTUFBTSxHQUFHLElBQUksQ0FBQ3BCLE9BQU8sQ0FBQ21CLElBQUksQ0FBQyxVQUFBckUsQ0FBQztRQUFBLE9BQUlBLENBQUMsQ0FBQ3hZLFFBQVEsS0FBS0EsUUFBUTtNQUFBLEVBQUM7TUFDOUQsSUFBSSxDQUFDOGMsTUFBTSxFQUFFO01BRWIsSUFBTVMsT0FBTyxHQUFHVCxNQUFNLENBQUNHLFFBQVEsQ0FBQ0osSUFBSSxDQUFDLFVBQUEvTSxDQUFDO1FBQUEsT0FBSUEsQ0FBQyxDQUFDM1IsSUFBSSxDQUFDL0UsU0FBUyxLQUFLQSxTQUFTO01BQUEsRUFBQztNQUN6RSxJQUFJLENBQUNta0IsT0FBTyxJQUFJLENBQUNBLE9BQU8sQ0FBQ3BiLGdCQUFnQixFQUFFO01BRTNDO01BQ0E7TUFDQTtNQUNBO0lBQ0Y7SUFFQTtFQUFBO0lBQUE3SixHQUFBO0lBQUFDLEtBQUEsRUFDUSxTQUFBNnBCLDZCQUE2QkEsQ0FBQ3BpQixRQUFnQixFQUFFNUcsU0FBaUIsRUFBRXlVLE1BQWdEO01BQ3pILElBQU1pUCxNQUFNLEdBQUcsSUFBSSxDQUFDcEIsT0FBTyxDQUFDbUIsSUFBSSxDQUFDLFVBQUFyRSxDQUFDO1FBQUEsT0FBSUEsQ0FBQyxDQUFDeFksUUFBUSxLQUFLQSxRQUFRO01BQUEsRUFBQztNQUU5RCxJQUFJOGMsTUFBTSxFQUFFO1FBQ1YsSUFBTVMsT0FBTyxHQUFHVCxNQUFNLENBQUNHLFFBQVEsQ0FBQ0osSUFBSSxDQUFDLFVBQUEvTSxDQUFDO1VBQUEsT0FBSUEsQ0FBQyxDQUFDM1IsSUFBSSxDQUFDL0UsU0FBUyxLQUFLQSxTQUFTO1FBQUEsRUFBQztRQUN6RSxJQUFJbWtCLE9BQU8sRUFBRTtVQUFBLElBQUFvRixxQkFBQSxFQUFBQyxnQkFBQTtVQUNYckYsT0FBTyxDQUFDcGYsSUFBSSxDQUFDMFAsTUFBTSxHQUFHQSxNQUFNO1VBQzVCO1VBQ0EsQ0FBQThVLHFCQUFBLElBQUFDLGdCQUFBLE9BQUksQ0FBQy9HLFNBQVMsRUFBQ2dILHNCQUFzQixjQUFBRixxQkFBQSxlQUFyQ0EscUJBQUEsQ0FBQW5KLElBQUEsQ0FBQW9KLGdCQUFBLEVBQXdDNWlCLFFBQVEsRUFBRTVHLFNBQVMsRUFBRXlVLE1BQU0sQ0FBQztRQUV0RTtNQUNGO0lBQ0Y7SUFFQTtFQUFBO0lBQUF2VixHQUFBO0lBQUFDLEtBQUEsRUFDUSxTQUFBd2tCLGtCQUFrQkEsQ0FBQy9jLFFBQWdCLEVBQUU2TixNQUFnRDtNQUMzRixJQUFNaVAsTUFBTSxHQUFHLElBQUksQ0FBQ3BCLE9BQU8sQ0FBQ21CLElBQUksQ0FBQyxVQUFBL0QsQ0FBQztRQUFBLE9BQUlBLENBQUMsQ0FBQzlZLFFBQVEsS0FBS0EsUUFBUTtNQUFBLEVBQUM7TUFFOUQsSUFBSThjLE1BQU0sRUFBRTtRQUFBLElBQUFnRyxzQkFBQSxFQUFBQyxnQkFBQTtRQUNWakcsTUFBTSxDQUFDalAsTUFBTSxHQUFHQSxNQUFNO1FBQ3RCO1FBQ0EsQ0FBQWlWLHNCQUFBLElBQUFDLGdCQUFBLE9BQUksQ0FBQ2xILFNBQVMsRUFBQ21ILHFCQUFxQixjQUFBRixzQkFBQSxlQUFwQ0Esc0JBQUEsQ0FBQXRKLElBQUEsQ0FBQXVKLGdCQUFBLEVBQXVDL2lCLFFBQVEsRUFBRTZOLE1BQU0sQ0FBQztNQUMxRDtJQUNGO0lBSUE7RUFBQTtJQUFBdlYsR0FBQTtJQUFBQyxLQUFBLEVBQ08sU0FBQXVuQixXQUFXQSxDQUFDOWYsUUFBZ0I7TUFBQSxJQUFBaWpCLHFCQUFBLEVBQUFDLGdCQUFBO01BQ2pDOW5CLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLDZDQUE2QyxFQUFFNkUsUUFBUSxDQUFDO01BQ3BFLElBQU15ZCxXQUFXLEdBQUcsSUFBSSxDQUFDL0IsT0FBTyxDQUFDZ0MsU0FBUyxDQUFDLFVBQUFtQyxHQUFHO1FBQUEsT0FBSUEsR0FBRyxDQUFDN2YsUUFBUSxLQUFLQSxRQUFRO01BQUEsRUFBQztNQUU1RTVFLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHFCQUFxQixFQUFFc2lCLFdBQVcsQ0FBQztNQUMvQyxJQUFJQSxXQUFXLEtBQUssQ0FBQyxDQUFDLEVBQUU7TUFDeEIsSUFBTVgsTUFBTSxHQUFHLElBQUksQ0FBQ3BCLE9BQU8sQ0FBQytCLFdBQVcsQ0FBQztNQUN4QyxJQUFJLENBQUNYLE1BQU0sRUFBRTtNQUNiO01BQ0EsSUFBSSxDQUFDcEIsT0FBTyxDQUFDelEsT0FBTyxDQUFDLFVBQUE2UixNQUFNLEVBQUc7UUFDNUJBLE1BQU0sQ0FBQ0csUUFBUSxDQUFDaFMsT0FBTyxDQUFDLFVBQUFzUyxPQUFPLEVBQUc7VUFDaENBLE9BQU8sQ0FBQ3BmLElBQUksQ0FBQ2dmLFFBQVEsR0FBRyxLQUFLO1FBQy9CLENBQUMsQ0FBQztRQUNGTCxNQUFNLENBQUNLLFFBQVEsR0FBRyxLQUFLO01BQ3pCLENBQUMsQ0FBQztNQUVGO01BQ0EsSUFBTWdHLFlBQVksR0FBRyxJQUFJLENBQUN6SCxPQUFPLENBQUMrQixXQUFXLENBQUM7TUFDOUMsSUFBSSxDQUFDMEYsWUFBWSxFQUFFO01BRW5CL25CLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHdCQUF3QixFQUFFZ29CLFlBQVksQ0FBQ25qQixRQUFRLEVBQUVtakIsWUFBWSxDQUFDNWpCLElBQUksQ0FBQztNQUM5RTtNQUNBbkUsT0FBTyxDQUFDRCxHQUFHLENBQUMsOENBQThDLEVBQUVnb0IsWUFBWSxDQUFDO01BQ3pFLENBQUFGLHFCQUFBLElBQUFDLGdCQUFBLE9BQUksQ0FBQ3JILFNBQVMsRUFBQ3VILHFCQUFxQixjQUFBSCxxQkFBQSxlQUFwQ0EscUJBQUEsQ0FBQXpKLElBQUEsQ0FBQTBKLGdCQUFBLEVBQXVDQyxZQUFZLENBQUMsQ0FBQztNQUN0RDtNQUNBLElBQU1wRixhQUFhLEdBQUdvRixZQUFZLENBQUNsRyxRQUFRLENBQUNKLElBQUksQ0FBQyxVQUFBL00sQ0FBQztRQUFBLE9BQUlBLENBQUMsQ0FBQzNSLElBQUksQ0FBQ2dmLFFBQVE7TUFBQSxFQUFDLElBQUlnRyxZQUFZLENBQUNsRyxRQUFRLENBQUMsQ0FBQyxDQUFDO01BQ2xHLElBQUljLGFBQWEsRUFBRTtRQUNqQixJQUFJLENBQUN1QyxlQUFlLENBQUN4RCxNQUFNLENBQUM5YyxRQUFRLEVBQUUrZCxhQUFhLENBQUM1ZixJQUFJLENBQUMvRSxTQUFTLENBQUM7TUFDckU7TUFFQTtNQUNBLElBQUksQ0FBQ3VpQixjQUFjLEdBQUc4QixXQUFXO01BQ2pDMEYsWUFBWSxDQUFDaEcsUUFBUSxHQUFHLElBQUk7SUFHOUI7SUFFQTtFQUFBO0lBQUE3a0IsR0FBQTtJQUFBQyxLQUFBLEVBQ08sU0FBQStuQixlQUFlQSxDQUFDdGdCLFFBQWdCLEVBQUU1RyxTQUFpQjtNQUFBLElBQUFpcUIsc0JBQUEsRUFBQUMsZ0JBQUE7TUFDeEQsSUFBTXhHLE1BQU0sR0FBRyxJQUFJLENBQUNwQixPQUFPLENBQUNtQixJQUFJLENBQUMsVUFBQWdELEdBQUc7UUFBQSxPQUFJQSxHQUFHLENBQUM3ZixRQUFRLEtBQUtBLFFBQVE7TUFBQSxFQUFDO01BQ2xFLElBQUksQ0FBQzhjLE1BQU0sRUFBRTtNQUViLElBQU1TLE9BQU8sR0FBR1QsTUFBTSxDQUFDRyxRQUFRLENBQUNKLElBQUksQ0FBQyxVQUFBL00sQ0FBQztRQUFBLE9BQUlBLENBQUMsQ0FBQzNSLElBQUksQ0FBQy9FLFNBQVMsS0FBS0EsU0FBUztNQUFBLEVBQUM7TUFDekUsSUFBSSxDQUFDbWtCLE9BQU8sRUFBRTtNQUVkO01BQ0EsSUFBSSxDQUFDN0IsT0FBTyxDQUFDelEsT0FBTyxDQUFDLFVBQUE2UixNQUFNLEVBQUc7UUFDNUJBLE1BQU0sQ0FBQ0csUUFBUSxDQUFDaFMsT0FBTyxDQUFDLFVBQUFzUyxPQUFPLEVBQUc7VUFDaENBLE9BQU8sQ0FBQ3BmLElBQUksQ0FBQ2dmLFFBQVEsR0FBRyxLQUFLO1FBQy9CLENBQUMsQ0FBQztNQUNKLENBQUMsQ0FBQztNQUVGO01BQ0FJLE9BQU8sQ0FBQ3BmLElBQUksQ0FBQ2dmLFFBQVEsR0FBRyxJQUFJO01BQzVCO01BQ0EsQ0FBQWtHLHNCQUFBLElBQUFDLGdCQUFBLE9BQUksQ0FBQ3pILFNBQVMsRUFBQzBILHNCQUFzQixjQUFBRixzQkFBQSxlQUFyQ0Esc0JBQUEsQ0FBQTdKLElBQUEsQ0FBQThKLGdCQUFBLEVBQXdDL0YsT0FBTyxDQUFDO01BRWhEO01BQ0EsSUFBSUEsT0FBTyxDQUFDekssVUFBVSxFQUFFO1FBQ3RCeUssT0FBTyxDQUFDekssVUFBVSxDQUFDMFEsS0FBSyxFQUFFO1FBQzFCcmtCLFVBQVUsQ0FBQyxZQUFLO1VBQ2QsSUFBSW9lLE9BQU8sQ0FBQ2tELFFBQVEsRUFBRTtZQUNwQmxELE9BQU8sQ0FBQ2tELFFBQVEsQ0FBQ2dELEdBQUcsRUFBRTtVQUN4QjtRQUNGLENBQUMsRUFBRSxHQUFHLENBQUM7TUFDVDtJQUNGO0lBRUE7RUFBQTtJQUFBbnJCLEdBQUE7SUFBQUMsS0FBQSxFQUNPLFNBQUFrbkIsV0FBV0EsQ0FBQ3pmLFFBQWdCO01BQUEsSUFBQTBqQixNQUFBO1FBQUFDLHNCQUFBO1FBQUFDLGdCQUFBO01BQ2pDLElBQU1uRyxXQUFXLEdBQUcsSUFBSSxDQUFDL0IsT0FBTyxDQUFDZ0MsU0FBUyxDQUFDLFVBQUFtQyxHQUFHO1FBQUEsT0FBSUEsR0FBRyxDQUFDN2YsUUFBUSxLQUFLQSxRQUFRO01BQUEsRUFBQztNQUM1RSxJQUFJeWQsV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFO01BRXhCLElBQU1YLE1BQU0sR0FBRyxJQUFJLENBQUNwQixPQUFPLENBQUMrQixXQUFXLENBQUM7TUFDeEMsSUFBSSxDQUFDWCxNQUFNLEVBQUU7TUFFYjtNQUNBQSxNQUFNLENBQUNHLFFBQVEsQ0FBQ2hTLE9BQU8sQ0FBQyxVQUFBc1MsT0FBTyxFQUFHO1FBQUEsSUFBQXNHLHFCQUFBLEVBQUFDLGdCQUFBO1FBQ2hDSixNQUFJLENBQUNLLGNBQWMsQ0FBQ3hHLE9BQU8sQ0FBQztRQUM1QixDQUFBc0cscUJBQUEsSUFBQUMsZ0JBQUEsR0FBQUosTUFBSSxDQUFDN0gsU0FBUyxFQUFDbUksZ0JBQWdCLGNBQUFILHFCQUFBLGVBQS9CQSxxQkFBQSxDQUFBckssSUFBQSxDQUFBc0ssZ0JBQUEsRUFBa0M5akIsUUFBUSxFQUFFdWQsT0FBTyxDQUFDcGYsSUFBSSxDQUFDL0UsU0FBUyxDQUFDO01BQ3JFLENBQUMsQ0FBQztNQUVGO01BQ0EsSUFBSSxDQUFDc2lCLE9BQU8sQ0FBQ2lDLE1BQU0sQ0FBQ0YsV0FBVyxFQUFFLENBQUMsQ0FBQztNQUVuQztNQUNBLENBQUFrRyxzQkFBQSxJQUFBQyxnQkFBQSxPQUFJLENBQUMvSCxTQUFTLEVBQUMrQixlQUFlLGNBQUErRixzQkFBQSxlQUE5QkEsc0JBQUEsQ0FBQW5LLElBQUEsQ0FBQW9LLGdCQUFBLEVBQWlDOUcsTUFBTSxDQUFDOWMsUUFBUSxDQUFDO01BRWpEO01BQ0EsSUFBSXlkLFdBQVcsS0FBSyxJQUFJLENBQUM5QixjQUFjLEVBQUU7UUFDdkMsSUFBSSxJQUFJLENBQUNELE9BQU8sQ0FBQzNpQixNQUFNLEdBQUcsQ0FBQyxFQUFFO1VBQzNCLElBQU1rckIsY0FBYyxHQUFHeHJCLElBQUksQ0FBQ3VHLEdBQUcsQ0FBQ3llLFdBQVcsRUFBRSxJQUFJLENBQUMvQixPQUFPLENBQUMzaUIsTUFBTSxHQUFHLENBQUMsQ0FBQztVQUNyRSxJQUFNaWtCLFNBQVMsR0FBRyxJQUFJLENBQUN0QixPQUFPLENBQUN1SSxjQUFjLENBQUM7VUFDOUMsSUFBSWpILFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQzhDLFdBQVcsQ0FBQzlDLFNBQVMsQ0FBQ2hkLFFBQVEsQ0FBQztVQUN0QztRQUNGO01BQ0YsQ0FBQyxNQUFNLElBQUl5ZCxXQUFXLEdBQUcsSUFBSSxDQUFDOUIsY0FBYyxFQUFFO1FBQzVDLElBQUksQ0FBQ0EsY0FBYyxFQUFFO01BQ3ZCO0lBQ0Y7SUFFQTtFQUFBO0lBQUFyakIsR0FBQTtJQUFBQyxLQUFBLEVBQ08sU0FBQWlsQixZQUFZQSxDQUFDeGQsUUFBZ0IsRUFBRTVHLFNBQWlCO01BQUEsSUFBQThxQixzQkFBQSxFQUFBQyxnQkFBQTtNQUNyRCxJQUFNckgsTUFBTSxHQUFHLElBQUksQ0FBQ3BCLE9BQU8sQ0FBQ21CLElBQUksQ0FBQyxVQUFBZ0QsR0FBRztRQUFBLE9BQUlBLEdBQUcsQ0FBQzdmLFFBQVEsS0FBS0EsUUFBUTtNQUFBLEVBQUM7TUFDbEUsSUFBSSxDQUFDOGMsTUFBTSxFQUFFO01BRWIsSUFBTXNILFlBQVksR0FBR3RILE1BQU0sQ0FBQ0csUUFBUSxDQUFDUyxTQUFTLENBQUMsVUFBQTVOLENBQUM7UUFBQSxPQUFJQSxDQUFDLENBQUMzUixJQUFJLENBQUMvRSxTQUFTLEtBQUtBLFNBQVM7TUFBQSxFQUFDO01BQ25GLElBQUlnckIsWUFBWSxLQUFLLENBQUMsQ0FBQyxFQUFFO01BRXpCLElBQU03RyxPQUFPLEdBQUdULE1BQU0sQ0FBQ0csUUFBUSxDQUFDbUgsWUFBWSxDQUFDO01BQzdDLElBQUksQ0FBQzdHLE9BQU8sRUFBRTtNQUVkO01BQ0EsSUFBSSxDQUFDd0csY0FBYyxDQUFDeEcsT0FBTyxDQUFDO01BRTVCO01BQ0FULE1BQU0sQ0FBQ0csUUFBUSxDQUFDVSxNQUFNLENBQUN5RyxZQUFZLEVBQUUsQ0FBQyxDQUFDO01BRXZDO01BQ0EsQ0FBQUYsc0JBQUEsSUFBQUMsZ0JBQUEsT0FBSSxDQUFDdEksU0FBUyxFQUFDbUksZ0JBQWdCLGNBQUFFLHNCQUFBLGVBQS9CQSxzQkFBQSxDQUFBMUssSUFBQSxDQUFBMkssZ0JBQUEsRUFBa0Nua0IsUUFBUSxFQUFFNUcsU0FBUyxDQUFDO01BRXREO01BQ0EsSUFBSTBqQixNQUFNLENBQUNHLFFBQVEsQ0FBQ2xrQixNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2hDLElBQUksQ0FBQzBtQixXQUFXLENBQUN6ZixRQUFRLENBQUM7UUFDMUI7TUFDRjtNQUVBO01BQ0EsSUFBSXVkLE9BQU8sQ0FBQ3BmLElBQUksQ0FBQ2dmLFFBQVEsRUFBRTtRQUN6QixJQUFNa0gsZ0JBQWdCLEdBQUd2SCxNQUFNLENBQUNHLFFBQVEsQ0FBQ3hrQixJQUFJLENBQUN1RyxHQUFHLENBQUNvbEIsWUFBWSxFQUFFdEgsTUFBTSxDQUFDRyxRQUFRLENBQUNsa0IsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVGLElBQUlzckIsZ0JBQWdCLEVBQUU7VUFDcEIsSUFBSSxDQUFDL0QsZUFBZSxDQUFDdGdCLFFBQVEsRUFBRXFrQixnQkFBZ0IsQ0FBQ2xtQixJQUFJLENBQUMvRSxTQUFTLENBQUM7UUFDakU7TUFDRjtJQUdGO0lBRUE7RUFBQTtJQUFBZCxHQUFBO0lBQUFDLEtBQUEsRUFDUSxTQUFBd3JCLGNBQWNBLENBQUN4RyxPQUFvQjtNQUFBLElBQUErRyxxQkFBQSxFQUFBQyxnQkFBQTtNQUN6QztNQUNBLElBQUloSCxPQUFPLENBQUNqTixlQUFlLEVBQUU7UUFDM0JpTixPQUFPLENBQUNqTixlQUFlLENBQUN6TyxPQUFPLEVBQUU7TUFDbkM7TUFFQTtNQUNBLElBQUkwYixPQUFPLENBQUNwYixnQkFBZ0IsRUFBRTtRQUM1Qm9iLE9BQU8sQ0FBQ3BiLGdCQUFnQixDQUFDTixPQUFPLEVBQUU7TUFDcEM7TUFFQTtNQUNBLElBQUkwYixPQUFPLENBQUN6SyxVQUFVLEVBQUU7UUFDdEJ5SyxPQUFPLENBQUN6SyxVQUFVLENBQUMwUixPQUFPLEVBQUU7TUFDOUI7TUFFQTtNQUNBLENBQUFGLHFCQUFBLElBQUFDLGdCQUFBLE9BQUksQ0FBQzFJLFNBQVMsRUFBQzRJLG1CQUFtQixjQUFBSCxxQkFBQSxlQUFsQ0EscUJBQUEsQ0FBQTlLLElBQUEsQ0FBQStLLGdCQUFBLEVBQXFDaEgsT0FBTyxDQUFDcGYsSUFBSSxDQUFDL0UsU0FBUyxDQUFDO0lBQzlEO0lBRUE7RUFBQTtJQUFBZCxHQUFBO0lBQUFDLEtBQUEsRUFDTyxTQUFBbXNCLHFCQUFxQkEsQ0FBQzFrQixRQUFnQjtNQUMzQztNQUNBO01BQ0E1RSxPQUFPLENBQUNELEdBQUcsQ0FBQywwREFBMEQsQ0FBQztJQUN6RTtJQUVBO0VBQUE7SUFBQTdDLEdBQUE7SUFBQUMsS0FBQSxFQUNPLFNBQUF5bEIsZ0JBQWdCQSxDQUFBO01BQ3JCLElBQU1tRixZQUFZLEdBQUcsSUFBSSxDQUFDekgsT0FBTyxDQUFDLElBQUksQ0FBQ0MsY0FBYyxDQUFDO01BQ3RELElBQUksQ0FBQ3dILFlBQVksRUFBRSxPQUFPLElBQUk7TUFFOUIsT0FBT0EsWUFBWSxDQUFDbEcsUUFBUSxDQUFDSixJQUFJLENBQUMsVUFBQS9NLENBQUM7UUFBQSxPQUFJQSxDQUFDLENBQUMzUixJQUFJLENBQUNnZixRQUFRO01BQUEsRUFBQyxJQUFJLElBQUk7SUFDakU7SUFFQTtFQUFBO0lBQUE3a0IsR0FBQTtJQUFBQyxLQUFBLEVBQ08sU0FBQW9zQixlQUFlQSxDQUFBO01BQ3BCLE9BQU8sSUFBSSxDQUFDakosT0FBTyxDQUFDLElBQUksQ0FBQ0MsY0FBYyxDQUFDLElBQUksSUFBSTtJQUNsRDtJQUVBO0VBQUE7SUFBQXJqQixHQUFBO0lBQUFDLEtBQUEsRUFDTyxTQUFBcXNCLGFBQWFBLENBQUE7TUFDbEIsT0FBQUMsa0JBQUEsQ0FBVyxJQUFJLENBQUNuSixPQUFPO0lBQ3pCO0lBRUE7RUFBQTtJQUFBcGpCLEdBQUE7SUFBQUMsS0FBQSxFQUNPLFNBQUF1c0IsaUJBQWlCQSxDQUFDOWtCLFFBQWdCO01BQ3ZDLElBQU04YyxNQUFNLEdBQUcsSUFBSSxDQUFDcEIsT0FBTyxDQUFDbUIsSUFBSSxDQUFDLFVBQUFnRCxHQUFHO1FBQUEsT0FBSUEsR0FBRyxDQUFDN2YsUUFBUSxLQUFLQSxRQUFRO01BQUEsRUFBQztNQUNsRSxPQUFPOGMsTUFBTSxHQUFBK0gsa0JBQUEsQ0FBTy9ILE1BQU0sQ0FBQ0csUUFBUSxJQUFJLEVBQUU7SUFDM0M7RUFBQztJQUFBM2tCLEdBQUE7SUFBQUMsS0FBQSxFQUVNLFNBQUE0SCxVQUFVQSxDQUFDaEMsSUFBZ0I7TUFDaEMsSUFBSSxJQUFJLENBQUMwZCxTQUFTLENBQUNrSixRQUFRLEVBQUU7UUFDM0IsSUFBSSxDQUFDbEosU0FBUyxDQUFDa0osUUFBUSxDQUFDNW1CLElBQUksQ0FBQztNQUMvQjtJQUNGO0lBRUE7RUFBQTtJQUFBN0YsR0FBQTtJQUFBQyxLQUFBLEVBQ08sU0FBQXlzQixVQUFVQSxDQUFBO01BQUEsSUFBQUMsTUFBQTtNQUNmO01BQ0EvbEIsTUFBTSxDQUFDZ21CLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxZQUFLO1FBQ3JDLElBQU1uSCxhQUFhLEdBQUdrSCxNQUFJLENBQUNqSCxnQkFBZ0IsRUFBRTtRQUM3QyxJQUFJRCxhQUFhLElBQUlBLGFBQWEsQ0FBQzBDLFFBQVEsRUFBRTtVQUMzQ3RoQixVQUFVLENBQUMsWUFBSztZQUFBLElBQUFnbUIscUJBQUE7WUFDZCxDQUFBQSxxQkFBQSxHQUFBcEgsYUFBYSxDQUFDMEMsUUFBUSxjQUFBMEUscUJBQUEsZUFBdEJBLHFCQUFBLENBQXdCMUIsR0FBRyxFQUFFO1VBQy9CLENBQUMsRUFBRSxHQUFHLENBQUM7UUFDVDtNQUNGLENBQUMsQ0FBQztNQUVGO01BQ0F2a0IsTUFBTSxDQUFDa21CLGNBQWMsR0FBRyxZQUFLO1FBQzNCSCxNQUFJLENBQUN2SixPQUFPLENBQUN6USxPQUFPLENBQUMsVUFBQTZSLE1BQU0sRUFBRztVQUM1QkEsTUFBTSxDQUFDRyxRQUFRLENBQUNoUyxPQUFPLENBQUMsVUFBQXNTLE9BQU8sRUFBRztZQUNoQyxJQUFJQSxPQUFPLENBQUNqTixlQUFlLEVBQUU7Y0FDM0JpTixPQUFPLENBQUNqTixlQUFlLENBQUN6TyxPQUFPLEVBQUU7WUFDbkM7WUFDQSxJQUFJMGIsT0FBTyxDQUFDcGIsZ0JBQWdCLEVBQUU7Y0FDNUJvYixPQUFPLENBQUNwYixnQkFBZ0IsQ0FBQ04sT0FBTyxFQUFFO1lBQ3BDO1VBQ0YsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDO01BQ0osQ0FBQztJQUNIO0VBQUM7QUFBQSxLQUdIOzs7OzRCQ3QxQkEsdUtBQUFzTyxDQUFBLEVBQUFxSSxDQUFBLEVBQUFDLENBQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBdFgsQ0FBQSxHQUFBcVgsQ0FBQSxDQUFBRSxRQUFBLGtCQUFBQyxDQUFBLEdBQUFILENBQUEsQ0FBQUksV0FBQSw4QkFBQW5NLEVBQUErTCxDQUFBLEVBQUFyWCxDQUFBLEVBQUF3WCxDQUFBLEVBQUFsTSxDQUFBLFFBQUFvTSxDQUFBLEdBQUExWCxDQUFBLElBQUFBLENBQUEsQ0FBQWdKLFNBQUEsWUFBQTJPLFNBQUEsR0FBQTNYLENBQUEsR0FBQTJYLFNBQUEsRUFBQUMsQ0FBQSxHQUFBM08sTUFBQSxDQUFBNE8sTUFBQSxDQUFBSCxDQUFBLENBQUExTyxTQUFBLFVBQUE4TyxxQkFBQSxDQUFBRixDQUFBLHVCQUFBUCxDQUFBLEVBQUFyWCxDQUFBLEVBQUF3WCxDQUFBLFFBQUFsTSxDQUFBLEVBQUFvTSxDQUFBLEVBQUFFLENBQUEsRUFBQTVJLENBQUEsTUFBQWpQLENBQUEsR0FBQXlYLENBQUEsUUFBQXJCLENBQUEsT0FBQTRCLENBQUEsS0FBQWhZLENBQUEsS0FBQUMsQ0FBQSxLQUFBRyxDQUFBLEVBQUE0TyxDQUFBLEVBQUE3TyxDQUFBLEVBQUE4WCxDQUFBLEVBQUFoSixDQUFBLEVBQUFnSixDQUFBLENBQUFDLElBQUEsQ0FBQWxKLENBQUEsTUFBQWlKLENBQUEsV0FBQUEsRUFBQVosQ0FBQSxFQUFBQyxDQUFBLFdBQUEvTCxDQUFBLEdBQUE4TCxDQUFBLEVBQUFNLENBQUEsTUFBQUUsQ0FBQSxHQUFBN0ksQ0FBQSxFQUFBZ0osQ0FBQSxDQUFBL1gsQ0FBQSxHQUFBcVgsQ0FBQSxFQUFBblgsQ0FBQSxnQkFBQThYLEVBQUFYLENBQUEsRUFBQXJYLENBQUEsU0FBQTBYLENBQUEsR0FBQUwsQ0FBQSxFQUFBTyxDQUFBLEdBQUE1WCxDQUFBLEVBQUFvWCxDQUFBLE9BQUFqQixDQUFBLElBQUFuSCxDQUFBLEtBQUF3SSxDQUFBLElBQUFKLENBQUEsR0FBQXJYLENBQUEsQ0FBQXBJLE1BQUEsRUFBQXlmLENBQUEsVUFBQUksQ0FBQSxFQUFBbE0sQ0FBQSxHQUFBdkwsQ0FBQSxDQUFBcVgsQ0FBQSxHQUFBWSxDQUFBLEdBQUFELENBQUEsQ0FBQWhZLENBQUEsRUFBQW1ZLENBQUEsR0FBQTVNLENBQUEsS0FBQStMLENBQUEsUUFBQUcsQ0FBQSxHQUFBVSxDQUFBLEtBQUFsWSxDQUFBLE1BQUE0WCxDQUFBLEdBQUF0TSxDQUFBLEVBQUFvTSxDQUFBLEdBQUFwTSxDQUFBLFlBQUFvTSxDQUFBLFdBQUFwTSxDQUFBLE1BQUFBLENBQUEsTUFBQXlELENBQUEsSUFBQXpELENBQUEsT0FBQTBNLENBQUEsTUFBQVIsQ0FBQSxHQUFBSCxDQUFBLFFBQUFXLENBQUEsR0FBQTFNLENBQUEsUUFBQW9NLENBQUEsTUFBQUssQ0FBQSxDQUFBNVgsQ0FBQSxHQUFBSCxDQUFBLEVBQUErWCxDQUFBLENBQUEvWCxDQUFBLEdBQUFzTCxDQUFBLE9BQUEwTSxDQUFBLEdBQUFFLENBQUEsS0FBQVYsQ0FBQSxHQUFBSCxDQUFBLFFBQUEvTCxDQUFBLE1BQUF0TCxDQUFBLElBQUFBLENBQUEsR0FBQWtZLENBQUEsTUFBQTVNLENBQUEsTUFBQStMLENBQUEsRUFBQS9MLENBQUEsTUFBQXRMLENBQUEsRUFBQStYLENBQUEsQ0FBQS9YLENBQUEsR0FBQWtZLENBQUEsRUFBQVIsQ0FBQSxjQUFBRixDQUFBLElBQUFILENBQUEsYUFBQW5YLENBQUEsUUFBQWlXLENBQUEsT0FBQW5XLENBQUEscUJBQUF3WCxDQUFBLEVBQUF6WCxDQUFBLEVBQUFtWSxDQUFBLFFBQUFsSixDQUFBLFlBQUFtSixTQUFBLHVDQUFBaEMsQ0FBQSxVQUFBcFcsQ0FBQSxJQUFBaVksQ0FBQSxDQUFBalksQ0FBQSxFQUFBbVksQ0FBQSxHQUFBUixDQUFBLEdBQUEzWCxDQUFBLEVBQUE2WCxDQUFBLEdBQUFNLENBQUEsR0FBQWQsQ0FBQSxHQUFBTSxDQUFBLE9BQUEzSSxDQUFBLEdBQUE2SSxDQUFBLE1BQUF6QixDQUFBLEtBQUE3SyxDQUFBLEtBQUFvTSxDQUFBLEdBQUFBLENBQUEsUUFBQUEsQ0FBQSxTQUFBSyxDQUFBLENBQUEvWCxDQUFBLFFBQUFnWSxDQUFBLENBQUFOLENBQUEsRUFBQUUsQ0FBQSxLQUFBRyxDQUFBLENBQUEvWCxDQUFBLEdBQUE0WCxDQUFBLEdBQUFHLENBQUEsQ0FBQTVYLENBQUEsR0FBQXlYLENBQUEsYUFBQTVJLENBQUEsTUFBQTFELENBQUEsUUFBQW9NLENBQUEsS0FBQUYsQ0FBQSxZQUFBSixDQUFBLEdBQUE5TCxDQUFBLENBQUFrTSxDQUFBLFdBQUFKLENBQUEsR0FBQUEsQ0FBQSxDQUFBZ0IsSUFBQSxDQUFBOU0sQ0FBQSxFQUFBc00sQ0FBQSxVQUFBTyxTQUFBLDJDQUFBZixDQUFBLENBQUF6SSxJQUFBLFNBQUF5SSxDQUFBLEVBQUFRLENBQUEsR0FBQVIsQ0FBQSxDQUFBamdCLEtBQUEsRUFBQXVnQixDQUFBLFNBQUFBLENBQUEsb0JBQUFBLENBQUEsS0FBQU4sQ0FBQSxHQUFBOUwsQ0FBQSxlQUFBOEwsQ0FBQSxDQUFBZ0IsSUFBQSxDQUFBOU0sQ0FBQSxHQUFBb00sQ0FBQSxTQUFBRSxDQUFBLEdBQUFPLFNBQUEsdUNBQUFYLENBQUEsZ0JBQUFFLENBQUEsT0FBQXBNLENBQUEsR0FBQXlELENBQUEsY0FBQXFJLENBQUEsSUFBQWpCLENBQUEsR0FBQTRCLENBQUEsQ0FBQS9YLENBQUEsUUFBQTRYLENBQUEsR0FBQVAsQ0FBQSxDQUFBZSxJQUFBLENBQUFwWSxDQUFBLEVBQUErWCxDQUFBLE9BQUE3WCxDQUFBLGtCQUFBa1gsQ0FBQSxJQUFBOUwsQ0FBQSxHQUFBeUQsQ0FBQSxFQUFBMkksQ0FBQSxNQUFBRSxDQUFBLEdBQUFSLENBQUEsY0FBQXBJLENBQUEsbUJBQUE3WCxLQUFBLEVBQUFpZ0IsQ0FBQSxFQUFBekksSUFBQSxFQUFBd0gsQ0FBQSxTQUFBa0IsQ0FBQSxFQUFBRyxDQUFBLEVBQUFsTSxDQUFBLFFBQUFzTSxDQUFBLFFBQUExWCxDQUFBLGdCQUFBeVgsVUFBQSxjQUFBVSxrQkFBQSxjQUFBQywyQkFBQSxLQUFBbEIsQ0FBQSxHQUFBbk8sTUFBQSxDQUFBc1AsY0FBQSxNQUFBYixDQUFBLE1BQUExWCxDQUFBLElBQUFvWCxDQUFBLENBQUFBLENBQUEsSUFBQXBYLENBQUEsU0FBQThYLHFCQUFBLENBQUFWLENBQUEsT0FBQXBYLENBQUEsaUNBQUFvWCxDQUFBLEdBQUFRLENBQUEsR0FBQVUsMEJBQUEsQ0FBQXRQLFNBQUEsR0FBQTJPLFNBQUEsQ0FBQTNPLFNBQUEsR0FBQUMsTUFBQSxDQUFBNE8sTUFBQSxDQUFBSCxDQUFBLFlBQUExSSxFQUFBRCxDQUFBLFdBQUE5RixNQUFBLENBQUF1UCxjQUFBLEdBQUF2UCxNQUFBLENBQUF1UCxjQUFBLENBQUF6SixDQUFBLEVBQUF1SiwwQkFBQSxLQUFBdkosQ0FBQSxDQUFBMEosU0FBQSxHQUFBSCwwQkFBQSxFQUFBUixxQkFBQSxDQUFBL0ksQ0FBQSxFQUFBeUksQ0FBQSx5QkFBQXpJLENBQUEsQ0FBQS9GLFNBQUEsR0FBQUMsTUFBQSxDQUFBNE8sTUFBQSxDQUFBRCxDQUFBLEdBQUE3SSxDQUFBLFdBQUFzSixpQkFBQSxDQUFBclAsU0FBQSxHQUFBc1AsMEJBQUEsRUFBQVIscUJBQUEsQ0FBQUYsQ0FBQSxpQkFBQVUsMEJBQUEsR0FBQVIscUJBQUEsQ0FBQVEsMEJBQUEsaUJBQUFELGlCQUFBLEdBQUFBLGlCQUFBLENBQUFLLFdBQUEsd0JBQUFaLHFCQUFBLENBQUFRLDBCQUFBLEVBQUFkLENBQUEsd0JBQUFNLHFCQUFBLENBQUFGLENBQUEsR0FBQUUscUJBQUEsQ0FBQUYsQ0FBQSxFQUFBSixDQUFBLGdCQUFBTSxxQkFBQSxDQUFBRixDQUFBLEVBQUE1WCxDQUFBLGlDQUFBOFgscUJBQUEsQ0FBQUYsQ0FBQSw4REFBQXBZLGNBQUEsWUFBQUEsYUFBQSxhQUFBSyxDQUFBLEVBQUF5TCxDQUFBLEVBQUE3TCxDQUFBLEVBQUF1UCxDQUFBO0FBQUEsU0FBQThJLHFCQUFBQSxDQUFBL0ksQ0FBQSxFQUFBc0ksQ0FBQSxFQUFBclgsQ0FBQSxFQUFBb1gsQ0FBQSxRQUFBOUwsQ0FBQSxHQUFBckMsTUFBQSxDQUFBRyxjQUFBLFFBQUFrQyxDQUFBLHVCQUFBeUQsQ0FBQSxJQUFBekQsQ0FBQSxRQUFBd00scUJBQUEsWUFBQWEsbUJBQUE1SixDQUFBLEVBQUFzSSxDQUFBLEVBQUFyWCxDQUFBLEVBQUFvWCxDQUFBLGFBQUFJLEVBQUFILENBQUEsRUFBQXJYLENBQUEsSUFBQThYLHFCQUFBLENBQUEvSSxDQUFBLEVBQUFzSSxDQUFBLFlBQUF0SSxDQUFBLGdCQUFBNkosT0FBQSxDQUFBdkIsQ0FBQSxFQUFBclgsQ0FBQSxFQUFBK08sQ0FBQSxTQUFBc0ksQ0FBQSxHQUFBL0wsQ0FBQSxHQUFBQSxDQUFBLENBQUF5RCxDQUFBLEVBQUFzSSxDQUFBLElBQUFsZ0IsS0FBQSxFQUFBNkksQ0FBQSxFQUFBNlksVUFBQSxHQUFBekIsQ0FBQSxFQUFBMEIsWUFBQSxHQUFBMUIsQ0FBQSxFQUFBMkIsUUFBQSxHQUFBM0IsQ0FBQSxNQUFBckksQ0FBQSxDQUFBc0ksQ0FBQSxJQUFBclgsQ0FBQSxJQUFBd1gsQ0FBQSxhQUFBQSxDQUFBLGNBQUFBLENBQUEsbUJBQUFNLHFCQUFBLENBQUEvSSxDQUFBLEVBQUFzSSxDQUFBLEVBQUFyWCxDQUFBLEVBQUFvWCxDQUFBO0FBQUEsU0FBQTRCLHFCQUFBQSxDQUFBaFosQ0FBQSxFQUFBb1gsQ0FBQSxFQUFBckksQ0FBQSxFQUFBc0ksQ0FBQSxFQUFBRyxDQUFBLEVBQUF0WCxDQUFBLEVBQUF3WCxDQUFBLGNBQUFwTSxDQUFBLEdBQUF0TCxDQUFBLENBQUFFLENBQUEsRUFBQXdYLENBQUEsR0FBQUUsQ0FBQSxHQUFBdE0sQ0FBQSxDQUFBblUsS0FBQSxXQUFBNkksQ0FBQSxnQkFBQStPLENBQUEsQ0FBQS9PLENBQUEsS0FBQXNMLENBQUEsQ0FBQXFELElBQUEsR0FBQXlJLENBQUEsQ0FBQVEsQ0FBQSxJQUFBaFAsT0FBQSxDQUFBcVEsT0FBQSxDQUFBckIsQ0FBQSxFQUFBNWEsSUFBQSxDQUFBcWEsQ0FBQSxFQUFBRyxDQUFBO0FBQUEsU0FBQWpZLG1CQUFBQSxDQUFBUyxDQUFBLDZCQUFBb1gsQ0FBQSxTQUFBckksQ0FBQSxHQUFBOVcsU0FBQSxhQUFBMlEsT0FBQSxXQUFBeU8sQ0FBQSxFQUFBRyxDQUFBLFFBQUF0WCxDQUFBLEdBQUFGLENBQUEsQ0FBQUssS0FBQSxDQUFBK1csQ0FBQSxFQUFBckksQ0FBQSxZQUFBbUssTUFBQWxaLENBQUEsSUFBQWdaLHFCQUFBLENBQUE5WSxDQUFBLEVBQUFtWCxDQUFBLEVBQUFHLENBQUEsRUFBQTBCLEtBQUEsRUFBQUMsTUFBQSxVQUFBblosQ0FBQSxjQUFBbVosT0FBQW5aLENBQUEsSUFBQWdaLHFCQUFBLENBQUE5WSxDQUFBLEVBQUFtWCxDQUFBLEVBQUFHLENBQUEsRUFBQTBCLEtBQUEsRUFBQUMsTUFBQSxXQUFBblosQ0FBQSxLQUFBa1osS0FBQTtBQUFBLFNBQUFsaUIsaUJBQUFBLENBQUFrSixDQUFBLEVBQUFGLENBQUEsVUFBQUUsQ0FBQSxZQUFBRixDQUFBLGFBQUFtWSxTQUFBO0FBQUEsU0FBQTBCLG1CQUFBQSxDQUFBOUssQ0FBQSxFQUFBc0ksQ0FBQSxhQUFBRCxDQUFBLE1BQUFBLENBQUEsR0FBQUMsQ0FBQSxDQUFBMWYsTUFBQSxFQUFBeWYsQ0FBQSxVQUFBSSxDQUFBLEdBQUFILENBQUEsQ0FBQUQsQ0FBQSxHQUFBSSxDQUFBLENBQUFxQixVQUFBLEdBQUFyQixDQUFBLENBQUFxQixVQUFBLFFBQUFyQixDQUFBLENBQUFzQixZQUFBLGtCQUFBdEIsQ0FBQSxLQUFBQSxDQUFBLENBQUF1QixRQUFBLFFBQUE5UCxNQUFBLENBQUFHLGNBQUEsQ0FBQTJGLENBQUEsRUFBQTZLLGdCQUFBLENBQUFwQyxDQUFBLENBQUF0Z0IsR0FBQSxHQUFBc2dCLENBQUE7QUFBQSxTQUFBdmdCLGNBQUFBLENBQUE4WCxDQUFBLEVBQUFzSSxDQUFBLEVBQUFELENBQUEsV0FBQUMsQ0FBQSxJQUFBd0MsbUJBQUEsQ0FBQTlLLENBQUEsQ0FBQS9GLFNBQUEsRUFBQXFPLENBQUEsR0FBQUQsQ0FBQSxJQUFBeUMsbUJBQUEsQ0FBQTlLLENBQUEsRUFBQXFJLENBQUEsR0FBQW5PLE1BQUEsQ0FBQUcsY0FBQSxDQUFBMkYsQ0FBQSxpQkFBQWdLLFFBQUEsU0FBQWhLLENBQUE7QUFBQSxTQUFBNkssZ0JBQUFBLENBQUF4QyxDQUFBLFFBQUE5TCxDQUFBLEdBQUF3TyxjQUFBLENBQUExQyxDQUFBLGdDQUFBMkMsU0FBQSxDQUFBek8sQ0FBQSxJQUFBQSxDQUFBLEdBQUFBLENBQUE7QUFBQSxTQUFBd08sY0FBQUEsQ0FBQTFDLENBQUEsRUFBQUMsQ0FBQSxvQkFBQTBDLFNBQUEsQ0FBQTNDLENBQUEsTUFBQUEsQ0FBQSxTQUFBQSxDQUFBLE1BQUFySSxDQUFBLEdBQUFxSSxDQUFBLENBQUFFLE1BQUEsQ0FBQTBDLFdBQUEsa0JBQUFqTCxDQUFBLFFBQUF6RCxDQUFBLEdBQUF5RCxDQUFBLENBQUFxSixJQUFBLENBQUFoQixDQUFBLEVBQUFDLENBQUEsZ0NBQUEwQyxTQUFBLENBQUF6TyxDQUFBLFVBQUFBLENBQUEsWUFBQTZNLFNBQUEseUVBQUFkLENBQUEsR0FBQXZJLE1BQUEsR0FBQW1MLE1BQUEsRUFBQTdDLENBQUE7QUFGNEQ7QUFFdEI7QUFVdEM7QUFDd0Q7QUFDTDtBQWtCbkQ7Ozs7QUFBQSxJQUlNNk0sV0FBVztFQW9CZixTQUFBQSxZQUFBO0lBQUFqdEIsaUJBQUEsT0FBQWl0QixXQUFBO0lBWkE7SUFDaUIsS0FBQXhELFVBQVUsR0FBVyxjQUFjO0lBQ25DLEtBQUFDLFFBQVEsR0FBVyxZQUFZO0lBQy9CLEtBQUFoUixVQUFVLEdBQVcsY0FBYztJQUMzQyxLQUFBd1UsS0FBSyxHQUFXLHVCQUF1QjtJQUN2QyxLQUFBeEosT0FBTyxHQUFXLDBCQUEwQjtJQUM3QyxLQUFBeUosT0FBTyxHQUFHLElBQUk7SUFFZCxLQUFBeEosTUFBTSxHQUFXLEVBQUU7SUFDbkIsS0FBQS9iLFFBQVEsR0FBVyxFQUFFO0lBQ3JCLEtBQUF3bEIsY0FBYyxHQUF1QixJQUFJO0lBRy9DcHFCLE9BQU8sQ0FBQ0QsR0FBRyxlQUFBOEIsTUFBQSxDQUFlLElBQUksQ0FBQ3NvQixPQUFPLENBQUUsQ0FBQztJQUN6QztJQUNBLElBQU1FLFlBQVksR0FBRyxJQUFJLENBQUNDLG1CQUFtQixFQUFFO0lBQy9DLElBQUlELFlBQVksS0FBSyxJQUFJLEVBQUU7TUFDekI7TUFDQTtJQUFBO0lBRUYsSUFBSSxDQUFDMUosTUFBTSxHQUFHMEosWUFBWTtJQUUxQjtJQUNBLElBQUksQ0FBQ3psQixRQUFRLEdBQUcsSUFBSSxDQUFDMmxCLHFCQUFxQixFQUFFO0lBRTVDdnFCLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHNDQUFzQyxFQUFFLElBQUksQ0FBQzRnQixNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQy9iLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDdWxCLE9BQU8sQ0FBQztJQUVwSDtJQUNBLElBQUksQ0FBQ0ssZUFBZSxHQUFHO01BQ3JCaEUsV0FBVyxFQUFFO0tBQ2Q7SUFFRCxJQUFJLElBQUksQ0FBQ0MsVUFBVSxFQUFFO01BQ25CLElBQUksQ0FBQytELGVBQWUsQ0FBQy9ELFVBQVUsR0FBRyxJQUFJLENBQUNBLFVBQVU7SUFDbkQ7SUFFQSxJQUFJLElBQUksQ0FBQ0MsUUFBUSxFQUFFO01BQ2pCLElBQUksQ0FBQzhELGVBQWUsQ0FBQzlELFFBQVEsR0FBRytELFFBQVEsQ0FBQyxJQUFJLENBQUMvRCxRQUFRLENBQUM7SUFDekQ7SUFFQSxJQUFJLElBQUksQ0FBQ3lELE9BQU8sRUFBRTtNQUNoQjtNQUNBLElBQUksQ0FBQ0QsS0FBSyxvQ0FBQXJvQixNQUFBLENBQW9DLElBQUksQ0FBQzhlLE1BQU0sZ0JBQUE5ZSxNQUFBLENBQWEsSUFBSSxDQUFDK0MsUUFBUSxvQkFBaUI7SUFDdEcsQ0FBQyxNQUFNO01BQ0wsSUFBSSxDQUFDc2xCLEtBQUssV0FBQXJvQixNQUFBLENBQVdpTSxRQUFRLENBQUM0YyxRQUFRLENBQUNDLElBQUksaUJBQUE5b0IsTUFBQSxDQUFjLElBQUksQ0FBQzhlLE1BQU0sZ0JBQUE5ZSxNQUFBLENBQWEsSUFBSSxDQUFDK0MsUUFBUSxvQkFBaUI7SUFDakg7SUFFQSxJQUFJLElBQUksQ0FBQ3VsQixPQUFPLEVBQUU7TUFDaEI7TUFDQSxJQUFJLENBQUN6SixPQUFPLEdBQUcsdUJBQXVCO0lBQ3hDLENBQUMsTUFBTTtNQUNMLElBQUksQ0FBQ0EsT0FBTyxNQUFBN2UsTUFBQSxDQUFNaU0sUUFBUSxDQUFDNGMsUUFBUSxDQUFDRSxRQUFRLFFBQUEvb0IsTUFBQSxDQUFLaU0sUUFBUSxDQUFDNGMsUUFBUSxDQUFDQyxJQUFJLENBQUU7SUFDM0U7SUFFQTtJQUNBLElBQUksQ0FBQ0UsVUFBVSxHQUFHLElBQUl4SyxrQkFBa0IsRUFBRTtJQUUxQztJQUNBLElBQUksQ0FBQ3dLLFVBQVUsQ0FBQ2hLLFVBQVUsQ0FBQyxJQUFJLENBQUNILE9BQU8sQ0FBQztJQUV4QztJQUNBLElBQUksQ0FBQ21LLFVBQVUsQ0FBQy9KLFNBQVMsQ0FBQyxJQUFJLENBQUNILE1BQU0sQ0FBQztJQUV0QztJQUNBLElBQUksQ0FBQ21LLHdCQUF3QixFQUFFO0lBQy9CLElBQUksQ0FBQ0QsVUFBVSxDQUFDOUosWUFBWSxDQUFDLElBQUksQ0FBQ21KLEtBQUssQ0FBQztFQUMxQztFQUVBOzs7O0VBQUEsT0FBQWp0QixjQUFBLENBQUFndEIsV0FBQTtJQUFBL3NCLEdBQUE7SUFBQUMsS0FBQSxFQUlRLFNBQUFtdEIsbUJBQW1CQSxDQUFBO01BQ3pCLElBQU1TLFNBQVMsR0FBRyxJQUFJQyxlQUFlLENBQUNsbkIsTUFBTSxDQUFDNG1CLFFBQVEsQ0FBQ08sTUFBTSxDQUFDO01BQzdELElBQU1DLElBQUksR0FBR3BuQixNQUFNLENBQUM0bUIsUUFBUSxDQUFDUyxRQUFRO01BRXJDLElBQUl4SyxNQUFNLEdBQUcsRUFBRTtNQUVmO01BQ0EsSUFBSUEsTUFBTSxJQUFJLEVBQUUsRUFBRTtRQUNoQjtRQUNBQSxNQUFNLEdBQUdvSyxTQUFTLENBQUNwWSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtRQUN0QzNTLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHFEQUFxRCxFQUFFNGdCLE1BQU0sQ0FBQztNQUM1RTtNQUNBLElBQUlBLE1BQU0sSUFBSSxFQUFFLEVBQUU7UUFDaEI7UUFDQUEsTUFBTSxHQUFHdUssSUFBSSxDQUFDMXRCLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCd0MsT0FBTyxDQUFDRCxHQUFHLENBQUMsK0NBQStDLEVBQUU0Z0IsTUFBTSxDQUFDO01BQ3RFO01BQ0EsSUFBSSxDQUFDNWpCLFdBQVcsQ0FBQ1UsU0FBUyxDQUFDa2pCLE1BQU0sQ0FBQyxFQUFFO1FBQ2xDQSxNQUFNLEdBQUcsRUFBRTtNQUNiO01BRUE7TUFDQSxJQUFJLENBQUNBLE1BQU0sSUFBSUEsTUFBTSxLQUFLLEVBQUUsRUFBRTtRQUM1QjtRQUNBLElBQUl5SyxXQUFXLEdBQUc5YyxZQUFZLENBQUMrYyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2hELElBQUlELFdBQVcsRUFBRTtVQUNmekssTUFBTSxHQUFHeUssV0FBVztRQUN0QjtRQUNBO1FBQ0EsSUFBSSxDQUFDcnVCLFdBQVcsQ0FBQ1UsU0FBUyxDQUFDMnRCLFdBQVcsSUFBSSxFQUFFLENBQUMsRUFBRTtVQUM3Q0EsV0FBVyxHQUFHcnVCLFdBQVcsQ0FBQ0ssVUFBVSxFQUFFO1VBQ3RDa1IsWUFBWSxDQUFDZ2QsT0FBTyxDQUFDLFFBQVEsRUFBRUYsV0FBVyxDQUFDO1VBQzNDcHJCLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHVCQUF1QixFQUFFcXJCLFdBQVcsQ0FBQztVQUNqRCxJQUFJQSxXQUFXLEVBQUU7WUFDZnpLLE1BQU0sR0FBR3lLLFdBQVc7VUFDdEI7UUFDRixDQUFDLE1BQU07VUFDTHByQixPQUFPLENBQUNELEdBQUcsQ0FBQyxxQkFBcUIsRUFBRXFyQixXQUFXLENBQUM7UUFDakQ7UUFDQTtRQUNBLElBQUksSUFBSSxDQUFDakIsT0FBTyxFQUFFO1VBQ2hCO1VBQ0E7UUFBQSxDQUNELE1BQU07VUFDTDtVQUNBO1FBQUE7UUFHRixPQUFPeEosTUFBTSxDQUFDLENBQUM7TUFDakI7TUFFQTtNQUNBclMsWUFBWSxDQUFDZ2QsT0FBTyxDQUFDLFFBQVEsRUFBRTNLLE1BQU0sQ0FBQztNQUN0QzNnQixPQUFPLENBQUNELEdBQUcsQ0FBQyxpQkFBaUIsRUFBRTRnQixNQUFNLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQ3dKLE9BQU8sQ0FBQztNQUNuRSxPQUFPeEosTUFBTTtJQUNmO0lBRUE7OztFQUFBO0lBQUF6akIsR0FBQTtJQUFBQyxLQUFBLEVBR1EsU0FBQW90QixxQkFBcUJBLENBQUE7TUFDM0I7TUFDQSxJQUFJM2xCLFFBQVEsR0FBRzBKLFlBQVksQ0FBQytjLE9BQU8sQ0FBQyxVQUFVLENBQUM7TUFFL0M7TUFDQSxJQUFJLENBQUN6bUIsUUFBUSxFQUFFO1FBQ2JBLFFBQVEsR0FBRzdILFdBQVcsQ0FBQ0ssVUFBVSxFQUFFO1FBQ25Da1IsWUFBWSxDQUFDZ2QsT0FBTyxDQUFDLFVBQVUsRUFBRTFtQixRQUFRLENBQUM7UUFDMUM1RSxPQUFPLENBQUNELEdBQUcsQ0FBQyx5QkFBeUIsRUFBRTZFLFFBQVEsQ0FBQztNQUNsRCxDQUFDLE1BQU07UUFDTDVFLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHVCQUF1QixFQUFFNkUsUUFBUSxDQUFDO01BQ2hEO01BRUEsT0FBT0EsUUFBUTtJQUNqQjtJQUVBOzs7RUFBQTtJQUFBMUgsR0FBQTtJQUFBQyxLQUFBLEVBR1EsU0FBQTJ0Qix3QkFBd0JBLENBQUE7TUFBQSxJQUFBNW9CLEtBQUE7TUFDOUIsSUFBTXVlLFNBQVMsR0FBZ0M7UUFDN0MvZ0IsV0FBVyxFQUFFLFNBQWJBLFdBQVdBLENBQUdnaUIsTUFBa0IsRUFBSTtVQUNsQzFoQixPQUFPLENBQUNELEdBQUcsQ0FBQyxzQkFBc0IsRUFBRTJoQixNQUFNLENBQUM7VUFDM0N4ZixLQUFJLENBQUNxcEIsZUFBZSxDQUFDN0osTUFBTSxDQUFDO1FBQzlCLENBQUM7UUFDRGMsZUFBZSxFQUFFLFNBQWpCQSxlQUFlQSxDQUFHNWQsUUFBZ0IsRUFBSTtVQUNwQzVFLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLDBCQUEwQixFQUFFNkUsUUFBUSxDQUFDO1VBQ2pEMUMsS0FBSSxDQUFDc3BCLGVBQWUsQ0FBQzVtQixRQUFRLENBQUM7VUFFOUI7VUFDQSxJQUFNNm1CLFVBQVUsR0FBR3ZwQixLQUFJLENBQUMyb0IsVUFBVSxDQUFDckIsYUFBYSxFQUFFO1VBQ2xELElBQUlpQyxVQUFVLENBQUM5dEIsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMzQnVFLEtBQUksQ0FBQ3dwQixzQkFBc0IsRUFBRTtVQUMvQjtRQUNGLENBQUM7UUFDRGhHLFlBQVksRUFBRSxTQUFkQSxZQUFZQSxDQUFHOWdCLFFBQWdCLEVBQUV1ZCxPQUFvQixFQUFJO1VBQ3ZEbmlCLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHVCQUF1QixFQUFFNkUsUUFBUSxFQUFFdWQsT0FBTyxDQUFDO1VBQ3ZEO1VBQ0EsSUFBTTRGLFlBQVksR0FBRzdsQixLQUFJLENBQUMyb0IsVUFBVSxDQUFDdEIsZUFBZSxFQUFFO1VBQ3RELElBQUl4QixZQUFZLElBQUlBLFlBQVksQ0FBQ25qQixRQUFRLEtBQUtBLFFBQVEsRUFBRTtZQUN0RDFDLEtBQUksQ0FBQ3lwQixnQkFBZ0IsQ0FBQy9tQixRQUFRLEVBQUV1ZCxPQUFPLENBQUM7WUFDeEM7WUFDQWpnQixLQUFJLENBQUMwcEIsc0JBQXNCLENBQUN6SixPQUFPLENBQUM7VUFDdEM7UUFDRixDQUFDO1FBQ0R5RyxnQkFBZ0IsRUFBRSxTQUFsQkEsZ0JBQWdCQSxDQUFHaGtCLFFBQWdCLEVBQUU1RyxTQUFpQixFQUFJO1VBQ3hEZ0MsT0FBTyxDQUFDRCxHQUFHLENBQUMsMkJBQTJCLEVBQUU2RSxRQUFRLEVBQUU1RyxTQUFTLENBQUM7VUFDN0RrRSxLQUFJLENBQUMycEIsZ0JBQWdCLENBQUM3dEIsU0FBUyxDQUFDO1VBRWhDO1VBQ0EsSUFBTStwQixZQUFZLEdBQUc3bEIsS0FBSSxDQUFDMm9CLFVBQVUsQ0FBQ3RCLGVBQWUsRUFBRTtVQUN0RCxJQUFJeEIsWUFBWSxJQUFJQSxZQUFZLENBQUNuakIsUUFBUSxLQUFLQSxRQUFRLEVBQUU7WUFDdEQxQyxLQUFJLENBQUM0cEIsaUJBQWlCLENBQUMvRCxZQUFZLENBQUM7VUFDdEM7UUFDRixDQUFDO1FBQ0RILHFCQUFxQixFQUFFLFNBQXZCQSxxQkFBcUJBLENBQUdoakIsUUFBZ0IsRUFBRTZOLE1BQWdELEVBQUk7VUFDNUZ6UyxPQUFPLENBQUNELEdBQUcsQ0FBQyxpQ0FBaUMsRUFBRTZFLFFBQVEsRUFBRTZOLE1BQU0sQ0FBQztVQUNoRXZRLEtBQUksQ0FBQzZwQixxQkFBcUIsQ0FBQ25uQixRQUFRLEVBQUU2TixNQUFNLENBQUM7UUFDOUMsQ0FBQztRQUNEZ1Ysc0JBQXNCLEVBQUUsU0FBeEJBLHNCQUFzQkEsQ0FBRzdpQixRQUFnQixFQUFFNUcsU0FBaUIsRUFBRXlVLE1BQWdELEVBQUk7VUFDaEh6UyxPQUFPLENBQUNELEdBQUcsQ0FBQyxrQ0FBa0MsRUFBRTZFLFFBQVEsRUFBRTVHLFNBQVMsRUFBRXlVLE1BQU0sQ0FBQztVQUM1RXZRLEtBQUksQ0FBQzhwQixzQkFBc0IsQ0FBQ2h1QixTQUFTLEVBQUV5VSxNQUFNLENBQUM7UUFDaEQsQ0FBQztRQUNEdVYscUJBQXFCLEVBQUUsU0FBdkJBLHFCQUFxQkEsQ0FBR3RHLE1BQXlCLEVBQUk7VUFDbkQxaEIsT0FBTyxDQUFDRCxHQUFHLENBQUMsaUNBQWlDLEVBQUUyaEIsTUFBTSxDQUFDO1VBQ3REMWhCLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLFlBQVksRUFBRTJoQixNQUFNLGFBQU5BLE1BQU0sdUJBQU5BLE1BQU0sQ0FBRTljLFFBQVEsRUFBRSxjQUFjLEVBQUU4YyxNQUFNLGFBQU5BLE1BQU0sdUJBQU5BLE1BQU0sQ0FBRXZkLElBQUksQ0FBQztVQUN6RWpDLEtBQUksQ0FBQytwQixxQkFBcUIsQ0FBQ3ZLLE1BQU0sQ0FBQztVQUNsQztVQUNBeGYsS0FBSSxDQUFDNHBCLGlCQUFpQixDQUFDcEssTUFBTSxDQUFDO1VBRTlCLElBQUlBLE1BQU0sRUFBRTtZQUNWO1lBQ0F4ZixLQUFJLENBQUNncUIsc0JBQXNCLEVBQUU7VUFDL0IsQ0FBQyxNQUFNO1lBQ0w7WUFDQWhxQixLQUFJLENBQUN3cEIsc0JBQXNCLEVBQUU7VUFDL0I7UUFDRixDQUFDO1FBQ0R2RCxzQkFBc0IsRUFBRSxTQUF4QkEsc0JBQXNCQSxDQUFHaEcsT0FBMkIsRUFBSTtVQUN0RG5pQixPQUFPLENBQUNELEdBQUcsQ0FBQyxrQ0FBa0MsRUFBRW9pQixPQUFPLENBQUM7VUFDeERqZ0IsS0FBSSxDQUFDMHBCLHNCQUFzQixDQUFDekosT0FBTyxDQUFDO1VBQ3BDO1VBQ0FqZ0IsS0FBSSxDQUFDaXFCLGdCQUFnQixFQUFFO1VBQ3ZCO1VBQ0EsSUFBSWhLLE9BQU8sRUFBRTtZQUNYamdCLEtBQUksQ0FBQ2txQixZQUFZLENBQUNqSyxPQUFPLENBQUM7VUFDNUI7UUFDRixDQUFDO1FBQ0RoakIsYUFBYSxFQUFFLFNBQWZBLGFBQWFBLENBQUduQixTQUFpQixFQUFFdUcsT0FBZSxFQUFFaVMsUUFBZ0IsRUFBSTtVQUN0RXhXLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHdCQUF3QixFQUFFO1lBQUUvQixTQUFTLEVBQVRBLFNBQVM7WUFBRXVHLE9BQU8sRUFBUEEsT0FBTztZQUFFaVMsUUFBUSxFQUFSQTtVQUFRLENBQUUsQ0FBQztVQUN2RXRVLEtBQUksQ0FBQ21xQix1QkFBdUIsQ0FBQ3J1QixTQUFTLEVBQUV1RyxPQUFPLEVBQUVpUyxRQUFRLENBQUM7UUFDNUQsQ0FBQztRQUNENlMsbUJBQW1CLEVBQUUsU0FBckJBLG1CQUFtQkEsQ0FBR3JyQixTQUFpQixFQUFJO1VBQ3pDZ0MsT0FBTyxDQUFDRCxHQUFHLENBQUMsK0JBQStCLEVBQUUvQixTQUFTLENBQUM7VUFDdkRrRSxLQUFJLENBQUNvcUIsaUJBQWlCLENBQUN0dUIsU0FBUyxDQUFDO1FBQ25DO09BQ0Q7TUFFRCxJQUFJLENBQUM2c0IsVUFBVSxDQUFDakssWUFBWSxDQUFDSCxTQUFTLENBQUM7SUFDekM7SUFFQTs7OztFQUFBO0lBQUF2akIsR0FBQTtJQUFBQyxLQUFBLEVBSVEsU0FBQW92Qiw0QkFBNEJBLENBQUE7TUFBQSxJQUFBOXBCLE1BQUE7TUFDbEMsSUFBTStwQixXQUFXLEdBQUcxb0IsTUFBTSxDQUFDNG1CLFFBQVEsQ0FBQ0MsSUFBSTtNQUN4QyxJQUFNOEIsU0FBUyxHQUFHRCxXQUFXLENBQUM3YixLQUFLLENBQUMsR0FBRyxDQUFDO01BQ3hDLElBQU0rYixRQUFRLEdBQUdELFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXO01BQzVDLElBQU1FLElBQUksR0FBR0YsU0FBUyxDQUFDLENBQUMsQ0FBQztNQUV6QjtNQUNBLElBQU1HLFdBQVcsR0FBRzlvQixNQUFNLENBQUM0bUIsUUFBUSxDQUFDRSxRQUFRLEtBQUssUUFBUSxHQUFHLEtBQUssR0FBRyxJQUFJO01BQ3hFLElBQU1pQyxTQUFTLEdBQUdGLElBQUksSUFBSUMsV0FBVztNQUVyQztNQUNBLElBQU1FLFlBQVksR0FBR2hmLFFBQVEsQ0FBQ2lmLGdCQUFnQixDQUFDLGNBQWMsQ0FBQztNQUU5REQsWUFBWSxDQUFDamQsT0FBTyxDQUFDLFVBQUFtZCxHQUFHLEVBQUc7UUFDekIsSUFBTUMsa0JBQWtCLEdBQUdELEdBQUcsQ0FBQ0UsYUFBYSxDQUFDLGVBQWUsQ0FBQztRQUM3RCxJQUFJLENBQUNELGtCQUFrQixFQUFFO1FBRXpCLElBQU1FLFdBQVcsR0FBR0Ysa0JBQWtCLENBQUNFLFdBQVc7UUFDbEQsSUFBSSxDQUFDQSxXQUFXLEVBQUU7UUFFbEI7UUFDQSxJQUFJQSxXQUFXLENBQUNyZSxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUlxZSxXQUFXLENBQUNyZSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUlxZSxXQUFXLENBQUNyZSxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7VUFDMUc7VUFDQSxJQUFNc2UsV0FBVyxHQUFHRCxXQUFXLENBQzVCN2tCLE9BQU8sQ0FBQyxXQUFXLEVBQUVva0IsUUFBUSxDQUFDLENBQzlCcGtCLE9BQU8sQ0FBQyxTQUFTLEVBQUV1a0IsU0FBUyxDQUFDLENBQzdCdmtCLE9BQU8sQ0FBQyxXQUFXLEVBQUU3RixNQUFJLENBQUNrZSxNQUFNLENBQUM7VUFDcEM7VUFDQXNNLGtCQUFrQixDQUFDRSxXQUFXLEdBQUdDLFdBQVc7UUFDOUM7UUFFQTtRQUNBLElBQU1DLE9BQU8sR0FBR0wsR0FBRyxDQUFDRSxhQUFhLENBQUMsV0FBVyxDQUFDO1FBQzlDLElBQUlHLE9BQU8sRUFBRTtVQUNYQSxPQUFPLENBQUN2RCxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsWUFBSztZQUNyQyxJQUFNd0QsV0FBVyxHQUFHTCxrQkFBa0IsQ0FBQ0UsV0FBVyxJQUFJLEVBQUU7WUFDeEQxcUIsTUFBSSxDQUFDOHFCLGVBQWUsQ0FBQ0QsV0FBVyxDQUFDO1VBQ25DLENBQUMsQ0FBQztRQUNKO01BQ0YsQ0FBQyxDQUFDO01BRUZ0dEIsT0FBTyxDQUFDRCxHQUFHLENBQUMscUNBQXFDLEVBQUV5c0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUM3TCxNQUFNLENBQUM7SUFDekY7SUFFQTs7O0VBQUE7SUFBQXpqQixHQUFBO0lBQUFDLEtBQUEsRUFHUSxTQUFBb3dCLGVBQWVBLENBQUMxYSxJQUFZO01BQ2xDbEksU0FBUyxDQUFDNmlCLFNBQVMsQ0FBQ25ULFNBQVMsQ0FBQ3hILElBQUksQ0FBQyxDQUFDN1AsSUFBSSxDQUFDLFlBQUs7UUFDNUNoRCxPQUFPLENBQUNELEdBQUcsQ0FBQyw4QkFBOEIsRUFBRThTLElBQUksQ0FBQztNQUNuRCxDQUFDLENBQUMsU0FBTSxDQUFDLFVBQUFvUixHQUFHLEVBQUc7UUFDYmprQixPQUFPLENBQUNDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRWdrQixHQUFHLENBQUM7UUFDbEQ7UUFDQSxJQUFNd0osUUFBUSxHQUFHM2YsUUFBUSxDQUFDQyxhQUFhLENBQUMsVUFBVSxDQUFDO1FBQ25EMGYsUUFBUSxDQUFDdHdCLEtBQUssR0FBRzBWLElBQUk7UUFDckIvRSxRQUFRLENBQUNvRCxJQUFJLENBQUNxVixXQUFXLENBQUNrSCxRQUFRLENBQUM7UUFDbkNBLFFBQVEsQ0FBQ0MsTUFBTSxFQUFFO1FBQ2pCNWYsUUFBUSxDQUFDNmYsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUM1QjdmLFFBQVEsQ0FBQ29ELElBQUksQ0FBQzBjLFdBQVcsQ0FBQ0gsUUFBUSxDQUFDO01BQ3JDLENBQUMsQ0FBQztJQUNKO0lBRUE7OztFQUFBO0lBQUF2d0IsR0FBQTtJQUFBQyxLQUFBO01BQUEsSUFBQTB3QixXQUFBLEdBQUF0b0IsbUJBQUEsY0FBQUMsY0FBQSxHQUFBQyxDQUFBLENBR08sU0FBQUMsUUFBQTtRQUFBLE9BQUFGLGNBQUEsR0FBQUssQ0FBQSxXQUFBQyxRQUFBO1VBQUEsa0JBQUFBLFFBQUEsQ0FBQUUsQ0FBQTtZQUFBO2NBQ0w7Y0FDQSxJQUFJLENBQUM2a0IsVUFBVSxDQUFDakIsVUFBVSxFQUFFO2NBRTVCO2NBQ0EsSUFBSSxDQUFDa0Usa0JBQWtCLEVBQUU7Y0FDekI7Y0FDQSxJQUFJLENBQUN2Qiw0QkFBNEIsRUFBRTtjQUVuQztjQUNBLElBQUksQ0FBQ2Isc0JBQXNCLEVBQUU7Y0FFN0I7Y0FDQSxJQUFJLENBQUNiLFVBQVUsQ0FBQ3RHLFlBQVksRUFBRTtZQUFDO2NBQUEsT0FBQXplLFFBQUEsQ0FBQUksQ0FBQTtVQUFBO1FBQUEsR0FBQVIsT0FBQTtNQUFBLENBQ2hDO01BQUEsU0FkWWtrQixVQUFVQSxDQUFBO1FBQUEsT0FBQWlFLFdBQUEsQ0FBQXhuQixLQUFBLE9BQUFwSSxTQUFBO01BQUE7TUFBQSxPQUFWMnJCLFVBQVU7SUFBQTtJQWdCdkI7OztJQUFBO0VBQUE7SUFBQTFzQixHQUFBO0lBQUFDLEtBQUEsRUFHUSxTQUFBb3VCLGVBQWVBLENBQUM3SCxVQUFzQjtNQUFBLElBQUFqZ0IsTUFBQTtNQUM1QyxJQUFNc3FCLGFBQWEsR0FBR2pnQixRQUFRLENBQUNvWSxjQUFjLENBQUMsU0FBUyxDQUFDO01BQ3hELElBQU04SCxTQUFTLEdBQUdsZ0IsUUFBUSxDQUFDb1ksY0FBYyxDQUFDLGdCQUFnQixDQUFDO01BRTNELElBQUksQ0FBQzZILGFBQWEsSUFBSSxDQUFDQyxTQUFTLEVBQUU7UUFDaEMsTUFBTSxJQUFJamIsS0FBSyxDQUFDLGlDQUFpQyxDQUFDO01BQ3BEO01BRUE7TUFDQSxJQUFNa2IsYUFBYSxHQUFHbmdCLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLEtBQUssQ0FBQztNQUNuRGtnQixhQUFhLENBQUNDLFNBQVMsR0FBRyxRQUFRO01BQ2xDRCxhQUFhLENBQUN2d0IsRUFBRSxNQUFBbUUsTUFBQSxDQUFNNmhCLFVBQVUsQ0FBQzllLFFBQVEsQ0FBRTtNQUMzQ3FwQixhQUFhLENBQUNFLFNBQVMsR0FBRyxJQUFJO01BRTlCbnVCLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHNDQUFzQyxLQUFBOEIsTUFBQSxDQUFLNmhCLFVBQVUsQ0FBQzllLFFBQVEsR0FBSSxhQUFhLEVBQUU4ZSxVQUFVLENBQUM7TUFFeEd1SyxhQUFhLENBQUNHLFNBQVMsK0RBQUF2c0IsTUFBQSxDQUMyQjZoQixVQUFVLENBQUM5ZSxRQUFRLHNPQUFBL0MsTUFBQSxDQVF2QzZoQixVQUFVLENBQUN2ZixJQUFJLGtEQUFBdEMsTUFBQSxDQUNkNmhCLFVBQVUsQ0FBQ3poQixVQUFVLHVFQUVuRDtNQUVEO01BQ0Fnc0IsYUFBYSxDQUFDSSxPQUFPLEdBQUcsVUFBQ3hyQixLQUFLLEVBQUk7UUFDaEM7UUFDQSxJQUFJLENBQUVBLEtBQUssQ0FBQ3lCLE1BQXNCLENBQUNncUIsU0FBUyxDQUFDQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUU7VUFDckV2dUIsT0FBTyxDQUFDRCxHQUFHLENBQUMsaUJBQWlCLEVBQUUyakIsVUFBVSxDQUFDOWUsUUFBUSxFQUFFOGUsVUFBVSxDQUFDdmYsSUFBSSxDQUFDO1VBQ3BFVixNQUFJLENBQUNvbkIsVUFBVSxDQUFDbkcsV0FBVyxDQUFDaEIsVUFBVSxDQUFDOWUsUUFBUSxDQUFDO1FBQ2xEO01BQ0YsQ0FBQztNQUVEO01BQ0EsSUFBTTRwQixXQUFXLEdBQUdQLGFBQWEsQ0FBQ2YsYUFBYSxDQUFDLGVBQWUsQ0FBc0I7TUFDckYsSUFBSXNCLFdBQVcsRUFBRTtRQUNmQSxXQUFXLENBQUNILE9BQU8sR0FBRyxVQUFDeHJCLEtBQUssRUFBSTtVQUM5QkEsS0FBSyxDQUFDNHJCLGVBQWUsRUFBRSxDQUFDLENBQUM7VUFDekJockIsTUFBSSxDQUFDNGdCLFdBQVcsQ0FBQ1gsVUFBVSxDQUFDOWUsUUFBUSxJQUFJOGUsVUFBVSxDQUFDOWUsUUFBUSxDQUFDO1FBQzlELENBQUM7TUFDSDtNQUVBO01BQ0EsSUFBSSxDQUFDOHBCLGdCQUFnQixDQUFDVCxhQUFhLEVBQUUsUUFBUSxDQUFDO01BRTlDRixhQUFhLENBQUNZLFlBQVksQ0FBQ1YsYUFBYSxFQUFFRCxTQUFTLENBQUM7SUFDdEQ7SUFFQTs7O0VBQUE7SUFBQTl3QixHQUFBO0lBQUFDLEtBQUEsRUFHUSxTQUFBcXVCLGVBQWVBLENBQUM1bUIsUUFBZ0I7TUFDdEMsSUFBTXFwQixhQUFhLEdBQUduZ0IsUUFBUSxDQUFDb1ksY0FBYyxDQUFDdGhCLFFBQVEsQ0FBQztNQUN2RCxJQUFJcXBCLGFBQWEsRUFBRTtRQUNqQkEsYUFBYSxDQUFDVyxNQUFNLEVBQUU7TUFDeEI7SUFDRjtJQUVBOzs7RUFBQTtJQUFBMXhCLEdBQUE7SUFBQUMsS0FBQSxFQUdRLFNBQUF3dUIsZ0JBQWdCQSxDQUFDL21CLFFBQWdCLEVBQUVpZixXQUF3QjtNQUFBLElBQUFrQyxNQUFBO01BQ2pFLElBQU04SSxpQkFBaUIsR0FBRy9nQixRQUFRLENBQUNvWSxjQUFjLENBQUMsVUFBVSxDQUFDO01BQzdELElBQU00SSxhQUFhLEdBQUdoaEIsUUFBUSxDQUFDb1ksY0FBYyxDQUFDLGlCQUFpQixDQUFDO01BRWhFLElBQUksQ0FBQzJJLGlCQUFpQixJQUFJLENBQUNDLGFBQWEsRUFBRTtNQUUxQyxJQUFNQyxjQUFjLEdBQUdqaEIsUUFBUSxDQUFDQyxhQUFhLENBQUMsS0FBSyxDQUFDO01BQ3BEZ2hCLGNBQWMsQ0FBQ2IsU0FBUyxHQUFHLFNBQVM7TUFDcENhLGNBQWMsQ0FBQ3J4QixFQUFFLGNBQUFtRSxNQUFBLENBQWNnaUIsV0FBVyxDQUFDOWdCLElBQUksQ0FBQy9FLFNBQVMsQ0FBRTtNQUMzRCt3QixjQUFjLENBQUNaLFNBQVMsR0FBRyxJQUFJO01BRS9CWSxjQUFjLENBQUNYLFNBQVMsaUVBQUF2c0IsTUFBQSxDQUM0QmdpQixXQUFXLENBQUM5Z0IsSUFBSSxDQUFDL0UsU0FBUyx1T0FBQTZELE1BQUEsQ0FRL0NnaUIsV0FBVyxDQUFDOWdCLElBQUksQ0FBQ29CLElBQUksdUVBRW5EO01BRUQ7TUFDQTRxQixjQUFjLENBQUNWLE9BQU8sR0FBRyxVQUFDeHJCLEtBQUssRUFBSTtRQUNqQztRQUNBLElBQUksQ0FBRUEsS0FBSyxDQUFDeUIsTUFBc0IsQ0FBQ2dxQixTQUFTLENBQUNDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRTtVQUN0RXhJLE1BQUksQ0FBQzhFLFVBQVUsQ0FBQzNGLGVBQWUsQ0FBQ3RnQixRQUFRLEVBQUVpZixXQUFXLENBQUM5Z0IsSUFBSSxDQUFDL0UsU0FBUyxDQUFDO1FBQ3ZFO01BQ0YsQ0FBQztNQUVEO01BQ0EsSUFBTXd3QixXQUFXLEdBQUdPLGNBQWMsQ0FBQzdCLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBc0I7TUFDdkYsSUFBSXNCLFdBQVcsRUFBRTtRQUNmQSxXQUFXLENBQUNILE9BQU8sR0FBRyxVQUFDeHJCLEtBQUssRUFBSTtVQUM5QkEsS0FBSyxDQUFDNHJCLGVBQWUsRUFBRSxDQUFDLENBQUM7VUFDekIxSSxNQUFJLENBQUMzRCxZQUFZLENBQUN4ZCxRQUFRLEVBQUVpZixXQUFXLENBQUM5Z0IsSUFBSSxDQUFDL0UsU0FBUyxDQUFDO1FBQ3pELENBQUM7TUFDSDtNQUVBO01BQ0EsSUFBSSxDQUFDMHdCLGdCQUFnQixDQUFDSyxjQUFjLEVBQUUsU0FBUyxDQUFDO01BRWhERixpQkFBaUIsQ0FBQ0YsWUFBWSxDQUFDSSxjQUFjLEVBQUVELGFBQWEsQ0FBQztJQUMvRDtJQUVBOzs7RUFBQTtJQUFBNXhCLEdBQUE7SUFBQUMsS0FBQSxFQUdRLFNBQUEwdUIsZ0JBQWdCQSxDQUFDN3RCLFNBQWlCO01BQ3hDLElBQU0rd0IsY0FBYyxHQUFHamhCLFFBQVEsQ0FBQ29ZLGNBQWMsWUFBQXJrQixNQUFBLENBQVk3RCxTQUFTLENBQUUsQ0FBQztNQUN0RSxJQUFJK3dCLGNBQWMsRUFBRTtRQUNsQkEsY0FBYyxDQUFDSCxNQUFNLEVBQUU7TUFDekI7SUFDRjtJQUNBOzs7RUFBQTtJQUFBMXhCLEdBQUE7SUFBQUMsS0FBQSxFQUdRLFNBQUE0dUIscUJBQXFCQSxDQUFDbm5CLFFBQWdCLEVBQUU2TixNQUFnRDtNQUM5RixJQUFNdWMsYUFBYSxHQUFHbGhCLFFBQVEsQ0FBQ29ZLGNBQWMsa0JBQUFya0IsTUFBQSxDQUFrQitDLFFBQVEsQ0FBRSxDQUFDO01BQzFFLElBQUksQ0FBQ29xQixhQUFhLEVBQUU7TUFFcEIsUUFBUXZjLE1BQU07UUFDWixLQUFLLFdBQVc7VUFDZHVjLGFBQWEsQ0FBQzdJLEtBQUssQ0FBQ1MsVUFBVSxHQUFHLFNBQVM7VUFDMUM7UUFDRixLQUFLLGNBQWM7VUFDakJvSSxhQUFhLENBQUM3SSxLQUFLLENBQUNTLFVBQVUsR0FBRyxTQUFTO1VBQzFDO1FBQ0YsS0FBSyxTQUFTO1VBQ1pvSSxhQUFhLENBQUM3SSxLQUFLLENBQUNTLFVBQVUsR0FBRyxTQUFTO1VBQzFDO1FBQ0Y7VUFDRW9JLGFBQWEsQ0FBQzdJLEtBQUssQ0FBQ1MsVUFBVSxHQUFHLE1BQU07TUFDM0M7SUFDRjtJQUVBOzs7RUFBQTtJQUFBMXBCLEdBQUE7SUFBQUMsS0FBQSxFQUdRLFNBQUE2dUIsc0JBQXNCQSxDQUFDaHVCLFNBQWlCLEVBQUV5VSxNQUFnRDtNQUNoRyxJQUFNdWMsYUFBYSxHQUFHbGhCLFFBQVEsQ0FBQ29ZLGNBQWMsbUJBQUFya0IsTUFBQSxDQUFtQjdELFNBQVMsQ0FBRSxDQUFDO01BQzVFLElBQUksQ0FBQ2d4QixhQUFhLEVBQUU7TUFFcEIsUUFBUXZjLE1BQU07UUFDWixLQUFLLFdBQVc7VUFDZHVjLGFBQWEsQ0FBQzdJLEtBQUssQ0FBQ1MsVUFBVSxHQUFHLFNBQVM7VUFDMUM7UUFDRixLQUFLLGNBQWM7VUFDakJvSSxhQUFhLENBQUM3SSxLQUFLLENBQUNTLFVBQVUsR0FBRyxTQUFTO1VBQzFDO1FBQ0YsS0FBSyxTQUFTO1VBQ1pvSSxhQUFhLENBQUM3SSxLQUFLLENBQUNTLFVBQVUsR0FBRyxTQUFTO1VBQzFDO1FBQ0Y7VUFDRW9JLGFBQWEsQ0FBQzdJLEtBQUssQ0FBQ1MsVUFBVSxHQUFHLE1BQU07TUFDM0M7SUFDRjtJQUVBOzs7RUFBQTtJQUFBMXBCLEdBQUE7SUFBQUMsS0FBQSxFQUdRLFNBQUE4dUIscUJBQXFCQSxDQUFDdkssTUFBeUI7TUFBQSxJQUFBNEcsTUFBQTtNQUNyRHRvQixPQUFPLENBQUNELEdBQUcsQ0FBQywyQ0FBMkMsRUFBRTJoQixNQUFNLENBQUM7TUFDaEU7TUFDQTVULFFBQVEsQ0FBQ2lmLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDbGQsT0FBTyxDQUFDLFVBQUE0VSxHQUFHLEVBQUc7UUFDakRBLEdBQUcsQ0FBQzZKLFNBQVMsQ0FBQ00sTUFBTSxDQUFDLFFBQVEsQ0FBQztNQUNoQyxDQUFDLENBQUM7TUFFRixJQUFJbE4sTUFBTSxFQUFFO1FBQ1Y7UUFDQSxJQUFNdU0sYUFBYSxHQUFHbmdCLFFBQVEsQ0FBQ29ZLGNBQWMsQ0FBQ3hFLE1BQU0sQ0FBQzljLFFBQVEsQ0FBQztRQUM5RDVFLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHFDQUFxQyxLQUFBOEIsTUFBQSxDQUFLNmYsTUFBTSxDQUFDOWMsUUFBUSxHQUFJLFFBQVEsRUFBRXFwQixhQUFhLENBQUM7UUFFakcsSUFBSUEsYUFBYSxFQUFFO1VBQ2pCO1VBQ0FBLGFBQWEsQ0FBQ0ssU0FBUyxDQUFDVyxHQUFHLENBQUMsUUFBUSxDQUFDO1VBQ3JDanZCLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHdCQUF3QixFQUFFa3VCLGFBQWEsQ0FBQ3Z3QixFQUFFLENBQUM7VUFFdkQ7VUFDQSxJQUFNc3hCLGFBQWEsR0FBR2YsYUFBYSxDQUFDZixhQUFhLENBQUMsZ0JBQWdCLENBQUM7VUFDbkUsSUFBTWdDLFdBQVcsR0FBR2pCLGFBQWEsQ0FBQ2YsYUFBYSxDQUFDLGNBQWMsQ0FBQztVQUMvRCxJQUFNaUMsV0FBVyxHQUFHbEIsYUFBYSxDQUFDZixhQUFhLENBQUMsY0FBYyxDQUFDO1VBRS9ELElBQUk4QixhQUFhLEVBQUU7WUFDakI7WUFDQUEsYUFBYSxDQUFDdHhCLEVBQUUsb0JBQUFtRSxNQUFBLENBQW9CNmYsTUFBTSxDQUFDOWMsUUFBUSxDQUFFO1VBQ3ZEO1VBRUEsSUFBSXNxQixXQUFXLEVBQUU7WUFDZkEsV0FBVyxDQUFDL0IsV0FBVyxHQUFHekwsTUFBTSxDQUFDdmQsSUFBSTtVQUN2QztVQUVBLElBQUlnckIsV0FBVyxFQUFFO1lBQ2ZBLFdBQVcsQ0FBQ2hDLFdBQVcsT0FBQXRyQixNQUFBLENBQU82ZixNQUFNLENBQUN6ZixVQUFVLE1BQUc7VUFDcEQ7VUFFQTtVQUNBZ3NCLGFBQWEsQ0FBQ0ksT0FBTyxHQUFHLFVBQUN4ckIsS0FBSyxFQUFJO1lBQ2hDLElBQUksQ0FBRUEsS0FBSyxDQUFDeUIsTUFBc0IsQ0FBQ2dxQixTQUFTLENBQUNDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRTtjQUNyRXZ1QixPQUFPLENBQUNELEdBQUcsQ0FBQyxpQkFBaUIsRUFBRTJoQixNQUFNLENBQUM5YyxRQUFRLEVBQUU4YyxNQUFNLENBQUN2ZCxJQUFJLENBQUM7Y0FDNURta0IsTUFBSSxDQUFDdUMsVUFBVSxDQUFDbkcsV0FBVyxDQUFDaEQsTUFBTSxDQUFDOWMsUUFBUSxDQUFDO1lBQzlDO1VBQ0YsQ0FBQztVQUVELElBQU00cEIsV0FBVyxHQUFHUCxhQUFhLENBQUNmLGFBQWEsQ0FBQyxlQUFlLENBQXNCO1VBQ3JGLElBQUlzQixXQUFXLEVBQUU7WUFDZkEsV0FBVyxDQUFDSCxPQUFPLEdBQUcsVUFBQ3hyQixLQUFLLEVBQUk7Y0FDOUJBLEtBQUssQ0FBQzRyQixlQUFlLEVBQUU7Y0FDdkJuRyxNQUFJLENBQUNqRSxXQUFXLENBQUMzQyxNQUFNLENBQUM5YyxRQUFRLENBQUM7WUFDbkMsQ0FBQztVQUNIO1FBQ0YsQ0FBQyxNQUFNO1VBQ0w1RSxPQUFPLENBQUNDLEtBQUssQ0FBQyxrQ0FBa0MsS0FBQTRCLE1BQUEsQ0FBSzZmLE1BQU0sQ0FBQzljLFFBQVEsQ0FBRSxDQUFDO1VBQ3ZFO1VBQ0EsSUFBTTZtQixVQUFVLEdBQUczZCxRQUFRLENBQUNpZixnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7VUFDdkQvc0IsT0FBTyxDQUFDRCxHQUFHLENBQUMsNEJBQTRCLEVBQUVvUCxLQUFLLENBQUN5RSxJQUFJLENBQUM2WCxVQUFVLENBQUMsQ0FBQzNYLEdBQUcsQ0FBQyxVQUFBc2IsRUFBRTtZQUFBLE9BQUlBLEVBQUUsQ0FBQzF4QixFQUFFO1VBQUEsRUFBQyxDQUFDO1FBQ3BGO01BQ0YsQ0FBQyxNQUFNO1FBQ0xzQyxPQUFPLENBQUNELEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQztNQUMxRDtJQUNGO0lBRUE7OztFQUFBO0lBQUE3QyxHQUFBO0lBQUFDLEtBQUEsRUFHUSxTQUFBeXVCLHNCQUFzQkEsQ0FBQ3pKLE9BQTJCO01BQ3hEO01BQ0FyVSxRQUFRLENBQUNpZixnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQ2xkLE9BQU8sQ0FBQyxVQUFBNFUsR0FBRyxFQUFHO1FBQ2xEQSxHQUFHLENBQUM2SixTQUFTLENBQUNNLE1BQU0sQ0FBQyxRQUFRLENBQUM7TUFDaEMsQ0FBQyxDQUFDO01BRUYsSUFBSXpNLE9BQU8sRUFBRTtRQUNYLElBQU00TSxjQUFjLEdBQUdqaEIsUUFBUSxDQUFDb1ksY0FBYyxZQUFBcmtCLE1BQUEsQ0FBWXNnQixPQUFPLENBQUNwZixJQUFJLENBQUMvRSxTQUFTLENBQUUsQ0FBQztRQUNuRixJQUFJK3dCLGNBQWMsRUFBRTtVQUNsQkEsY0FBYyxDQUFDVCxTQUFTLENBQUNXLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDeEM7TUFDRjtJQUNGO0lBRUE7OztFQUFBO0lBQUEveEIsR0FBQTtJQUFBQyxLQUFBLEVBR1EsU0FBQTJ1QixpQkFBaUJBLENBQUNwSyxNQUF5QjtNQUFBLElBQUFtSSxNQUFBO01BQ2pELElBQU1nRixpQkFBaUIsR0FBRy9nQixRQUFRLENBQUNvWSxjQUFjLENBQUMsVUFBVSxDQUFDO01BQzdELElBQU00SSxhQUFhLEdBQUdoaEIsUUFBUSxDQUFDb1ksY0FBYyxDQUFDLGlCQUFpQixDQUFDO01BRWhFLElBQUksQ0FBQzJJLGlCQUFpQixJQUFJLENBQUNDLGFBQWEsRUFBRTtNQUUxQztNQUNBLElBQU1PLGdCQUFnQixHQUFHUixpQkFBaUIsQ0FBQzlCLGdCQUFnQixDQUFDLFVBQVUsQ0FBQztNQUN2RXNDLGdCQUFnQixDQUFDeGYsT0FBTyxDQUFDLFVBQUFzUyxPQUFPO1FBQUEsT0FBSUEsT0FBTyxDQUFDeU0sTUFBTSxFQUFFO01BQUEsRUFBQztNQUVyRCxJQUFJbE4sTUFBTSxJQUFJQSxNQUFNLENBQUNHLFFBQVEsQ0FBQ2xrQixNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3hDO1FBQ0ErakIsTUFBTSxDQUFDRyxRQUFRLENBQUNoUyxPQUFPLENBQUMsVUFBQXNTLE9BQU8sRUFBRztVQUNoQzBILE1BQUksQ0FBQzhCLGdCQUFnQixDQUFDakssTUFBTSxDQUFDOWMsUUFBUSxFQUFFdWQsT0FBTyxDQUFDO1FBQ2pELENBQUMsQ0FBQztNQUNKO0lBQ0Y7SUFFQTs7O0VBQUE7SUFBQWpsQixHQUFBO0lBQUFDLEtBQUEsRUFHUSxTQUFBZ3ZCLGdCQUFnQkEsQ0FBQTtNQUN0QixJQUFNVixVQUFVLEdBQUcsSUFBSSxDQUFDWixVQUFVLENBQUNyQixhQUFhLEVBQUU7TUFDbERpQyxVQUFVLENBQUM1YixPQUFPLENBQUMsVUFBQTZSLE1BQU0sRUFBRztRQUMxQkEsTUFBTSxDQUFDRyxRQUFRLENBQUNoUyxPQUFPLENBQUMsVUFBQXNTLE9BQU8sRUFBRztVQUNoQyxJQUFNaUQsV0FBVyxHQUFHdFgsUUFBUSxDQUFDb1ksY0FBYyxhQUFBcmtCLE1BQUEsQ0FBYXNnQixPQUFPLENBQUNwZixJQUFJLENBQUMvRSxTQUFTLENBQUUsQ0FBQztVQUNqRixJQUFJb25CLFdBQVcsRUFBRTtZQUNmQSxXQUFXLENBQUNlLEtBQUssQ0FBQ0MsT0FBTyxHQUFHLE1BQU07VUFDcEM7UUFDRixDQUFDLENBQUM7TUFDSixDQUFDLENBQUM7SUFDSjtJQUVBOzs7RUFBQTtJQUFBbHBCLEdBQUE7SUFBQUMsS0FBQSxFQUdRLFNBQUFteUIsbUJBQW1CQSxDQUFDNU4sTUFBa0I7TUFDNUNBLE1BQU0sQ0FBQ0csUUFBUSxDQUFDaFMsT0FBTyxDQUFDLFVBQUFzUyxPQUFPLEVBQUc7UUFDaEMsSUFBTWlELFdBQVcsR0FBR3RYLFFBQVEsQ0FBQ29ZLGNBQWMsYUFBQXJrQixNQUFBLENBQWFzZ0IsT0FBTyxDQUFDcGYsSUFBSSxDQUFDL0UsU0FBUyxDQUFFLENBQUM7UUFDakYsSUFBSW9uQixXQUFXLEVBQUU7VUFDZkEsV0FBVyxDQUFDZSxLQUFLLENBQUNDLE9BQU8sR0FBRyxPQUFPO1FBQ3JDO01BQ0YsQ0FBQyxDQUFDO0lBQ0o7SUFFQTs7O0VBQUE7SUFBQWxwQixHQUFBO0lBQUFDLEtBQUEsRUFHUSxTQUFBaXZCLFlBQVlBLENBQUNqSyxPQUFvQjtNQUN2QyxJQUFNaUQsV0FBVyxHQUFHdFgsUUFBUSxDQUFDb1ksY0FBYyxhQUFBcmtCLE1BQUEsQ0FBYXNnQixPQUFPLENBQUNwZixJQUFJLENBQUMvRSxTQUFTLENBQUUsQ0FBQztNQUNqRixJQUFJb25CLFdBQVcsRUFBRTtRQUNmQSxXQUFXLENBQUNlLEtBQUssQ0FBQ0MsT0FBTyxHQUFHLE9BQU87TUFDckM7SUFDRjtJQUNBOzs7RUFBQTtJQUFBbHBCLEdBQUE7SUFBQUMsS0FBQSxFQUdPLFNBQUFveUIsY0FBY0EsQ0FBQzNxQixRQUFnQjtNQUNwQyxJQUFNOGMsTUFBTSxHQUFHLElBQUksQ0FBQ21KLFVBQVUsQ0FBQ3JCLGFBQWEsRUFBRSxDQUFDL0gsSUFBSSxDQUFDLFVBQUEvRCxDQUFDO1FBQUEsT0FBSUEsQ0FBQyxDQUFDOVksUUFBUSxLQUFLQSxRQUFRO01BQUEsRUFBQztNQUNqRixJQUFJOGMsTUFBTSxFQUFFO1FBQ1YsSUFBSSxDQUFDbUosVUFBVSxDQUFDbkcsV0FBVyxDQUFDaEQsTUFBTSxDQUFDOWMsUUFBUSxDQUFDO01BQzlDO0lBQ0Y7SUFFQTs7O0VBQUE7SUFBQTFILEdBQUE7SUFBQUMsS0FBQSxFQUdPLFNBQUErbkIsZUFBZUEsQ0FBQ3RnQixRQUFnQixFQUFFNUcsU0FBaUI7TUFDeEQsSUFBTTBqQixNQUFNLEdBQUcsSUFBSSxDQUFDbUosVUFBVSxDQUFDckIsYUFBYSxFQUFFLENBQUMvSCxJQUFJLENBQUMsVUFBQS9ELENBQUM7UUFBQSxPQUFJQSxDQUFDLENBQUM5WSxRQUFRLEtBQUtBLFFBQVE7TUFBQSxFQUFDO01BQ2pGLElBQUk4YyxNQUFNLEVBQUU7UUFDVixJQUFJLENBQUNtSixVQUFVLENBQUMzRixlQUFlLENBQUN4RCxNQUFNLENBQUM5YyxRQUFRLEVBQUU1RyxTQUFTLENBQUM7TUFDN0Q7SUFDRjtJQUVBOzs7RUFBQTtJQUFBZCxHQUFBO0lBQUFDLEtBQUEsRUFHTyxTQUFBa25CLFdBQVdBLENBQUN6ZixRQUFnQjtNQUNqQyxJQUFNOGMsTUFBTSxHQUFHLElBQUksQ0FBQ21KLFVBQVUsQ0FBQ3JCLGFBQWEsRUFBRSxDQUFDL0gsSUFBSSxDQUFDLFVBQUEvRCxDQUFDO1FBQUEsT0FBSUEsQ0FBQyxDQUFDOVksUUFBUSxLQUFLQSxRQUFRO01BQUEsRUFBQztNQUNqRixJQUFJOGMsTUFBTSxFQUFFO1FBQ1YsSUFBSSxDQUFDbUosVUFBVSxDQUFDeEcsV0FBVyxDQUFDM0MsTUFBTSxDQUFDOWMsUUFBUSxDQUFDO01BQzlDO0lBQ0Y7SUFFQTs7O0VBQUE7SUFBQTFILEdBQUE7SUFBQUMsS0FBQSxFQUdPLFNBQUFpbEIsWUFBWUEsQ0FBQ3hkLFFBQWdCLEVBQUU1RyxTQUFpQjtNQUNyRCxJQUFNMGpCLE1BQU0sR0FBRyxJQUFJLENBQUNtSixVQUFVLENBQUNyQixhQUFhLEVBQUUsQ0FBQy9ILElBQUksQ0FBQyxVQUFBL0QsQ0FBQztRQUFBLE9BQUlBLENBQUMsQ0FBQzlZLFFBQVEsS0FBS0EsUUFBUTtNQUFBLEVBQUM7TUFDakYsSUFBSThjLE1BQU0sRUFBRTtRQUNWLElBQUksQ0FBQ21KLFVBQVUsQ0FBQ3pJLFlBQVksQ0FBQ1YsTUFBTSxDQUFDOWMsUUFBUSxFQUFFNUcsU0FBUyxDQUFDO01BQzFEO0lBQ0Y7SUFFQTs7O0VBQUE7SUFBQWQsR0FBQTtJQUFBQyxLQUFBLEVBR1EsU0FBQTJ3QixrQkFBa0JBLENBQUE7TUFBQSxJQUFBMEIsTUFBQTtNQUN4QjtNQUNBLElBQU1WLGFBQWEsR0FBR2hoQixRQUFRLENBQUNvWSxjQUFjLENBQUMsaUJBQWlCLENBQUM7TUFDaEUsSUFBSTRJLGFBQWEsRUFBRTtRQUNqQjl1QixPQUFPLENBQUNELEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQztRQUM1RCt1QixhQUFhLENBQUNULE9BQU8sR0FBRyxZQUFLO1VBQzNCcnVCLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLDRCQUE0QixDQUFDO1VBQ3pDeXZCLE1BQUksQ0FBQzdKLGdCQUFnQixFQUFFO1FBQ3pCLENBQUM7TUFDSCxDQUFDLE1BQU07UUFDTDNsQixPQUFPLENBQUNDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQztNQUNoRDtNQUVBO01BQ0EsSUFBTXd2QixZQUFZLEdBQUczaEIsUUFBUSxDQUFDb1ksY0FBYyxDQUFDLGdCQUFnQixDQUFDO01BQzlELElBQUl1SixZQUFZLEVBQUU7UUFDaEJ6dkIsT0FBTyxDQUFDRCxHQUFHLENBQUMsOENBQThDLENBQUM7UUFDM0QwdkIsWUFBWSxDQUFDcEIsT0FBTyxHQUFHLFlBQUs7VUFDMUJydUIsT0FBTyxDQUFDRCxHQUFHLENBQUMsMkJBQTJCLENBQUM7VUFDeEN5dkIsTUFBSSxDQUFDOUQsc0JBQXNCLEVBQUU7UUFDL0IsQ0FBQztNQUNILENBQUMsTUFBTTtRQUNMMXJCLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLDhCQUE4QixDQUFDO01BQy9DO01BRUE7TUFDQTZELE1BQU0sQ0FBQ2dtQixnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsWUFBSztRQUNyQyxJQUFNbkgsYUFBYSxHQUFHNk0sTUFBSSxDQUFDM0UsVUFBVSxDQUFDakksZ0JBQWdCLEVBQUU7UUFDeEQsSUFBSUQsYUFBYSxJQUFJQSxhQUFhLENBQUMwQyxRQUFRLEVBQUU7VUFDM0N0aEIsVUFBVSxDQUFDLFlBQUs7WUFBQSxJQUFBZ21CLHFCQUFBO1lBQ2QsQ0FBQUEscUJBQUEsR0FBQXBILGFBQWEsQ0FBQzBDLFFBQVEsY0FBQTBFLHFCQUFBLGVBQXRCQSxxQkFBQSxDQUF3QjFCLEdBQUcsRUFBRTtVQUMvQixDQUFDLEVBQUUsR0FBRyxDQUFDO1FBQ1Q7TUFDRixDQUFDLENBQUM7TUFDRixJQUFJLENBQUMsSUFBSSxDQUFDOEIsT0FBTyxFQUFFO1FBQ2pCcm1CLE1BQU0sQ0FBQ2dtQixnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsVUFBQy9VLENBQUMsRUFBSTtVQUV2QyxJQUFNMmEsS0FBSyxHQUFHL2tCLFNBQVMsQ0FBQ0UsUUFBUSxDQUFDMkcsV0FBVyxFQUFFLENBQUM1VCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztVQUNsRTtVQUNBLElBQU0reEIsVUFBVSxHQUNiRCxLQUFLLElBQUkzYSxDQUFDLENBQUM2YSxPQUFPLElBQUk3YSxDQUFDLENBQUM4YSxNQUFNLElBQUk5YSxDQUFDLENBQUM3WCxHQUFHLEtBQUssR0FBRztVQUFLO1VBQ3BELENBQUN3eUIsS0FBSyxJQUFJM2EsQ0FBQyxDQUFDK2EsT0FBTyxJQUFJL2EsQ0FBQyxDQUFDZ2IsUUFBUSxJQUFJaGIsQ0FBQyxDQUFDN1gsR0FBRyxLQUFLLEdBQUk7VUFBSTtVQUN4RDZYLENBQUMsQ0FBQzdYLEdBQUcsS0FBSyxLQUFLO1VBQ2pCLElBQUl5eUIsVUFBVSxFQUFFO1lBQ2Q1YSxDQUFDLENBQUNpYixjQUFjLEVBQUU7WUFDbEIsT0FBTyxDQUFDO1VBQ1Y7VUFDQSxJQUFJamIsQ0FBQyxDQUFDK2EsT0FBTyxJQUFJL2EsQ0FBQyxDQUFDOGEsTUFBTSxJQUFJOWEsQ0FBQyxDQUFDZ2IsUUFBUSxFQUFFO1lBQ3ZDaGIsQ0FBQyxDQUFDaWIsY0FBYyxFQUFFO1lBQ2xCLElBQU1yTixhQUFhLEdBQUc2TSxNQUFJLENBQUMzRSxVQUFVLENBQUNqSSxnQkFBZ0IsRUFBRTtZQUN4RCxJQUFJRCxhQUFhLEVBQUU7Y0FDakI2TSxNQUFJLENBQUMzRSxVQUFVLENBQUM5bEIsVUFBVSxDQUFDO2dCQUN6Qi9HLFNBQVMsRUFBRTJrQixhQUFhLENBQUM1ZixJQUFJLENBQUMvRSxTQUFTO2dCQUN2Q2QsR0FBRyxFQUFFNlgsQ0FBQyxDQUFDN1gsR0FBRztnQkFDVit5QixJQUFJLEVBQUVsYixDQUFDLENBQUMrYSxPQUFPO2dCQUNmSSxHQUFHLEVBQUVuYixDQUFDLENBQUM4YSxNQUFNO2dCQUNicG5CLEtBQUssRUFBRXNNLENBQUMsQ0FBQ2diO2VBQ1YsQ0FBQztZQUNKO1VBRUY7UUFFRixDQUFDLENBQUM7TUFDSjtNQUVBO01BQ0FqaUIsUUFBUSxDQUFDZ2MsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFVBQUNqbkIsS0FBSyxFQUFJO1FBQzNDLElBQU1zdEIsbUJBQW1CLEdBQUdyaUIsUUFBUSxDQUFDb1ksY0FBYyxDQUFDLHFCQUFxQixDQUFDO1FBQzFFLElBQU11SixZQUFZLEdBQUczaEIsUUFBUSxDQUFDb1ksY0FBYyxDQUFDLGdCQUFnQixDQUFDO1FBQzlELElBQUlpSyxtQkFBbUIsSUFBSUEsbUJBQW1CLENBQUM3QixTQUFTLENBQUNDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtVQUN6RTtVQUNBLElBQUksQ0FBQzRCLG1CQUFtQixDQUFDNUIsUUFBUSxDQUFDMXJCLEtBQUssQ0FBQ3lCLE1BQWMsQ0FBQyxJQUNyRCxFQUFDbXJCLFlBQVksYUFBWkEsWUFBWSxlQUFaQSxZQUFZLENBQUVsQixRQUFRLENBQUMxckIsS0FBSyxDQUFDeUIsTUFBYyxDQUFDLEdBQUU7WUFDL0M7WUFDQSxJQUFNeWpCLFlBQVksR0FBR3lILE1BQUksQ0FBQzNFLFVBQVUsQ0FBQ3RCLGVBQWUsRUFBRTtZQUN0RCxJQUFJeEIsWUFBWSxFQUFFO2NBQ2hCeUgsTUFBSSxDQUFDdEQsc0JBQXNCLEVBQUU7WUFDL0I7VUFDRjtRQUNGO01BQ0YsQ0FBQyxDQUFDO0lBQ0o7SUFFQTs7O0VBQUE7SUFBQWh2QixHQUFBO0lBQUFDLEtBQUEsRUFHTyxTQUFBd29CLGdCQUFnQkEsQ0FBQTtNQUNyQjNsQixPQUFPLENBQUNELEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQztNQUV0QyxJQUFNZ29CLFlBQVksR0FBRyxJQUFJLENBQUM4QyxVQUFVLENBQUN0QixlQUFlLEVBQUU7TUFDdEQsSUFBSSxDQUFDeEIsWUFBWSxFQUFFO1FBQ2pCL25CLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLG1EQUFtRCxDQUFDO1FBQ2hFcXdCLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQztRQUNyRDtNQUNGO01BRUFwd0IsT0FBTyxDQUFDRCxHQUFHLENBQUMsa0NBQWtDLEVBQUVnb0IsWUFBWSxDQUFDNWpCLElBQUksQ0FBQztNQUVsRTtNQUNBLElBQUksQ0FBQzBtQixVQUFVLENBQUNsRixnQkFBZ0IsQ0FBQ29DLFlBQVksQ0FBQ25qQixRQUFRLGFBQUEvQyxNQUFBLENBQWFrbUIsWUFBWSxDQUFDbEcsUUFBUSxDQUFDbGtCLE1BQU0sR0FBRyxDQUFDLENBQUUsQ0FBQztJQUN4RztJQUVBOzs7RUFBQTtJQUFBVCxHQUFBO0lBQUFDLEtBQUEsRUFHTyxTQUFBdXVCLHNCQUFzQkEsQ0FBQTtNQUMzQixJQUFNeUUsbUJBQW1CLEdBQUdyaUIsUUFBUSxDQUFDb1ksY0FBYyxDQUFDLHFCQUFxQixDQUFDO01BQzFFLElBQU11SixZQUFZLEdBQUczaEIsUUFBUSxDQUFDb1ksY0FBYyxDQUFDLGdCQUFnQixDQUFDO01BQzlELElBQU1tSyxlQUFlLEdBQUd2aUIsUUFBUSxDQUFDb1ksY0FBYyxDQUFDLFVBQVUsQ0FBQztNQUMzRCxJQUFJLENBQUNpRyxnQkFBZ0IsRUFBRTtNQUN2QixJQUFJZ0UsbUJBQW1CLEVBQUU7UUFDdkJBLG1CQUFtQixDQUFDN0IsU0FBUyxDQUFDVyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ3pDanZCLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLDJCQUEyQixDQUFDO01BQzFDO01BRUEsSUFBSTB2QixZQUFZLEVBQUU7UUFDaEJBLFlBQVksQ0FBQ25CLFNBQVMsQ0FBQ1csR0FBRyxDQUFDLHNCQUFzQixDQUFDO01BQ3BEO01BRUEsSUFBSW9CLGVBQWUsRUFBRTtRQUNuQkEsZUFBZSxDQUFDbEssS0FBSyxDQUFDQyxPQUFPLEdBQUcsTUFBTTtRQUN0Q3BtQixPQUFPLENBQUNELEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQztNQUN4QztJQUNGO0lBRUE7OztFQUFBO0lBQUE3QyxHQUFBO0lBQUFDLEtBQUEsRUFHTyxTQUFBK3VCLHNCQUFzQkEsQ0FBQTtNQUMzQixJQUFNaUUsbUJBQW1CLEdBQUdyaUIsUUFBUSxDQUFDb1ksY0FBYyxDQUFDLHFCQUFxQixDQUFDO01BQzFFLElBQU11SixZQUFZLEdBQUczaEIsUUFBUSxDQUFDb1ksY0FBYyxDQUFDLGdCQUFnQixDQUFDO01BQzlELElBQU1tSyxlQUFlLEdBQUd2aUIsUUFBUSxDQUFDb1ksY0FBYyxDQUFDLFVBQVUsQ0FBQztNQUUzRCxJQUFJaUssbUJBQW1CLEVBQUU7UUFDdkJBLG1CQUFtQixDQUFDN0IsU0FBUyxDQUFDTSxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzVDNXVCLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLDRCQUE0QixDQUFDO01BQzNDO01BRUEsSUFBSTB2QixZQUFZLEVBQUU7UUFDaEJBLFlBQVksQ0FBQ25CLFNBQVMsQ0FBQ00sTUFBTSxDQUFDLHNCQUFzQixDQUFDO01BQ3ZEO01BRUEsSUFBSXlCLGVBQWUsRUFBRTtRQUNuQkEsZUFBZSxDQUFDbEssS0FBSyxDQUFDQyxPQUFPLEdBQUcsTUFBTTtRQUN0Q3BtQixPQUFPLENBQUNELEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztNQUN2QztJQUNGO0lBRUE7Ozs7RUFBQTtJQUFBN0MsR0FBQTtJQUFBQyxLQUFBLEVBSVEsU0FBQWt2Qix1QkFBdUJBLENBQUNydUIsU0FBaUIsRUFBRXVHLE9BQWUsRUFBRWlTLFFBQWdCO01BQ2xGeFcsT0FBTyxDQUFDRCxHQUFHLDZDQUFBOEIsTUFBQSxDQUE2QzdELFNBQVMsa0JBQUE2RCxNQUFBLENBQWMwQyxPQUFPLG1CQUFBMUMsTUFBQSxDQUFlMlUsUUFBUSxDQUFFLENBQUM7TUFFaEg7TUFDQSxJQUFNbU0sYUFBYSxHQUFHLElBQUksQ0FBQ2tJLFVBQVUsQ0FBQ2pJLGdCQUFnQixFQUFFO01BQ3hELElBQUksQ0FBQ0QsYUFBYSxJQUFJQSxhQUFhLENBQUM1ZixJQUFJLENBQUMvRSxTQUFTLEtBQUtBLFNBQVMsRUFBRTtRQUNoRWdDLE9BQU8sQ0FBQ0QsR0FBRyxZQUFBOEIsTUFBQSxDQUFZN0QsU0FBUyxpREFBOEMsQ0FBQztRQUMvRTtNQUNGO01BRUE7TUFDQSxJQUFJMmtCLGFBQWEsQ0FBQzViLGdCQUFnQixFQUFFO1FBQ2xDL0csT0FBTyxDQUFDRCxHQUFHLDZDQUFBOEIsTUFBQSxDQUE2QzdELFNBQVMsQ0FBRSxDQUFDO1FBQ3BFMmtCLGFBQWEsQ0FBQzViLGdCQUFnQixDQUFDa0IsS0FBSyxDQUFDMUQsT0FBTyxFQUFFaVMsUUFBUSxDQUFDO01BQ3pELENBQUMsTUFBTTtRQUNMeFcsT0FBTyxDQUFDRSxJQUFJLDJDQUFBMkIsTUFBQSxDQUEyQzdELFNBQVMsQ0FBRSxDQUFDO01BQ3JFO0lBQ0Y7SUFFQTs7O0VBQUE7SUFBQWQsR0FBQTtJQUFBQyxLQUFBLEVBR1EsU0FBQW12QixpQkFBaUJBLENBQUN0dUIsU0FBaUI7TUFDekMsSUFBTW9uQixXQUFXLEdBQUd0WCxRQUFRLENBQUNvWSxjQUFjLGFBQUFya0IsTUFBQSxDQUFhN0QsU0FBUyxDQUFFLENBQUM7TUFDcEUsSUFBSW9uQixXQUFXLEVBQUU7UUFDZnBsQixPQUFPLENBQUNELEdBQUcsOENBQUE4QixNQUFBLENBQThDN0QsU0FBUyxDQUFFLENBQUM7UUFDckVvbkIsV0FBVyxDQUFDd0osTUFBTSxFQUFFO01BQ3RCLENBQUMsTUFBTTtRQUNMNXVCLE9BQU8sQ0FBQ0UsSUFBSSwrQ0FBQTJCLE1BQUEsQ0FBK0M3RCxTQUFTLENBQUUsQ0FBQztNQUN6RTtJQUNGO0lBRUE7OztFQUFBO0lBQUFkLEdBQUE7SUFBQUMsS0FBQSxFQUdRLFNBQUF1eEIsZ0JBQWdCQSxDQUFDNEIsT0FBb0IsRUFBRTNqQixJQUEwQjtNQUFBLElBQUE0akIsTUFBQTtNQUN2RTtNQUNBRCxPQUFPLENBQUN4RyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsVUFBQy9VLENBQVksRUFBSTtRQUNyRHdiLE1BQUksQ0FBQ25HLGNBQWMsR0FBR2tHLE9BQU87UUFDN0JBLE9BQU8sQ0FBQ2hDLFNBQVMsQ0FBQ1csR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNqQyxJQUFJbGEsQ0FBQyxDQUFDeWIsWUFBWSxFQUFFO1VBQ2xCemIsQ0FBQyxDQUFDeWIsWUFBWSxDQUFDQyxhQUFhLEdBQUcsTUFBTTtVQUNyQzFiLENBQUMsQ0FBQ3liLFlBQVksQ0FBQ0UsT0FBTyxDQUFDLFdBQVcsRUFBRUosT0FBTyxDQUFDbEMsU0FBUyxDQUFDO1FBQ3hEO01BQ0YsQ0FBQyxDQUFDO01BRUY7TUFDQWtDLE9BQU8sQ0FBQ3hHLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxVQUFDL1UsQ0FBWSxFQUFJO1FBQ25EdWIsT0FBTyxDQUFDaEMsU0FBUyxDQUFDTSxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3BDO1FBQ0EsSUFBTStCLFNBQVMsR0FBR2hrQixJQUFJLEtBQUssUUFBUSxHQUMvQm1CLFFBQVEsQ0FBQ29ZLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FDbENwWSxRQUFRLENBQUNvWSxjQUFjLENBQUMsVUFBVSxDQUFDO1FBQ3ZDLElBQUl5SyxTQUFTLEVBQUU7VUFDYkEsU0FBUyxDQUFDNUQsZ0JBQWdCLEtBQUFsckIsTUFBQSxDQUFLOEssSUFBSSxDQUFFLENBQUMsQ0FBQ2tELE9BQU8sQ0FBQyxVQUFBdWYsRUFBRSxFQUFHO1lBQ2xEQSxFQUFFLENBQUNkLFNBQVMsQ0FBQ00sTUFBTSxDQUFDLFdBQVcsQ0FBQztVQUNsQyxDQUFDLENBQUM7UUFDSjtRQUNBMkIsTUFBSSxDQUFDbkcsY0FBYyxHQUFHLElBQUk7TUFDNUIsQ0FBQyxDQUFDO01BRUY7TUFDQWtHLE9BQU8sQ0FBQ3hHLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxVQUFDL1UsQ0FBWSxFQUFJO1FBQ3BEQSxDQUFDLENBQUNpYixjQUFjLEVBQUU7UUFDbEIsSUFBSWpiLENBQUMsQ0FBQ3liLFlBQVksRUFBRTtVQUNsQnpiLENBQUMsQ0FBQ3liLFlBQVksQ0FBQ0ksVUFBVSxHQUFHLE1BQU07UUFDcEM7UUFFQSxJQUFJTCxNQUFJLENBQUNuRyxjQUFjLElBQUltRyxNQUFJLENBQUNuRyxjQUFjLEtBQUtrRyxPQUFPLEVBQUU7VUFDMURBLE9BQU8sQ0FBQ2hDLFNBQVMsQ0FBQ1csR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUNwQztNQUNGLENBQUMsQ0FBQztNQUVGO01BQ0FxQixPQUFPLENBQUN4RyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsVUFBQy9VLENBQVksRUFBSTtRQUNyRHViLE9BQU8sQ0FBQ2hDLFNBQVMsQ0FBQ00sTUFBTSxDQUFDLFdBQVcsQ0FBQztNQUN2QyxDQUFDLENBQUM7TUFFRjtNQUNBMEIsT0FBTyxDQUFDeEcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFVBQUMvVSxDQUFZLEVBQUk7UUFDaERBLENBQUMsQ0FBQ2liLGNBQWMsRUFBRTtRQUNsQmpiLENBQUMsQ0FBQzBaLGVBQWUsRUFBRTtRQUVuQjZCLE9BQU8sQ0FBQ2hDLFNBQVMsQ0FBQ00sTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUVyQyxJQUFJMkIsTUFBSSxDQUFDbkcsY0FBYyxJQUFJbUcsTUFBSSxDQUFDbkcsY0FBYyxLQUFLa0csT0FBTyxFQUFFO1VBQzFELElBQU1LLFNBQVMsR0FBR2hrQixJQUFJLEtBQUssUUFBUSxHQUMvQm1CLFFBQVEsQ0FBQ29ZLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FDbENwWSxRQUFRLENBQUNvWSxjQUFjLENBQUMsVUFBVSxDQUFDO1VBRXZDLElBQUl5SyxTQUFTLEVBQUU7WUFDYjtZQUNBLElBQU1FLFlBQVksR0FBR04sTUFBSSxDQUFDTyxtQkFBbUIsQ0FBQ0gsU0FBUyxFQUFFNWIsQ0FBQyxDQUFDZ2MsT0FBTyxFQUFFcGtCLElBQUksQ0FBQztZQUV6RSxJQUFJa2tCLFlBQVksSUFBSSxJQUFJLEVBQUU7Y0FDeEI7Y0FDQSxJQUFNRyxNQUFNLEdBQUdya0IsSUFBSSxLQUFLLFFBQVEsR0FDNUJtQixRQUFRLENBQUNvWSxjQUFjLENBQUMsZ0JBQWdCLENBQUMsR0FDekNwWSxRQUFRLENBQUNvWSxjQUFjLENBQUMsaUJBQWlCLENBQUM7Y0FDOUMsSUFBSThLLE1BQU0sRUFBRTtnQkFDVkwsU0FBUyxDQUFDaEMsWUFBWSxDQUFDNEIsTUFBSSxDQUFDbkcsY0FBYyxFQUFFNEcsTUFBTSxDQUFDO2NBQ3JEO1lBQ0YsQ0FBQyxNQUFNO2NBQ0w7Y0FDQUwsU0FBUyxDQUFDaEMsWUFBWSxDQUFDNEIsTUFBSSxDQUFDbkcsY0FBYyxFQUFFeUcsWUFBWSxDQUFDO1lBQzNEO1VBQ0Y7UUFDRjtNQUNGLENBQUMsQ0FBQztJQUNKO0lBRUE7OztFQUFBO0lBQUEzekIsR0FBQTtJQUFBQyxLQUFBLEVBR1EsU0FBQTJ6QixtQkFBbUJBLENBQUNILFNBQXNCLEVBQUU1VSxDQUFTLEVBQUVwUCxJQUEwQjtNQUN2RixJQUFNc2tCLGlCQUFpQixHQUFHOWhCLEtBQUssQ0FBQ3lFLElBQUksQ0FDbEMrYyxTQUFTLENBQUM1RCxnQkFBZ0IsS0FBQWxyQixNQUFBLENBQUs4SyxJQUFJLG9CQUFpQixDQUFDLENBQ3JDO01BRWxCLE9BQU9za0IsaUJBQWlCLENBQUNDLE1BQU0sQ0FBcUIsVUFBQ0MsT0FBTyxFQUFFQyxLQUFLLEVBQUk7UUFDckUsSUFBTXBFLEdBQUcsR0FBR29FLEtBQUssQ0FBQ0MscUJBQXFCLEVBQUU7UUFDekMsSUFBTUMsTUFBTSxHQUFHdlYsQ0FBQyxHQUFHaVIsR0FBRyxDQUFDMUcsSUFBSSxHQUFHMEcsR0FBRyxDQUFDM2hCLEtBQUssR0FBRyxDQUFDO1FBRTNDLElBQUlpbUIsTUFBTSxHQUFHLENBQUMsS0FBS0gsT0FBTyxLQUFLLElBQUksSUFBSUcsTUFBTSxHQUFJSCxPQUFlLENBQUNHLE1BQU0sQ0FBQyxFQUFFO1VBQ3hFLE9BQU9yaUIsTUFBTSxDQUFDc2lCLE1BQU0sQ0FBQ0gsS0FBSyxFQUFFO1lBQUVFLE1BQU0sRUFBTkE7VUFBTSxDQUFFLENBQUM7UUFDekMsQ0FBQyxNQUFNO1VBQ0wsT0FBT0gsT0FBTztRQUNoQjtNQUNGLENBQUMsRUFBRSxJQUFJLENBQUM7SUFDVjtFQUFDO0FBQUEsS0FHSDtBQUNBbnhCLE9BQU8sQ0FBQ0QsR0FBRyxDQUFDLHdCQUF3QixDQUFDO0FBQ3JDLElBQU15eEIsV0FBVyxHQUFHLElBQUl2SCxXQUFXLEVBQUU7QUFJckNubUIsTUFBTSxDQUFDMHRCLFdBQVcsR0FBR0EsV0FBVztBQUNoQztBQUNBLFNBQVNDLGNBQWNBLENBQUE7RUFDckJ6eEIsT0FBTyxDQUFDRCxHQUFHLENBQUMsdUJBQXVCLENBQUM7RUFDcEMyeEIsYUFBYSxFQUFFLENBQUMxdUIsSUFBSSxFQUFFO0FBQ3hCO0FBQUMsU0FDYzB1QixhQUFhQSxDQUFBO0VBQUEsT0FBQUMsY0FBQSxDQUFBdHJCLEtBQUEsT0FBQXBJLFNBQUE7QUFBQSxFQUs1QjtBQUFBLFNBQUEwekIsZUFBQTtFQUFBQSxjQUFBLEdBQUFwc0IsbUJBQUEsY0FBQUMsY0FBQSxHQUFBQyxDQUFBLENBTEEsU0FBQTBDLFNBQUE7SUFBQSxPQUFBM0MsY0FBQSxHQUFBSyxDQUFBLFdBQUF3QyxTQUFBO01BQUEsa0JBQUFBLFNBQUEsQ0FBQXJDLENBQUE7UUFBQTtVQUNFaEcsT0FBTyxDQUFDRCxHQUFHLENBQUMsc0JBQXNCLENBQUM7VUFBQ3NJLFNBQUEsQ0FBQXJDLENBQUE7VUFBQSxPQUM5QndyQixXQUFXLENBQUM1SCxVQUFVLEVBQUU7UUFBQTtVQUFBLE9BQUF2aEIsU0FBQSxDQUFBbkMsQ0FBQTtNQUFBO0lBQUEsR0FBQWlDLFFBQUE7RUFBQSxDQUMvQjtFQUFBLE9BQUF3cEIsY0FBQSxDQUFBdHJCLEtBQUEsT0FBQXBJLFNBQUE7QUFBQTtBQUdELElBQUk2UCxRQUFRLENBQUMzTCxVQUFVLEtBQUssU0FBUyxFQUFFO0VBQ3JDO0VBQ0FuQyxPQUFPLENBQUNELEdBQUcsQ0FBQyx1REFBdUQsQ0FBQztFQUNwRStOLFFBQVEsQ0FBQ2djLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFNEgsYUFBYSxDQUFDO0FBQzlELENBQUMsTUFBTTtFQUNMO0VBQ0ExeEIsT0FBTyxDQUFDRCxHQUFHLENBQUMsK0RBQStELENBQUM7RUFDNUUweEIsY0FBYyxFQUFFO0FBQ2xCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcnR0eS13ZWJwYWNrLy4vc3JjL3RzL3R5cGVzLnRzPzM5NmEiLCJ3ZWJwYWNrOi8vcnR0eS13ZWJwYWNrLy4vc3JjL3RzL2Nvbm5lY3Rpb24udHM/ZWQwYSIsIndlYnBhY2s6Ly9ydHR5LXdlYnBhY2svLi9zcmMvdHMvY29tbWFuZC1idWlsZGVyLnRzPzI4MDMiLCJ3ZWJwYWNrOi8vcnR0eS13ZWJwYWNrLy4vc3JjL3RzL2NvbW1hbmRzL2luZm8udHM/ZDM4ZCIsIndlYnBhY2s6Ly9ydHR5LXdlYnBhY2svLi9zcmMvdHMvY29tbWFuZHMvaGVscC50cz9iNTBlIiwid2VicGFjazovL3J0dHktd2VicGFjay8uL3NyYy90cy9jb21tYW5kcy9jbGVhci50cz8wNWI3Iiwid2VicGFjazovL3J0dHktd2VicGFjay8uL3NyYy90cy91dGlscy9jdXJsLXV0aWxzLnRzPzViNGUiLCJ3ZWJwYWNrOi8vcnR0eS13ZWJwYWNrLy4vc3JjL3RzL2NvbW1hbmRzL2N1cmwudHM/NGEyMSIsIndlYnBhY2s6Ly9ydHR5LXdlYnBhY2svLi9zcmMvdHMvY29tbWFuZHMvanEudHM/YjBlNCIsIndlYnBhY2s6Ly9ydHR5LXdlYnBhY2svLi9zcmMvdHMvY29tbWFuZHMvaW5kZXgudHM/NDIxYSIsIndlYnBhY2s6Ly9ydHR5LXdlYnBhY2svLi9zcmMvdHMvY3VzdG9tLWNvbW1hbmQtc3RvcmFnZS50cz9kZDM0Iiwid2VicGFjazovL3J0dHktd2VicGFjay8uL3NyYy90cy90ZXJtaW5hbC1tYW5hZ2VyLnRzPzBkYmMiLCJ3ZWJwYWNrOi8vcnR0eS13ZWJwYWNrLy4vc3JjL3RzL3Rlcm1pbmFsLXVpLXdyaXRlci50cz8xMmM4Iiwid2VicGFjazovL3J0dHktd2VicGFjay8uL3NyYy90cy90ZXJtaW5hbC10YWItbWFuYWdlci50cz80YWU0Iiwid2VicGFjazovL3J0dHktd2VicGFjay8uL3NyYy90cy9pbmRleC50cz9hMzIwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog0KLQuNC/0Ysg0Lgg0LjQvdGC0LXRgNGE0LXQudGB0Ysg0LTQu9GPINGC0LXRgNC80LjQvdCw0LvRjNC90L7Qs9C+INC60LvQuNC10L3RgtCwXG4gKi9cblxuaW1wb3J0IHsgQ29ubmVjdGlvbiwgSUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9jb25uZWN0aW9uXCI7XG5cbi8vINCi0LjQv9GLINGB0L7QsdGL0YLQuNC5XG5leHBvcnQgdHlwZSBFdmVudFR5cGUgPSBcbiAgfCAnY29ubmVjdCdcbiAgfCAnZGlzY29ubmVjdCdcbiAgfCAnY2xvc2UnXG4gIHwgJ2lkZW50aWZ5J1xuICB8ICdjb21tYW5kJ1xuICB8ICdyZXNpemUnXG4gIHwgJ3NlbmRLZXknXG4gIHwgJ2hvdGtleSdcbiAgfCAnY3Vyc29yJ1xuICB8ICdvdXRwdXQnXG4gIHwgJ2Vycm9yJ1xuICB8ICdzZXNzaW9uJ1xuICB8ICduZXdTZXNzaW9uJ1xuICB8ICduZXdDbGllbnQnXG4gIHwgJ2RlbGV0ZUNsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBFdmVudFR5cGVDb25zdCA9IHtcbiAgQ1VSU09SX1NUQVRFOiAnY3Vyc29yJyxcbiAgQ09OTkVDVDogJ2Nvbm5lY3QnLFxuICBESVNDT05ORUNUOiAnZGlzY29ubmVjdCcsXG4gIENMT1NFOiAnY2xvc2UnLFxuICBJREVOVElGWTogJ2lkZW50aWZ5JyxcbiAgQ09NTUFORDogJ2NvbW1hbmQnLFxuICBSRVNJWkU6ICdyZXNpemUnLFxuICBTRU5EX0tFWTogJ3NlbmRLZXknLFxuICBIT1RLRVk6ICdob3RrZXknLFxuICBPVVRQVVQ6ICdvdXRwdXQnLFxuICBFUlJPUjogJ2Vycm9yJyxcbiAgU0VTU0lPTjogJ3Nlc3Npb24nLFxuICBORVdfU0VTU0lPTjogJ25ld1Nlc3Npb24nLFxuICBORVdfQ0xJRU5UOiAnbmV3Q2xpZW50JyxcbiAgREVMRVRFX0NMSUVOVDogJ2RlbGV0ZUNsaWVudCcsXG4gIENMT1NFX1NFU1NJT046ICdjbG9zZVNlc3Npb24nLFxuICBDTElFTlRfU1RBVFVTOiAnY2xpZW50U3RhdHVzJ1xufSBhcyBjb25zdDtcblxuXG4vLyDQotC40L/RiyDQutC70LjQtdC90YLQvtCyXG5leHBvcnQgdHlwZSBDbGllbnRUeXBlID0gJ3dlYicgfCAnY21kJyB8ICdqcyc7XG5cbi8vINCg0LXQttC40LzRiyDRgNCw0LHQvtGC0Ysg0YLQtdGA0LzQuNC90LDQu9CwXG5leHBvcnQgdHlwZSBXb3JrTW9kZSA9ICdsb2NhbCcgfCAncmVtb3RlJyB8ICdvZmZsaW5lJztcblxuLy8g0JjQvdGC0LXRgNGE0LXQudGBINC00LvRjyDQv9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60L7QuSDQutC+0LzQsNC90LTRi1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21Db21tYW5kIHtcbiAgaGFuZGxlcjogKGNvbW1hbmQ6IHN0cmluZykgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBtYXRjaGVyOiAoaW5wdXQ6IHN0cmluZykgPT4gYm9vbGVhbjtcbn1cblxuLy8g0JjQvdGC0LXRgNGE0LXQudGBINC00LvRjyDQuNC90YTQvtGA0LzQsNGG0LjQuCDQviDQutC+0LzQsNC90LTQtVxuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kSW5mbyB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuLy8g0JjQvdGC0LXRgNGE0LXQudGBINC00LvRjyDRgdC+0L7QsdGJ0LXQvdC40Y8gV2ViU29ja2V0XG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldE1lc3NhZ2Uge1xuICBldmVudDogc3RyaW5nO1xuICB0YXJnZXQ/OiBzdHJpbmd8bnVsbDtcbiAgZGF0YTogYW55O1xufVxuXG4vLyDQmNC90YLQtdGA0YTQtdC50YEg0LTQu9GPINC00LDQvdC90YvRhSDQv9C+0LTQutC70Y7Rh9C10L3QuNGPXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3REYXRhIHtcbiAgbmFtZTogc3RyaW5nO1xuICBjbGllbnRUeXBlOiBDbGllbnRUeXBlO1xufVxuXG4vLyDQmNC90YLQtdGA0YTQtdC50YEg0LTQu9GPINC00LDQvdC90YvRhSDQuNC00LXQvdGC0LjRhNC40LrQsNGG0LjQuFxuZXhwb3J0IGludGVyZmFjZSBJZGVudGlmeURhdGEge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbn1cblxuLy8g0JjQvdGC0LXRgNGE0LXQudGBINC00LvRjyDQtNCw0L3QvdGL0YUg0YLQtdGA0LzQuNC90LDQu9CwXG5leHBvcnQgaW50ZXJmYWNlIFRlcm1pbmFsRGF0YSB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBpbmRleDogbnVtYmVyO1xuICBkYXRhOiBzdHJpbmc7XG59XG5cbi8vINCY0L3RgtC10YDRhNC10LnRgSDQtNC70Y8g0LTQsNC90L3Ri9GFIHNlbmRLZXlcbmV4cG9ydCBpbnRlcmZhY2UgU2VuZEtleURhdGEge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAga2V5czogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90S2V5RGF0YSB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAgY3RybDogYm9vbGVhbjtcbiAgYWx0OiBib29sZWFuO1xuICBzaGlmdDogYm9vbGVhbjtcbn1cblxuLy8g0JjQvdGC0LXRgNGE0LXQudGBINC00LvRjyDQtNCw0L3QvdGL0YUg0LrRg9GA0YHQvtGA0LBcbmV4cG9ydCBpbnRlcmZhY2UgQ3Vyc29yU3RhdGVEYXRhIHtcbiAgcG9zaXRpb246IG51bWJlcjtcbiAgY29tbWFuZDogc3RyaW5nO1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbn1cblxuLy8g0JjQvdGC0LXRgNGE0LXQudGBINC00LvRjyDQtNCw0L3QvdGL0YUg0L3QvtCy0L7QuSDRgdC10YHRgdC40LhcbmV4cG9ydCBpbnRlcmZhY2UgTmV3U2Vzc2lvbkNvbW1hbmREYXRhIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLy8g0JjQvdGC0LXRgNGE0LXQudGBINC00LvRjyDQtNCw0L3QvdGL0YUg0L3QvtCy0L7Qs9C+INC60LvQuNC10L3RgtCwXG5leHBvcnQgaW50ZXJmYWNlIE5ld0NsaWVudERhdGEge1xuICBjbGllbnRJZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNsaWVudFR5cGU6IENsaWVudFR5cGU7XG59XG5cbi8vINCY0L3RgtC10YDRhNC10LnRgSDQtNC70Y8g0LTQsNC90L3Ri9GFINGD0LTQsNC70LXQvdC40Y8g0LrQu9C40LXQvdGC0LBcbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlQ2xpZW50RGF0YSB7XG4gIGNsaWVudElkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgY2xpZW50VHlwZTogQ2xpZW50VHlwZTtcbn1cbi8vINCY0L3RgtC10YDRhNC10LnRgSDQtNC70Y8g0LTQsNC90L3Ri9GFINC60L7QvNCw0L3QtNGLXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmREYXRhIHtcbiAgY29tbWFuZDogc3RyaW5nO1xufVxuXG4vLyDQmNC90YLQtdGA0YTQtdC50YEg0LTQu9GPINC00LDQvdC90YvRhSDQuNC30LzQtdC90LXQvdC40Y8g0YDQsNC30LzQtdGA0LBcbmV4cG9ydCBpbnRlcmZhY2UgUmVzaXplRGF0YSB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG4vLyDQmNC90YLQtdGA0YTQtdC50YEg0LTQu9GPINC+0L/RhtC40Lkg0L/QvtC00LrQu9GO0YfQtdC90LjRj1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uT3B0aW9ucyB7XG4gIHNlcnZlclVybDogc3RyaW5nO1xuICBcbn1cblxuLy8g0JjQvdGC0LXRgNGE0LXQudGBINC00LvRjyDQvtC/0YbQuNC5IFRlcm1pbmFsTWFuYWdlclxuZXhwb3J0IGludGVyZmFjZSBUZXJtaW5hbE1hbmFnZXJPcHRpb25zIHtcbiAgY29ubmVjdGlvbk9wdGlvbnM/OiBDb25uZWN0aW9uT3B0aW9ucyB8IHVuZGVmaW5lZDsgLy8g0J7Qv9GG0LjQvtC90LDQu9GM0L3QviDQtNC70Y8gb2ZmbGluZSDRgNC10LbQuNC80LBcbiAgY29ubmVjdGlvbj86IElDb25uZWN0aW9uIHwgbnVsbDsgLy8g0J7Qv9GG0LjQvtC90LDQu9GM0L3QviDQtNC70Y8gb2ZmbGluZSDRgNC10LbQuNC80LBcbiAgY2xpZW50TmFtZTogc3RyaW5nO1xuICBhdXRvQ29ubmVjdDogYm9vbGVhbjtcbiAgYXV0b0Nvbm5lY3REZWxheTogbnVtYmVyO1xuICB3b3JrTW9kZTogV29ya01vZGU7XG4gIHNlc3Npb25JZDogc3RyaW5nIHwgbnVsbDtcbiAgY2xpZW50VHlwZTogQ2xpZW50VHlwZTtcbn1cblxuLy8g0JDQu9C40LDRgdGLINC00LvRjyDRgdC+0LLQvNC10YHRgtC40LzQvtGB0YLQuFxuZXhwb3J0IHR5cGUgVGVybWluYWxNYW5hZ2VyQ29uZmlnID0gVGVybWluYWxNYW5hZ2VyT3B0aW9ucztcbmV4cG9ydCB0eXBlIFRlcm1pbmFsTWFuYWdlckhhbmRsZXJzID0gSGFuZGxlcnM7XG5cbi8vINCY0L3RgtC10YDRhNC10LnRgSDQtNC70Y8g0YHQtdGB0YHQuNC4XG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb24ge1xuICBpZDogc3RyaW5nO1xuICBjb21tYW5kQnVpbGRlcjogYW55OyAvLyBDb21tYW5kQnVpbGRlclxuICB0ZXJtaW5hbDogYW55OyAvLyBUZXJtaW5hbENsaSAtINCx0YPQtNC10YIg0LjQvNC/0L7RgNGC0LjRgNC+0LLQsNC9INC40LcgdGVybWluYWwtY2xpLnRzXG4gIGNvbm5lY3Rpb246IGFueTsgLy8gQ29ubmVjdGlvbiAtINCx0YPQtNC10YIg0LjQvNC/0L7RgNGC0LjRgNC+0LLQsNC9INC40LcgY29ubmVjdGlvbi50c1xuICBvcHRpb25zOiBUZXJtaW5hbE1hbmFnZXJPcHRpb25zO1xuICBzdGF0dXM6ICdjcmVhdGVkJyB8ICdjb25uZWN0ZWQnIHwgJ2Rpc2Nvbm5lY3RlZCc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbn1cblxuLy8g0JjQvdGC0LXRgNGE0LXQudGBINC00LvRjyBoYW5kbGVyc1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVycyB7XG4gIG9uRGF0YT86IChkYXRhOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uRXJyb3I/OiAoZXJyb3I6IHN0cmluZykgPT4gdm9pZDtcbiAgb25Db25uZWN0PzogKHNlc3Npb25JZD86IHN0cmluZykgPT4gdm9pZDtcbiAgb25EaXNjb25uZWN0PzogKHNlc3Npb25JZD86IHN0cmluZykgPT4gdm9pZDtcbiAgb25NZXNzYWdlPzogKG1lc3NhZ2U6IFdlYlNvY2tldE1lc3NhZ2UsIHNlc3Npb25JZD86IHN0cmluZykgPT4gdm9pZDtcbiAgb25DdXJzb3JTdGF0ZT86IChzZXNzaW9uSWQ6IHN0cmluZywgY29tbWFuZDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xufVxuXG4vLyDQmNC90YLQtdGA0YTQtdC50YEg0LTQu9GPINC+0L/RhtC40LkgY3VybFxuZXhwb3J0IGludGVyZmFjZSBDdXJsT3B0aW9ucyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBib2R5OiBzdHJpbmcgfCBudWxsO1xuICB2ZXJib3NlOiBib29sZWFuO1xuICBzaG93SGVhZGVyczogYm9vbGVhbjtcbiAgc2lsZW50OiBib29sZWFuO1xufVxuXG4vLyDQmNC90YLQtdGA0YTQtdC50YEg0LTQu9GPINC+0YDQuNCz0LjQvdCw0LvRjNC90YvRhSDQvNC10YLQvtC00L7QsiBjb25zb2xlXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbmFsQ29uc29sZSB7XG4gIGxvZzogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuICBlcnJvcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuICB3YXJuOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG4gIGluZm86ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbiAgZGVidWc6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbn1cblxuLy8gVGVybWluYWxDbGkg0LHRg9C00LXRgiDQuNC80L/QvtGA0YLQuNGA0L7QstCw0L0g0LjQtyB0ZXJtaW5hbC1jbGkudHNcbi8vIENvbm5lY3Rpb24g0LHRg9C00LXRgiDQuNC80L/QvtGA0YLQuNGA0L7QstCw0L0g0LjQtyBjb25uZWN0aW9uLnRzXG5cbi8vIFRlcm1pbmFsTWFuYWdlciDQsdGD0LTQtdGCINC40LzQv9C+0YDRgtC40YDQvtCy0LDQvSDQuNC3IHRlcm1pbmFsLW1hbmFnZXIudHNcblxuZXhwb3J0IGludGVyZmFjZSBDbG9zZVNlc3Npb25EYXRhIHtcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50U3RhdHVzRGF0YSB7XG4gIGNsaWVudElkOiBzdHJpbmc7XG4gIHN0YXR1czogJ3dhaXRpbmcnIHwgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJztcbn1cblxuXG5leHBvcnQgY2xhc3MgSWRHZW5lcmF0b3J7XG5cbiAgLyoqXG4gICAqINCT0LXQvdC10YDQuNGA0YPQtdGCINGB0LvRg9GH0LDQudC90YvQuSBJRFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyAgZ2VuZXJhdGVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTUpICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDE1KTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRJZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlkLmxlbmd0aCA9PT0gMTAgJiYgaWQuaW5kZXhPZignaW5kZXgnKSA9PT0gLTE7XG4gIH1cbn0iLCIvKipcbiAqIENvbm5lY3Rpb24gLSDRg9C/0YDQsNCy0LvRj9C10YIgV2ViU29ja2V0INGB0L7QtdC00LjQvdC10L3QuNC10Lwg0YEg0YHQtdGA0LLQtdGA0L7QvFxuICog0J7RgtCy0LXRh9Cw0LXRgiDRgtC+0LvRjNC60L4g0LfQsCDQv9C+0LTQutC70Y7Rh9C10L3QuNC1LCDQvtGC0L/RgNCw0LLQutGDINC4INC/0L7Qu9GD0YfQtdC90LjQtSDQtNCw0L3QvdGL0YVcbiAqL1xuXG5cbmltcG9ydCB7IFxuICAgIFdlYlNvY2tldE1lc3NhZ2UsIFxuICAgIENvbm5lY3REYXRhLCBcbiAgICBJZGVudGlmeURhdGEsIFxuICAgIFRlcm1pbmFsRGF0YSwgXG4gICAgU2VuZEtleURhdGEsIFxuICAgIENvbW1hbmREYXRhLCBcbiAgICBSZXNpemVEYXRhLCBcbiAgICBDbGllbnRUeXBlLFxuICAgIEV2ZW50VHlwZSxcbiAgICBFdmVudFR5cGVDb25zdCxcbiAgICBPcmlnaW5hbENvbnNvbGUsXG4gICAgQ3Vyc29yU3RhdGVEYXRhLFxuICAgIE5ld1Nlc3Npb25Db21tYW5kRGF0YSxcbiAgICBOZXdDbGllbnREYXRhLFxuICAgIERlbGV0ZUNsaWVudERhdGEsXG4gICAgQ2xvc2VTZXNzaW9uRGF0YSxcbiAgICBDbGllbnRTdGF0dXNEYXRhLFxuICAgIEhvdEtleURhdGFcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyAgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbm5lY3Rpb24ge1xuICBvbkNvbm5lY3Q6ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIG9uRGlzY29ubmVjdDogKChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkKSB8IG51bGw7XG4gIG9uQ3Vyc29yU3RhdGU6ICgoZGF0YTogQ3Vyc29yU3RhdGVEYXRhKSA9PiB2b2lkKSB8IG51bGw7XG4gIG9uRXJyb3I6ICgoZXJyb3I6IGFueSkgPT4gdm9pZCkgfCBudWxsO1xuICBvblNlbmRLZXk6ICgoZGF0YTogU2VuZEtleURhdGEpID0+IHZvaWQpIHwgbnVsbDtcbiAgb25Db21tYW5kOiAoKGRhdGE6IENvbW1hbmREYXRhKSA9PiBQcm9taXNlPHZvaWQ+KSB8IG51bGw7XG4gIG9uUmVzaXplOiAoKGRhdGE6IFJlc2l6ZURhdGEpID0+IHZvaWQpIHwgbnVsbDtcbiAgb25UZXJtaW5hbDogKChkYXRhOiBUZXJtaW5hbERhdGEpID0+IHZvaWQpIHwgbnVsbDtcbiAgb25DbG9zZTogKChkYXRhOiBhbnkpID0+IHZvaWQpIHwgbnVsbDtcbiAgb25OZXdDbGllbnQ6ICgoZGF0YTogTmV3Q2xpZW50RGF0YSkgPT4gdm9pZCkgfCBudWxsO1xuICBvbkRlbGV0ZUNsaWVudDogKChkYXRhOiBEZWxldGVDbGllbnREYXRhKSA9PiB2b2lkKSB8IG51bGw7XG4gIG9uUmVjb25uZWN0QXR0ZW1wdD86IChhdHRlbXB0OiBudW1iZXIsIG1heEF0dGVtcHRzOiBudW1iZXIpID0+IHZvaWQ7XG4gIG9uUmVjb25uZWN0RmFpbGVkPzogKCkgPT4gdm9pZDtcbiAgc2V0T25Db25uZWN0KGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgc2V0T25DdXJzb3JTdGF0ZShjYWxsYmFjazogKGRhdGE6IEN1cnNvclN0YXRlRGF0YSkgPT4gdm9pZCk6IHZvaWQ7XG4gIHNldE9uRGlzY29ubmVjdChjYWxsYmFjazogKGNvZGU6IG51bWJlciwgcmVhc29uOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xuICBzZXRPbkVycm9yKGNhbGxiYWNrOiAoZXJyb3I6IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gIHNldE9uU2VuZEtleShjYWxsYmFjazogKGRhdGE6IFNlbmRLZXlEYXRhKSA9PiB2b2lkKTogdm9pZDtcbiAgc2V0T25Db21tYW5kKGNhbGxiYWNrOiAoZGF0YTogQ29tbWFuZERhdGEpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkO1xuICBzZXRPblRlcm1pbmFsKGNhbGxiYWNrOiAoZGF0YTogVGVybWluYWxEYXRhKSA9PiB2b2lkKTogdm9pZDtcbiAgc2V0T25SZXNpemUoY2FsbGJhY2s6IChkYXRhOiBSZXNpemVEYXRhKSA9PiB2b2lkKTogdm9pZDtcbiAgc2V0T25DbG9zZShjYWxsYmFjazogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gIHNldE9uTmV3Q2xpZW50KGNhbGxiYWNrOiAoZGF0YTogTmV3Q2xpZW50RGF0YSkgPT4gdm9pZCk6IHZvaWQ7XG4gIHNldE9uRGVsZXRlQ2xpZW50KGNhbGxiYWNrOiAoZGF0YTogRGVsZXRlQ2xpZW50RGF0YSkgPT4gdm9pZCk6IHZvaWQ7XG4gIHNldE9uQ2xvc2VTZXNzaW9uKGNhbGxiYWNrOiAoZGF0YTogQ2xvc2VTZXNzaW9uRGF0YSkgPT4gdm9pZCk6IHZvaWQ7XG4gIHNldE9uQ2xpZW50U3RhdHVzKGNhbGxiYWNrOiAoZGF0YTogQ2xpZW50U3RhdHVzRGF0YSkgPT4gdm9pZCk6IHZvaWQ7XG4gIHNldE9uUmVjb25uZWN0QXR0ZW1wdChjYWxsYmFjazogKGF0dGVtcHQ6IG51bWJlciwgbWF4QXR0ZW1wdHM6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQ7XG4gIHNldE9uUmVjb25uZWN0RmFpbGVkKGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgc2V0QXV0b1JlY29ubmVjdFNldHRpbmdzKGVuYWJsZWQ6IGJvb2xlYW4sIG1heEF0dGVtcHRzOiBudW1iZXIsIGRlbGF5OiBudW1iZXIsIG1heERlbGF5OiBudW1iZXIsIGJhY2tvZmZNdWx0aXBsaWVyOiBudW1iZXIpOiB2b2lkO1xuICBnZXRBdXRvUmVjb25uZWN0U2V0dGluZ3MoKTogdm9pZDtcbiAgY29ubmVjdChjbGllbnRUeXBlOiBDbGllbnRUeXBlKTogdm9pZDtcbiAgYXR0ZW1wdFJlY29ubmVjdChjbGllbnRUeXBlOiBDbGllbnRUeXBlKTogdm9pZDtcbiAgY2xlYXJSZWNvbm5lY3RUaW1lcigpOiB2b2lkO1xuICBzZW5kQ29ubmVjdChjbGllbnRUeXBlOiBDbGllbnRUeXBlKTogdm9pZDtcbiAgc2VuZENvbW1hbmQodGFyZ2V0OiBzdHJpbmcsIGNvbW1hbmQ6IHN0cmluZyk6IHZvaWQ7XG4gIHNlbmRJZGVudGlmeShzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQ7XG4gIHNlbmROZXdTZXNzaW9uKGNsaWVudElkOiBzdHJpbmcsIHNlc3Npb25JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkO1xuICBzZW5kVGVybWluYWxEYXRhKHNlc3Npb25JZDogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkO1xuICBzZW5kQ3Vyc29yU3RhdGUoZGF0YTogQ3Vyc29yU3RhdGVEYXRhKTogdm9pZDtcbiAgc2VuZFNlbmRLZXkoZGF0YTogU2VuZEtleURhdGEpOiB2b2lkO1xuICBzZW5kSG90S2V5KGRhdGE6IEhvdEtleURhdGEpOiB2b2lkO1xuICBzZW5kTmV3Q2xpZW50KGRhdGE6IE5ld0NsaWVudERhdGEpOiB2b2lkO1xuICBzZW5kRGVsZXRlQ2xpZW50KGRhdGE6IERlbGV0ZUNsaWVudERhdGEpOiB2b2lkO1xuICBzZW5kTWVzc2FnZShtZXNzYWdlOiBXZWJTb2NrZXRNZXNzYWdlKTogdm9pZDtcbiAgaGFuZGxlTWVzc2FnZShkYXRhOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBkaXNjb25uZWN0KCk6IHZvaWQ7XG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW47XG4gIGRlc3Ryb3koKTogdm9pZDtcbn1cblxuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbiBpbXBsZW1lbnRzIElDb25uZWN0aW9uIHtcbiAgICBwdWJsaWMgc2VydmVyVXJsOiBzdHJpbmc7XG4gICAgcHVibGljIHNvY2tldDogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIF9pc0Nvbm5lY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyByZWNvbm5lY3RBdHRlbXB0czogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgbWF4UmVjb25uZWN0QXR0ZW1wdHM6IG51bWJlciA9IERFRkFVTFRfU0VUVElOR1MuTUFYX1JFQ09OTkVDVF9BVFRFTVBUUztcbiAgICBwdWJsaWMgcmVjb25uZWN0RGVsYXk6IG51bWJlciA9IERFRkFVTFRfU0VUVElOR1MuUkVDT05ORUNUX0RFTEFZO1xuICAgIHB1YmxpYyByZWNvbm5lY3REZWxheU1heDogbnVtYmVyID0gREVGQVVMVF9TRVRUSU5HUy5SRUNPTk5FQ1RfREVMQVlfTUFYO1xuICAgIHB1YmxpYyByZWNvbm5lY3RCYWNrb2ZmTXVsdGlwbGllcjogbnVtYmVyID0gREVGQVVMVF9TRVRUSU5HUy5SRUNPTk5FQ1RfQkFDS09GRl9NVUxUSVBMSUVSO1xuICAgIHB1YmxpYyBhdXRvUmVjb25uZWN0RW5hYmxlZDogYm9vbGVhbiA9IERFRkFVTFRfU0VUVElOR1MuRU5BQkxFX0FVVE9fUkVDT05ORUNUO1xuICAgIHB1YmxpYyByZWNvbm5lY3RUaW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9uQ29ubmVjdDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9uRGlzY29ubmVjdDogKChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBvbkN1cnNvclN0YXRlOiAoKGRhdGE6IEN1cnNvclN0YXRlRGF0YSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgb25FcnJvcjogKChlcnJvcjogYW55KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBvblNlbmRLZXk6ICgoZGF0YTogU2VuZEtleURhdGEpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9uQ29tbWFuZDogKChkYXRhOiBDb21tYW5kRGF0YSkgPT4gUHJvbWlzZTx2b2lkPikgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgb25SZXNpemU6ICgoZGF0YTogUmVzaXplRGF0YSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgb25UZXJtaW5hbDogKChkYXRhOiBUZXJtaW5hbERhdGEpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9uQ2xvc2U6ICgoZGF0YTogYW55KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBvbk5ld0NsaWVudDogKChkYXRhOiBOZXdDbGllbnREYXRhKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBvbkRlbGV0ZUNsaWVudDogKChkYXRhOiBEZWxldGVDbGllbnREYXRhKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBvbkNsb3NlU2Vzc2lvbjogKChkYXRhOiBDbG9zZVNlc3Npb25EYXRhKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBvbkNsaWVudFN0YXR1czogKChkYXRhOiBDbGllbnRTdGF0dXNEYXRhKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBvblJlY29ubmVjdEF0dGVtcHQ/OiAoYXR0ZW1wdDogbnVtYmVyLCBtYXhBdHRlbXB0czogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHB1YmxpYyBvblJlY29ubmVjdEZhaWxlZD86ICgpID0+IHZvaWQ7XG4gICAgcHVibGljIG9yaWdpbmFsQ29uc29sZTogT3JpZ2luYWxDb25zb2xlO1xuXG4gICAgY29uc3RydWN0b3Ioc2VydmVyVXJsOiBzdHJpbmcsIHNlc3Npb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXJVcmwgPSBzZXJ2ZXJVcmw7XG4gICAgICAgIFxuICAgICAgICAvLyDQodC+0YXRgNCw0L3Rj9C10Lwg0YHRgdGL0LvQutGDINC90LAg0L7RgNC40LPQuNC90LDQu9GM0L3Ri9C1INC80LXRgtC+0LTRiyBjb25zb2xlXG4gICAgICAgIHRoaXMub3JpZ2luYWxDb25zb2xlID0ge1xuICAgICAgICAgICAgbG9nOiBjb25zb2xlLmxvZyxcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmVycm9yLFxuICAgICAgICAgICAgd2FybjogY29uc29sZS53YXJuLFxuICAgICAgICAgICAgaW5mbzogY29uc29sZS5pbmZvLFxuICAgICAgICAgICAgZGVidWc6IGNvbnNvbGUuZGVidWdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiBjYWxsYmFjayDQtNC70Y8g0YHQvtCx0YvRgtC40Y8g0L/QvtC00LrQu9GO0YfQtdC90LjRj1xuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtINGE0YPQvdC60YbQuNGPINC+0LHRgNCw0YLQvdC+0LPQviDQstGL0LfQvtCy0LBcbiAgICAgKi9cbiAgICBzZXRPbkNvbm5lY3QoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNvbm5lY3QgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBzZXRPbkN1cnNvclN0YXRlKGNhbGxiYWNrOiAoZGF0YTogQ3Vyc29yU3RhdGVEYXRhKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DdXJzb3JTdGF0ZSA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCIGNhbGxiYWNrINC00LvRjyDRgdC+0LHRi9GC0LjRjyDQvtGC0LrQu9GO0YfQtdC90LjRj1xuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtINGE0YPQvdC60YbQuNGPINC+0LHRgNCw0YLQvdC+0LPQviDQstGL0LfQvtCy0LBcbiAgICAgKi9cbiAgICBzZXRPbkRpc2Nvbm5lY3QoY2FsbGJhY2s6IChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25EaXNjb25uZWN0ID0gY2FsbGJhY2s7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiBjYWxsYmFjayDQtNC70Y8g0L7RiNC40LHQvtC6XG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0g0YTRg9C90LrRhtC40Y8g0L7QsdGA0LDRgtC90L7Qs9C+INCy0YvQt9C+0LLQsFxuICAgICAqL1xuICAgIHNldE9uRXJyb3IoY2FsbGJhY2s6IChlcnJvcjogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25FcnJvciA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCIGNhbGxiYWNrINC00LvRjyDRgdC+0LHRi9GC0LjRjyBzZW5kS2V5XG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0g0YTRg9C90LrRhtC40Y8g0L7QsdGA0LDRgtC90L7Qs9C+INCy0YvQt9C+0LLQsFxuICAgICAqL1xuICAgIHNldE9uU2VuZEtleShjYWxsYmFjazogKGRhdGE6IFNlbmRLZXlEYXRhKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25TZW5kS2V5ID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIgY2FsbGJhY2sg0LTQu9GPINGB0L7QsdGL0YLQuNGPIGNvbW1hbmRcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSDRhNGD0L3QutGG0LjRjyDQvtCx0YDQsNGC0L3QvtCz0L4g0LLRi9C30L7QstCwXG4gICAgICovXG4gICAgc2V0T25Db21tYW5kKGNhbGxiYWNrOiAoZGF0YTogQ29tbWFuZERhdGEpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNvbW1hbmQgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiBjYWxsYmFjayDQtNC70Y8g0YHQvtCx0YvRgtC40Y8gdGVybWluYWxcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSDRhNGD0L3QutGG0LjRjyDQvtCx0YDQsNGC0L3QvtCz0L4g0LLRi9C30L7QstCwXG4gICAgICovXG4gICAgc2V0T25UZXJtaW5hbChjYWxsYmFjazogKGRhdGE6IFRlcm1pbmFsRGF0YSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVGVybWluYWwgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgLyoqXG4gICAgICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIgY2FsbGJhY2sg0LTQu9GPINGB0L7QsdGL0YLQuNGPIHJlc2l6ZVxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtINGE0YPQvdC60YbQuNGPINC+0LHRgNCw0YLQvdC+0LPQviDQstGL0LfQvtCy0LBcbiAgICAgKi9cbiAgICBzZXRPblJlc2l6ZShjYWxsYmFjazogKGRhdGE6IFJlc2l6ZURhdGEpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblJlc2l6ZSA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCIGNhbGxiYWNrINC00LvRjyDRgdC+0LHRi9GC0LjRjyBjbG9zZVxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtINGE0YPQvdC60YbQuNGPINC+0LHRgNCw0YLQvdC+0LPQviDQstGL0LfQvtCy0LBcbiAgICAgKi9cbiAgICBzZXRPbkNsb3NlKGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DbG9zZSA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCIGNhbGxiYWNrINC00LvRjyDRgdC+0LHRi9GC0LjRjyBuZXdDbGllbnRcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSDRhNGD0L3QutGG0LjRjyDQvtCx0YDQsNGC0L3QvtCz0L4g0LLRi9C30L7QstCwXG4gICAgICovXG4gICAgc2V0T25OZXdDbGllbnQoY2FsbGJhY2s6IChkYXRhOiBOZXdDbGllbnREYXRhKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25OZXdDbGllbnQgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiBjYWxsYmFjayDQtNC70Y8g0YHQvtCx0YvRgtC40Y8gZGVsZXRlQ2xpZW50XG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0g0YTRg9C90LrRhtC40Y8g0L7QsdGA0LDRgtC90L7Qs9C+INCy0YvQt9C+0LLQsFxuICAgICAqL1xuICAgIHNldE9uRGVsZXRlQ2xpZW50KGNhbGxiYWNrOiAoZGF0YTogRGVsZXRlQ2xpZW50RGF0YSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uRGVsZXRlQ2xpZW50ID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIgY2FsbGJhY2sg0LTQu9GPINC/0L7Qv9GL0YLQvtC6INC/0LXRgNC10L/QvtC00LrQu9GO0YfQtdC90LjRj1xuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtINGE0YPQvdC60YbQuNGPINC+0LHRgNCw0YLQvdC+0LPQviDQstGL0LfQvtCy0LBcbiAgICAgKi9cbiAgICBzZXRPblJlY29ubmVjdEF0dGVtcHQoY2FsbGJhY2s6IChhdHRlbXB0OiBudW1iZXIsIG1heEF0dGVtcHRzOiBudW1iZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblJlY29ubmVjdEF0dGVtcHQgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiBjYWxsYmFjayDQtNC70Y8g0L3QtdGD0LTQsNGH0L3Ri9GFINC/0L7Qv9GL0YLQvtC6INC/0LXRgNC10L/QvtC00LrQu9GO0YfQtdC90LjRj1xuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtINGE0YPQvdC60YbQuNGPINC+0LHRgNCw0YLQvdC+0LPQviDQstGL0LfQvtCy0LBcbiAgICAgKi9cbiAgICBzZXRPblJlY29ubmVjdEZhaWxlZChjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uUmVjb25uZWN0RmFpbGVkID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgc2V0T25DbG9zZVNlc3Npb24oY2FsbGJhY2s6IChkYXRhOiBDbG9zZVNlc3Npb25EYXRhKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DbG9zZVNlc3Npb24gPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBzZXRPbkNsaWVudFN0YXR1cyhjYWxsYmFjazogKGRhdGE6IENsaWVudFN0YXR1c0RhdGEpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNsaWVudFN0YXR1cyA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCd0LDRgdGC0YDQsNC40LLQsNC10YIg0L/QsNGA0LDQvNC10YLRgNGLINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC+0LPQviDQv9C10YDQtdC/0L7QtNC60LvRjtGH0LXQvdC40Y9cbiAgICAgKiBAcGFyYW0gZW5hYmxlZCAtINCy0LrQu9GO0YfQuNGC0Ywv0LLRi9C60LvRjtGH0LjRgtGMIGF1dG9SZWNvbm5lY3RcbiAgICAgKiBAcGFyYW0gbWF4QXR0ZW1wdHMgLSDQvNCw0LrRgdC40LzQsNC70YzQvdC+0LUg0LrQvtC70LjRh9C10YHRgtCy0L4g0L/QvtC/0YvRgtC+0LpcbiAgICAgKiBAcGFyYW0gZGVsYXkgLSDQsdCw0LfQvtCy0LDRjyDQt9Cw0LTQtdGA0LbQutCwINC80LXQttC00YMg0L/QvtC/0YvRgtC60LDQvNC4XG4gICAgICogQHBhcmFtIG1heERlbGF5IC0g0LzQsNC60YHQuNC80LDQu9GM0L3QsNGPINC30LDQtNC10YDQttC60LBcbiAgICAgKiBAcGFyYW0gYmFja29mZk11bHRpcGxpZXIgLSDQvNC90L7QttC40YLQtdC70Ywg0LTQu9GPINGN0LrRgdC/0L7QvdC10L3RhtC40LDQu9GM0L3QvtCz0L4gYmFja29mZlxuICAgICAqL1xuICAgIHNldEF1dG9SZWNvbm5lY3RTZXR0aW5ncyhcbiAgICAgICAgZW5hYmxlZDogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIG1heEF0dGVtcHRzOiBudW1iZXIgPSBERUZBVUxUX1NFVFRJTkdTLk1BWF9SRUNPTk5FQ1RfQVRURU1QVFMsXG4gICAgICAgIGRlbGF5OiBudW1iZXIgPSBERUZBVUxUX1NFVFRJTkdTLlJFQ09OTkVDVF9ERUxBWSxcbiAgICAgICAgbWF4RGVsYXk6IG51bWJlciA9IERFRkFVTFRfU0VUVElOR1MuUkVDT05ORUNUX0RFTEFZX01BWCxcbiAgICAgICAgYmFja29mZk11bHRpcGxpZXI6IG51bWJlciA9IERFRkFVTFRfU0VUVElOR1MuUkVDT05ORUNUX0JBQ0tPRkZfTVVMVElQTElFUlxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLmF1dG9SZWNvbm5lY3RFbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgdGhpcy5tYXhSZWNvbm5lY3RBdHRlbXB0cyA9IG1heEF0dGVtcHRzO1xuICAgICAgICB0aGlzLnJlY29ubmVjdERlbGF5ID0gZGVsYXk7XG4gICAgICAgIHRoaXMucmVjb25uZWN0RGVsYXlNYXggPSBtYXhEZWxheTtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RCYWNrb2ZmTXVsdGlwbGllciA9IGJhY2tvZmZNdWx0aXBsaWVyO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5vcmlnaW5hbENvbnNvbGUubG9nKGBBdXRvUmVjb25uZWN0IHNldHRpbmdzIHVwZGF0ZWQ6IGVuYWJsZWQ9JHtlbmFibGVkfSwgbWF4QXR0ZW1wdHM9JHttYXhBdHRlbXB0c30sIGRlbGF5PSR7ZGVsYXl9bXMsIG1heERlbGF5PSR7bWF4RGVsYXl9bXMsIGJhY2tvZmZNdWx0aXBsaWVyPSR7YmFja29mZk11bHRpcGxpZXJ9YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QvtC70YPRh9Cw0LXRgiDRgtC10LrRg9GJ0LjQtSDQvdCw0YHRgtGA0L7QudC60LggYXV0b1JlY29ubmVjdFxuICAgICAqL1xuICAgIGdldEF1dG9SZWNvbm5lY3RTZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuYXV0b1JlY29ubmVjdEVuYWJsZWQsXG4gICAgICAgICAgICBtYXhBdHRlbXB0czogdGhpcy5tYXhSZWNvbm5lY3RBdHRlbXB0cyxcbiAgICAgICAgICAgIGRlbGF5OiB0aGlzLnJlY29ubmVjdERlbGF5LFxuICAgICAgICAgICAgbWF4RGVsYXk6IHRoaXMucmVjb25uZWN0RGVsYXlNYXgsXG4gICAgICAgICAgICBiYWNrb2ZmTXVsdGlwbGllcjogdGhpcy5yZWNvbm5lY3RCYWNrb2ZmTXVsdGlwbGllcixcbiAgICAgICAgICAgIGN1cnJlbnRBdHRlbXB0czogdGhpcy5yZWNvbm5lY3RBdHRlbXB0c1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0L7QtNC60LvRjtGH0LDQtdGC0YHRjyDQuiDRgdC10YDQstC10YDRg1xuICAgICAqL1xuICAgIGNvbm5lY3QoY2xpZW50VHlwZTogQ2xpZW50VHlwZSk6IHZvaWQge1xuICAgICAgICAvLyDQn9GA0L7QstC10YDRj9C10LwsINC90LUg0L/QvtC00LrQu9GO0YfQtdC90Ysg0LvQuCDRg9C20LVcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29ubmVjdGVkICYmIHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgICAvLyDQldGB0LvQuCDRg9C20LUg0L/QvtC00LrQu9GO0YfQtdC90YssINC/0YDQvtGB0YLQviDQvtGC0L/RgNCw0LLQu9GP0LXQvCDRgdC+0L7QsdGJ0LXQvdC40LUg0L/QvtC00LrQu9GO0YfQtdC90LjRj1xuICAgICAgICAgICAgdGhpcy5zZW5kQ29ubmVjdChjbGllbnRUeXBlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8g0JXRgdC70Lgg0L3QtSDQv9C+0LTQutC70Y7Rh9C10L3Riywg0YHQvtC30LTQsNC10Lwg0L3QvtCy0L7QtSDRgdC+0LXQtNC40L3QtdC90LjQtVxuICAgICAgICB0aGlzLmNvbm5lY3RXcygoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbmRDb25uZWN0KGNsaWVudFR5cGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXRgiBXZWJTb2NrZXQg0YHQvtC10LTQuNC90LXQvdC40LUg0YEgY2FsbGJhY2tcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbm5lY3RXcyhvbkNvbm5lY3RlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g0J7RgtC80LXQvdGP0LXQvCDQv9GA0LXQtNGL0LTRg9GJ0LjQuSDRgtCw0LnQvNC10YAg0L/QtdGA0LXQv9C+0LTQutC70Y7Rh9C10L3QuNGPXG4gICAgICAgICAgICB0aGlzLmNsZWFyUmVjb25uZWN0VGltZXIoKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbENvbnNvbGUubG9nKGBDb25uZWN0aW5nIHRvIHNlcnZlcjogJHt0aGlzLnNlcnZlclVybH0gKGF0dGVtcHQgJHt0aGlzLnJlY29ubmVjdEF0dGVtcHRzICsgMX0vJHt0aGlzLm1heFJlY29ubmVjdEF0dGVtcHRzICsgMX0pYCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vINCj0LLQtdC00L7QvNC70Y/QtdC8INC+INC/0L7Qv9GL0YLQutC1INC/0LXRgNC10L/QvtC00LrQu9GO0YfQtdC90LjRj1xuICAgICAgICAgICAgaWYgKHRoaXMub25SZWNvbm5lY3RBdHRlbXB0ICYmIHRoaXMucmVjb25uZWN0QXR0ZW1wdHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblJlY29ubmVjdEF0dGVtcHQodGhpcy5yZWNvbm5lY3RBdHRlbXB0cywgdGhpcy5tYXhSZWNvbm5lY3RBdHRlbXB0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLnNlcnZlclVybCk7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbENvbnNvbGUubG9nKCdXZWJTb2NrZXQgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHRzID0gMDsgLy8g0KHQsdGA0LDRgdGL0LLQsNC10Lwg0YHRh9C10YLRh9C40Log0L/RgNC4INGD0YHQv9C10YjQvdC+0Lwg0L/QvtC00LrQu9GO0YfQtdC90LjQuFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vINCS0YvQt9GL0LLQsNC10LwgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICBvbkNvbm5lY3RlZCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uQ29ubmVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ29ubmVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVNZXNzYWdlKGV2ZW50LmRhdGEpLnRoZW4oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoZXZlbnQ6IENsb3NlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9yaWdpbmFsQ29uc29sZT8ubG9nKCdXZWJTb2NrZXQgY29ubmVjdGlvbiBjbG9zZWQ6JywgZXZlbnQuY29kZSwgZXZlbnQucmVhc29uKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uRGlzY29ubmVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRGlzY29ubmVjdChldmVudC5jb2RlLCBldmVudC5yZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyDQn9C+0L/Ri9GC0LrQsCDQv9C10YDQtdC/0L7QtNC60LvRjtGH0LXQvdC40Y9cbiAgICAgICAgICAgICAgICB0aGlzLmF0dGVtcHRSZWNvbm5lY3QoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoZXJyb3I6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbENvbnNvbGU/LmVycm9yKCdXZWJTb2NrZXQgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxDb25zb2xlPy5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBXZWJTb2NrZXQgY29ubmVjdGlvbjonLCBlcnJvcik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0aGlzLm9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyDQn9C70LDQvdC40YDRg9C10Lwg0L/QtdGA0LXQv9C+0LTQutC70Y7Rh9C10L3QuNC1INC/0YDQuCDQvtGI0LjQsdC60LUg0YHQvtC30LTQsNC90LjRjyDRgdC+0LXQtNC40L3QtdC90LjRj1xuICAgICAgICAgICAgdGhpcy5hdHRlbXB0UmVjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0L/Ri9GC0LrQsCDQv9C10YDQtdC/0L7QtNC60LvRjtGH0LXQvdC40Y9cbiAgICAgKi9cbiAgICBhdHRlbXB0UmVjb25uZWN0KGNsaWVudFR5cGU/OiBDbGllbnRUeXBlKTogdm9pZCB7XG4gICAgICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCwg0LLQutC70Y7Rh9C10L0g0LvQuCBhdXRvUmVjb25uZWN0XG4gICAgICAgIGlmICghdGhpcy5hdXRvUmVjb25uZWN0RW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbENvbnNvbGU/LmxvZygnQXV0b1JlY29ubmVjdCBpcyBkaXNhYmxlZCwgbm90IGF0dGVtcHRpbmcgdG8gcmVjb25uZWN0Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZWNvbm5lY3RBdHRlbXB0cyA8IHRoaXMubWF4UmVjb25uZWN0QXR0ZW1wdHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdHMrKztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8g0JLRi9GH0LjRgdC70Y/QtdC8INC30LDQtNC10YDQttC60YMg0YEg0Y3QutGB0L/QvtC90LXQvdGG0LjQsNC70YzQvdGL0LwgYmFja29mZlxuICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdERlbGF5ICogTWF0aC5wb3codGhpcy5yZWNvbm5lY3RCYWNrb2ZmTXVsdGlwbGllciwgdGhpcy5yZWNvbm5lY3RBdHRlbXB0cyAtIDEpLFxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0RGVsYXlNYXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxDb25zb2xlPy5sb2coYEF0dGVtcHRpbmcgdG8gcmVjb25uZWN0ICgke3RoaXMucmVjb25uZWN0QXR0ZW1wdHN9LyR7dGhpcy5tYXhSZWNvbm5lY3RBdHRlbXB0c30pIGluICR7ZGVsYXl9bXMuLi5gKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8g0KPQstC10LTQvtC80LvRj9C10Lwg0L4g0L/QvtC/0YvRgtC60LUg0L/QtdGA0LXQv9C+0LTQutC70Y7Rh9C10L3QuNGPXG4gICAgICAgICAgICBpZiAodGhpcy5vblJlY29ubmVjdEF0dGVtcHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUmVjb25uZWN0QXR0ZW1wdCh0aGlzLnJlY29ubmVjdEF0dGVtcHRzLCB0aGlzLm1heFJlY29ubmVjdEF0dGVtcHRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8g0J/Qu9Cw0L3QuNGA0YPQtdC8INC/0LXRgNC10L/QvtC00LrQu9GO0YfQtdC90LjQtVxuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2xpZW50VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoY2xpZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g0JXRgdC70LggY2xpZW50VHlwZSDQvdC1INC/0LXRgNC10LTQsNC9LCDQuNGB0L/QvtC70YzQt9GD0LXQvCBjb25uZWN0V3Mg0LHQtdC3IGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdFdzKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsQ29uc29sZT8uZXJyb3IoJ01heCByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgcmVhY2hlZCcpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyDQo9Cy0LXQtNC+0LzQu9GP0LXQvCDQviDQvdC10YPQtNCw0YfQvdGL0YUg0L/QvtC/0YvRgtC60LDRhSDQv9C10YDQtdC/0L7QtNC60LvRjtGH0LXQvdC40Y9cbiAgICAgICAgICAgIGlmICh0aGlzLm9uUmVjb25uZWN0RmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblJlY29ubmVjdEZhaWxlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7Rh9C40YnQsNC10YIg0YLQsNC50LzQtdGAINC/0LXRgNC10L/QvtC00LrQu9GO0YfQtdC90LjRj1xuICAgICAqL1xuICAgIGNsZWFyUmVjb25uZWN0VGltZXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJlY29ubmVjdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RUaW1lcik7XG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0YLQv9GA0LDQstC70Y/QtdGCINGB0L7QvtCx0YnQtdC90LjQtSDQv9C+0LTQutC70Y7Rh9C10L3QuNGPXG4gICAgICogQHBhcmFtIGNsaWVudFR5cGUgLSDRgtC40L8g0LrQu9C40LXQvdGC0LBcbiAgICAgKi9cbiAgICBzZW5kQ29ubmVjdChjbGllbnRUeXBlOiBDbGllbnRUeXBlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IFdlYlNvY2tldE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICBldmVudDogJ2Nvbm5lY3QnIGFzIEV2ZW50VHlwZSxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAvL25hbWU6IERFRkFVTFRfU0VUVElOR1MuREVGQVVMVF9DTElFTlRfTkFNRSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnd2ViY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgY2xpZW50VHlwZTogY2xpZW50VHlwZVxuICAgICAgICAgICAgfSBhcyBDb25uZWN0RGF0YVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBzZW5kQ29tbWFuZCh0YXJnZXQ6c3RyaW5nLCBjb21tYW5kOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZTogV2ViU29ja2V0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGV2ZW50OiAnY29tbWFuZCcgYXMgRXZlbnRUeXBlLFxuICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IGNvbW1hbmRcbiAgICAgICAgICAgIH0gYXMgQ29tbWFuZERhdGFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntGC0L/RgNCw0LLQu9GP0LXRgiDRgdC+0L7QsdGJ0LXQvdC40LUg0LjQtNC10L3RgtC40YTQuNC60LDRhtC40LhcbiAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIC0gSUQg0YHQtdGB0YHQuNC4XG4gICAgICovXG4gICAgc2VuZElkZW50aWZ5KHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChzZXNzaW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2U6IFdlYlNvY2tldE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAgZXZlbnQ6ICdpZGVudGlmeScgYXMgRXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRcbiAgICAgICAgICAgICAgICB9IGFzIElkZW50aWZ5RGF0YVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0YLQv9GA0LDQstC70Y/QtdGCINC00LDQvdC90YvQtSDRgtC10YDQvNC40L3QsNC70LAg0L3QsCDRgdC10YDQstC10YBcbiAgICAgKiBAcGFyYW0gZGF0YSAtINC00LDQvdC90YvQtSDQtNC70Y8g0L7RgtC/0YDQsNCy0LrQuFxuICAgICAqIEBwYXJhbSBpbmRleCAtINC40L3QtNC10LrRgSDQtNCw0L3QvdGL0YVcbiAgICAgKi9cbiAgICBzZW5kVGVybWluYWxEYXRhKHNlc3Npb25JZDpzdHJpbmcsZGF0YTogc3RyaW5nLCBpbmRleDogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtZXNzYWdlOiBXZWJTb2NrZXRNZXNzYWdlID0ge1xuICAgICAgICAgICAgZXZlbnQ6ICdvdXRwdXQnIGFzIEV2ZW50VHlwZSxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICAgICAgfSBhcyBUZXJtaW5hbERhdGFcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgc2VuZE5ld1Nlc3Npb24oIGNsaWVudElkOiBzdHJpbmcsIHNlc3Npb25JZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZTogV2ViU29ja2V0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGV2ZW50OiAnbmV3U2Vzc2lvbicgYXMgRXZlbnRUeXBlLFxuICAgICAgICAgICAgdGFyZ2V0OiBjbGllbnRJZCxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgICAgICB9IGFzIE5ld1Nlc3Npb25Db21tYW5kRGF0YVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHNlbmRDdXJzb3JTdGF0ZShkYXRhOiBDdXJzb3JTdGF0ZURhdGEpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZTogV2ViU29ja2V0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGV2ZW50OiAnY3Vyc29yJyBhcyBFdmVudFR5cGUsXG4gICAgICAgICAgICBkYXRhOiBkYXRhIGFzIEN1cnNvclN0YXRlRGF0YVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHNlbmRTZW5kS2V5KGRhdGE6IFNlbmRLZXlEYXRhKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IFdlYlNvY2tldE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICBldmVudDogJ3NlbmRLZXknIGFzIEV2ZW50VHlwZSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEgYXMgU2VuZEtleURhdGFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBzZW5kSG90S2V5KGRhdGE6IEhvdEtleURhdGEpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZTogV2ViU29ja2V0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGV2ZW50OiAnaG90a2V5JyBhcyBFdmVudFR5cGUsXG4gICAgICAgICAgICBkYXRhOiBkYXRhIGFzIEhvdEtleURhdGFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBzZW5kTmV3Q2xpZW50KGRhdGE6IE5ld0NsaWVudERhdGEpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZTogV2ViU29ja2V0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGV2ZW50OiAnbmV3Q2xpZW50JyBhcyBFdmVudFR5cGUsXG4gICAgICAgICAgICBkYXRhOiBkYXRhIGFzIE5ld0NsaWVudERhdGFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBzZW5kRGVsZXRlQ2xpZW50KGRhdGE6IERlbGV0ZUNsaWVudERhdGEpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZTogV2ViU29ja2V0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGV2ZW50OiAnZGVsZXRlQ2xpZW50JyBhcyBFdmVudFR5cGUsXG4gICAgICAgICAgICBkYXRhOiBkYXRhIGFzIERlbGV0ZUNsaWVudERhdGFcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntGC0L/RgNCw0LLQu9GP0LXRgiDRgdC+0L7QsdGJ0LXQvdC40LUg0L3QsCDRgdC10YDQstC10YBcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtINGB0L7QvtCx0YnQtdC90LjQtSDQtNC70Y8g0L7RgtC/0YDQsNCy0LrQuFxuICAgICAqL1xuICAgIHNlbmRNZXNzYWdlKG1lc3NhZ2U6IFdlYlNvY2tldE1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGpzb25NZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChqc29uTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbENvbnNvbGUubG9nKCdTZW50IG1lc3NhZ2U6JywgbWVzc2FnZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbENvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzZW5kIG1lc3NhZ2U6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsQ29uc29sZS53YXJuKCdDYW5ub3Qgc2VuZCBtZXNzYWdlOiBXZWJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCINCy0YXQvtC00Y/RidC40LUg0YHQvtC+0LHRidC10L3QuNGPXG4gICAgICogQHBhcmFtIGRhdGEgLSDQtNCw0L3QvdGL0LUg0YHQvtC+0LHRidC10L3QuNGPXG4gICAgICovXG4gICBhc3luYyBoYW5kbGVNZXNzYWdlKGRhdGE6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZTogV2ViU29ja2V0TWVzc2FnZSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsQ29uc29sZS5sb2coJ1JlY2VpdmVkIG1lc3NhZ2U6JywgbWVzc2FnZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8g0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdC8INGB0L7QsdGL0YLQuNGPINGH0LXRgNC10LcgY2FsbGJhY2sn0LhcbiAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS5ldmVudCkge1xuICAgICAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlQ29uc3QuQ1VSU09SX1NUQVRFOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkN1cnNvclN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ3Vyc29yU3RhdGUobWVzc2FnZS5kYXRhIGFzIEN1cnNvclN0YXRlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBFdmVudFR5cGVDb25zdC5TRU5EX0tFWTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25TZW5kS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2VuZEtleShtZXNzYWdlLmRhdGEgYXMgU2VuZEtleURhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZUNvbnN0LkNPTU1BTkQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uQ29tbWFuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkNvbW1hbmQobWVzc2FnZS5kYXRhIGFzIENvbW1hbmREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY2FzZSBFdmVudFR5cGVDb25zdC5SRVNJWkU6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uUmVzaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUmVzaXplKG1lc3NhZ2UuZGF0YSBhcyBSZXNpemVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZUNvbnN0Lk9VVFBVVDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25UZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblRlcm1pbmFsKG1lc3NhZ2UuZGF0YSBhcyBUZXJtaW5hbERhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjYXNlIEV2ZW50VHlwZUNvbnN0LkNMT1NFOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkNsb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2xvc2UobWVzc2FnZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY2FzZSBFdmVudFR5cGVDb25zdC5ORVdfQ0xJRU5UOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbk5ld0NsaWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk5ld0NsaWVudChtZXNzYWdlLmRhdGEgYXMgTmV3Q2xpZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlQ29uc3QuREVMRVRFX0NMSUVOVDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25EZWxldGVDbGllbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25EZWxldGVDbGllbnQobWVzc2FnZS5kYXRhIGFzIERlbGV0ZUNsaWVudERhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlQ29uc3QuQ0xPU0VfU0VTU0lPTjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25DbG9zZVNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25DbG9zZVNlc3Npb24obWVzc2FnZS5kYXRhIGFzIENsb3NlU2Vzc2lvbkRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgRXZlbnRUeXBlQ29uc3QuQ0xJRU5UX1NUQVRVUzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub25DbGllbnRTdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25DbGllbnRTdGF0dXMobWVzc2FnZS5kYXRhIGFzIENsaWVudFN0YXR1c0RhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9yaWdpbmFsQ29uc29sZS5sb2coJ1Vua25vd24gZXZlbnQgdHlwZTonLCBtZXNzYWdlLmV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsQ29uc29sZS5lcnJvcignRmFpbGVkIHRvIHBhcnNlIG1lc3NhZ2U6JywgZXJyb3IpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodGhpcy5vbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICog0J7RgtC60LvRjtGH0LDQtdGC0YHRjyDQvtGCINGB0LXRgNCy0LXRgNCwXG4gICAgICovXG4gICAgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICAgICAgLy8g0J7Rh9C40YnQsNC10Lwg0YLQsNC50LzQtdGAINC/0LXRgNC10L/QvtC00LrQu9GO0YfQtdC90LjRj1xuICAgICAgICB0aGlzLmNsZWFyUmVjb25uZWN0VGltZXIoKTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQvtCy0LXRgNGP0LXRgiwg0L/QvtC00LrQu9GO0YfQtdC9INC70Lgg0LrQu9C40LXQvdGCXG4gICAgICogQHJldHVybnMg0YHRgtCw0YLRg9GBINC/0L7QtNC60LvRjtGH0LXQvdC40Y9cbiAgICAgKi9cbiAgICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzQ29ubmVjdGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0YfQuNGJ0LDQtdGCINGA0LXRgdGD0YDRgdGLINC4INCy0L7RgdGB0YLQsNC90LDQstC70LjQstCw0LXRgiDQvtGA0LjQs9C40L3QsNC70YzQvdGL0LUg0LzQtdGC0L7QtNGLIGNvbnNvbGVcbiAgICAgKi9cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbENvbnNvbGUgPSBudWxsIGFzIGFueTtcbiAgICAgICAgdGhpcy5vbkNvbm5lY3QgPSBudWxsO1xuICAgICAgICB0aGlzLm9uRGlzY29ubmVjdCA9IG51bGw7XG4gICAgICAgIHRoaXMub25FcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMub25TZW5kS2V5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkNvbW1hbmQgPSBudWxsO1xuICAgICAgICB0aGlzLm9uUmVzaXplID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkNsb3NlID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbk5ld0NsaWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMub25EZWxldGVDbGllbnQgPSBudWxsO1xuICAgIH1cbn1cbiIsIi8qKlxuICogQ29tbWFuZEJ1aWxkZXIudHMgLSDQmtC70LDRgdGBINC00LvRjyDRhNC+0YDQvNC40YDQvtCy0LDQvdC40Y8g0LrQvtC80LDQvdC0INCyINGC0LXRgNC80LjQvdCw0LvQtVxuICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCINCy0LLQvtC0INGB0LjQvNCy0L7Qu9C+0LIsINGD0L/RgNCw0LLQu9C10L3QuNC1INC60YPRgNGB0L7RgNC+0Lwg0Lgg0YTQvtGA0LzQuNGA0L7QstCw0L3QuNC1INC60L7QvNCw0L3QtFxuICog0JjRgdC/0L7Qu9GM0LfRg9C10YIgY2FsbGJhY2sn0Lgg0LTQu9GPINGD0LLQtdC00L7QvNC70LXQvdC40Y8g0L7QsSDQuNC30LzQtdC90LXQvdC40Y/RhSDQuCDQstGL0L/QvtC70L3QtdC90LjQuCDQutC+0LzQsNC90LRcbiAqL1xuXG5pbXBvcnQgeyBUZXJtaW5hbFVpV3JpdGVyIH0gZnJvbSAnLi90ZXJtaW5hbC11aS13cml0ZXInO1xuXG4vLyDQmNC90YLQtdGA0YTQtdC50YHRiyDQtNC70Y8g0YLQuNC/0LjQt9Cw0YbQuNC4XG5pbnRlcmZhY2UgU3RhdGVDaGFuZ2VDYWxsYmFjayB7XG4gIChzdGF0ZTogQ29tbWFuZFN0YXRlKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIEV4ZWN1dGVDb21tYW5kQ2FsbGJhY2sge1xuICAoY29tbWFuZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuaW50ZXJmYWNlIENvbW1hbmRTdGF0ZSB7XG4gIHBvc3RpdGlvbjogbnVtYmVyO1xuICBjb21tYW5kOiBzdHJpbmc7XG59XG5cbi8qKlxuICog0JrQu9Cw0YHRgSBDb21tYW5kQnVpbGRlciAtINC+0LHRgNCw0LHQsNGC0YvQstCw0LXRgiDQu9C+0LPQuNC60YMg0YTQvtGA0LzQuNGA0L7QstCw0L3QuNGPINC60L7QvNCw0L3QtNGLXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21tYW5kQnVpbGRlciB7XG4gIHByaXZhdGUgY29tbWFuZEJ1ZmZlcjogc3RyaW5nID0gJyc7IC8vINCR0YPRhNC10YAg0LTQu9GPINC90LDQutC+0L/Qu9C10L3QuNGPINC60L7QvNCw0L3QtNGLXG4gIHByaXZhdGUgY3Vyc29yUG9zaXRpb246IG51bWJlciA9IDA7IC8vINCf0L7Qt9C40YbQuNGPINC60YPRgNGB0L7RgNCwINCyINCx0YPRhNC10YDQtVxuICBwcml2YXRlIGhpc3Rvcnk6IHN0cmluZ1tdID0gW107IC8vINCY0YHRgtC+0YDQuNGPINC60L7QvNCw0L3QtFxuICBwcml2YXRlIGhpc3RvcnlJbmRleDogbnVtYmVyID0gLTE7IC8vINCY0L3QtNC10LrRgSDQsiDQuNGB0YLQvtGA0LjQuFxuICBwcml2YXRlIHRlcm1pbmFsVWlXcml0ZXI6IFRlcm1pbmFsVWlXcml0ZXIgfCBudWxsID0gbnVsbDsgLy8gVGVybWluYWxVaVdyaXRlciDQtNC70Y8g0L7RgtGA0LjRgdC+0LLQutC4XG4gIFxuICAvLyBDYWxsYmFja3NcbiAgcHJpdmF0ZSBvblN0YXRlQ2hhbmdlOiBTdGF0ZUNoYW5nZUNhbGxiYWNrIHwgbnVsbCA9IG51bGw7IC8vIENhbGxiYWNrINC00LvRjyDQuNC30LzQtdC90LXQvdC40Y8g0YHQvtGB0YLQvtGP0L3QuNGPICjQutC+0LzQsNC90LTQsCDQuCDQv9C+0LfQuNGG0LjRjyDQutGD0YDRgdC+0YDQsClcbiAgcHJpdmF0ZSBvbkV4ZWN1dGVDb21tYW5kOiBFeGVjdXRlQ29tbWFuZENhbGxiYWNrIHwgbnVsbCA9IG51bGw7IC8vIENhbGxiYWNrINC00LvRjyDQstGL0L/QvtC70L3QtdC90LjRjyDQutC+0LzQsNC90LTRi1xuXG4gIC8qKlxuICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiBjYWxsYmFjayDQtNC70Y8g0LjQt9C80LXQvdC10L3QuNGPINGB0L7RgdGC0L7Rj9C90LjRj1xuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSDRhNGD0L3QutGG0LjRjyDQvtCx0YDQsNGC0L3QvtCz0L4g0LLRi9C30L7QstCwXG4gICAqL1xuICBzZXRPblN0YXRlQ2hhbmdlKGNhbGxiYWNrOiBTdGF0ZUNoYW5nZUNhbGxiYWNrKTogdm9pZCB7XG4gICAgdGhpcy5vblN0YXRlQ2hhbmdlID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIgY2FsbGJhY2sg0LTQu9GPINCy0YvQv9C+0LvQvdC10L3QuNGPINC60L7QvNCw0L3QtNGLXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtINGE0YPQvdC60YbQuNGPINC+0LHRgNCw0YLQvdC+0LPQviDQstGL0LfQvtCy0LBcbiAgICovXG4gIHNldE9uRXhlY3V0ZUNvbW1hbmQoY2FsbGJhY2s6IEV4ZWN1dGVDb21tYW5kQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLm9uRXhlY3V0ZUNvbW1hbmQgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiBUZXJtaW5hbFVpV3JpdGVyINC00LvRjyDQvtGC0YDQuNGB0L7QstC60LhcbiAgICogQHBhcmFtIHdyaXRlciAtINGN0LrQt9C10LzQv9C70Y/RgCBUZXJtaW5hbFVpV3JpdGVyXG4gICAqL1xuICBzZXRUZXJtaW5hbFVpV3JpdGVyKHdyaXRlcjogVGVybWluYWxVaVdyaXRlcik6IHZvaWQge1xuICAgIHRoaXMudGVybWluYWxVaVdyaXRlciA9IHdyaXRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiDQl9Cw0L/QuNGB0YvQstCw0LXRgiDRgdC40LzQstC+0Lsg0LIg0LHRg9GE0LXRgCDQutC+0LzQsNC90LTRi1xuICAgKiBAcGFyYW0gY2hhciAtINGB0LjQvNCy0L7QuyDQtNC70Y8g0LfQsNC/0LjRgdC4XG4gICAqL1xuICBhc3luYyB3cml0ZShjaGFyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hhciA9PT0gJ1xccicgfHwgY2hhciA9PT0gJ1xcbicpIHtcbiAgICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCwg0LXRgdGC0Ywg0LvQuCDRgdC40LzQstC+0LsgXFxcXCDQsiDQutC+0L3RhtC1INGB0YLRgNC+0LrQuFxuICAgICAgaWYgKHRoaXMuY29tbWFuZEJ1ZmZlci5lbmRzV2l0aCgnXFxcXCcpKSB7XG4gICAgICAgIC8vINCV0YHQu9C4INC/0L7RgdC70LXQtNC90LjQuSDRgdC40LzQstC+0LsgXFxcXCDigJQg0LTQvtCx0LDQstC70Y/QtdC8INC/0LXRgNC10L3QvtGBINGB0YLRgNC+0LrQuCwg0YHQvtGF0YDQsNC90Y/RjyBcXFxcINC90LAg0Y3QutGA0LDQvdC1XG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlciA9IHRoaXMuY29tbWFuZEJ1ZmZlciArICdcXG4nO1xuICAgICAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gdGhpcy5jb21tYW5kQnVmZmVyLmxlbmd0aDtcbiAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g0J7QsdGL0YfQvdGL0LkgRW50ZXIgLSDQstGL0L/QvtC70L3Rj9C10Lwg0LrQvtC80LDQvdC00YNcbiAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlQ29tbWFuZCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1xcYicgfHwgY2hhciA9PT0gJ1xceDdmJykge1xuICAgICAgLy8gQmFja3NwYWNlIC0g0YPQtNCw0LvRj9C10Lwg0YHQuNC80LLQvtC7INC/0LXRgNC10LQg0LrRg9GA0YHQvtGA0L7QvFxuICAgICAgaWYgKHRoaXMuY3Vyc29yUG9zaXRpb24gPiAwKSB7XG4gICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlciA9IHRoaXMuY29tbWFuZEJ1ZmZlci5zbGljZSgwLCB0aGlzLmN1cnNvclBvc2l0aW9uIC0gMSkgKyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlci5zbGljZSh0aGlzLmN1cnNvclBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJzb3JQb3NpdGlvbi0tO1xuICAgICAgICB0aGlzLm5vdGlmeVN0YXRlQ2hhbmdlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSAnXFx4MWJbQScpIHtcbiAgICAgIC8vINCh0YLRgNC10LvQutCwINCy0LLQtdGA0YUg4oCUINC10YHQu9C4INC10YHRgtGMINGB0YLRgNC+0LrQsCDQstGL0YjQtSwg0L/QtdGA0LXQvNC10YnQsNC10Lwg0LrRg9GA0YHQvtGAINC/0L4g0LzQvdC+0LPQvtGB0YLRgNC+0YfQvdC+0LzRgyDQsdGD0YTQtdGA0YMsXG4gICAgICAvLyDQuNC90LDRh9C1INC/0LXRgNC10YXQvtC00LjQvCDQv9C+INC40YHRgtC+0YDQuNC4XG4gICAgICBpZiAoIXRoaXMubW92ZUN1cnNvclVwKCkpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZUhpc3RvcnkoLTEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1xceDFiW0InKSB7XG4gICAgICAvLyDQodGC0YDQtdC70LrQsCDQstC90LjQtyDigJQg0LXRgdC70Lgg0LXRgdGC0Ywg0YHRgtGA0L7QutCwINC90LjQttC1LCDQv9C10YDQtdC80LXRidCw0LXQvCDQutGD0YDRgdC+0YAg0L/QviDQvNC90L7Qs9C+0YHRgtGA0L7Rh9C90L7QvNGDINCx0YPRhNC10YDRgyxcbiAgICAgIC8vINC40L3QsNGH0LUg0L/QtdGA0LXRhdC+0LTQuNC8INC/0L4g0LjRgdGC0L7RgNC40LhcbiAgICAgIGlmICghdGhpcy5tb3ZlQ3Vyc29yRG93bigpKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGVIaXN0b3J5KDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1xceDFiW0MnKSB7XG4gICAgICAvLyDQodGC0YDQtdC70LrQsCDQstC/0YDQsNCy0L4gLSDQutGD0YDRgdC+0YAg0LLQv9GA0LDQstC+XG4gICAgICB0aGlzLm1vdmVDdXJzb3JSaWdodCgpO1xuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1xceDFiW0QnKSB7XG4gICAgICAvLyDQodGC0YDQtdC70LrQsCDQstC70LXQstC+IC0g0LrRg9GA0YHQvtGAINCy0LvQtdCy0L5cbiAgICAgIHRoaXMubW92ZUN1cnNvckxlZnQoKTtcbiAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICdcXHgwMycpIHtcbiAgICAgIC8vIEN0cmwrQyAtINC+0YfQuNGJ0LDQtdC8INCx0YPRhNC10YBcbiAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlciA9ICcnO1xuICAgICAgdGhpcy5jdXJzb3JQb3NpdGlvbiA9IDA7XG4gICAgICB0aGlzLm5vdGlmeVN0YXRlQ2hhbmdlKCk7XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSAnXFx4MDQnKSB7XG4gICAgICAvLyBDdHJsK0QgLSDQstGL0YXQvtC0XG4gICAgICB0aGlzLm5vdGlmeVN0YXRlQ2hhbmdlKCk7XG4gICAgfSBlbHNlIGlmIChjaGFyID09PSAnXFx4MGMnKSB7XG4gICAgICAvLyBDdHJsK0wgLSDQvtGH0LjRgdGC0LrQsCDRjdC60YDQsNC90LBcbiAgICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g0J7QsdGL0YfQvdGL0Lkg0YHQuNC80LLQvtC7IC0g0LTQvtCx0LDQstC70Y/QtdC8INCyINCx0YPRhNC10YAg0LIg0L/QvtC30LjRhtC40Y4g0LrRg9GA0YHQvtGA0LBcbiAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlciA9IHRoaXMuY29tbWFuZEJ1ZmZlci5zbGljZSgwLCB0aGlzLmN1cnNvclBvc2l0aW9uKSArIFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKyBcbiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRCdWZmZXIuc2xpY2UodGhpcy5jdXJzb3JQb3NpdGlvbik7XG4gICAgICB0aGlzLmN1cnNvclBvc2l0aW9uKys7XG4gICAgICB0aGlzLm5vdGlmeVN0YXRlQ2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqINCS0YvQv9C+0LvQvdGP0LXRgiDQutC+0LzQsNC90LTRgyDQuNC3INCx0YPRhNC10YDQsFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUNvbW1hbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g0J/QvtC00LPQvtGC0L7QstC60LAg0LrQvtC80LDQvdC00Ys6INGD0LTQsNC70Y/QtdC8INC/0L7RgdC70LXQtNC+0LLQsNGC0LXQu9GM0L3QvtGB0YLQuCBcXFxcXFxuINC00LvRjyDQvNC90L7Qs9C+0YHRgtGA0L7Rh9C90YvRhSDQutC+0L3RgdGC0YDRg9C60YbQuNC5XG4gICAgY29uc3QgcHJlcGFyZWQgPSB0aGlzLmNvbW1hbmRCdWZmZXIucmVwbGFjZSgvXFxcXFxcbi9nLCAnJyk7XG4gICAgY29uc3QgY29tbWFuZCA9IHByZXBhcmVkLnRyaW0oKTtcbiAgICBcbiAgICBpZiAoY29tbWFuZC5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vINCf0YPRgdGC0LDRjyDQutC+0LzQsNC90LTQsCAtINC/0YDQvtGB0YLQviDQvdC+0LLQsNGPINGB0YLRgNC+0LrQsFxuICAgICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vINCU0L7QsdCw0LLQu9GP0LXQvCDQutC+0LzQsNC90LTRgyDQsiDQuNGB0YLQvtGA0LjRjlxuICAgIGlmIChjb21tYW5kICE9PSB0aGlzLmhpc3RvcnlbdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDFdKSB7XG4gICAgICB0aGlzLmhpc3RvcnkucHVzaChjb21tYW5kKTtcbiAgICAgIGlmICh0aGlzLmhpc3RvcnkubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5zaGlmdCgpOyAvLyDQntCz0YDQsNC90LjRh9C40LLQsNC10Lwg0LjRgdGC0L7RgNC40Y4gMTAwINC60L7QvNCw0L3QtNCw0LzQuFxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmhpc3RvcnlJbmRleCA9IHRoaXMuaGlzdG9yeS5sZW5ndGg7XG5cbiAgICAvLyDQo9Cy0LXQtNC+0LzQu9GP0LXQvCDQviDQstGL0L/QvtC70L3QtdC90LjQuCDQutC+0LzQsNC90LTRi1xuICAgIGlmICh0aGlzLm9uRXhlY3V0ZUNvbW1hbmQpIHtcbiAgICAgIGF3YWl0IHRoaXMub25FeGVjdXRlQ29tbWFuZChjb21tYW5kKTtcbiAgICB9XG5cbiAgICAvLyDQntGH0LjRidCw0LXQvCDQsdGD0YTQtdGAINC4INGB0LHRgNCw0YHRi9Cy0LDQtdC8INC/0L7Qt9C40YbQuNGOINC60YPRgNGB0L7RgNCwXG4gICAgdGhpcy5jb21tYW5kQnVmZmVyID0gJyc7XG4gICAgdGhpcy5jdXJzb3JQb3NpdGlvbiA9IDA7XG4gICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqINCf0LXRgNC10LzQtdGJ0LDQtdGCINC60YPRgNGB0L7RgCDQstC70LXQstC+XG4gICAqL1xuICBtb3ZlQ3Vyc29yTGVmdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJzb3JQb3NpdGlvbiA+IDApIHtcbiAgICAgIHRoaXMuY3Vyc29yUG9zaXRpb24tLTtcbiAgICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog0J/QtdGA0LXQvNC10YnQsNC10YIg0LrRg9GA0YHQvtGAINCy0L/RgNCw0LLQvlxuICAgKi9cbiAgbW92ZUN1cnNvclJpZ2h0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnNvclBvc2l0aW9uIDwgdGhpcy5jb21tYW5kQnVmZmVyLmxlbmd0aCkge1xuICAgICAgdGhpcy5jdXJzb3JQb3NpdGlvbisrO1xuICAgICAgdGhpcy5ub3RpZnlTdGF0ZUNoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDQn9C10YDQtdC80LXRidCw0LXRgiDQutGD0YDRgdC+0YAg0L3QsCDRgdGC0YDQvtC60YMg0LLRi9GI0LUgKNGBINGB0L7RhdGA0LDQvdC10L3QuNC10Lwg0LrQvtC70L7QvdC60LgsINC10YHQu9C4INCy0L7Qt9C80L7QttC90L4pXG4gICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCIHRydWUsINC10YHQu9C4INC/0LXRgNC10LzQtdGJ0LXQvdC40LUg0LLQvtC30LzQvtC20L3QviDQuCDQstGL0L/QvtC70L3QtdC90L5cbiAgICovXG4gIHByaXZhdGUgbW92ZUN1cnNvclVwKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNvbW1hbmRCdWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLmNvbW1hbmRCdWZmZXIuc2xpY2UoMCwgdGhpcy5jdXJzb3JQb3NpdGlvbik7XG4gICAgY29uc3QgY3VycmVudExpbmVTdGFydCA9IGJlZm9yZS5sYXN0SW5kZXhPZignXFxuJykgKyAxOyAvLyAwLCDQtdGB0LvQuCDQvdC10YIg0L/QtdGA0LXQstC+0LTQsCDRgdGC0YDQvtC60Lgg0YHQu9C10LLQsFxuXG4gICAgLy8g0J3QsNC50YLQuCDQvdCw0YfQsNC70L4g0L/RgNC10LTRi9C00YPRidC10Lkg0YHRgtGA0L7QutC4XG4gICAgaWYgKGN1cnJlbnRMaW5lU3RhcnQgPT09IDApIHtcbiAgICAgIC8vINCc0Ysg0YPQttC1INC90LAg0L/QtdGA0LLQvtC5INGB0YLRgNC+0LrQtSDigJQg0L/QtdGA0LXQvNC10YnQtdC90LjQtSDQstCy0LXRgNGFINC90LXQstC+0LfQvNC+0LbQvdC+XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldk5ld2xpbmUgPSB0aGlzLmNvbW1hbmRCdWZmZXIubGFzdEluZGV4T2YoJ1xcbicsIGN1cnJlbnRMaW5lU3RhcnQgLSAyKTtcbiAgICBjb25zdCBwcmV2TGluZVN0YXJ0ID0gcHJldk5ld2xpbmUgPj0gMCA/IHByZXZOZXdsaW5lICsgMSA6IDA7XG4gICAgY29uc3QgcHJldkxpbmVFbmQgPSBjdXJyZW50TGluZVN0YXJ0IC0gMTsgLy8g0LjQvdC00LXQutGBINC/0LXRgNC10LLQvtC00LAg0YHRgtGA0L7QutC4INC/0YDQtdC00YvQtNGD0YnQtdC5INGB0YLRgNC+0LrQuFxuXG4gICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuY3Vyc29yUG9zaXRpb24gLSBjdXJyZW50TGluZVN0YXJ0O1xuICAgIGNvbnN0IHByZXZMaW5lTGVuZ3RoID0gTWF0aC5tYXgoMCwgcHJldkxpbmVFbmQgLSBwcmV2TGluZVN0YXJ0KTtcbiAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSBNYXRoLm1pbihjdXJyZW50Q29sdW1uLCBwcmV2TGluZUxlbmd0aCk7XG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBwcmV2TGluZVN0YXJ0ICsgdGFyZ2V0Q29sdW1uO1xuXG4gICAgaWYgKG5ld1Bvc2l0aW9uICE9PSB0aGlzLmN1cnNvclBvc2l0aW9uKSB7XG4gICAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gbmV3UG9zaXRpb247XG4gICAgICB0aGlzLm5vdGlmeVN0YXRlQ2hhbmdlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqINCf0LXRgNC10LzQtdGJ0LDQtdGCINC60YPRgNGB0L7RgCDQvdCwINGB0YLRgNC+0LrRgyDQvdC40LbQtSAo0YEg0YHQvtGF0YDQsNC90LXQvdC40LXQvCDQutC+0LvQvtC90LrQuCwg0LXRgdC70Lgg0LLQvtC30LzQvtC20L3QvilcbiAgICog0JLQvtC30LLRgNCw0YnQsNC10YIgdHJ1ZSwg0LXRgdC70Lgg0L/QtdGA0LXQvNC10YnQtdC90LjQtSDQstC+0LfQvNC+0LbQvdC+INC4INCy0YvQv9C+0LvQvdC10L3QvlxuICAgKi9cbiAgcHJpdmF0ZSBtb3ZlQ3Vyc29yRG93bigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jb21tYW5kQnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgYmVmb3JlID0gdGhpcy5jb21tYW5kQnVmZmVyLnNsaWNlKDAsIHRoaXMuY3Vyc29yUG9zaXRpb24pO1xuICAgIGNvbnN0IGN1cnJlbnRMaW5lU3RhcnQgPSBiZWZvcmUubGFzdEluZGV4T2YoJ1xcbicpICsgMTtcblxuICAgIC8vINCd0LDQudGC0Lgg0LrQvtC90LXRhiDRgtC10LrRg9GJ0LXQuSDRgdGC0YDQvtC60LggKNC/0LXRgNC10LLQvtC0INGB0YLRgNC+0LrQuCDQuNC70Lgg0LrQvtC90LXRhiDQsdGD0YTQtdGA0LApXG4gICAgY29uc3QgY3VycmVudExpbmVFbmROZXdsaW5lID0gdGhpcy5jb21tYW5kQnVmZmVyLmluZGV4T2YoJ1xcbicsIGN1cnJlbnRMaW5lU3RhcnQpO1xuICAgIGNvbnN0IGN1cnJlbnRMaW5lRW5kID0gY3VycmVudExpbmVFbmROZXdsaW5lID49IDAgPyBjdXJyZW50TGluZUVuZE5ld2xpbmUgOiB0aGlzLmNvbW1hbmRCdWZmZXIubGVuZ3RoO1xuXG4gICAgaWYgKGN1cnJlbnRMaW5lRW5kTmV3bGluZSA8IDApIHtcbiAgICAgIC8vINCd0LXRgiDRgdC70LXQtNGD0Y7RidC10Lkg0YHRgtGA0L7QutC4IOKAlCDQvNGLINC90LAg0L/QvtGB0LvQtdC00L3QtdC5XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dExpbmVTdGFydCA9IGN1cnJlbnRMaW5lRW5kTmV3bGluZSArIDE7XG4gICAgY29uc3QgbmV4dExpbmVFbmROZXdsaW5lID0gdGhpcy5jb21tYW5kQnVmZmVyLmluZGV4T2YoJ1xcbicsIG5leHRMaW5lU3RhcnQpO1xuICAgIGNvbnN0IG5leHRMaW5lRW5kID0gbmV4dExpbmVFbmROZXdsaW5lID49IDAgPyBuZXh0TGluZUVuZE5ld2xpbmUgOiB0aGlzLmNvbW1hbmRCdWZmZXIubGVuZ3RoO1xuXG4gICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuY3Vyc29yUG9zaXRpb24gLSBjdXJyZW50TGluZVN0YXJ0O1xuICAgIGNvbnN0IG5leHRMaW5lTGVuZ3RoID0gTWF0aC5tYXgoMCwgbmV4dExpbmVFbmQgLSBuZXh0TGluZVN0YXJ0KTtcbiAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSBNYXRoLm1pbihjdXJyZW50Q29sdW1uLCBuZXh0TGluZUxlbmd0aCk7XG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBuZXh0TGluZVN0YXJ0ICsgdGFyZ2V0Q29sdW1uO1xuXG4gICAgaWYgKG5ld1Bvc2l0aW9uICE9PSB0aGlzLmN1cnNvclBvc2l0aW9uKSB7XG4gICAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gbmV3UG9zaXRpb247XG4gICAgICB0aGlzLm5vdGlmeVN0YXRlQ2hhbmdlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqINCd0LDQstC40LPQsNGG0LjRjyDQv9C+INC40YHRgtC+0YDQuNC4INC60L7QvNCw0L3QtFxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIC0g0L3QsNC/0YDQsNCy0LvQtdC90LjQtSAoLTEg0LLQstC10YDRhSwgMSDQstC90LjQtylcbiAgICovXG4gIG5hdmlnYXRlSGlzdG9yeShkaXJlY3Rpb246IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmhpc3RvcnkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSAtMSAmJiB0aGlzLmhpc3RvcnlJbmRleCA+IDApIHtcbiAgICAgIC8vINCS0LLQtdGA0YUg0L/QviDQuNGB0YLQvtGA0LjQuFxuICAgICAgdGhpcy5oaXN0b3J5SW5kZXgtLTtcbiAgICAgIHRoaXMuY29tbWFuZEJ1ZmZlciA9IHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnlJbmRleF0gPz8gJyc7XG4gICAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gdGhpcy5jb21tYW5kQnVmZmVyLmxlbmd0aDsgLy8g0JrRg9GA0YHQvtGAINCyINC60L7QvdC10YZcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gMSAmJiB0aGlzLmhpc3RvcnlJbmRleCA8IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxKSB7XG4gICAgICAvLyDQktC90LjQtyDQv9C+INC40YHRgtC+0YDQuNC4XG4gICAgICB0aGlzLmhpc3RvcnlJbmRleCsrO1xuICAgICAgdGhpcy5jb21tYW5kQnVmZmVyID0gdGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeUluZGV4XSA/PyAnJztcbiAgICAgIHRoaXMuY3Vyc29yUG9zaXRpb24gPSB0aGlzLmNvbW1hbmRCdWZmZXIubGVuZ3RoOyAvLyDQmtGD0YDRgdC+0YAg0LIg0LrQvtC90LXRhlxuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAxICYmIHRoaXMuaGlzdG9yeUluZGV4ID09PSB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSkge1xuICAgICAgLy8g0JTQvtGB0YLQuNCz0LvQuCDQutC+0L3RhtCwINC40YHRgtC+0YDQuNC4IC0g0L7Rh9C40YnQsNC10Lwg0LHRg9GE0LXRgFxuICAgICAgdGhpcy5oaXN0b3J5SW5kZXggPSB0aGlzLmhpc3RvcnkubGVuZ3RoO1xuICAgICAgdGhpcy5jb21tYW5kQnVmZmVyID0gJyc7XG4gICAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gMDsgLy8g0JrRg9GA0YHQvtGAINCyINC90LDRh9Cw0LvQvlxuICAgIH1cblxuICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQo9Cy0LXQtNC+0LzQu9GP0LXRgiDQvtCxINC40LfQvNC10L3QtdC90LjQuCDRgdC+0YHRgtC+0Y/QvdC40Y9cbiAgICovXG4gIHByaXZhdGUgbm90aWZ5U3RhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgLy8g0J7QsdC90L7QstC70Y/QtdC8INC+0YLRgNC40YHQvtCy0LrRgyDRh9C10YDQtdC3IFRlcm1pbmFsVWlXcml0ZXJcbiAgICBpZiAodGhpcy50ZXJtaW5hbFVpV3JpdGVyKSB7XG4gICAgICB0aGlzLnRlcm1pbmFsVWlXcml0ZXIud3JpdGUodGhpcy5jb21tYW5kQnVmZmVyLCB0aGlzLmN1cnNvclBvc2l0aW9uKTtcbiAgICB9XG4gICAgXG4gICAgLy8g0KPQstC10LTQvtC80LvRj9C10Lwg0YfQtdGA0LXQtyBjYWxsYmFja1xuICAgIGlmICh0aGlzLm9uU3RhdGVDaGFuZ2UpIHtcbiAgICAgIHRoaXMub25TdGF0ZUNoYW5nZSh7XG4gICAgICAgIHBvc3RpdGlvbjogdGhpcy5jdXJzb3JQb3NpdGlvbixcbiAgICAgICAgY29tbWFuZDogdGhpcy5jb21tYW5kQnVmZmVyXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzZXRTdGF0ZShzdGF0ZTogQ29tbWFuZFN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kQnVmZmVyID0gc3RhdGUuY29tbWFuZDtcbiAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gc3RhdGUucG9zdGl0aW9uO1xuICAgIHRoaXMubm90aWZ5U3RhdGVDaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQntGH0LjRidCw0LXRgiDQsdGD0YTQtdGAINC60L7QvNCw0L3QtNGLXG4gICAqL1xuICBjbGVhckJ1ZmZlcigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1hbmRCdWZmZXIgPSAnJztcbiAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gMDtcbiAgICB0aGlzLm5vdGlmeVN0YXRlQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICog0J7Rh9C40YnQsNC10YIg0YDQtdGB0YPRgNGB0YtcbiAgICovXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jb21tYW5kQnVmZmVyID0gJyc7XG4gICAgdGhpcy5jdXJzb3JQb3NpdGlvbiA9IDA7XG4gICAgdGhpcy5oaXN0b3J5ID0gW107XG4gICAgdGhpcy5oaXN0b3J5SW5kZXggPSAtMTtcbiAgICB0aGlzLm9uU3RhdGVDaGFuZ2UgPSBudWxsO1xuICAgIHRoaXMub25FeGVjdXRlQ29tbWFuZCA9IG51bGw7XG4gICAgdGhpcy50ZXJtaW5hbFVpV3JpdGVyID0gbnVsbDtcbiAgfVxufVxuXG4iLCIvKipcbiAqINCa0L7QvNCw0L3QtNCwIGluZm8gLSDQv9C+0LrQsNC30YvQstCw0LXRgiDQuNC90YTQvtGA0LzQsNGG0LjRjiDQviDRgdGA0LXQtNC1INCy0YvQv9C+0LvQvdC10L3QuNGPIEphdmFTY3JpcHRcbiAqL1xuXG5pbXBvcnQgeyBDdXN0b21Db21tYW5kIH0gZnJvbSBcIi4uL2N1c3RvbS1jb21tYW5kXCI7XG5cbmV4cG9ydCBjbGFzcyBJbmZvQ29tbWFuZCBleHRlbmRzIEN1c3RvbUNvbW1hbmQge1xuICAgIHJlYWRvbmx5IG5hbWUgPSAnaW5mbyc7XG4gICAgcmVhZG9ubHkgZGVzY3JpcHRpb24gPSAnU2hvd3MgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgSmF2YVNjcmlwdCBlbnZpcm9ubWVudCwgYnJvd3Nlciwgc2NyZWVuLCBhbmQgYXZhaWxhYmxlIEFQSXMnO1xuICAgIFxuICAgIGV4ZWN1dGUoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGdldEVudmlyb25tZW50SW5mbygpO1xuICAgIH1cbn1cblxuLyoqXG4gKiDQn9C+0LvRg9GH0LDQtdGCINC40L3RhNC+0YDQvNCw0YbQuNGOINC+INGB0YDQtdC00LUg0LLRi9C/0L7Qu9C90LXQvdC40Y8gSmF2YVNjcmlwdFxuICogQHJldHVybnMg0LjQvdGE0L7RgNC80LDRhtC40Y8g0L4g0YHRgNC10LTQtVxuICovXG5mdW5jdGlvbiBnZXRFbnZpcm9ubWVudEluZm8oKTogc3RyaW5nIHtcbiAgICBsZXQgaW5mbyA9ICcnO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICAgIC8vINCe0YHQvdC+0LLQvdCw0Y8g0LjQvdGE0L7RgNC80LDRhtC40Y8g0L4gSmF2YVNjcmlwdFxuICAgICAgICBpbmZvICs9ICc9PT0gSmF2YVNjcmlwdCBFbnZpcm9ubWVudCA9PT1cXG4nO1xuICAgICAgICBpbmZvICs9IGBKYXZhU2NyaXB0IEVuZ2luZTogJHtnZXRKU0VuZ2luZSgpfVxcbmA7XG4gICAgICAgIGluZm8gKz0gYEphdmFTY3JpcHQgVmVyc2lvbjogJHtnZXRKU1ZlcnNpb24oKX1cXG5gO1xuICAgICAgICBpbmZvICs9IGBMYW5ndWFnZTogJHtuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgJ1Vua25vd24nfVxcbmA7XG4gICAgICAgIGluZm8gKz0gYFBsYXRmb3JtOiAke25hdmlnYXRvci5wbGF0Zm9ybSB8fCAnVW5rbm93bid9XFxuYDtcbiAgICAgICAgaW5mbyArPSBgVXNlciBBZ2VudDogJHtuYXZpZ2F0b3IudXNlckFnZW50IHx8ICdVbmtub3duJ31cXG5gO1xuICAgICAgICBcbiAgICAgICAgLy8g0JjQvdGE0L7RgNC80LDRhtC40Y8g0L4g0LHRgNCw0YPQt9C10YDQtVxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGluZm8gKz0gJ1xcbj09PSBCcm93c2VyIEluZm9ybWF0aW9uID09PVxcbic7XG4gICAgICAgICAgICBpbmZvICs9IGBCcm93c2VyOiAke2dldEJyb3dzZXJJbmZvKCl9XFxuYDtcbiAgICAgICAgICAgIGluZm8gKz0gYEJyb3dzZXIgVmVyc2lvbjogJHtnZXRCcm93c2VyVmVyc2lvbigpfVxcbmA7XG4gICAgICAgICAgICBpbmZvICs9IGBDb29raWVzIEVuYWJsZWQ6ICR7bmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQgPyAnWWVzJyA6ICdObyd9XFxuYDtcbiAgICAgICAgICAgIGluZm8gKz0gYE9ubGluZTogJHtuYXZpZ2F0b3Iub25MaW5lID8gJ1llcycgOiAnTm8nfVxcbmA7XG4gICAgICAgICAgICBpbmZvICs9IGBEbyBOb3QgVHJhY2s6ICR7bmF2aWdhdG9yLmRvTm90VHJhY2sgfHwgJ05vdCBzcGVjaWZpZWQnfVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vINCY0L3RhNC+0YDQvNCw0YbQuNGPINC+0LEg0Y3QutGA0LDQvdC1XG4gICAgICAgIGlmICh0eXBlb2Ygc2NyZWVuICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW5mbyArPSAnXFxuPT09IFNjcmVlbiBJbmZvcm1hdGlvbiA9PT1cXG4nO1xuICAgICAgICAgICAgaW5mbyArPSBgU2NyZWVuIFdpZHRoOiAke3NjcmVlbi53aWR0aH1weFxcbmA7XG4gICAgICAgICAgICBpbmZvICs9IGBTY3JlZW4gSGVpZ2h0OiAke3NjcmVlbi5oZWlnaHR9cHhcXG5gO1xuICAgICAgICAgICAgaW5mbyArPSBgQXZhaWxhYmxlIFdpZHRoOiAke3NjcmVlbi5hdmFpbFdpZHRofXB4XFxuYDtcbiAgICAgICAgICAgIGluZm8gKz0gYEF2YWlsYWJsZSBIZWlnaHQ6ICR7c2NyZWVuLmF2YWlsSGVpZ2h0fXB4XFxuYDtcbiAgICAgICAgICAgIGluZm8gKz0gYENvbG9yIERlcHRoOiAke3NjcmVlbi5jb2xvckRlcHRofSBiaXRzXFxuYDtcbiAgICAgICAgICAgIGluZm8gKz0gYFBpeGVsIERlcHRoOiAke3NjcmVlbi5waXhlbERlcHRofSBiaXRzXFxuYDtcbiAgICAgICAgICAgIGluZm8gKz0gYERldmljZSBQaXhlbCBSYXRpbzogJHsod2luZG93IGFzIGFueSkuZGV2aWNlUGl4ZWxSYXRpbyB8fCAnTm90IGF2YWlsYWJsZSd9XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8g0JjQvdGE0L7RgNC80LDRhtC40Y8g0L7QsSDQvtC60L3QtVxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGluZm8gKz0gJ1xcbj09PSBXaW5kb3cgSW5mb3JtYXRpb24gPT09XFxuJztcbiAgICAgICAgICAgIGluZm8gKz0gYFdpbmRvdyBXaWR0aDogJHt3aW5kb3cuaW5uZXJXaWR0aH1weFxcbmA7XG4gICAgICAgICAgICBpbmZvICs9IGBXaW5kb3cgSGVpZ2h0OiAke3dpbmRvdy5pbm5lckhlaWdodH1weFxcbmA7XG4gICAgICAgICAgICBpbmZvICs9IGBPdXRlciBXaWR0aDogJHt3aW5kb3cub3V0ZXJXaWR0aH1weFxcbmA7XG4gICAgICAgICAgICBpbmZvICs9IGBPdXRlciBIZWlnaHQ6ICR7d2luZG93Lm91dGVySGVpZ2h0fXB4XFxuYDtcbiAgICAgICAgICAgIGluZm8gKz0gYFNjcm9sbCBYOiAke3dpbmRvdy5zY3JvbGxYfXB4XFxuYDtcbiAgICAgICAgICAgIGluZm8gKz0gYFNjcm9sbCBZOiAke3dpbmRvdy5zY3JvbGxZfXB4XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8g0JjQvdGE0L7RgNC80LDRhtC40Y8g0L4g0LLRgNC10LzQtdC90LhcbiAgICAgICAgaW5mbyArPSAnXFxuPT09IFRpbWUgSW5mb3JtYXRpb24gPT09XFxuJztcbiAgICAgICAgaW5mbyArPSBgQ3VycmVudCBUaW1lOiAke25ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKX1cXG5gO1xuICAgICAgICBpbmZvICs9IGBUaW1lem9uZTogJHtJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmV9XFxuYDtcbiAgICAgICAgaW5mbyArPSBgVGltZXpvbmUgT2Zmc2V0OiAke25ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKX0gbWludXRlc1xcbmA7XG4gICAgICAgIFxuICAgICAgICAvLyDQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDQv9GA0L7QuNC30LLQvtC00LjRgtC10LvRjNC90L7RgdGC0LhcbiAgICAgICAgaWYgKHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGluZm8gKz0gJ1xcbj09PSBQZXJmb3JtYW5jZSBJbmZvcm1hdGlvbiA9PT1cXG4nO1xuICAgICAgICAgICAgaW5mbyArPSBgTmF2aWdhdGlvbiBUeXBlOiAkeyhwZXJmb3JtYW5jZSBhcyBhbnkpLm5hdmlnYXRpb24udHlwZX1cXG5gO1xuICAgICAgICAgICAgaW5mbyArPSBgUGFnZSBMb2FkIFRpbWU6ICR7KHBlcmZvcm1hbmNlIGFzIGFueSkudGltaW5nLmxvYWRFdmVudEVuZCAtIChwZXJmb3JtYW5jZSBhcyBhbnkpLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnR9bXNcXG5gO1xuICAgICAgICAgICAgaW5mbyArPSBgRE9NIENvbnRlbnQgTG9hZGVkOiAkeyhwZXJmb3JtYW5jZSBhcyBhbnkpLnRpbWluZy5kb21Db250ZW50TG9hZGVkRXZlbnRFbmQgLSAocGVyZm9ybWFuY2UgYXMgYW55KS50aW1pbmcubmF2aWdhdGlvblN0YXJ0fW1zXFxuYDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKChwZXJmb3JtYW5jZSBhcyBhbnkpLm1lbW9yeSkge1xuICAgICAgICAgICAgICAgIGluZm8gKz0gYE1lbW9yeSBVc2VkOiAke01hdGgucm91bmQoKHBlcmZvcm1hbmNlIGFzIGFueSkubWVtb3J5LnVzZWRKU0hlYXBTaXplIC8gMTAyNCAvIDEwMjQgKiAxMDApIC8gMTAwfU1CXFxuYDtcbiAgICAgICAgICAgICAgICBpbmZvICs9IGBNZW1vcnkgVG90YWw6ICR7TWF0aC5yb3VuZCgocGVyZm9ybWFuY2UgYXMgYW55KS5tZW1vcnkudG90YWxKU0hlYXBTaXplIC8gMTAyNCAvIDEwMjQgKiAxMDApIC8gMTAwfU1CXFxuYDtcbiAgICAgICAgICAgICAgICBpbmZvICs9IGBNZW1vcnkgTGltaXQ6ICR7TWF0aC5yb3VuZCgocGVyZm9ybWFuY2UgYXMgYW55KS5tZW1vcnkuanNIZWFwU2l6ZUxpbWl0IC8gMTAyNCAvIDEwMjQgKiAxMDApIC8gMTAwfU1CXFxuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8g0JjQvdGE0L7RgNC80LDRhtC40Y8g0L4g0YHQtdGC0LhcbiAgICAgICAgaWYgKChuYXZpZ2F0b3IgYXMgYW55KS5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICBpbmZvICs9ICdcXG49PT0gTmV0d29yayBJbmZvcm1hdGlvbiA9PT1cXG4nO1xuICAgICAgICAgICAgaW5mbyArPSBgQ29ubmVjdGlvbiBUeXBlOiAkeyhuYXZpZ2F0b3IgYXMgYW55KS5jb25uZWN0aW9uLmVmZmVjdGl2ZVR5cGUgfHwgJ1Vua25vd24nfVxcbmA7XG4gICAgICAgICAgICBpbmZvICs9IGBEb3dubGluazogJHsobmF2aWdhdG9yIGFzIGFueSkuY29ubmVjdGlvbi5kb3dubGluayB8fCAnVW5rbm93bid9IE1icHNcXG5gO1xuICAgICAgICAgICAgaW5mbyArPSBgUlRUOiAkeyhuYXZpZ2F0b3IgYXMgYW55KS5jb25uZWN0aW9uLnJ0dCB8fCAnVW5rbm93bid9IG1zXFxuYDtcbiAgICAgICAgICAgIGluZm8gKz0gYFNhdmUgRGF0YTogJHsobmF2aWdhdG9yIGFzIGFueSkuY29ubmVjdGlvbi5zYXZlRGF0YSA/ICdZZXMnIDogJ05vJ31cXG5gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyDQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDQs9C10L7Qu9C+0LrQsNGG0LjQuFxuICAgICAgICBpZiAobmF2aWdhdG9yLmdlb2xvY2F0aW9uKSB7XG4gICAgICAgICAgICBpbmZvICs9ICdcXG49PT0gR2VvbG9jYXRpb24gPT09XFxuJztcbiAgICAgICAgICAgIGluZm8gKz0gJ0dlb2xvY2F0aW9uOiBBdmFpbGFibGVcXG4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5mbyArPSAnXFxuPT09IEdlb2xvY2F0aW9uID09PVxcbic7XG4gICAgICAgICAgICBpbmZvICs9ICdHZW9sb2NhdGlvbjogTm90IGF2YWlsYWJsZVxcbic7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vINCY0L3RhNC+0YDQvNCw0YbQuNGPINC+INC80LXQtNC40LAg0YPRgdGC0YDQvtC50YHRgtCy0LDRhVxuICAgICAgICBpZiAoKG5hdmlnYXRvciBhcyBhbnkpLm1lZGlhRGV2aWNlcykge1xuICAgICAgICAgICAgaW5mbyArPSAnXFxuPT09IE1lZGlhIERldmljZXMgPT09XFxuJztcbiAgICAgICAgICAgIGluZm8gKz0gJ01lZGlhIERldmljZXM6IEF2YWlsYWJsZVxcbic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmZvICs9ICdcXG49PT0gTWVkaWEgRGV2aWNlcyA9PT1cXG4nO1xuICAgICAgICAgICAgaW5mbyArPSAnTWVkaWEgRGV2aWNlczogTm90IGF2YWlsYWJsZVxcbic7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vINCY0L3RhNC+0YDQvNCw0YbQuNGPINC+IFdlYkdMXG4gICAgICAgIGlmICh0eXBlb2YgV2ViR0xSZW5kZXJpbmdDb250ZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW5mbyArPSAnXFxuPT09IFdlYkdMIEluZm9ybWF0aW9uID09PVxcbic7XG4gICAgICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAgIGNvbnN0IGdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJykgfHwgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcpIGFzIFdlYkdMUmVuZGVyaW5nQ29udGV4dDtcbiAgICAgICAgICAgIGlmIChnbCkge1xuICAgICAgICAgICAgICAgIGluZm8gKz0gYFdlYkdMIFZlcnNpb246ICR7Z2wuZ2V0UGFyYW1ldGVyKGdsLlZFUlNJT04pfVxcbmA7XG4gICAgICAgICAgICAgICAgaW5mbyArPSBgV2ViR0wgVmVuZG9yOiAke2dsLmdldFBhcmFtZXRlcihnbC5WRU5ET1IpfVxcbmA7XG4gICAgICAgICAgICAgICAgaW5mbyArPSBgV2ViR0wgUmVuZGVyZXI6ICR7Z2wuZ2V0UGFyYW1ldGVyKGdsLlJFTkRFUkVSKX1cXG5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmZvICs9ICdXZWJHTDogTm90IGF2YWlsYWJsZVxcbic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vINCY0L3RhNC+0YDQvNCw0YbQuNGPINC+INC00L7RgdGC0YPQv9C90YvRhSBBUElcbiAgICAgICAgaW5mbyArPSAnXFxuPT09IEF2YWlsYWJsZSBBUElzID09PVxcbic7XG4gICAgICAgIGluZm8gKz0gYExvY2FsIFN0b3JhZ2U6ICR7dHlwZW9mIGxvY2FsU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcgPyAnWWVzJyA6ICdObyd9XFxuYDtcbiAgICAgICAgaW5mbyArPSBgU2Vzc2lvbiBTdG9yYWdlOiAke3R5cGVvZiBzZXNzaW9uU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcgPyAnWWVzJyA6ICdObyd9XFxuYDtcbiAgICAgICAgaW5mbyArPSBgSW5kZXhlZERCOiAke3R5cGVvZiBpbmRleGVkREIgIT09ICd1bmRlZmluZWQnID8gJ1llcycgOiAnTm8nfVxcbmA7XG4gICAgICAgIGluZm8gKz0gYFdlYiBXb3JrZXJzOiAke3R5cGVvZiBXb3JrZXIgIT09ICd1bmRlZmluZWQnID8gJ1llcycgOiAnTm8nfVxcbmA7XG4gICAgICAgIGluZm8gKz0gYFNlcnZpY2UgV29ya2VyczogJHt0eXBlb2YgU2VydmljZVdvcmtlciAhPT0gJ3VuZGVmaW5lZCcgPyAnWWVzJyA6ICdObyd9XFxuYDtcbiAgICAgICAgaW5mbyArPSBgV2ViU29ja2V0czogJHt0eXBlb2YgV2ViU29ja2V0ICE9PSAndW5kZWZpbmVkJyA/ICdZZXMnIDogJ05vJ31cXG5gO1xuICAgICAgICBpbmZvICs9IGBGZXRjaCBBUEk6ICR7dHlwZW9mIGZldGNoICE9PSAndW5kZWZpbmVkJyA/ICdZZXMnIDogJ05vJ31cXG5gO1xuICAgICAgICBpbmZvICs9IGBQcm9taXNlOiAke3R5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyA/ICdZZXMnIDogJ05vJ31cXG5gO1xuICAgICAgICBpbmZvICs9IGBBc3luYy9Bd2FpdDogJHtpc0FzeW5jQXdhaXRTdXBwb3J0ZWQoKSA/ICdZZXMnIDogJ05vJ31cXG5gO1xuICAgICAgICBcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGluZm8gKz0gYEVycm9yIGdldHRpbmcgZW52aXJvbm1lbnQgaW5mbzogJHtlcnJvci5tZXNzYWdlfVxcbmA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBpbmZvO1xufVxuXG4vKipcbiAqINCe0L/RgNC10LTQtdC70Y/QtdGCIEphdmFTY3JpcHQg0LTQstC40LbQvtC6XG4gKiBAcmV0dXJucyDQvdCw0LfQstCw0L3QuNC1INC00LLQuNC20LrQsFxuICovXG5mdW5jdGlvbiBnZXRKU0VuZ2luZSgpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ0Nocm9tZScpKSByZXR1cm4gJ1Y4IChDaHJvbWUpJztcbiAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCdGaXJlZm94JykpIHJldHVybiAnU3BpZGVyTW9ua2V5IChGaXJlZm94KSc7XG4gICAgICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmNsdWRlcygnU2FmYXJpJykpIHJldHVybiAnSmF2YVNjcmlwdENvcmUgKFNhZmFyaSknO1xuICAgICAgICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ0VkZ2UnKSkgcmV0dXJuICdDaGFrcmEgKEVkZ2UpJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ1Vua25vd24nO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiAnVW5rbm93bic7XG4gICAgfVxufVxuXG4vKipcbiAqINCe0L/RgNC10LTQtdC70Y/QtdGCINCy0LXRgNGB0LjRjiBKYXZhU2NyaXB0XG4gKiBAcmV0dXJucyDQstC10YDRgdC40Y8gSmF2YVNjcmlwdFxuICovXG5mdW5jdGlvbiBnZXRKU1ZlcnNpb24oKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgICAvLyDQn9GA0L7QstC10YDRj9C10Lwg0L/QvtC00LTQtdGA0LbQutGDINGA0LDQt9C70LjRh9C90YvRhSDQstC+0LfQvNC+0LbQvdC+0YHRgtC10Lkg0LTQu9GPINC+0L/RgNC10LTQtdC70LXQvdC40Y8g0LLQtdGA0YHQuNC4XG4gICAgICAgIGlmICh0eXBlb2YgQmlnSW50ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuICdFUzIwMjArIChCaWdJbnQgc3VwcG9ydCknO1xuICAgICAgICBpZiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmIChQcm9taXNlLnByb3RvdHlwZSBhcyBhbnkpLmZpbmFsbHkpIHJldHVybiAnRVMyMDE4KyAoUHJvbWlzZS5maW5hbGx5KSc7XG4gICAgICAgIGlmICh0eXBlb2YgT2JqZWN0LmVudHJpZXMgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gJ0VTMjAxNysgKE9iamVjdC5lbnRyaWVzKSc7XG4gICAgICAgIGlmICh0eXBlb2YgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzICE9PSAndW5kZWZpbmVkJykgcmV0dXJuICdFUzIwMTYrIChBcnJheS5pbmNsdWRlcyknO1xuICAgICAgICBpZiAodHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gJ0VTMjAxNSsgKFByb21pc2UpJztcbiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gJ0VTNSsgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSknO1xuICAgICAgICByZXR1cm4gJ0VTMyBvciBlYXJsaWVyJztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gJ1Vua25vd24nO1xuICAgIH1cbn1cblxuLyoqXG4gKiDQntC/0YDQtdC00LXQu9GP0LXRgiDQuNC90YTQvtGA0LzQsNGG0LjRjiDQviDQsdGA0LDRg9C30LXRgNC1XG4gKiBAcmV0dXJucyDQvdCw0LfQstCw0L3QuNC1INCx0YDQsNGD0LfQtdGA0LBcbiAqL1xuZnVuY3Rpb24gZ2V0QnJvd3NlckluZm8oKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgICAgICBpZiAodXNlckFnZW50LmluY2x1ZGVzKCdDaHJvbWUnKSAmJiAhdXNlckFnZW50LmluY2x1ZGVzKCdFZGcnKSkgcmV0dXJuICdDaHJvbWUnO1xuICAgICAgICBpZiAodXNlckFnZW50LmluY2x1ZGVzKCdGaXJlZm94JykpIHJldHVybiAnRmlyZWZveCc7XG4gICAgICAgIGlmICh1c2VyQWdlbnQuaW5jbHVkZXMoJ1NhZmFyaScpICYmICF1c2VyQWdlbnQuaW5jbHVkZXMoJ0Nocm9tZScpKSByZXR1cm4gJ1NhZmFyaSc7XG4gICAgICAgIGlmICh1c2VyQWdlbnQuaW5jbHVkZXMoJ0VkZycpKSByZXR1cm4gJ0VkZ2UnO1xuICAgICAgICBpZiAodXNlckFnZW50LmluY2x1ZGVzKCdNU0lFJykgfHwgdXNlckFnZW50LmluY2x1ZGVzKCdUcmlkZW50LycpKSByZXR1cm4gJ0ludGVybmV0IEV4cGxvcmVyJztcbiAgICAgICAgcmV0dXJuICdVbmtub3duJztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gJ1Vua25vd24nO1xuICAgIH1cbn1cblxuLyoqXG4gKiDQntC/0YDQtdC00LXQu9GP0LXRgiDQstC10YDRgdC40Y4g0LHRgNCw0YPQt9C10YDQsFxuICogQHJldHVybnMg0LLQtdGA0YHQuNGPINCx0YDQsNGD0LfQtdGA0LBcbiAqL1xuZnVuY3Rpb24gZ2V0QnJvd3NlclZlcnNpb24oKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgICAgICBjb25zdCBtYXRjaCA9IHVzZXJBZ2VudC5tYXRjaCgvKGNocm9tZXxmaXJlZm94fHNhZmFyaXxlZGdlfG1zaWV8dHJpZGVudCg/PVxcLykpXFwvP1xccyooXFxkKykvaSk7XG4gICAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzJdIHx8ICdVbmtub3duJyA6ICdVbmtub3duJztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gJ1Vua25vd24nO1xuICAgIH1cbn1cblxuLyoqXG4gKiDQn9GA0L7QstC10YDRj9C10YIg0L/QvtC00LTQtdGA0LbQutGDIGFzeW5jL2F3YWl0XG4gKiBAcmV0dXJucyB0cnVlINC10YHQu9C4INC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y9cbiAqL1xuZnVuY3Rpb24gaXNBc3luY0F3YWl0U3VwcG9ydGVkKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vINCf0YvRgtCw0LXQvNGB0Y8g0YHQvtC30LTQsNGC0Ywg0LDRgdC40L3RhdGA0L7QvdC90YPRjiDRhNGD0L3QutGG0LjRjlxuICAgICAgICBuZXcgRnVuY3Rpb24oJ2FzeW5jICgpID0+IHt9Jyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCIvKipcbiAqINCa0L7QvNCw0L3QtNCwIGhlbHAgLSDQv9C+0LrQsNC30YvQstCw0LXRgiDRgdC/0YDQsNCy0LrRgyDQv9C+INC00L7RgdGC0YPQv9C90YvQvCDQutC+0LzQsNC90LTQsNC8XG4gKi9cblxuaW1wb3J0IHsgQ3VzdG9tQ29tbWFuZCB9IGZyb20gXCIuLi9jdXN0b20tY29tbWFuZFwiO1xuaW1wb3J0IHsgQ3VzdG9tQ29tbWFuZFN0b3JhZ2UgfSBmcm9tIFwiLi4vY3VzdG9tLWNvbW1hbmQtc3RvcmFnZVwiO1xuXG5leHBvcnQgY2xhc3MgSGVscENvbW1hbmQgZXh0ZW5kcyBDdXN0b21Db21tYW5kIHtcbiAgICByZWFkb25seSBuYW1lID0gJ2hlbHAnO1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uID0gJ1Nob3dzIGF2YWlsYWJsZSBjb21tYW5kcyBhbmQgaGVscCBpbmZvcm1hdGlvbic7XG4gICAgXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb21tYW5kU3RvcmFnZTogQ3VzdG9tQ29tbWFuZFN0b3JhZ2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgXG4gICAgZXhlY3V0ZShjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBjdXN0b21Db21tYW5kcyA9IHRoaXMuY29tbWFuZFN0b3JhZ2UuZ2V0Q3VzdG9tQ29tbWFuZHMoKTtcbiAgICAgICAgbGV0IGhlbHBUZXh0ID0gJ0F2YWlsYWJsZSBjb21tYW5kczpcXG4nO1xuICAgICAgICBcbiAgICAgICAgaWYgKGN1c3RvbUNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGhlbHBUZXh0ICs9ICdcXG5DdXN0b20gY29tbWFuZHM6XFxuJztcbiAgICAgICAgICAgIGN1c3RvbUNvbW1hbmRzLmZvckVhY2goY21kID0+IHtcbiAgICAgICAgICAgICAgICBoZWxwVGV4dCArPSBgLSAke2NtZC5uYW1lfTogJHtjbWQuZGVzY3JpcHRpb259XFxuYDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgXG4gICAgICAgIGhlbHBUZXh0ICs9ICdcXG5Zb3UgY2FuIGFsc28gdXNlIGFueSBKYXZhU2NyaXB0IGV4cHJlc3Npb24uJztcbiAgICAgICAgcmV0dXJuIGhlbHBUZXh0O1xuICAgIH1cbn1cbiIsIi8qKlxuICog0JrQvtC80LDQvdC00LAgY2xlYXIgLSDQvtGH0LjRidCw0LXRgiDRjdC60YDQsNC9INGC0LXRgNC80LjQvdCw0LvQsFxuICovXG5cbmltcG9ydCB7IEN1c3RvbUNvbW1hbmQgfSBmcm9tIFwiLi4vY3VzdG9tLWNvbW1hbmRcIjtcbmltcG9ydCB7IEFOU0lfRVNDQVBFUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBDbGVhckNvbW1hbmQgZXh0ZW5kcyBDdXN0b21Db21tYW5kIHtcbiAgICByZWFkb25seSBuYW1lID0gJ2NsZWFyJztcbiAgICByZWFkb25seSBkZXNjcmlwdGlvbiA9ICdDbGVhcnMgdGhlIHRlcm1pbmFsIHNjcmVlbic7XG4gICAgXG4gICAgZXhlY3V0ZShjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyDQktC+0LfQstGA0LDRidCw0LXQvCBBTlNJIGVzY2FwZSBzZXF1ZW5jZSDQtNC70Y8g0L7Rh9C40YHRgtC60Lgg0Y3QutGA0LDQvdCwXG4gICAgICAgIHJldHVybiBBTlNJX0VTQ0FQRVMuQ0xFQVJfU0NSRUVOO1xuICAgIH1cbn1cbiIsIi8qKlxuICog0KPRgtC40LvQuNGC0Ysg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSBIVFRQINC30LDQv9GA0L7RgdCw0LzQuCAoY3VybClcbiAqL1xuXG5pbXBvcnQgeyBDdXJsT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiDQktGL0L/QvtC70L3Rj9C10YIg0LrQvtC80LDQvdC00YMgY3VybFxuICogQHBhcmFtIGFyZ3MgLSDQsNGA0LPRg9C80LXQvdGC0Ysg0LrQvtC80LDQvdC00YsgY3VybFxuICogQHJldHVybnMg0YDQtdC30YPQu9GM0YLQsNGCINCy0YvQv9C+0LvQvdC10L3QuNGPXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ3VybChhcmdzOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vINCV0YHQu9C4IGFyZ3Mg0L3QsNGH0LjQvdCw0LXRgtGB0Y8g0YEgJ2N1cmwnLCDRg9Cx0LjRgNCw0LXQvCDRjdGC0L5cbiAgICAgICAgbGV0IGNvbW1hbmRMaW5lID0gYXJncztcbiAgICAgICAgaWYgKGNvbW1hbmRMaW5lLnN0YXJ0c1dpdGgoJ2N1cmwnKSkge1xuICAgICAgICAgICAgY29tbWFuZExpbmUgPSBjb21tYW5kTGluZS5zdWJzdHJpbmcoNCkudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyDQn9Cw0YDRgdC40Lwg0LDRgNCz0YPQvNC10L3RgtGLXG4gICAgICAgIGNvbnN0IHBhcnRzID0gY29tbWFuZExpbmUudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDAgfHwgcGFydHNbMF0gPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q3VybEhlbHAoKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdXJsID0gcGFydHNbMF07XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwYXJzZUN1cmxPcHRpb25zKHBhcnRzLnNsaWNlKDEpKTtcbiAgICAgICAgXG4gICAgICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCBVUkxcbiAgICAgICAgaWYgKCFpc1ZhbGlkVXJsKHVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiBgRXJyb3I6IEludmFsaWQgVVJMIFwiJHt1cmx9XCJgO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyDQktGL0L/QvtC70L3Rj9C10Lwg0LfQsNC/0YDQvtGBXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1ha2VIdHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICBcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHJldHVybiBgRXJyb3IgZXhlY3V0aW5nIGN1cmw6ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgIH1cbn1cblxuLyoqXG4gKiDQktC+0LfQstGA0LDRidCw0LXRgiDRgdC/0YDQsNCy0LrRgyDQv9C+INC60L7QvNCw0L3QtNC1IGN1cmxcbiAqIEByZXR1cm5zINGB0L/RgNCw0LLQutCwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJsSGVscCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgVXNhZ2U6IGN1cmwgPHVybD4gW29wdGlvbnNdXG5cbk9wdGlvbnM6XG4gIC1YIDxtZXRob2Q+ICBIVFRQIG1ldGhvZCAoR0VULCBQT1NULCBQVVQsIERFTEVURSlcbiAgLUggPGhlYWRlcj4gIEFkZCBoZWFkZXIgKGZvcm1hdDogXCJOYW1lOiBWYWx1ZVwiKVxuICAtZCA8ZGF0YT4gICAgUE9TVCBkYXRhXG4gIC12ICAgICAgICAgICBWZXJib3NlIG91dHB1dFxuICAtaSAgICAgICAgICAgU2hvdyByZXNwb25zZSBoZWFkZXJzXG4gIC1zICAgICAgICAgICBTaWxlbnQgbW9kZSAobm8gcHJvZ3Jlc3MpXG5cbkV4YW1wbGVzOlxuICBjdXJsIGh0dHBzOi8vaHR0cGJpbi5vcmcvZ2V0XG4gIGN1cmwgLVggUE9TVCAtZCBcIm5hbWU9dGVzdFwiIGh0dHBzOi8vaHR0cGJpbi5vcmcvcG9zdFxuICBjdXJsIC1IIFwiQXV0aG9yaXphdGlvbjogQmVhcmVyIHRva2VuXCIgaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vZGF0YWA7XG59XG5cbi8qKlxuICog0J/QsNGA0YHQuNGCINC+0L/RhtC40Lgg0LrQvtC80LDQvdC00YsgY3VybFxuICogQHBhcmFtIGFyZ3MgLSDQvNCw0YHRgdC40LIg0LDRgNCz0YPQvNC10L3RgtC+0LJcbiAqIEByZXR1cm5zINC+0LHRitC10LrRgiDRgSDQvtC/0YbQuNGP0LzQuFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDdXJsT3B0aW9ucyhhcmdzOiBzdHJpbmdbXSk6IEN1cmxPcHRpb25zIHtcbiAgICBjb25zdCBvcHRpb25zOiBDdXJsT3B0aW9ucyA9IHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGJvZHk6IG51bGwsXG4gICAgICAgIHZlcmJvc2U6IGZhbHNlLFxuICAgICAgICBzaG93SGVhZGVyczogZmFsc2UsXG4gICAgICAgIHNpbGVudDogZmFsc2VcbiAgICB9O1xuICAgIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICBcbiAgICAgICAgc3dpdGNoIChhcmcpIHtcbiAgICAgICAgICAgIGNhc2UgJy1YJzpcbiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm1ldGhvZCA9IGFyZ3NbKytpXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJy1IJzpcbiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBhcmdzWysraV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9uSW5kZXggPSBoZWFkZXIuaW5kZXhPZignOicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sb25JbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBoZWFkZXIuc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZGVyLnN1YnN0cmluZyhjb2xvbkluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzW25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBjYXNlICctZCc6XG4gICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gYXJnc1srK2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJy12JzpcbiAgICAgICAgICAgICAgICBvcHRpb25zLnZlcmJvc2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FzZSAnLWknOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2hvd0hlYWRlcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgY2FzZSAnLXMnOlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2lsZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiDQn9GA0L7QstC10YDRj9C10YIg0LLQsNC70LjQtNC90L7RgdGC0YwgVVJMXG4gKiBAcGFyYW0gdXJsIC0gVVJMINC00LvRjyDQv9GA0L7QstC10YDQutC4XG4gKiBAcmV0dXJucyB0cnVlINC10YHQu9C4IFVSTCDQstCw0LvQuNC00LXQvVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwodXJsKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICog0JLRi9C/0L7Qu9C90Y/QtdGCIEhUVFAg0LfQsNC/0YDQvtGBXG4gKiBAcGFyYW0gdXJsIC0gVVJMINC00LvRjyDQt9Cw0L/RgNC+0YHQsFxuICogQHBhcmFtIG9wdGlvbnMgLSDQvtC/0YbQuNC4INC30LDQv9GA0L7RgdCwXG4gKiBAcmV0dXJucyDRgNC10LfRg9C70YzRgtCw0YIg0LfQsNC/0YDQvtGB0LBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1ha2VIdHRwUmVxdWVzdCh1cmw6IHN0cmluZywgb3B0aW9uczogQ3VybE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBNYWtpbmcgJHtvcHRpb25zLm1ldGhvZH0gcmVxdWVzdCB0byAke3VybH0uLi5gKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgZmV0Y2hPcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QsXG4gICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnNcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGlmIChvcHRpb25zLmJvZHkgJiYgKG9wdGlvbnMubWV0aG9kID09PSAnUE9TVCcgfHwgb3B0aW9ucy5tZXRob2QgPT09ICdQVVQnIHx8IG9wdGlvbnMubWV0aG9kID09PSAnUEFUQ0gnKSkge1xuICAgICAgICAgICAgZmV0Y2hPcHRpb25zLmJvZHkgPSBvcHRpb25zLmJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBmZXRjaE9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgXG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgKiBDb25uZWN0ZWQgdG8gJHt1cmx9XFxuYDtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgKiAke29wdGlvbnMubWV0aG9kfSAke3VybH0gSFRUUC8ke3Jlc3BvbnNlLnR5cGUgfHwgJzEuMSd9XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKG9wdGlvbnMuc2hvd0hlYWRlcnMpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgSFRUUC8ke3Jlc3BvbnNlLnR5cGUgfHwgJzEuMSd9ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9XFxuYDtcbiAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYCR7bmFtZX06ICR7dmFsdWV9XFxuYDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzdWx0ICs9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gYCogUmVzcG9uc2UgdGltZTogJHtlbmRUaW1lIC0gc3RhcnRUaW1lfW1zXFxuYDtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgKiBTdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9XFxuYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8g0J/QvtC70YPRh9Cw0LXQvCDRgtC10LvQviDQvtGC0LLQtdGC0LBcbiAgICAgICAgbGV0IHJlc3BvbnNlVGV4dDogc3RyaW5nO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSB8fCAnJztcbiAgICAgICAgXG4gICAgICAgIGlmIChjb250ZW50VHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgICAgICAgICBjb25zdCBqc29uRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHJlc3BvbnNlVGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb25EYXRhLCBudWxsLCAyKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VHlwZS5pbmNsdWRlcygndGV4dC8nKSkge1xuICAgICAgICAgICAgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g0JTQu9GPINCx0LjQvdCw0YDQvdGL0YUg0LTQsNC90L3Ri9GFINC/0L7QutCw0LfRi9Cy0LDQtdC8INGA0LDQt9C80LXRgFxuICAgICAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcbiAgICAgICAgICAgIHJlc3BvbnNlVGV4dCA9IGBbQmluYXJ5IGRhdGEsIHNpemU6ICR7YmxvYi5zaXplfSBieXRlc11gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXN1bHQgKz0gcmVzcG9uc2VUZXh0O1xuICAgICAgICBcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGBcXG4qIENvbm5lY3Rpb24gY2xvc2VkXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgcmVxdWVzdCBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG59XG4iLCIvKipcbiAqINCa0L7QvNCw0L3QtNCwIGN1cmwgLSDQstGL0L/QvtC70L3Rj9C10YIgSFRUUCDQt9Cw0L/RgNC+0YHRi1xuICovXG5cbmltcG9ydCB7IEN1c3RvbUNvbW1hbmQgfSBmcm9tIFwiLi4vY3VzdG9tLWNvbW1hbmRcIjtcbmltcG9ydCB7IGV4ZWN1dGVDdXJsIH0gZnJvbSAnLi4vdXRpbHMvY3VybC11dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBDdXJsQ29tbWFuZCBleHRlbmRzIEN1c3RvbUNvbW1hbmQge1xuICAgIHJlYWRvbmx5IG5hbWUgPSAnY3VybCc7XG4gICAgcmVhZG9ubHkgZGVzY3JpcHRpb24gPSAnTWFrZXMgSFRUUCByZXF1ZXN0LiBVc2FnZTogY3VybCA8dXJsPiBbb3B0aW9uc10nO1xuICAgIFxuICAgIGFzeW5jIGV4ZWN1dGUoY29tbWFuZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVDdXJsKGNvbW1hbmQpO1xuICAgIH1cbn1cbiIsIi8qKlxuICog0JrQvtC80LDQvdC00LAganEgLSBKU09OINC/0YDQvtGG0LXRgdGB0L7RgFxuICovXG5cbmltcG9ydCB7IEN1c3RvbUNvbW1hbmQgfSBmcm9tIFwiLi4vY3VzdG9tLWNvbW1hbmRcIjtcbmltcG9ydCB7IGV4ZWN1dGVKcSB9IGZyb20gJy4uL3V0aWxzL2pxLXV0aWxzJztcblxuZXhwb3J0IGNsYXNzIEpxQ29tbWFuZCBleHRlbmRzIEN1c3RvbUNvbW1hbmQge1xuICAgIHJlYWRvbmx5IG5hbWUgPSAnanEnO1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uID0gJ0pTT04gcHJvY2Vzc29yLiBVc2FnZToganEgPGV4cHJlc3Npb24+IFtvYmplY3RdIG9yIGpxIDxvYmplY3Q+JztcbiAgICBcbiAgICBhc3luYyBleGVjdXRlKGNvbW1hbmQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlSnEoY29tbWFuZCk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiDQrdC60YHQv9C+0YDRgiDQstGB0LXRhSDQutC+0LzQsNC90LRcbiAqL1xuXG5leHBvcnQgeyBJbmZvQ29tbWFuZCB9IGZyb20gJy4vaW5mbyc7XG5leHBvcnQgeyBIZWxwQ29tbWFuZCB9IGZyb20gJy4vaGVscCc7XG5leHBvcnQgeyBDbGVhckNvbW1hbmQgfSBmcm9tICcuL2NsZWFyJztcbmV4cG9ydCB7IEN1cmxDb21tYW5kIH0gZnJvbSAnLi9jdXJsJztcbmV4cG9ydCB7IEpxQ29tbWFuZCB9IGZyb20gJy4vanEnO1xuZXhwb3J0IHsgRWNob0NvbW1hbmQgfSBmcm9tICcuL2VjaG8nO1xuIiwiLyoqXG4gKiBDdXN0b21Db21tYW5kU3RvcmFnZSAtINGD0L/RgNCw0LLQu9GP0LXRgiDQv9C+0LvRjNC30L7QstCw0YLQtdC70YzRgdC60LjQvNC4INC60L7QvNCw0L3QtNCw0LzQuFxuICog0KXRgNCw0L3QuNGCINC60L7QvNCw0L3QtNGLINC4INC/0YDQtdC00L7RgdGC0LDQstC70Y/QtdGCINC40YUg0LTQu9GPINCy0YvQv9C+0LvQvdC10L3QuNGPXG4gKi9cblxuaW1wb3J0IHsgQ3VzdG9tQ29tbWFuZCB9IGZyb20gJy4vY3VzdG9tLWNvbW1hbmQnO1xuaW1wb3J0IHsgXG4gICAgSW5mb0NvbW1hbmQsXG4gICAgSGVscENvbW1hbmQsXG4gICAgQ2xlYXJDb21tYW5kLFxuICAgIEN1cmxDb21tYW5kLFxuICAgIEpxQ29tbWFuZCxcbiAgICBFY2hvQ29tbWFuZCxcbn0gZnJvbSAnLi9jb21tYW5kcyc7XG5cbi8vINCt0LrRgdC/0L7RgNGC0LjRgNGD0LXQvCBDdXN0b21Db21tYW5kINC00LvRjyDQvtCx0YDQsNGC0L3QvtC5INGB0L7QstC80LXRgdGC0LjQvNC+0YHRgtC4XG5leHBvcnQgeyBDdXN0b21Db21tYW5kIH07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21Db21tYW5kU3RvcmFnZSB7XG4gICAgcHJpdmF0ZSBjb21tYW5kczogTWFwPHN0cmluZywgQ3VzdG9tQ29tbWFuZD4gPSBuZXcgTWFwKCk7XG5cbiAgICAvKipcbiAgICAgKiDQoNC10LPQuNGB0YLRgNC40YDRg9C10YIg0LrQvtC80LDQvdC00YNcbiAgICAgKiBAcGFyYW0gY29tbWFuZCAtINGN0LrQt9C10LzQv9C70Y/RgCDQutC70LDRgdGB0LAg0LrQvtC80LDQvdC00YtcbiAgICAgKi9cbiAgICByZWdpc3RlckNvbW1hbmQoY29tbWFuZDogQ3VzdG9tQ29tbWFuZCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbW1hbmRzLnNldChjb21tYW5kLm5hbWUsIGNvbW1hbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0LTQsNC70Y/QtdGCINC60L7QvNCw0L3QtNGDXG4gICAgICogQHBhcmFtIGNvbW1hbmROYW1lIC0g0LjQvNGPINC60L7QvNCw0L3QtNGLXG4gICAgICogQHJldHVybnMg0YPRgdC/0LXRiNC90L7RgdGC0Ywg0YPQtNCw0LvQtdC90LjRj1xuICAgICAqL1xuICAgIHVucmVnaXN0ZXJDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWFuZHMuZGVsZXRlKGNvbW1hbmROYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LvRg9GH0LDQtdGCINGB0L/QuNGB0L7QuiDQstGB0LXRhSDQt9Cw0YDQtdCz0LjRgdGC0YDQuNGA0L7QstCw0L3QvdGL0YUg0LrQvtC80LDQvdC0XG4gICAgICogQHJldHVybnMg0LzQsNGB0YHQuNCyINC+0LHRitC10LrRgtC+0LIg0YEg0LjQvdGE0L7RgNC80LDRhtC40LXQuSDQviDQutC+0LzQsNC90LTQsNGFXG4gICAgICovXG4gICAgZ2V0Q3VzdG9tQ29tbWFuZHMoKTogQXJyYXk8e25hbWU6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZ30+IHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jb21tYW5kcy52YWx1ZXMoKSkubWFwKGNvbW1hbmQgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGNvbW1hbmQubmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBjb21tYW5kLmRlc2NyaXB0aW9uXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QstC10YDRj9C10YIsINC30LDRgNC10LPQuNGB0YLRgNC40YDQvtCy0LDQvdCwINC70Lgg0LrQvtC80LDQvdC00LBcbiAgICAgKiBAcGFyYW0gY29tbWFuZE5hbWUgLSDQuNC80Y8g0LrQvtC80LDQvdC00YtcbiAgICAgKiBAcmV0dXJucyB0cnVlINC10YHQu9C4INC60L7QvNCw0L3QtNCwINC30LDRgNC10LPQuNGB0YLRgNC40YDQvtCy0LDQvdCwXG4gICAgICovXG4gICAgaGFzQ3VzdG9tQ29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmRzLmhhcyhjb21tYW5kTmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QvtC70YPRh9Cw0LXRgiDQuNC90YTQvtGA0LzQsNGG0LjRjiDQviDQutC+0LzQsNC90LTQtVxuICAgICAqIEBwYXJhbSBjb21tYW5kTmFtZSAtINC40LzRjyDQutC+0LzQsNC90LTRi1xuICAgICAqIEByZXR1cm5zINC+0LHRitC10LrRgiDRgSDQuNC90YTQvtGA0LzQsNGG0LjQtdC5INC+INC60L7QvNCw0L3QtNC1INC40LvQuCBudWxsXG4gICAgICovXG4gICAgZ2V0Q29tbWFuZChjb21tYW5kTmFtZTogc3RyaW5nKTogQ3VzdG9tQ29tbWFuZCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tYW5kcy5nZXQoY29tbWFuZE5hbWUpIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7Rh9C40YnQsNC10YIg0LLRgdC1INC60L7QvNCw0L3QtNGLXG4gICAgICovXG4gICAgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29tbWFuZHMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LvRg9GH0LDQtdGCINC60L7Qu9C40YfQtdGB0YLQstC+INC30LDRgNC10LPQuNGB0YLRgNC40YDQvtCy0LDQvdC90YvRhSDQutC+0LzQsNC90LRcbiAgICAgKiBAcmV0dXJucyDQutC+0LvQuNGH0LXRgdGC0LLQviDQutC+0LzQsNC90LRcbiAgICAgKi9cbiAgICBnZXRDb21tYW5kQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWFuZHMuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktGL0L/QvtC70L3Rj9C10YIg0LrQvtC80LDQvdC00YMsINC10YHQu9C4INC+0L3QsCDQt9Cw0YDQtdCz0LjRgdGC0YDQuNGA0L7QstCw0L3QsFxuICAgICAqIEBwYXJhbSBjb21tYW5kIC0g0LrQvtC80LDQvdC00LAg0LTQu9GPINCy0YvQv9C+0LvQvdC10L3QuNGPXG4gICAgICogQHJldHVybnMg0YDQtdC30YPQu9GM0YLQsNGCINCy0YvQv9C+0LvQvdC10L3QuNGPINC40LvQuCBudWxsINC10YHQu9C4INC60L7QvNCw0L3QtNCwINC90LUg0L3QsNC50LTQtdC90LBcbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgICAgLy8g0JjRidC10Lwg0LrQvtC80LDQvdC00YMsINC60L7RgtC+0YDQsNGPINGB0L7QvtGC0LLQtdGC0YHRgtCy0YPQtdGCINCy0LLQvtC00YNcbiAgICAgICAgZm9yIChjb25zdCBbY21kTmFtZSwgY21kSW5zdGFuY2VdIG9mIHRoaXMuY29tbWFuZHMpIHtcbiAgICAgICAgICAgIGlmIChjbWRJbnN0YW5jZS5tYXRjaGVzKGNvbW1hbmQpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGNtZEluc3RhbmNlLmV4ZWN1dGUoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyDQn9GA0L7QstC10YDRj9C10LwsINGP0LLQu9GP0LXRgtGB0Y8g0LvQuCDRgNC10LfRg9C70YzRgtCw0YIgUHJvbWlzZVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIGN1c3RvbSBjb21tYW5kICcke2NtZE5hbWV9JzogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vINCa0L7QvNCw0L3QtNCwINC90LUg0L3QsNC50LTQtdC90LBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINCy0YHRgtGA0L7QtdC90L3Ri9C1INC60L7QvNCw0L3QtNGLXG4gICAgICovXG4gICAgaW5pdEJ1aWx0aW5Db21tYW5kcyh0ZXJtaW5hbE1hbmFnZXI/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8g0JrQvtC80LDQvdC00LAgaW5mbyDQtNC70Y8g0L/QvtC70YPRh9C10L3QuNGPINC40L3RhNC+0YDQvNCw0YbQuNC4INC+INGB0YDQtdC00LVcbiAgICAgICAgdGhpcy5yZWdpc3RlckNvbW1hbmQobmV3IEluZm9Db21tYW5kKCkpO1xuICAgICAgICBcbiAgICAgICAgLy8g0JrQvtC80LDQvdC00LAgaGVscCDQtNC70Y8g0L/QvtC70YPRh9C10L3QuNGPINGB0L/RgNCw0LLQutC4XG4gICAgICAgIHRoaXMucmVnaXN0ZXJDb21tYW5kKG5ldyBIZWxwQ29tbWFuZCh0aGlzKSk7XG4gICAgICAgIFxuICAgICAgICAvLyDQmtC+0LzQsNC90LTQsCBjbGVhciDQtNC70Y8g0L7Rh9C40YHRgtC60Lgg0YLQtdGA0LzQuNC90LDQu9CwXG4gICAgICAgIHRoaXMucmVnaXN0ZXJDb21tYW5kKG5ldyBDbGVhckNvbW1hbmQoKSk7XG4gICAgICAgIFxuICAgICAgICAvLyDQmtC+0LzQsNC90LTQsCBjdXJsINC00LvRjyDQstGL0L/QvtC70L3QtdC90LjRjyBIVFRQINC30LDQv9GA0L7RgdC+0LJcbiAgICAgICAgdGhpcy5yZWdpc3RlckNvbW1hbmQobmV3IEN1cmxDb21tYW5kKCkpO1xuICAgICAgICBcbiAgICAgICAgLy8g0JrQvtC80LDQvdC00LAganEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSBKU09OINC+0LHRitC10LrRgtCw0LzQuFxuICAgICAgICB0aGlzLnJlZ2lzdGVyQ29tbWFuZChuZXcgSnFDb21tYW5kKCkpO1xuICAgICAgICBcbiAgICAgICAgLy8g0JrQvtC80LDQvdC00LAgZWNobyDQtNC70Y8g0LLRi9Cy0L7QtNCwINGC0LXQutGB0YLQsCAo0LDQvdCw0LvQvtCzIGNvbnNvbGUubG9nKVxuICAgICAgICB0aGlzLnJlZ2lzdGVyQ29tbWFuZChuZXcgRWNob0NvbW1hbmQoKSk7XG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2coJ0J1aWx0LWluIGNvbW1hbmRzIGluaXRpYWxpemVkJyk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBUZXJtaW5hbE1hbmFnZXIgLSDRg9C/0YDQsNCy0LvRj9C10YIg0YLQtdGA0LzQuNC90LDQu9C+0Lwg0Lgg0L/QvtC00LrQu9GO0YfQtdC90LjQtdC8XG4gKi9cblxuaW1wb3J0IHtcbiAgICBUZXJtaW5hbE1hbmFnZXJPcHRpb25zLFxuICAgIEhhbmRsZXJzLFxuICAgIENsaWVudFR5cGVcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyAgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFRlcm1pbmFsQ2xpIH0gZnJvbSAnLi90ZXJtaW5hbC1jbGknO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiwgSUNvbm5lY3Rpb24gfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IHsgQ29tbWFuZEJ1aWxkZXIgfSBmcm9tICcuL2NvbW1hbmQtYnVpbGRlcic7XG5cbmltcG9ydCB7IEN1c3RvbUNvbW1hbmRTdG9yYWdlIH0gZnJvbSAnLi9jdXN0b20tY29tbWFuZC1zdG9yYWdlJztcblxuZXhwb3J0IGNsYXNzIFRlcm1pbmFsTWFuYWdlciB7XG5cbiAgICBwdWJsaWMgaXNJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBvcHRpb25zOiBUZXJtaW5hbE1hbmFnZXJPcHRpb25zO1xuICAgIHB1YmxpYyB0ZXJtaW5hbDogVGVybWluYWxDbGkgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgY29ubmVjdGlvbjogSUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgY29tbWFuZEJ1aWxkZXI6IENvbW1hbmRCdWlsZGVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGhhbmRsZXJzOiBIYW5kbGVyc3xudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgY3VzdG9tQ29tbWFuZFN0b3JhZ2U6IEN1c3RvbUNvbW1hbmRTdG9yYWdlO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogUGFydGlhbDxUZXJtaW5hbE1hbmFnZXJPcHRpb25zPiA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHdvcmtNb2RlID0gb3B0aW9ucy53b3JrTW9kZSB8fCAnbG9jYWwnO1xuICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSBvcHRpb25zLnNlc3Npb25JZCB8fCBudWxsO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZCxcbiAgICAgICAgICAgIGNsaWVudE5hbWU6IG9wdGlvbnMuY2xpZW50TmFtZSB8fCBERUZBVUxUX1NFVFRJTkdTLkRFRkFVTFRfQ0xJRU5UX05BTUUsXG4gICAgICAgICAgICBhdXRvQ29ubmVjdDogb3B0aW9ucy5hdXRvQ29ubmVjdCAhPT0gZmFsc2UsXG4gICAgICAgICAgICBhdXRvQ29ubmVjdERlbGF5OiBvcHRpb25zLmF1dG9Db25uZWN0RGVsYXkgfHwgREVGQVVMVF9TRVRUSU5HUy5BVVRPX0NPTk5FQ1RfREVMQVksXG4gICAgICAgICAgICB3b3JrTW9kZTogd29ya01vZGUsXG4gICAgICAgICAgICBjbGllbnRUeXBlOiBvcHRpb25zLmNsaWVudFR5cGUgfHwgJ3dlYicsXG4gICAgICAgICAgICBjb25uZWN0aW9uOiBvcHRpb25zLmNvbm5lY3Rpb24gfHwgbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8IGNvbm5lY3Rpb24g0YLQvtC70YzQutC+INC10YHQu9C4INC90LUg0LIgb2ZmbGluZSDRgNC10LbQuNC80LVcbiAgICAgICAgaWYgKHdvcmtNb2RlICE9PSAnb2ZmbGluZScpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb25uZWN0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXJVcmw6IG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnM/LnNlcnZlclVybCB8fCBERUZBVUxUX1NFVFRJTkdTLkRFRkFVTFRfU0VSVkVSX1VSTCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1c3RvbUNvbW1hbmRTdG9yYWdlID0gbmV3IEN1c3RvbUNvbW1hbmRTdG9yYWdlKCk7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuXG4gICAgICAgIC8vINCQ0LLRgtC+0LzQsNGC0LjRh9C10YHQutC+0LUg0L/QvtC00LrQu9GO0YfQtdC90LjQtSDRh9C10YDQtdC3INGD0LrQsNC30LDQvdC90YPRjiDQt9Cw0LTQtdGA0LbQutGDXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b0Nvbm5lY3QpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgdGhpcy5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoJ3dlYicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5hdXRvQ29ubmVjdERlbGF5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINCy0L3QtdGI0L3QtdC1INGB0L7QtdC00LjQvdC10L3QuNC1ICjQstC80LXRgdGC0L4g0YHQvtC30LTQsNC90LjRjyDQvdC+0LLQvtCz0L4pXG4gICAgICogQHBhcmFtIGNvbm5lY3Rpb24gLSDQstC90LXRiNC90LXQtSDRgdC+0LXQtNC40L3QtdC90LjQtSDQtNC70Y8g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y9cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RXh0ZXJuYWxDb25uZWN0aW9uKGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgLy8g0KPQvdC40YfRgtC+0LbQsNC10Lwg0YHRg9GJ0LXRgdGC0LLRg9GO0YnQtdC1INGB0L7QtdC00LjQvdC10L3QuNC1XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgY29uc29sZS5sb2coJ0V4dGVybmFsIGNvbm5lY3Rpb24gc2V0IGZvciBUZXJtaW5hbE1hbmFnZXInKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiDQstGB0LUgaGFuZGxlcnMg0LTQu9GPINGC0LXRgNC80LjQvdCw0LvQsCDQuCDRgdC+0LXQtNC40L3QtdC90LjRj1xuICAgICAqIEBwYXJhbSBoYW5kbGVycyAtINC+0LHRitC10LrRgiDRgSBoYW5kbGVyc1xuICAgICAqL1xuICAgIHNldEhhbmRsZXJzKGhhbmRsZXJzOiBIYW5kbGVycyA9IHt9KTogdm9pZCB7XG4gICAgICAgIC8vINCd0LDRgdGC0YDQsNC40LLQsNC10LwgY2FsbGJhY2tzINC00LvRjyDQvtGB0L3QvtCy0L3QvtCz0L4g0YLQtdGA0LzQuNC90LDQu9CwXG4gICAgICAgIGlmIChoYW5kbGVycy5vbkRhdGEpIHtcbiAgICAgICAgICAvLyAgdGhpcy5vcHRpb25zLm9uRGF0YSA9IGhhbmRsZXJzLm9uRGF0YTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXJtaW5hbC5zZXRPbkRhdGEoaGFuZGxlcnMub25EYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYW5kbGVycy5vbkVycm9yKSB7XG4gICAgICAgICAgLy8gIHRoaXMub3B0aW9ucy5vbkVycm9yID0gaGFuZGxlcnMub25FcnJvcjtcbiAgICAgICAgICAgIGlmICh0aGlzLnRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXJtaW5hbC5zZXRPbkVycm9yKGhhbmRsZXJzLm9uRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g0J3QsNGB0YLRgNCw0LjQstCw0LXQvCBjYWxsYmFja3Mg0LTQu9GPINC+0YHQvdC+0LLQvdC+0LPQviDRgdC+0LXQtNC40L3QtdC90LjRjyAo0YLQvtC70YzQutC+INC10YHQu9C4IENvbm5lY3Rpb24g0YHRg9GJ0LXRgdGC0LLRg9C10YIpXG4gICAgICAgIGlmIChoYW5kbGVycy5vbkNvbm5lY3QpIHtcbiAgICAgICAgICAvLyAgdGhpcy5vcHRpb25zLm9uQ29ubmVjdCA9IGhhbmRsZXJzLm9uQ29ubmVjdDtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2V0T25Db25uZWN0KGhhbmRsZXJzLm9uQ29ubmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFuZGxlcnMub25DdXJzb3JTdGF0ZSkge1xuICAgICAgICAgICAgLy90aGlzLm9wdGlvbnMub25DdXJzb3JTdGF0ZSA9IGhhbmRsZXJzLm9uQ3Vyc29yU3RhdGU7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnNldE9uQ3Vyc29yU3RhdGUoc3RhdGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5vbkN1cnNvclN0YXRlIShzdGF0ZS5zZXNzaW9uSWQsIHN0YXRlLmNvbW1hbmQsIHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlcnMub25EYXRhKSB7XG4gICAgICAgICAgLy8gIHRoaXMub3B0aW9ucy5vbkRhdGEgPSBoYW5kbGVycy5vbkRhdGE7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2V0T25UZXJtaW5hbChhPT57XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMub25EYXRhIShhLmRhdGEpO1xuICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFuZGxlcnMub25EaXNjb25uZWN0KSB7XG4gICAgICAgICAgICAvLyB0aGlzLm9wdGlvbnMub25EaXNjb25uZWN0ID0gKGNvZGU6IG51bWJlciwgcmVhc29uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vICAgICBoYW5kbGVycy5vbkRpc2Nvbm5lY3QhKCk7XG4gICAgICAgICAgICAvLyB9O1xuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5zZXRPbkRpc2Nvbm5lY3QoKGNvZGU6IG51bWJlciwgcmVhc29uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMub25EaXNjb25uZWN0ISgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgICAgICBpZiAoaGFuZGxlcnMub25FcnJvcikge1xuICAgICAgICAgIC8vICB0aGlzLm9wdGlvbnMub25FcnJvciA9IGhhbmRsZXJzLm9uRXJyb3I7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnNldE9uRXJyb3IoaGFuZGxlcnMub25FcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoaGFuZGxlcnMub25DbGllbnRTdGF0dXMpIHtcbiAgICAgICAgLy8gICAgIHRoaXMub3B0aW9ucy5vbkNsaWVudFN0YXR1cyA9IGhhbmRsZXJzLm9uQ2xpZW50U3RhdHVzO1xuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY29ubmVjdGlvbikge1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5zZXRPbkNsaWVudFN0YXR1cyhoYW5kbGVycy5vbkNsaWVudFN0YXR1cyk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gLy8gY2xvc2VTZXNzaW9uXG4gICAgICAgIC8vIGlmIChoYW5kbGVycy5vbkNsb3NlU2Vzc2lvbikge1xuICAgICAgICAvLyAgICAgdGhpcy5vcHRpb25zLm9uQ2xvc2VTZXNzaW9uID0gaGFuZGxlcnMub25DbG9zZVNlc3Npb247XG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnNldE9uQ2xvc2VTZXNzaW9uKGhhbmRsZXJzLm9uQ2xvc2VTZXNzaW9uKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG5cblxuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVycztcbiAgICAgICAgY29uc29sZS5sb2coJ0hhbmRsZXJzIHNldCBzdWNjZXNzZnVsbHknKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINGC0LXRgNC80LjQvdCw0Lsg0Lgg0L/QvtC00LrQu9GO0YfQtdC90LjQtVxuICAgICAqL1xuICAgIGluaXQoKTogdm9pZCB7XG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1aWxkZXIgPSBuZXcgQ29tbWFuZEJ1aWxkZXIoKTtcblxuICAgICAgICAgICAgLy8g0KHQvtC30LTQsNC10LwgVGVybWluYWxDbGkg0YEgQ3VzdG9tQ29tbWFuZFN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMudGVybWluYWwgPSBuZXcgVGVybWluYWxDbGkodGhpcy5jdXN0b21Db21tYW5kU3RvcmFnZSk7XG4gICAgICAgICAgICAvLyDQodC+0LfQtNCw0LXQvCBDb25uZWN0aW9uINGC0L7Qu9GM0LrQviDQtdGB0LvQuCDQvdC1INCyIG9mZmxpbmUg0YDQtdC20LjQvNC1INC4INC90LXRgiDQstC90LXRiNC90LXQs9C+INGB0L7QtdC00LjQvdC10L3QuNGPXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmtNb2RlICE9PSAnb2ZmbGluZScgJiYgdGhpcy5vcHRpb25zLmNvbm5lY3Rpb24gJiYgIXRoaXMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbm5lY3Rpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSB0aGlzLm9wdGlvbnMuY29ubmVjdGlvbjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbm5lY3Rpb25PcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbih0aGlzLm9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMhLnNlcnZlclVybCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gb3B0aW9ucyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vINCd0LDRgdGC0YDQsNC40LLQsNC10LwgY2FsbGJhY2sn0Lgg0LTQu9GPIENvbm5lY3Rpb24g0LIg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDQvtGCINGA0LXQttC40LzQsCDRgNCw0LHQvtGC0YtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29ya01vZGUgPT09ICdyZW1vdGUnICYmIHRoaXMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vINCSINGD0LTQsNC70LXQvdC90L7QvCDRgNC10LbQuNC80LUg0L7RgtC/0YDQsNCy0LvRj9C10Lwg0YHQvtCx0YvRgtC40Y8gU0VORF9LRVlcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2V0T25TZW5kS2V5KChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8g0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdC8IHNlbmRLZXkg0YfQtdGA0LXQtyBDb21tYW5kQnVpbGRlclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5rZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEua2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1aWxkZXIhLndyaXRlKGRhdGEua2V5c1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5zZXRPbkNvbW1hbmQoYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyDQntCx0YDQsNCx0LDRgtGL0LLQsNC10LwgY29tbWFuZCDRh9C10YDQtdC3IENvbW1hbmRCdWlsZGVyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudGVybWluYWw/LmV4ZWN1dGVDb21tYW5kKGRhdGEuY29tbWFuZCk7XG5cblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vINCd0LDRgdGC0YDQsNC40LLQsNC10LwgY2FsbGJhY2sn0Lgg0LTQu9GPIENvbW1hbmRCdWlsZGVyXG4gICAgICAgICAgICB0aGlzLmNvbW1hbmRCdWlsZGVyLnNldE9uRXhlY3V0ZUNvbW1hbmQoYXN5bmMgKGNvbW1hbmQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlcnM/Lm9uRGF0YSEoXCJcXHJcXG5cIik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy53b3JrTW9kZSA9PT0gJ29mZmxpbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudGVybWluYWwhLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2Vzc2lvbklkID0gb3B0aW9ucy5zZXNzaW9uSWQhO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24hLnNlbmRDb21tYW5kKHNlc3Npb25JZCwgY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vINCSINC70L7QutCw0LvRjNC90L7QvCDRgNC10LbQuNC80LUg0L7RgtC/0YDQsNCy0LvRj9C10LwgQ1VSU09SX1NUQVRFINC40LcgQ29tbWFuZEJ1aWxkZXJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29ya01vZGUgPT09ICdsb2NhbCcgJiYgdGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVpbGRlci5zZXRPblN0YXRlQ2hhbmdlKHN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFuZGxlcnM/Lm9uQ3Vyc29yU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlcnM/Lm9uQ3Vyc29yU3RhdGUodGhpcy5vcHRpb25zLnNlc3Npb25JZCB8fCAnb2ZmbGluZScsIHN0YXRlLmNvbW1hbmQsIHN0YXRlLnBvc3RpdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uPy5zZW5kQ3Vyc29yU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLm9wdGlvbnMuc2Vzc2lvbklkIHx8ICdvZmZsaW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IHN0YXRlLmNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogc3RhdGUucG9zdGl0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDQkiBvZmZsaW5lINGA0LXQttC40LzQtSDQvdCw0YHRgtGA0LDQuNCy0LDQtdC8INC/0YDRj9C80YPRjiDRgNCw0LHQvtGC0YMg0YEgVGVybWluYWxDbGlcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29ya01vZGUgPT09ICdvZmZsaW5lJykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbWFuZEJ1aWxkZXIuc2V0T25TdGF0ZUNoYW5nZShzdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vINCSIG9mZmxpbmUg0YDQtdC20LjQvNC1INC/0YDQvtGB0YLQviDRg9Cy0LXQtNC+0LzQu9GP0LXQvCDQvtCxINC40LfQvNC10L3QtdC90LjQuCDRgdC+0YHRgtC+0Y/QvdC40Y9cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFuZGxlcnM/Lm9uQ3Vyc29yU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlcnM/Lm9uQ3Vyc29yU3RhdGUodGhpcy5vcHRpb25zLnNlc3Npb25JZCB8fCAnb2ZmbGluZScsIHN0YXRlLmNvbW1hbmQsIHN0YXRlLnBvc3RpdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8g0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXQvCDQstGB0YLRgNC+0LXQvdC90YvQtSDQutC+0LzQsNC90LTRi1xuICAgICAgICAgICAgdGhpcy5jdXN0b21Db21tYW5kU3RvcmFnZS5pbml0QnVpbHRpbkNvbW1hbmRzKCk7XG5cbiAgICAgICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVGVybWluYWxNYW5hZ2VyIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseScpO1xuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIFRlcm1pbmFsTWFuYWdlcjonLCBlcnJvcik7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LTQutC70Y7Rh9Cw0LXRgtGB0Y8g0Log0YHQtdGA0LLQtdGA0YNcbiAgICAgKi9cbiAgICBjb25uZWN0KGNsaWVudFR5cGU6IENsaWVudFR5cGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGVybWluYWxNYW5hZ2VyIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyDQkiBvZmZsaW5lINGA0LXQttC40LzQtSDQvdC1INC/0L7QtNC60LvRjtGH0LDQtdC80YHRjyDQuiDRgdC10YDQstC10YDRg1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLndvcmtNb2RlID09PSAnb2ZmbGluZScpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUZXJtaW5hbE1hbmFnZXIgcnVubmluZyBpbiBvZmZsaW5lIG1vZGUgLSBubyBzZXJ2ZXIgY29ubmVjdGlvbiBuZWVkZWQnKTtcbiAgICAgICAgICAgIC8vINCS0YvQt9GL0LLQsNC10Lwgb25Db25uZWN0IGNhbGxiYWNrINC00LvRjyDRg9Cy0LXQtNC+0LzQu9C10L3QuNGPINC+INCz0L7RgtC+0LLQvdC+0YHRgtC4XG4gICAgICAgICAgICBpZiAodGhpcy5oYW5kbGVycz8ub25Db25uZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVycz8ub25Db25uZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uY29ubmVjdChjbGllbnRUeXBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29ubmVjdGlvbiBub3QgYXZhaWxhYmxlIC0gY2hlY2sgd29ya01vZGUgYW5kIGNvbm5lY3Rpb24gb3B0aW9ucycpO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiDQntGC0LrQu9GO0YfQsNC10YLRgdGPINC+0YIg0YHQtdGA0LLQtdGA0LBcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgICAgICAvLyDQkiBvZmZsaW5lINGA0LXQttC40LzQtSDQvdC10YfQtdCz0L4g0L7RgtC60LvRjtGH0LDRgtGMXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29ya01vZGUgPT09ICdvZmZsaW5lJykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1Rlcm1pbmFsTWFuYWdlciBpbiBvZmZsaW5lIG1vZGUgLSBubyBjb25uZWN0aW9uIHRvIGRpc2Nvbm5lY3QnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntGC0L/RgNCw0LLQu9GP0LXRgiDQtNCw0L3QvdGL0LUg0LIg0YLQtdGA0LzQuNC90LDQu1xuICAgICAqIEBwYXJhbSBkYXRhIC0g0LTQsNC90L3Ri9C1INC00LvRjyDQvtGC0L/RgNCw0LLQutC4XG4gICAgICovXG4gICAgYXN5bmMgd3JpdGUoZGF0YTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMud29ya01vZGUgPT09ICdvZmZsaW5lJykge1xuICAgICAgICAgICAgLy8g0JIgb2ZmbGluZSDRgNC10LbQuNC80LUg0YDQsNCx0L7RgtCw0LXQvCDQvdCw0L/RgNGP0LzRg9GOINGBIENvbW1hbmRCdWlsZGVyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbW1hbmRCdWlsZGVyPy53cml0ZShkYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMud29ya01vZGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tbWFuZEJ1aWxkZXI/LndyaXRlKGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g0JIgcmVtb3RlINGA0LXQttC40LzQtSDQvtGC0L/RgNCw0LLQu9GP0LXQvCDRh9C10YDQtdC3IENvbm5lY3Rpb25cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uc2VuZFNlbmRLZXkoe1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMub3B0aW9ucy5zZXNzaW9uSWQhLFxuICAgICAgICAgICAgICAgICAgICBrZXlzOiBbZGF0YV0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29ubmVjdGlvbiBub3QgYXZhaWxhYmxlIGluIHJlbW90ZSBtb2RlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG5cbiAgICAvKipcbiAgICAgKiDQntGH0LjRidCw0LXRgiDRgNC10YHRg9GA0YHRi1xuICAgICAqL1xuICAgIGRlc3Ryb3koKTogdm9pZCB7XG5cbiAgICAgICAgLy8g0KPQvdC40YfRgtC+0LbQsNC10Lwg0L7RgdC90L7QstC90L7QuSDRgtC10YDQvNC40L3QsNC7XG4gICAgICAgIGlmICh0aGlzLnRlcm1pbmFsKSB7XG4gICAgICAgICAgICB0aGlzLnRlcm1pbmFsLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMudGVybWluYWwgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g0KPQvdC40YfRgtC+0LbQsNC10Lwg0L7RgdC90L7QstC90L7QuSBDb21tYW5kQnVpbGRlclxuICAgICAgICBpZiAodGhpcy5jb21tYW5kQnVpbGRlcikge1xuICAgICAgICAgICAgdGhpcy5jb21tYW5kQnVpbGRlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmNvbW1hbmRCdWlsZGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vINCj0L3QuNGH0YLQvtC20LDQtdC8INC+0YHQvdC+0LLQvdC+0LUg0YHQvtC10LTQuNC90LXQvdC40LVcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IG51bGw7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBUZXJtaW5hbFVpV3JpdGVyLnRzIC0g0JrQu9Cw0YHRgSDQtNC70Y8g0YHQvtCz0LvQsNGB0L7QstCw0L3QvdC+0Lkg0L7RgtGA0LjRgdC+0LLQutC4INGC0LXRgNC80LjQvdCw0LvQsFxuICog0J7QsdC10YHQv9C10YfQuNCy0LDQtdGCINGG0LXQvdGC0YDQsNC70LjQt9C+0LLQsNC90L3QvtC1INGD0L/RgNCw0LLQu9C10L3QuNC1INCy0YvQstC+0LTQsNC80Lgg0LIg0YLQtdGA0LzQuNC90LDQuyDRh9C10YDQtdC3IHh0ZXJtLmpzXG4gKi9cblxuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG4vKipcbiAqINCY0L3RgtC10YDRhNC10LnRgSDQtNC70Y8g0YHQvtGB0YLQvtGP0L3QuNGPINC60L7QvNCw0L3QtNGLINCyINGC0LXRgNC80LjQvdCw0LvQtVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRTdGF0ZSB7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgcG9zaXRpb246IG51bWJlcjtcbn1cblxuLyoqXG4gKiDQmtC70LDRgdGBIFRlcm1pbmFsVWlXcml0ZXIgLSDRg9C/0YDQsNCy0LvRj9C10YIg0L7RgtGA0LjRgdC+0LLQutC+0Lkg0LIg0YLQtdGA0LzQuNC90LDQu9C1XG4gKi9cbmV4cG9ydCBjbGFzcyBUZXJtaW5hbFVpV3JpdGVyIHtcbiAgcHJpdmF0ZSB0ZXJtaW5hbFVpOiBUZXJtaW5hbDtcbiAgcHJpdmF0ZSBjdXJyZW50TGluZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBjdXJyZW50Q29sdW1uOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIGxhc3RDb21tYW5kOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBsYXN0UG9zaXRpb246IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IodGVybWluYWxVaTogVGVybWluYWwpIHtcbiAgICB0aGlzLnRlcm1pbmFsVWkgPSB0ZXJtaW5hbFVpO1xuICB9XG5cbiAgLyoqXG4gICAqINCe0YHQvdC+0LLQvdC+0Lkg0LzQtdGC0L7QtCDQtNC70Y8g0LfQsNC/0LjRgdC4INC60L7QvNCw0L3QtNGLINCyINGC0LXRgNC80LjQvdCw0LtcbiAgICogQHBhcmFtIGNvbW1hbmQgLSDRgtC10LrRgdGCINC60L7QvNCw0L3QtNGLINC00LvRjyDQvtGC0L7QsdGA0LDQttC10L3QuNGPXG4gICAqIEBwYXJhbSBwb3NpdGlvbiAtINC/0L7Qt9C40YbQuNGPINC60YPRgNGB0L7RgNCwINCyINC60L7QvNCw0L3QtNC1XG4gICAqL1xuICBwdWJsaWMgd3JpdGUoY29tbWFuZDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coYHdyaXRlKCkgY2FsbGVkOiBjb21tYW5kPVwiJHtjb21tYW5kfVwiLCBwb3NpdGlvbj0ke3Bvc2l0aW9ufSwgbGFzdENvbW1hbmQ9XCIke3RoaXMubGFzdENvbW1hbmR9XCIsIGxhc3RQb3NpdGlvbj0ke3RoaXMubGFzdFBvc2l0aW9ufWApO1xuICAgIFxuICAgIC8vIDApINCR0YvRgdGC0YDRi9C5INC/0YPRgtGMINCy0YHRgtCw0LLQutC4INCyINGB0LXRgNC10LTQuNC90LUg0YHRgtGA0L7QutC4XG4gICAgaWYgKHRoaXMudHJ5TWlkbGluZUluc2VydCh0aGlzLmxhc3RDb21tYW5kLCBjb21tYW5kLCB0aGlzLmxhc3RQb3NpdGlvbiwgcG9zaXRpb24pKSB7XG4gICAgICBjb25zb2xlLmxvZygnICAtPiB0cnlNaWRsaW5lSW5zZXJ0IGhhbmRsZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAwLjEpINCR0YvRgdGC0YDRi9C5INC/0YPRgtGMINGD0LTQsNC70LXQvdC40Y8g0LIg0YHQtdGA0LXQtNC40L3QtSDRgdGC0YDQvtC60LggKNCy0LrQu9GO0YfQsNGPINGD0LTQsNC70LXQvdC40LUg0L/QvtGB0LvQtdC00L3QtdCz0L4g0YHQuNC80LLQvtC70LAg0LIg0YHRgtGA0L7QutC1KVxuICAgIGlmICh0aGlzLnRyeU1pZGxpbmVEZWxldGUodGhpcy5sYXN0Q29tbWFuZCwgY29tbWFuZCwgdGhpcy5sYXN0UG9zaXRpb24sIHBvc2l0aW9uKSkge1xuICAgICAgY29uc29sZS5sb2coJyAgLT4gdHJ5TWlkbGluZURlbGV0ZSBoYW5kbGVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gMSkg0KLQvtC70YzQutC+INC/0LXRgNC10LzQtdGJ0LXQvdC40LUg0LrRg9GA0YHQvtGA0LAgKNGB0YLRgNC+0LrQsCDQvdC1INC40LfQvNC10L3QuNC70LDRgdGMKVxuICAgIGlmIChjb21tYW5kID09PSB0aGlzLmxhc3RDb21tYW5kICYmIHBvc2l0aW9uICE9PSB0aGlzLmxhc3RQb3NpdGlvbikge1xuICAgICAgY29uc29sZS5sb2coJyAgLT4gbW92ZUN1cnNvclJlbGF0aXZlJyk7XG4gICAgICB0aGlzLm1vdmVDdXJzb3JSZWxhdGl2ZShjb21tYW5kLCB0aGlzLmxhc3RQb3NpdGlvbiwgcG9zaXRpb24pO1xuICAgICAgdGhpcy5sYXN0UG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAyKSDQkdGL0YHRgtGA0YvQuSBiYWNrc3BhY2Ug0LIg0LrQvtC90YbQtSDRgdGC0YDQvtC60LhcbiAgICBpZiAoXG4gICAgICB0aGlzLmxhc3RDb21tYW5kLmxlbmd0aCA+IDAgJiZcbiAgICAgIHBvc2l0aW9uID09PSB0aGlzLmxhc3RDb21tYW5kLmxlbmd0aCAtIDEgJiZcbiAgICAgIGNvbW1hbmQgPT09IHRoaXMubGFzdENvbW1hbmQuc2xpY2UoMCwgLTEpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmxvZygnICAtPiBmYXN0IGJhY2tzcGFjZSBhdCBlbmQnKTtcbiAgICAgIC8vINCS0YvQv9C+0LvQvdGP0LXQvCDQstC40LfRg9Cw0LvRjNC90YvQuSBiYWNrc3BhY2VcbiAgICAgIHRoaXMudGVybWluYWxVaS53cml0ZSgnXFxiIFxcYicpO1xuICAgICAgdGhpcy5sYXN0Q29tbWFuZCA9IGNvbW1hbmQ7XG4gICAgICB0aGlzLmxhc3RQb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vINCd0LjRh9C10LPQviDQvdC1INC00LXQu9Cw0YLRjCwg0LXRgdC70Lgg0YHQvtGB0YLQvtGP0L3QuNC1INC90LUg0LjQt9C80LXQvdC40LvQvtGB0YxcbiAgICBpZiAoY29tbWFuZCA9PT0gdGhpcy5sYXN0Q29tbWFuZCAmJiBwb3NpdGlvbiA9PT0gdGhpcy5sYXN0UG9zaXRpb24pIHtcbiAgICAgIGNvbnNvbGUubG9nKCcgIC0+IG5vIGNoYW5nZSwgcmV0dXJuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g0JHRi9GB0YLRgNGL0Lkg0L/Rg9GC0Yw6INC00L7Qv9C40YHRi9Cy0LDQvdC40LUg0LIg0LrQvtC90LXRhiDQsdC10Lcg0L/QtdGA0LXQvNC10YnQtdC90LjRjyDQutGD0YDRgdC+0YDQsFxuICAgIGlmICh0aGlzLnRyeUZhc3RBcHBlbmQodGhpcy5sYXN0Q29tbWFuZCwgY29tbWFuZCwgcG9zaXRpb24pKSB7XG4gICAgICBjb25zb2xlLmxvZygnICAtPiB0cnlGYXN0QXBwZW5kIGhhbmRsZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDQl9Cw0YnQuNGC0LA6INC/0L7RgdC70LUg0LLRi9C/0L7Qu9C90LXQvdC40Y8g0LrQvtC80LDQvdC00YsgKNC+0YfQuNGB0YLQutCwINCx0YPRhNC10YDQsCkg0L3QtSDRgtGA0L7Qs9Cw0LXQvCDRjdC60YDQsNC9LFxuICAgIC8vINGH0YLQvtCx0Ysg0L3QtSDRgdGC0LXRgNC10YLRjCDQstGL0LLQvtC0L9C+0YjQuNCx0LrQuCwg0YLQvtC70YzQutC+INC+0LHQvdC+0LLQu9GP0LXQvCDQstC90YPRgtGA0LXQvdC90LXQtSDRgdC+0YHRgtC+0Y/QvdC40LVcbiAgICBpZiAodGhpcy5sYXN0Q29tbWFuZC5sZW5ndGggPiAwICYmIGNvbW1hbmQubGVuZ3RoID09PSAwICYmIHBvc2l0aW9uID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZygnICAtPiBjb21tYW5kIGV4ZWN1dGlvbiBjbGVhbnVwJyk7XG4gICAgICB0aGlzLmxhc3RDb21tYW5kID0gY29tbWFuZDtcbiAgICAgIHRoaXMubGFzdFBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJyAgLT4gdXBkYXRlQ29tbWFuZFJlZ2lvbiArIHNldEN1cnNvclBvc2l0aW9uSW5Db21tYW5kJyk7XG4gICAgLy8g0JTQuNGE0YQt0L7QsdC90L7QstC70LXQvdC40LU6INC/0LXRgNC10YDQuNGB0L7QstGL0LLQsNC10Lwg0YLQvtC70YzQutC+INC40LfQvNC10L3QuNCy0YjQuNC10YHRjyDRgdGC0YDQvtC60LhcbiAgICB0aGlzLnVwZGF0ZUNvbW1hbmRSZWdpb24odGhpcy5sYXN0Q29tbWFuZCwgY29tbWFuZCk7XG5cbiAgICAvLyDQotC+0YfQvdC+0LUg0L/QvtC30LjRhtC40L7QvdC40YDQvtCy0LDQvdC40LUg0LrRg9GA0YHQvtGA0LAg0YEg0YPRh9C10YLQvtC8INC80L3QvtCz0L7RgdGC0YDQvtGH0L3QvtGB0YLQuFxuICAgIGNvbnN0IGF0RW5kID0gcG9zaXRpb24gPj0gY29tbWFuZC5sZW5ndGg7XG4gICAgY29uc29sZS5sb2coYCAgLT4gYXRFbmQ9JHthdEVuZH0sIGNhbGxpbmcgc2V0Q3Vyc29yUG9zaXRpb25JbkNvbW1hbmQgd2l0aCBwb3NpdGlvbj0ke2F0RW5kID8gY29tbWFuZC5sZW5ndGggOiBwb3NpdGlvbn1gKTtcbiAgICBpZiAoYXRFbmQpIHtcbiAgICAgIC8vINCV0YHQu9C4INC60YPRgNGB0L7RgCDQsiDQutC+0L3RhtC1INC60L7QvNCw0L3QtNGLLCDRg9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDQtdCz0L4g0LIg0LrQvtC90LXRhiDQv9C+0YHQu9C10LTQvdC10Lkg0YHRgtGA0L7QutC4XG4gICAgICB0aGlzLnNldEN1cnNvclBvc2l0aW9uSW5Db21tYW5kKGNvbW1hbmQsIGNvbW1hbmQubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRDdXJzb3JQb3NpdGlvbkluQ29tbWFuZChjb21tYW5kLCBwb3NpdGlvbik7XG4gICAgfVxuXG4gICAgLy8g0JfQsNC/0L7QvNC40L3QsNC10Lwg0YLQtdC60YPRidC10LUg0YHQvtGB0YLQvtGP0L3QuNC1XG4gICAgdGhpcy5sYXN0Q29tbWFuZCA9IGNvbW1hbmQ7XG4gICAgdGhpcy5sYXN0UG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICBjb25zb2xlLmxvZyhgICAtPiBmaW5hbCBzdGF0ZTogbGFzdENvbW1hbmQ9XCIke3RoaXMubGFzdENvbW1hbmR9XCIsIGxhc3RQb3NpdGlvbj0ke3RoaXMubGFzdFBvc2l0aW9ufWApO1xuICB9XG5cbiAgLyoqXG4gICAqINCe0YLQvdC+0YHQuNGC0LXQu9GM0L3QvtC1INC/0LXRgNC10LzQtdGJ0LXQvdC40LUg0LrRg9GA0YHQvtGA0LAg0L/QviDQvtC00L3QvtC5INC4INGC0L7QuSDQttC1INC60L7QvNCw0L3QtNC1XG4gICAqL1xuICBwcml2YXRlIG1vdmVDdXJzb3JSZWxhdGl2ZShjb21tYW5kOiBzdHJpbmcsIGZyb21Qb3NpdGlvbjogbnVtYmVyLCB0b1Bvc2l0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmcm9tSW5mbyA9IHRoaXMuZ2V0Q3Vyc29ySW5mbyhjb21tYW5kLCBmcm9tUG9zaXRpb24pO1xuICAgIGNvbnN0IHRvSW5mbyA9IHRoaXMuZ2V0Q3Vyc29ySW5mbyhjb21tYW5kLCB0b1Bvc2l0aW9uKTtcblxuICAgIGNvbnN0IGxpbmVEZWx0YSA9IHRvSW5mby5saW5lIC0gZnJvbUluZm8ubGluZTtcbiAgICBpZiAobGluZURlbHRhID4gMCkge1xuICAgICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKGBcXHgxYlske2xpbmVEZWx0YX1CYCk7XG4gICAgfSBlbHNlIGlmIChsaW5lRGVsdGEgPCAwKSB7XG4gICAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoYFxceDFiWyR7LWxpbmVEZWx0YX1BYCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uRGVsdGEgPSB0b0luZm8uY29sdW1uIC0gZnJvbUluZm8uY29sdW1uO1xuICAgIGlmIChjb2x1bW5EZWx0YSA+IDApIHtcbiAgICAgIHRoaXMudGVybWluYWxVaS53cml0ZShgXFx4MWJbJHtjb2x1bW5EZWx0YX1DYCk7XG4gICAgfSBlbHNlIGlmIChjb2x1bW5EZWx0YSA8IDApIHtcbiAgICAgIHRoaXMudGVybWluYWxVaS53cml0ZShgXFx4MWJbJHstY29sdW1uRGVsdGF9RGApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDQkdGL0YHRgtGA0LDRjyDQtNC+0L/QuNGB0Ywg0LIg0LrQvtC90LXRhiDQutC+0LzQsNC90LTRiyDQsdC10Lcg0L/RgNGL0LbQutC+0LIg0LrRg9GA0YHQvtGA0LBcbiAgICovXG4gIHByaXZhdGUgdHJ5RmFzdEFwcGVuZChvbGRDb21tYW5kOiBzdHJpbmcsIG5ld0NvbW1hbmQ6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIG5ld0NvbW1hbmQubGVuZ3RoID49IG9sZENvbW1hbmQubGVuZ3RoICYmXG4gICAgICBuZXdDb21tYW5kLnN0YXJ0c1dpdGgob2xkQ29tbWFuZCkgJiZcbiAgICAgIHBvc2l0aW9uID09PSBuZXdDb21tYW5kLmxlbmd0aCAmJlxuICAgICAgdGhpcy5sYXN0UG9zaXRpb24gPT09IG9sZENvbW1hbmQubGVuZ3RoXG4gICAgKSB7XG4gICAgICBjb25zdCBhcHBlbmRlZDogc3RyaW5nID0gbmV3Q29tbWFuZC5zbGljZShvbGRDb21tYW5kLmxlbmd0aCk7XG4gICAgICBpZiAoYXBwZW5kZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoYXBwZW5kZWQuaW5kZXhPZignXFxuJykgPj0gMCkge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gYXBwZW5kZWQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rID0gcGFydHNbaV07XG4gICAgICAgICAgICBpZiAoY2h1bmspIHtcbiAgICAgICAgICAgICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKGNodW5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpIDwgcGFydHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAvLyDQn9C10YDQtdGF0L7QtCDQvdCwINC90L7QstGD0Y4g0YHRgtGA0L7QutGDINGBINCy0L7Qt9Cy0YDQsNGC0L7QvCDQutCw0YDQtdGC0LrQuFxuICAgICAgICAgICAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoJ1xcclxcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoYXBwZW5kZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RDb21tYW5kID0gbmV3Q29tbWFuZDtcbiAgICAgIHRoaXMubGFzdFBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqINCR0YvRgdGC0YDRi9C5INC/0YPRgtGMINCy0YHRgtCw0LLQutC4INCyINGB0LXRgNC10LTQuNC90LUg0YHRgtGA0L7QutC4OiDQv9C10YDQtdC/0LjRgdCw0YLRjCDQvtGB0YLQsNGC0L7QuiDRgdGC0YDQvtC60Lgg0Lgg0LLQtdGA0L3Rg9GC0Ywg0LrRg9GA0YHQvtGAXG4gICAqL1xuICBwcml2YXRlIHRyeU1pZGxpbmVJbnNlcnQob2xkQ29tbWFuZDogc3RyaW5nLCBuZXdDb21tYW5kOiBzdHJpbmcsIGZyb21Qb3NpdGlvbjogbnVtYmVyLCB0b1Bvc2l0aW9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAobmV3Q29tbWFuZC5sZW5ndGggPD0gb2xkQ29tbWFuZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8g0L3QtSDQstGB0YLQsNCy0LrQsFxuICAgIH1cblxuICAgIGNvbnN0IG9sZExpbmVzID0gb2xkQ29tbWFuZC5zcGxpdCgnXFxuJyk7XG4gICAgY29uc3QgbmV3TGluZXMgPSBuZXdDb21tYW5kLnNwbGl0KCdcXG4nKTtcblxuICAgIGNvbnN0IGZyb21JbmZvID0gdGhpcy5nZXRDdXJzb3JJbmZvKG9sZENvbW1hbmQsIGZyb21Qb3NpdGlvbik7XG4gICAgY29uc3QgdG9JbmZvID0gdGhpcy5nZXRDdXJzb3JJbmZvKG5ld0NvbW1hbmQsIHRvUG9zaXRpb24pO1xuXG4gICAgLy8g0JLRgdGC0LDQstC60LAg0YLQvtC70YzQutC+INCyINC/0YDQtdC00LXQu9Cw0YUg0L7QtNC90L7QuSDRgdGC0YDQvtC60LhcbiAgICBpZiAoZnJvbUluZm8ubGluZSAhPT0gdG9JbmZvLmxpbmUgfHwgdG9JbmZvLmNvbHVtbiA8IGZyb21JbmZvLmNvbHVtbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVJbmRleCA9IGZyb21JbmZvLmxpbmU7XG4gICAgY29uc3Qgb2xkTGluZTogc3RyaW5nID0gb2xkTGluZXNbbGluZUluZGV4XSA/PyAnJztcbiAgICBjb25zdCBuZXdMaW5lOiBzdHJpbmcgPSBuZXdMaW5lc1tsaW5lSW5kZXhdID8/ICcnO1xuXG4gICAgLy8g0J/RgNC+0LLQtdGA0Y/QtdC8LCDRh9GC0L4g0Y3RgtC+INC40LzQtdC90L3QviDQstGB0YLQsNCy0LrQsDog0L/RgNC10YTQuNC60YEg0YHQvtCy0L/QsNC00LDQtdGCINC00L4g0LzQtdGB0YLQsCDQstGB0YLQsNCy0LrQuCDQuCDRgdGD0YTRhNC40LrRgSDQv9C+0YHQu9C1INCy0YHRgtCw0LLQutC4INGB0L7QstC/0LDQtNCw0LXRgiDRgSDQv9GA0LXQttC90LjQvFxuICAgIGNvbnN0IG9sZFByZWZpeCA9IG9sZExpbmUuc2xpY2UoMCwgZnJvbUluZm8uY29sdW1uKTtcbiAgICBjb25zdCBvbGRTdWZmaXggPSBvbGRMaW5lLnNsaWNlKGZyb21JbmZvLmNvbHVtbik7XG4gICAgY29uc3QgbmV3UHJlZml4ID0gbmV3TGluZS5zbGljZSgwLCBmcm9tSW5mby5jb2x1bW4pO1xuICAgIGNvbnN0IG5ld1N1ZmZpeEZyb21DdXJzb3IgPSBuZXdMaW5lLnNsaWNlKHRvSW5mby5jb2x1bW4pO1xuXG4gICAgaWYgKG5ld1ByZWZpeCAhPT0gb2xkUHJlZml4IHx8IG5ld1N1ZmZpeEZyb21DdXJzb3IgIT09IG9sZFN1ZmZpeCkge1xuICAgICAgcmV0dXJuIGZhbHNlOyAvLyDQvdC1INGH0LjRgdGC0LDRjyDQstGB0YLQsNCy0LrQsFxuICAgIH1cblxuICAgIC8vINCf0LXRgNC10LnQtNGR0Lwg0Log0L/QvtC30LjRhtC40Lgg0LLRgdGC0LDQstC60Lgg0L7RgtC90L7RgdC40YLQtdC70YzQvdGL0Lwg0L/QtdGA0LXQvNC10YnQtdC90LjQtdC8ICjQvtCx0YvRh9C90L4g0LzRiyDRg9C20LUg0YLQsNC8KVxuICAgIHRoaXMubW92ZUN1cnNvclJlbGF0aXZlKG9sZENvbW1hbmQsIHRoaXMubGFzdFBvc2l0aW9uLCBmcm9tUG9zaXRpb24pO1xuXG4gICAgLy8g0J7Rh9C40YHRgtC60LAg0LTQviDQutC+0L3RhtCwINGB0YLRgNC+0LrQuCDQvtGCINC/0L7Qt9C40YbQuNC4INCy0YHRgtCw0LLQutC4INC4INC30LDQv9C40YHRjCDQvtGB0YLQsNGC0LrQsCDQvdC+0LLQvtC5INGB0YLRgNC+0LrQuCAo0LLQutC70Y7Rh9Cw0Y8g0LLRgdGC0LDQstC60YMpXG4gICAgY29uc3QgcmVzdFRvV3JpdGUgPSBuZXdMaW5lLnNsaWNlKGZyb21JbmZvLmNvbHVtbik7XG4gICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKCdcXHgxYltLJyk7XG4gICAgaWYgKHJlc3RUb1dyaXRlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGVybWluYWxVaS53cml0ZShyZXN0VG9Xcml0ZSk7XG4gICAgfVxuXG4gICAgLy8g0JLQtdGA0L3Rg9GC0Ywg0LrRg9GA0YHQvtGAINCyINGG0LXQu9C10LLRg9GOINC/0L7Qt9C40YbQuNGOINCy0L3Rg9GC0YDQuCDRgdGC0YDQvtC60LhcbiAgICBjb25zdCBtb3ZlTGVmdCA9IG5ld0xpbmUubGVuZ3RoIC0gdG9JbmZvLmNvbHVtbjtcbiAgICBpZiAobW92ZUxlZnQgPiAwKSB7XG4gICAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoYFxceDFiWyR7bW92ZUxlZnR9RGApO1xuICAgIH1cblxuICAgIC8vINCe0LHQvdC+0LLQu9GP0LXQvCDRgdC+0YHRgtC+0Y/QvdC40LVcbiAgICB0aGlzLmxhc3RDb21tYW5kID0gbmV3Q29tbWFuZDtcbiAgICB0aGlzLmxhc3RQb3NpdGlvbiA9IHRvUG9zaXRpb247XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICog0JHRi9GB0YLRgNGL0Lkg0L/Rg9GC0Ywg0YPQtNCw0LvQtdC90LjRjyDQsiDRgdC10YDQtdC00LjQvdC1INGB0YLRgNC+0LrQuDog0L/QtdGA0LXQv9C40YHQsNGC0Ywg0L7RgdGC0LDRgtC+0Log0YHRgtGA0L7QutC4INC4INCy0LXRgNC90YPRgtGMINC60YPRgNGB0L7RgFxuICAgKi9cbiAgcHJpdmF0ZSB0cnlNaWRsaW5lRGVsZXRlKG9sZENvbW1hbmQ6IHN0cmluZywgbmV3Q29tbWFuZDogc3RyaW5nLCBmcm9tUG9zaXRpb246IG51bWJlciwgdG9Qb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKG5ld0NvbW1hbmQubGVuZ3RoICE9PSBvbGRDb21tYW5kLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8g0L/QvtC00LTQtdGA0LbQuNCy0LDQtdC8INGC0L7Qu9GM0LrQviDQv9C+INC+0LTQvdC+0LzRgyDRgdC40LzQstC+0LvRgyDQtNC70Y8g0L/RgNC+0YHRgtC+0YLRiyDQuCDRgdGC0LDQsdC40LvRjNC90L7RgdGC0LhcbiAgICB9XG5cbiAgICBjb25zdCBvbGRMaW5lcyA9IG9sZENvbW1hbmQuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IG5ld0xpbmVzID0gbmV3Q29tbWFuZC5zcGxpdCgnXFxuJyk7XG5cbiAgICBjb25zdCBmcm9tSW5mbyA9IHRoaXMuZ2V0Q3Vyc29ySW5mbyhvbGRDb21tYW5kLCBmcm9tUG9zaXRpb24pO1xuICAgIGNvbnN0IHRvSW5mbyA9IHRoaXMuZ2V0Q3Vyc29ySW5mbyhuZXdDb21tYW5kLCB0b1Bvc2l0aW9uKTtcblxuICAgIC8vINCj0LTQsNC70LXQvdC40LUg0LTQvtC70LbQvdC+INC/0YDQvtC40YHRhdC+0LTQuNGC0Ywg0LIg0L7QtNC90L7QuSDRgdGC0YDQvtC60LUsINCY0JvQmCDRjdGC0L4g0YPQtNCw0LvQtdC90LjQtSBcXG4gKNC/0LXRgNC10YXQvtC0INC80LXQttC00YMg0YHRgtGA0L7QutCw0LzQuClcbiAgICBpZiAoZnJvbUluZm8ubGluZSAhPT0gdG9JbmZvLmxpbmUpIHtcbiAgICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCwg0L3QtSDRg9C00LDQu9GP0LXQvCDQu9C4INC80YsgXFxuXG4gICAgICBjb25zdCBkZWxldGVkQ2hhciA9IG9sZENvbW1hbmRbZnJvbVBvc2l0aW9uIC0gMV07XG4gICAgICBpZiAoZGVsZXRlZENoYXIgIT09ICdcXG4nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vINCt0YLQviDRg9C00LDQu9C10L3QuNC1IFxcbiAtINC+0LHRgNCw0LHQsNGC0YvQstCw0LXQvCDRgdC/0LXRhtC40LDQu9GM0L3QvlxuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlTmV3bGluZURlbGV0aW9uKG9sZENvbW1hbmQsIG5ld0NvbW1hbmQsIGZyb21Qb3NpdGlvbiwgdG9Qb3NpdGlvbik7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZUluZGV4ID0gZnJvbUluZm8ubGluZTtcbiAgICBjb25zdCBvbGRMaW5lOiBzdHJpbmcgPSBvbGRMaW5lc1tsaW5lSW5kZXhdID8/ICcnO1xuICAgIGNvbnN0IG5ld0xpbmU6IHN0cmluZyA9IG5ld0xpbmVzW2xpbmVJbmRleF0gPz8gJyc7XG5cbiAgICAvLyBiYWNrc3BhY2Ug0YPQtNCw0LvRj9C10YIg0YHQuNC80LLQvtC7INGB0LvQtdCy0LAg0L7RgiDQutGD0YDRgdC+0YDQsDog0L/QvtC30LjRhtC40Y8g0YPQvNC10L3RjNGI0LjQu9Cw0YHRjCDQvdCwIDFcbiAgICBpZiAodG9JbmZvLmNvbHVtbiAhPT0gZnJvbUluZm8uY29sdW1uIC0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vINCf0YDQvtCy0LXRgNC40Lwg0YHQvtC+0YLQstC10YLRgdGC0LLQuNC1INC/0YDQtdGE0LjQutGB0LAg0Lgg0YHRg9GE0YTQuNC60YHQsFxuICAgIGNvbnN0IGV4cGVjdGVkTmV3TGluZSA9IG9sZExpbmUuc2xpY2UoMCwgZnJvbUluZm8uY29sdW1uIC0gMSkgKyBvbGRMaW5lLnNsaWNlKGZyb21JbmZvLmNvbHVtbik7XG4gICAgaWYgKGV4cGVjdGVkTmV3TGluZSAhPT0gbmV3TGluZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vINCf0LXRgNC10LnRgtC4INCyINGB0YLQsNGA0YPRjiDQv9C+0LfQuNGG0LjRjiDQutGD0YDRgdC+0YDQsFxuICAgIHRoaXMubW92ZUN1cnNvclJlbGF0aXZlKG9sZENvbW1hbmQsIHRoaXMubGFzdFBvc2l0aW9uLCBmcm9tUG9zaXRpb24pO1xuXG4gICAgLy8g0KHQvNC10YHRgtC40YLRjNGB0Y8g0LLQu9C10LLQviDQvdCwINC+0LTQuNC9INGB0LjQvNCy0L7QuyAo0L/QvtC30LjRhtC40Y8g0YPQtNCw0LvQtdC90LjRjylcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoJ1xceDFiW0QnKTtcblxuICAgIC8vINCe0YfQuNGB0YLQuNGC0Ywg0LTQviDQutC+0L3RhtCwINGB0YLRgNC+0LrQuCDQuCDQt9Cw0L/QuNGB0LDRgtGMINC+0YHRgtCw0YLQvtC6INC90L7QstC+0Lkg0YHRgtGA0L7QutC4INGBINGC0LXQutGD0YnQtdC5INC/0L7Qt9C40YbQuNC4XG4gICAgY29uc3QgcmVzdFRvV3JpdGUgPSBuZXdMaW5lLnNsaWNlKHRvSW5mby5jb2x1bW4pO1xuICAgIHRoaXMudGVybWluYWxVaS53cml0ZSgnXFx4MWJbSycpO1xuICAgIGlmIChyZXN0VG9Xcml0ZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUocmVzdFRvV3JpdGUpO1xuICAgICAgLy8g0JLQtdGA0L3Rg9GC0Ywg0LrRg9GA0YHQvtGAINC90LDQt9Cw0LQg0L3QsCDQtNC70LjQvdGDINC30LDQv9C40YHQsNC90L3QvtCz0L4g0L7RgdGC0LDRgtC60LBcbiAgICAgIHRoaXMudGVybWluYWxVaS53cml0ZShgXFx4MWJbJHtyZXN0VG9Xcml0ZS5sZW5ndGh9RGApO1xuICAgIH1cblxuICAgIC8vINCe0LHQvdC+0LLQu9GP0LXQvCDRgdC+0YHRgtC+0Y/QvdC40LVcbiAgICB0aGlzLmxhc3RDb21tYW5kID0gbmV3Q29tbWFuZDtcbiAgICB0aGlzLmxhc3RQb3NpdGlvbiA9IHRvUG9zaXRpb247XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCINGD0LTQsNC70LXQvdC40LUg0YHQuNC80LLQvtC70LAgXFxuICjQvtCx0YrQtdC00LjQvdC10L3QuNC1INGB0YLRgNC+0LopXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZU5ld2xpbmVEZWxldGlvbihvbGRDb21tYW5kOiBzdHJpbmcsIG5ld0NvbW1hbmQ6IHN0cmluZywgZnJvbVBvc2l0aW9uOiBudW1iZXIsIHRvUG9zaXRpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnNvbGUubG9nKCdoYW5kbGVOZXdsaW5lRGVsZXRpb24gY2FsbGVkJyk7XG4gICAgXG4gICAgY29uc3QgZnJvbUluZm8gPSB0aGlzLmdldEN1cnNvckluZm8ob2xkQ29tbWFuZCwgZnJvbVBvc2l0aW9uKTtcbiAgICBjb25zdCB0b0luZm8gPSB0aGlzLmdldEN1cnNvckluZm8obmV3Q29tbWFuZCwgdG9Qb3NpdGlvbik7XG4gICAgXG4gICAgY29uc29sZS5sb2coYCAgZnJvbUluZm86IGxpbmU9JHtmcm9tSW5mby5saW5lfSwgY29sdW1uPSR7ZnJvbUluZm8uY29sdW1ufWApO1xuICAgIGNvbnNvbGUubG9nKGAgIHRvSW5mbzogbGluZT0ke3RvSW5mby5saW5lfSwgY29sdW1uPSR7dG9JbmZvLmNvbHVtbn1gKTtcbiAgICBcbiAgICAvLyDQn9C10YDQtdC50YLQuCDQsiDRgdGC0LDRgNGD0Y4g0L/QvtC30LjRhtC40Y4g0LrRg9GA0YHQvtGA0LBcbiAgICB0aGlzLm1vdmVDdXJzb3JSZWxhdGl2ZShvbGRDb21tYW5kLCB0aGlzLmxhc3RQb3NpdGlvbiwgZnJvbVBvc2l0aW9uKTtcbiAgICBcbiAgICAvLyDQodC80LXRgdGC0LjRgtGM0YHRjyDQstC70LXQstC+INC90LAg0L7QtNC40L0g0YHQuNC80LLQvtC7ICjQv9C+0LfQuNGG0LjRjyDRg9C00LDQu9C10L3QuNGPIFxcbilcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoJ1xceDFiW0QnKTtcbiAgICBcbiAgICAvLyDQntGH0LjRgdGC0LjRgtGMINC00L4g0LrQvtC90YbQsCDRgdGC0YDQvtC60LhcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoJ1xceDFiW0snKTtcbiAgICBcbiAgICAvLyDQl9Cw0L/QuNGB0LDRgtGMINGB0L7QtNC10YDQttC40LzQvtC1INGB0LvQtdC00YPRjtGJ0LXQuSDRgdGC0YDQvtC60LggKNC60L7RgtC+0YDQsNGPINGC0LXQv9C10YDRjCDQvtCx0YrQtdC00LjQvdC40LvQsNGB0Ywg0YEg0YLQtdC60YPRidC10LkpXG4gICAgY29uc3Qgb2xkTGluZXMgPSBvbGRDb21tYW5kLnNwbGl0KCdcXG4nKTtcbiAgICBjb25zdCBuZXdMaW5lcyA9IG5ld0NvbW1hbmQuc3BsaXQoJ1xcbicpO1xuICAgIFxuICAgIGlmIChmcm9tSW5mby5saW5lIDwgb2xkTGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgLy8g0JXRgdGC0Ywg0YHQu9C10LTRg9GO0YnQsNGPINGB0YLRgNC+0LrQsCwg0LrQvtGC0L7RgNGD0Y4g0L3Rg9C20L3QviDQvtCx0YrQtdC00LjQvdC40YLRjFxuICAgICAgY29uc3QgbmV4dExpbmVDb250ZW50ID0gb2xkTGluZXNbZnJvbUluZm8ubGluZSArIDFdIHx8ICcnO1xuICAgICAgY29uc29sZS5sb2coYCAgbmV4dExpbmVDb250ZW50OiBcIiR7bmV4dExpbmVDb250ZW50fVwiYCk7XG4gICAgICBpZiAobmV4dExpbmVDb250ZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKG5leHRMaW5lQ29udGVudCk7XG4gICAgICAgIC8vINCS0LXRgNC90YPRgtGMINC60YPRgNGB0L7RgCDQsiDQv9GA0LDQstC40LvRjNC90YPRjiDQv9C+0LfQuNGG0LjRjlxuICAgICAgICBjb25zdCBtb3ZlTGVmdCA9IG5leHRMaW5lQ29udGVudC5sZW5ndGggLSB0b0luZm8uY29sdW1uO1xuICAgICAgICBjb25zb2xlLmxvZyhgICBtb3ZlTGVmdDogJHttb3ZlTGVmdH1gKTtcbiAgICAgICAgaWYgKG1vdmVMZWZ0ID4gMCkge1xuICAgICAgICAgIHRoaXMudGVybWluYWxVaS53cml0ZShgXFx4MWJbJHttb3ZlTGVmdH1EYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g0J3QtdGCINGB0LvQtdC00YPRjtGJ0LXQuSDRgdGC0YDQvtC60LggLSDQv9GA0L7RgdGC0L4g0YPQtNCw0LvRj9C10LwgXFxuXG4gICAgICBjb25zb2xlLmxvZygnICBubyBuZXh0IGxpbmUsIGp1c3QgcmVtb3ZpbmcgXFxcXG4nKTtcbiAgICAgIC8vINCS0LDQttC90L46INC90YPQttC90L4g0L/QvtC00L3Rj9GC0YzRgdGPINC90LAg0YHRgtGA0L7QutGDINCy0YvRiNC1LCDQtdGB0LvQuCDQutGD0YDRgdC+0YAg0LHRi9C7INC90LAg0LLRgtC+0YDQvtC5INGB0YLRgNC+0LrQtVxuICAgICAgaWYgKGZyb21JbmZvLmxpbmUgPiB0b0luZm8ubGluZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICBtb3ZpbmcgdXAgZnJvbSBsaW5lICR7ZnJvbUluZm8ubGluZX0gdG8gbGluZSAke3RvSW5mby5saW5lfWApO1xuICAgICAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoYFxceDFiWyR7ZnJvbUluZm8ubGluZSAtIHRvSW5mby5saW5lfUFgKTtcbiAgICAgICAgLy8g0J/QtdGA0LXQvNC10YHRgtC40YLRjNGB0Y8g0LIg0L/RgNCw0LLQuNC70YzQvdGD0Y4g0LrQvtC70L7QvdC60YNcbiAgICAgICAgaWYgKHRvSW5mby5jb2x1bW4gPiAwKSB7XG4gICAgICAgICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKGBcXHgxYlske3RvSW5mby5jb2x1bW59Q2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vINCe0LHQvdC+0LLQu9GP0LXQvCDRgdC+0YHRgtC+0Y/QvdC40LVcbiAgICB0aGlzLmxhc3RDb21tYW5kID0gbmV3Q29tbWFuZDtcbiAgICB0aGlzLmxhc3RQb3NpdGlvbiA9IHRvUG9zaXRpb247XG4gICAgY29uc29sZS5sb2coYCAgZmluYWwgcG9zaXRpb246ICR7dG9Qb3NpdGlvbn1gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQl9Cw0L/QuNGB0YvQstCw0LXRgiDRgtC10LrRgdGCINCyINGC0LXRgNC80LjQvdCw0Lsg0LHQtdC3INC40LfQvNC10L3QtdC90LjRjyDQv9C+0LfQuNGG0LjQuCDQutGD0YDRgdC+0YDQsFxuICAgKiBAcGFyYW0gdGV4dCAtINGC0LXQutGB0YIg0LTQu9GPINC30LDQv9C40YHQuFxuICAgKi9cbiAgcHVibGljIHdyaXRlVGV4dCh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUodGV4dCk7XG4gIH1cblxuICAvKipcbiAgICog0JfQsNC/0LjRgdGL0LLQsNC10YIg0YLQtdC60YHRgiDRgSDQv9C10YDQtdC90L7RgdC+0Lwg0YHRgtGA0L7QutC4XG4gICAqIEBwYXJhbSB0ZXh0IC0g0YLQtdC60YHRgiDQtNC70Y8g0LfQsNC/0LjRgdC4XG4gICAqL1xuICBwdWJsaWMgd3JpdGVMaW5lKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudGVybWluYWxVaS53cml0ZSh0ZXh0ICsgJ1xcclxcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqINCe0YfQuNGJ0LDQtdGCINGC0LXQutGD0YnRg9GOINGB0YLRgNC+0LrRg1xuICAgKi9cbiAgcHVibGljIGNsZWFyQ3VycmVudExpbmUoKTogdm9pZCB7XG4gICAgLy8g0J/QtdGA0LXQvNC10YnQsNC10LzRgdGPINCyINC90LDRh9Cw0LvQviDRgdGC0YDQvtC60LhcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoJ1xccicpO1xuICAgIC8vINCe0YfQuNGJ0LDQtdC8INGB0YLRgNC+0LrRg1xuICAgIHRoaXMudGVybWluYWxVaS53cml0ZSgnXFx4MWJbMksnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQntGH0LjRidCw0LXRgiDQstGB0LUg0YHRgtGA0L7QutC4LCDQutC+0YLQvtGA0YvQtSDQt9Cw0L3QuNC80LDQtdGCINC60L7QvNCw0L3QtNCwXG4gICAqIEBwYXJhbSBjb21tYW5kIC0g0LrQvtC80LDQvdC00LAg0LTQu9GPINCw0L3QsNC70LjQt9CwXG4gICAqL1xuICBwcml2YXRlIGNsZWFyQ29tbWFuZExpbmVzKGNvbW1hbmQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vINCh0L7RhdGA0LDQvdC10L3QviDQtNC70Y8g0L7QsdGA0LDRgtC90L7QuSDRgdC+0LLQvNC10YHRgtC40LzQvtGB0YLQuCwg0L3QviDQvdC1INC40YHQv9C+0LvRjNC30YPQtdGC0YHRjyDQsiDQvdC+0LLQvtC5INC00LjRhNGELdC70L7Qs9C40LrQtVxuICAgIGNvbnN0IGxpbmVzID0gY29tbWFuZC5zcGxpdCgnXFxuJyk7XG4gICAgY29uc3QgbGluZUNvdW50ID0gbGluZXMubGVuZ3RoO1xuICAgIHRoaXMudGVybWluYWxVaS53cml0ZSgnXFxyJyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykge1xuICAgICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKCdcXHgxYlsySycpO1xuICAgICAgaWYgKGkgPCBsaW5lQ291bnQgLSAxKSB7XG4gICAgICAgIHRoaXMudGVybWluYWxVaS53cml0ZSgnXFx4MWJbQicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGluZUNvdW50ID4gMSkge1xuICAgICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKGBcXHgxYlske2xpbmVDb3VudCAtIDF9QWApO1xuICAgIH1cbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoJ1xccicpO1xuICB9XG5cbiAgLyoqXG4gICAqINCe0LHQvdC+0LLQu9GP0LXRgiDQvtCx0LvQsNGB0YLRjCDQutC+0LzQsNC90LTRiywg0L/QtdGA0LXRgNC40YHQvtCy0YvQstCw0Y8g0YLQvtC70YzQutC+INC40LfQvNC10L3QuNCy0YjQuNC10YHRjyDRgdGC0YDQvtC60LhcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29tbWFuZFJlZ2lvbihvbGRDb21tYW5kOiBzdHJpbmcsIG5ld0NvbW1hbmQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9sZExpbmVzID0gb2xkQ29tbWFuZC5zcGxpdCgnXFxuJyk7XG4gICAgY29uc3QgbmV3TGluZXMgPSBuZXdDb21tYW5kLnNwbGl0KCdcXG4nKTtcbiAgICBjb25zdCBtYXhMaW5lcyA9IE1hdGgubWF4KG9sZExpbmVzLmxlbmd0aCwgbmV3TGluZXMubGVuZ3RoKTtcblxuICAgIC8vINCf0L7QtNC90LjQvNCw0LXQvNGB0Y8g0Log0L3QsNGH0LDQu9GDINGA0LXQs9C40L7QvdCwINGB0YLQsNGA0L7QuSDQutC+0LzQsNC90LTRiyDQvtGC0L3QvtGB0LjRgtC10LvRjNC90L4g0L/RgNC10LTRi9C00YPRidC10Lkg0L/QvtC30LjRhtC40Lgg0LrRg9GA0YHQvtGA0LBcbiAgICBjb25zdCBwcmV2SW5mbyA9IHRoaXMuZ2V0Q3Vyc29ySW5mbyhvbGRDb21tYW5kLCB0aGlzLmxhc3RQb3NpdGlvbik7XG4gICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKCdcXHInKTtcbiAgICBpZiAocHJldkluZm8ubGluZSA+IDApIHtcbiAgICAgIHRoaXMudGVybWluYWxVaS53cml0ZShgXFx4MWJbJHtwcmV2SW5mby5saW5lfUFgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heExpbmVzOyBpKyspIHtcbiAgICAgIGNvbnN0IG9sZExpbmU6IHN0cmluZyA9IGkgPCBvbGRMaW5lcy5sZW5ndGggPyAob2xkTGluZXNbaV0gPz8gJycpIDogJyc7XG4gICAgICBjb25zdCBuZXdMaW5lOiBzdHJpbmcgPSBpIDwgbmV3TGluZXMubGVuZ3RoID8gKG5ld0xpbmVzW2ldID8/ICcnKSA6ICcnO1xuXG4gICAgICAvLyDQktGB0LXQs9C00LAg0L3QsNGH0LjQvdCw0LXQvCDRgdC+INGB0YLQsNGA0YLQsCDRgdGC0YDQvtC60LhcbiAgICAgIHRoaXMudGVybWluYWxVaS53cml0ZSgnXFxyJyk7XG5cbiAgICAgIGlmIChvbGRMaW5lICE9PSBuZXdMaW5lKSB7XG4gICAgICAgIC8vINCe0YfQuNGJ0LDQtdC8INGC0LXQutGD0YnRg9GOINGB0YLRgNC+0LrRgyDQuCDQt9Cw0L/QuNGB0YvQstCw0LXQvCDQvdC+0LLRg9GOINCy0LXRgNGB0LjRjiDRgdGC0YDQvtC60LhcbiAgICAgICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKCdcXHgxYlsySycpO1xuICAgICAgICBpZiAobmV3TGluZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKG5ld0xpbmUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vINCf0LXRgNC10YXQvtC00LjQvCDQvdCwINGB0LvQtdC00YPRjtGJ0YPRjiDRgdGC0YDQvtC60YMsINC10YHQu9C4INC+0L3QsCDQtdGB0YLRjFxuICAgICAgaWYgKGkgPCBtYXhMaW5lcyAtIDEpIHtcbiAgICAgICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKCdcXHInKTtcbiAgICAgICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKCdcXHgxYltCJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g0J/QviDQvtC60L7QvdGH0LDQvdC40Lgg0L7RgdGC0LDQstC40YLRjCDQutGD0YDRgdC+0YAg0LLQvdC40LfRgyDQndCe0JLQntCZINC+0LHQu9Cw0YHRgtC4XG4gICAgLy8g0KHQtdC50YfQsNGBINC80Ysg0L3QsCDQvdC40LbQvdC10Lkg0YHRgtGA0L7QutC1IG1heExpbmVzLiDQldGB0LvQuCDRgdGC0LDRgNGL0YUg0YHRgtGA0L7QuiDQsdC+0LvRjNGI0LUg0L3QvtCy0YvRhSDigJQg0L/QvtC00L3QuNC80LXQvNGB0Y8g0L3QsCDRgNCw0LfQvdC40YbRg1xuICAgIGlmIChvbGRMaW5lcy5sZW5ndGggPiBuZXdMaW5lcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudGVybWluYWxVaS53cml0ZShgXFx4MWJbJHtvbGRMaW5lcy5sZW5ndGggLSBuZXdMaW5lcy5sZW5ndGh9QWApO1xuICAgIH1cbiAgICBcbiAgICAvLyDQktCw0LbQvdC+OiDQv9C+0YHQu9C1INC+0LHQvdC+0LLQu9C10L3QuNGPINC+0LHQu9Cw0YHRgtC4INC60YPRgNGB0L7RgCDQvNC+0LbQtdGCINCx0YvRgtGMINCyINC90LXQv9GA0LDQstC40LvRjNC90L7QuSDQv9C+0LfQuNGG0LjQuFxuICAgIC8vINCf0L7RjdGC0L7QvNGDINC80Ysg0LLRgdC10LPQtNCwINCx0YPQtNC10Lwg0YPRgdGC0LDQvdCw0LLQu9C40LLQsNGC0Ywg0LXQs9C+INCyINC/0YDQsNCy0LjQu9GM0L3Rg9GOINC/0L7Qt9C40YbQuNGOINC/0L7RgdC70LUgdXBkYXRlQ29tbWFuZFJlZ2lvblxuICB9XG5cbiAgLyoqXG4gICAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC/0L7Qt9C40YbQuNGOINC60YPRgNGB0L7RgNCwINCyINC60L7QvNCw0L3QtNC1INGBINGD0YfQtdGC0L7QvCDQvNC90L7Qs9C+0YHRgtGA0L7Rh9C90L7RgdGC0LhcbiAgICogQHBhcmFtIGNvbW1hbmQgLSDQutC+0LzQsNC90LTQsFxuICAgKiBAcGFyYW0gcG9zaXRpb24gLSDQv9C+0LfQuNGG0LjRjyDQutGD0YDRgdC+0YDQsCDQsiDQutC+0LzQsNC90LTQtVxuICAgKi9cbiAgcHJpdmF0ZSBzZXRDdXJzb3JQb3NpdGlvbkluQ29tbWFuZChjb21tYW5kOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBsaW5lcyA9IGNvbW1hbmQuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IHRvdGFsTGVuZ3RoID0gY29tbWFuZC5sZW5ndGg7XG4gICAgbGV0IGN1cnJlbnRQb3NpdGlvbiA9IDA7XG4gICAgbGV0IHRhcmdldExpbmUgPSAwO1xuICAgIGxldCB0YXJnZXRDb2x1bW4gPSAwO1xuXG4gICAgLy8g0JrQvtGA0YDQtdC60YLQuNGA0YPQtdC8INC/0L7Qt9C40YbQuNGOINCyINC00L7Qv9GD0YHRgtC40LzRi9C1INC/0YDQtdC00LXQu9GLXG4gICAgY29uc3Qgc2FmZVBvc2l0aW9uID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocG9zaXRpb24sIHRvdGFsTGVuZ3RoKSk7XG4gICAgXG4gICAgY29uc29sZS5sb2coYHNldEN1cnNvclBvc2l0aW9uSW5Db21tYW5kOiBjb21tYW5kPVwiJHtjb21tYW5kfVwiLCBwb3NpdGlvbj0ke3Bvc2l0aW9ufSwgc2FmZVBvc2l0aW9uPSR7c2FmZVBvc2l0aW9ufSwgbGluZXM9JHtsaW5lcy5sZW5ndGh9YCk7XG5cbiAgICAvLyDQndCw0YXQvtC00LjQvCDRgdGC0YDQvtC60YMg0Lgg0LrQvtC70L7QvdC60YMg0LTQu9GPINC30LDQtNCw0L3QvdC+0Lkg0L/QvtC30LjRhtC40LggKNGD0YfQuNGC0YvQstCw0LXQvCDQv9GD0YHRgtGL0LUg0YHRgtGA0L7QutC4KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpbmU6IHN0cmluZyA9IGxpbmVzW2ldID8/ICcnO1xuICAgICAgY29uc3QgbGluZUxlbmd0aCA9IGxpbmUubGVuZ3RoO1xuICAgICAgaWYgKHNhZmVQb3NpdGlvbiA8PSBjdXJyZW50UG9zaXRpb24gKyBsaW5lTGVuZ3RoKSB7XG4gICAgICAgIHRhcmdldExpbmUgPSBpO1xuICAgICAgICB0YXJnZXRDb2x1bW4gPSBzYWZlUG9zaXRpb24gLSBjdXJyZW50UG9zaXRpb247XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY3VycmVudFBvc2l0aW9uICs9IGxpbmVMZW5ndGggKyAxOyAvLyArMSDQtNC70Y8g0YHQuNC80LLQvtC70LAgXFxuXG4gICAgfVxuXG4gICAgLy8g0JXRgdC70Lgg0L/QvtC30LjRhtC40Y8g0LIg0YHQsNC80L7QvCDQutC+0L3RhtC1LCDQutGD0YDRgdC+0YAg0LIg0LrQvtC90LXRhiDQv9C+0YHQu9C10LTQvdC10Lkg0YHRgtGA0L7QutC4XG4gICAgaWYgKHNhZmVQb3NpdGlvbiA9PT0gdG90YWxMZW5ndGggJiYgdG90YWxMZW5ndGggPiAwKSB7XG4gICAgICB0YXJnZXRMaW5lID0gbGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHRhcmdldENvbHVtbiA9IGxpbmVzW3RhcmdldExpbmVdPy5sZW5ndGggPz8gMDtcbiAgICB9XG5cbiAgICAvLyDQn9C10YDQtdC80LXRidCw0LXQvNGB0Y8g0Log0L3QsNGH0LDQu9GDINC/0LXRgNCy0L7QuSDRgdGC0YDQvtC60Lgg0LrQvtC80LDQvdC00YtcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoJ1xccicpO1xuICAgIGlmIChsaW5lcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoYFxceDFiWyR7bGluZXMubGVuZ3RoIC0gMX1BYCk7XG4gICAgfVxuXG4gICAgLy8g0KHQv9GD0YHQutCw0LXQvNGB0Y8g0L3QsCDRhtC10LvQtdCy0YPRjiDRgdGC0YDQvtC60YNcbiAgICBpZiAodGFyZ2V0TGluZSA+IDApIHtcbiAgICAgIHRoaXMudGVybWluYWxVaS53cml0ZShgXFx4MWJbJHt0YXJnZXRMaW5lfUJgKTtcbiAgICB9XG5cbiAgICAvLyDQn9C10YDQtdGF0L7QtNC40Lwg0Log0YbQtdC70LXQstC+0Lkg0LrQvtC70L7QvdC60LVcbiAgICBpZiAodGFyZ2V0Q29sdW1uID4gMCkge1xuICAgICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKGBcXHgxYlske3RhcmdldENvbHVtbn1DYCk7XG4gICAgfVxuICAgIFxuICAgIGNvbnNvbGUubG9nKGBzZXRDdXJzb3JQb3NpdGlvbkluQ29tbWFuZCByZXN1bHQ6IHRhcmdldExpbmU9JHt0YXJnZXRMaW5lfSwgdGFyZ2V0Q29sdW1uPSR7dGFyZ2V0Q29sdW1ufWApO1xuICB9XG5cbiAgLyoqXG4gICAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC/0L7Qt9C40YbQuNGOINC60YPRgNGB0L7RgNCwINCyINC60L7QvNCw0L3QtNC1ICjRg9C/0YDQvtGJ0LXQvdC90LDRjyDQstC10YDRgdC40Y8g0LTQu9GPINC+0LHRgNCw0YLQvdC+0Lkg0YHQvtCy0LzQtdGB0YLQuNC80L7RgdGC0LgpXG4gICAqIEBwYXJhbSBwb3NpdGlvbiAtINC/0L7Qt9C40YbQuNGPINC60YPRgNGB0L7RgNCwXG4gICAqL1xuICBwdWJsaWMgc2V0Q3Vyc29yUG9zaXRpb24ocG9zaXRpb246IG51bWJlcik6IHZvaWQge1xuICAgIC8vINCf0LXRgNC10LzQtdGJ0LDQtdC80YHRjyDQsiDQvdCw0YfQsNC70L4g0YHRgtGA0L7QutC4XG4gICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKCdcXHInKTtcbiAgICAvLyDQn9C10YDQtdC80LXRidCw0LXQvNGB0Y8g0L3QsCDQvdGD0LbQvdGD0Y4g0L/QvtC30LjRhtC40Y5cbiAgICBpZiAocG9zaXRpb24gPiAwKSB7XG4gICAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoYFxceDFiWyR7cG9zaXRpb259Q2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDQn9C10YDQtdC80LXRidCw0LXRgiDQutGD0YDRgdC+0YAg0LLQu9C10LLQvlxuICAgKi9cbiAgcHVibGljIG1vdmVDdXJzb3JMZWZ0KCk6IHZvaWQge1xuICAgIHRoaXMudGVybWluYWxVaS53cml0ZSgnXFx4MWJbRCcpO1xuICB9XG5cbiAgLyoqXG4gICAqINCf0LXRgNC10LzQtdGJ0LDQtdGCINC60YPRgNGB0L7RgCDQstC/0YDQsNCy0L5cbiAgICovXG4gIHB1YmxpYyBtb3ZlQ3Vyc29yUmlnaHQoKTogdm9pZCB7XG4gICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKCdcXHgxYltDJyk7XG4gIH1cblxuICAvKipcbiAgICog0J/QtdGA0LXQvNC10YnQsNC10YIg0LrRg9GA0YHQvtGAINCyINC90LDRh9Cw0LvQviDRgdGC0YDQvtC60LhcbiAgICovXG4gIHB1YmxpYyBtb3ZlQ3Vyc29yVG9TdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoJ1xccicpO1xuICB9XG5cbiAgLyoqXG4gICAqINCf0LXRgNC10LzQtdGJ0LDQtdGCINC60YPRgNGB0L7RgCDQsiDQutC+0L3QtdGGINC60L7QvNCw0L3QtNGLICjRgSDRg9GH0LXRgtC+0Lwg0LzQvdC+0LPQvtGB0YLRgNC+0YfQvdC+0YHRgtC4KVxuICAgKiBAcGFyYW0gY29tbWFuZCAtINC60L7QvNCw0L3QtNCwXG4gICAqL1xuICBwdWJsaWMgbW92ZUN1cnNvclRvRW5kT2ZDb21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2V0Q3Vyc29yUG9zaXRpb25JbkNvbW1hbmQoY29tbWFuZCwgY29tbWFuZC5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqINCf0LXRgNC10LzQtdGJ0LDQtdGCINC60YPRgNGB0L7RgCDQsiDQutC+0L3QtdGGINGB0YLRgNC+0LrQuCAo0YPQv9GA0L7RidC10L3QvdCw0Y8g0LLQtdGA0YHQuNGPKVxuICAgKiBAcGFyYW0gY29tbWFuZExlbmd0aCAtINC00LvQuNC90LAg0LrQvtC80LDQvdC00YtcbiAgICovXG4gIHB1YmxpYyBtb3ZlQ3Vyc29yVG9FbmQoY29tbWFuZExlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50ZXJtaW5hbFVpLndyaXRlKCdcXHInKTtcbiAgICBpZiAoY29tbWFuZExlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGVybWluYWxVaS53cml0ZShgXFx4MWJbJHtjb21tYW5kTGVuZ3RofUNgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog0J7Rh9C40YnQsNC10YIg0LLQtdGB0Ywg0Y3QutGA0LDQvVxuICAgKi9cbiAgcHVibGljIGNsZWFyU2NyZWVuKCk6IHZvaWQge1xuICAgIHRoaXMudGVybWluYWxVaS53cml0ZSgnXFx4MWJbMkonKTtcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoJ1xceDFiW0gnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiDRgdC+0YHRgtC+0Y/QvdC40LUg0LrQvtC80LDQvdC00Ysg0LIg0YLQtdGA0LzQuNC90LDQu9C1XG4gICAqIEBwYXJhbSBzdGF0ZSAtINGB0L7RgdGC0L7Rj9C90LjQtSDQutC+0LzQsNC90LTRi1xuICAgKi9cbiAgcHVibGljIHNldENvbW1hbmRTdGF0ZShzdGF0ZTogQ29tbWFuZFN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy53cml0ZShzdGF0ZS5jb21tYW5kLCBzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICAvKipcbiAgICog0J/QvtC70YPRh9Cw0LXRgiDRgtC10LrRg9GJ0YPRjiDQv9C+0LfQuNGG0LjRjiDQutGD0YDRgdC+0YDQsFxuICAgKi9cbiAgcHVibGljIGdldEN1cnJlbnRDdXJzb3JQb3NpdGlvbigpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICB4OiB0aGlzLnRlcm1pbmFsVWkuYnVmZmVyLmFjdGl2ZS5jdXJzb3JYLFxuICAgICAgeTogdGhpcy50ZXJtaW5hbFVpLmJ1ZmZlci5hY3RpdmUuY3Vyc29yWVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog0JfQsNC/0LjRgdGL0LLQsNC10YIg0L/RgNC40LPQu9Cw0YjQtdC90LjQtSDQutC+0LzQsNC90LTQvdC+0Lkg0YHRgtGA0L7QutC4XG4gICAqIEBwYXJhbSBwcm9tcHQgLSDRgtC10LrRgdGCINC/0YDQuNCz0LvQsNGI0LXQvdC40Y8gKNC90LDQv9GA0LjQvNC10YAsIFwiJCBcIilcbiAgICovXG4gIHB1YmxpYyB3cml0ZVByb21wdChwcm9tcHQ6IHN0cmluZyA9ICckICcpOiB2b2lkIHtcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUocHJvbXB0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQl9Cw0L/QuNGB0YvQstCw0LXRgiDQvtGI0LjQsdC60YMg0LIg0YLQtdGA0LzQuNC90LDQu1xuICAgKiBAcGFyYW0gZXJyb3IgLSDRgtC10LrRgdGCINC+0YjQuNCx0LrQuFxuICAgKi9cbiAgcHVibGljIHdyaXRlRXJyb3IoZXJyb3I6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudGVybWluYWxVaS53cml0ZShgXFx4MWJbMzFtJHtlcnJvcn1cXHgxYlswbWApO1xuICB9XG5cbiAgLyoqXG4gICAqINCX0LDQv9C40YHRi9Cy0LDQtdGCINC/0YDQtdC00YPQv9GA0LXQttC00LXQvdC40LUg0LIg0YLQtdGA0LzQuNC90LDQu1xuICAgKiBAcGFyYW0gd2FybmluZyAtINGC0LXQutGB0YIg0L/RgNC10LTRg9C/0YDQtdC20LTQtdC90LjRj1xuICAgKi9cbiAgcHVibGljIHdyaXRlV2FybmluZyh3YXJuaW5nOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoYFxceDFiWzMzbSR7d2FybmluZ31cXHgxYlswbWApO1xuICB9XG5cbiAgLyoqXG4gICAqINCX0LDQv9C40YHRi9Cy0LDQtdGCINGD0YHQv9C10YjQvdC+0LUg0YHQvtC+0LHRidC10L3QuNC1INCyINGC0LXRgNC80LjQvdCw0LtcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSDRgtC10LrRgdGCINGB0L7QvtCx0YnQtdC90LjRj1xuICAgKi9cbiAgcHVibGljIHdyaXRlU3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoYFxceDFiWzMybSR7bWVzc2FnZX1cXHgxYlswbWApO1xuICB9XG5cbiAgLyoqXG4gICAqINCX0LDQv9C40YHRi9Cy0LDQtdGCINC40L3RhNC+0YDQvNCw0YbQuNC+0L3QvdC+0LUg0YHQvtC+0LHRidC10L3QuNC1INCyINGC0LXRgNC80LjQvdCw0LtcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSDRgtC10LrRgdGCINGB0L7QvtCx0YnQtdC90LjRj1xuICAgKi9cbiAgcHVibGljIHdyaXRlSW5mbyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoYFxceDFiWzM0bSR7bWVzc2FnZX1cXHgxYlswbWApO1xuICB9XG5cbiAgLyoqXG4gICAqINCS0YvQv9C+0LvQvdGP0LXRgiDQvtGC0LrQsNGCIChiYWNrc3BhY2UpIC0g0YPQtNCw0LvRj9C10YIg0YHQuNC80LLQvtC7INC/0LXRgNC10LQg0LrRg9GA0YHQvtGA0L7QvFxuICAgKi9cbiAgcHVibGljIGJhY2tzcGFjZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRlcm1pbmFsVWkud3JpdGUoJ1xcYiBcXGInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQn9C+0LvRg9GH0LDQtdGCINC40L3RhNC+0YDQvNCw0YbQuNGOINC+INC/0L7Qt9C40YbQuNC4INC60YPRgNGB0L7RgNCwINCyINC80L3QvtCz0L7RgdGC0YDQvtGH0L3QvtC5INC60L7QvNCw0L3QtNC1XG4gICAqIEBwYXJhbSBjb21tYW5kIC0g0LrQvtC80LDQvdC00LBcbiAgICogQHBhcmFtIHBvc2l0aW9uIC0g0L/QvtC30LjRhtC40Y8g0LIg0LrQvtC80LDQvdC00LVcbiAgICogQHJldHVybnMg0L7QsdGK0LXQutGCINGBINC40L3RhNC+0YDQvNCw0YbQuNC10Lkg0L4g0YHRgtGA0L7QutC1INC4INC60L7Qu9C+0L3QutC1XG4gICAqL1xuICBwdWJsaWMgZ2V0Q3Vyc29ySW5mbyhjb21tYW5kOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOiB7IGxpbmU6IG51bWJlcjsgY29sdW1uOiBudW1iZXI7IGxpbmVUZXh0OiBzdHJpbmcgfSB7XG4gICAgY29uc3QgbGluZXMgPSBjb21tYW5kLnNwbGl0KCdcXG4nKTtcbiAgICBjb25zdCB0b3RhbExlbmd0aCA9IGNvbW1hbmQubGVuZ3RoO1xuICAgIGxldCBjdXJyZW50UG9zaXRpb24gPSAwO1xuICAgIGxldCB0YXJnZXRMaW5lID0gMDtcbiAgICBsZXQgdGFyZ2V0Q29sdW1uID0gMDtcblxuICAgIGNvbnN0IHNhZmVQb3NpdGlvbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBvc2l0aW9uLCB0b3RhbExlbmd0aCkpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGluZTogc3RyaW5nID0gbGluZXNbaV0gPz8gJyc7XG4gICAgICBjb25zdCBsaW5lTGVuZ3RoID0gbGluZS5sZW5ndGg7XG4gICAgICBpZiAoc2FmZVBvc2l0aW9uIDw9IGN1cnJlbnRQb3NpdGlvbiArIGxpbmVMZW5ndGgpIHtcbiAgICAgICAgdGFyZ2V0TGluZSA9IGk7XG4gICAgICAgIHRhcmdldENvbHVtbiA9IHNhZmVQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjdXJyZW50UG9zaXRpb24gKz0gbGluZUxlbmd0aCArIDE7IC8vICsxINC00LvRjyDRgdC40LzQstC+0LvQsCBcXG5cbiAgICB9XG5cbiAgICBpZiAoc2FmZVBvc2l0aW9uID09PSB0b3RhbExlbmd0aCkge1xuICAgICAgdGFyZ2V0TGluZSA9IGxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB0YXJnZXRDb2x1bW4gPSBsaW5lc1t0YXJnZXRMaW5lXT8ubGVuZ3RoID8/IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IHRhcmdldExpbmUsXG4gICAgICBjb2x1bW46IHRhcmdldENvbHVtbixcbiAgICAgIGxpbmVUZXh0OiBsaW5lc1t0YXJnZXRMaW5lXSB8fCAnJ1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog0J/QvtC70YPRh9Cw0LXRgiDQutC+0LvQuNGH0LXRgdGC0LLQviDRgdGC0YDQvtC6INCyINC60L7QvNCw0L3QtNC1XG4gICAqIEBwYXJhbSBjb21tYW5kIC0g0LrQvtC80LDQvdC00LBcbiAgICogQHJldHVybnMg0LrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0L7QulxuICAgKi9cbiAgcHVibGljIGdldENvbW1hbmRMaW5lQ291bnQoY29tbWFuZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29tbWFuZC5zcGxpdCgnXFxuJykubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqINCf0L7Qu9GD0YfQsNC10YIg0LTQu9C40L3RgyDQv9C+0YHQu9C10LTQvdC10Lkg0YHRgtGA0L7QutC4INC60L7QvNCw0L3QtNGLXG4gICAqIEBwYXJhbSBjb21tYW5kIC0g0LrQvtC80LDQvdC00LBcbiAgICogQHJldHVybnMg0LTQu9C40L3QsCDQv9C+0YHQu9C10LTQvdC10Lkg0YHRgtGA0L7QutC4XG4gICAqL1xuICBwdWJsaWMgZ2V0TGFzdExpbmVMZW5ndGgoY29tbWFuZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBsaW5lcyA9IGNvbW1hbmQuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IGxhc3RMaW5lID0gbGluZXNbbGluZXMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIGxhc3RMaW5lID8gbGFzdExpbmUubGVuZ3RoIDogMDtcbiAgfVxuXG4gIC8qKlxuICAgKiDQo9C90LjRh9GC0L7QttCw0LXRgiB3cml0ZXIg0Lgg0L7Rh9C40YnQsNC10YIg0YDQtdGB0YPRgNGB0YtcbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgIC8vINCe0YfQuNGJ0LDQtdC8INGB0YHRi9C70LrRgyDQvdCwINGC0LXRgNC80LjQvdCw0LtcbiAgICB0aGlzLnRlcm1pbmFsVWkgPSBudWxsIGFzIGFueTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgRml0QWRkb24gfSBmcm9tICdAeHRlcm0vYWRkb24tZml0JztcbmltcG9ydCB7IFdlYkxpbmtzQWRkb24gfSBmcm9tICdAeHRlcm0vYWRkb24td2ViLWxpbmtzJztcbmltcG9ydCB7IFRlcm1pbmFsTWFuYWdlciB9IGZyb20gJy4vdGVybWluYWwtbWFuYWdlcic7XG5pbXBvcnQgeyBUZXJtaW5hbFVpV3JpdGVyIH0gZnJvbSAnLi90ZXJtaW5hbC11aS13cml0ZXInO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiwgSUNvbm5lY3Rpb24gfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IHsgTmV3Q2xpZW50RGF0YSwgRGVsZXRlQ2xpZW50RGF0YSwgQ2xvc2VTZXNzaW9uRGF0YSwgQ2xpZW50U3RhdHVzRGF0YSwgQ3Vyc29yU3RhdGVEYXRhLCBIb3RLZXlEYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vINCi0LjQv9GLINC00LvRjyBBUEkg0L7RgtCy0LXRgtC+0LJcbmludGVyZmFjZSBBcGlSZXNwb25zZSB7XG4gIGNsaWVudHM6IFNlcnZlckNsaWVudERhdGFbXTtcbn1cblxuLy8gQ2FsbGJhY2tzINC00LvRjyDQvtCx0L3QvtCy0LvQtdC90LjRjyBVSVxuaW50ZXJmYWNlIFRlcm1pbmFsVGFiTWFuYWdlckNhbGxiYWNrcyB7XG4gIG9uTmV3Q2xpZW50PzogKGNsaWVudDogQ2xpZW50RGF0YSkgPT4gdm9pZDtcbiAgb25DbGllbnRSZW1vdmVkPzogKGNsaWVudElkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uTmV3U2Vzc2lvbj86IChjbGllbnRJZDogc3RyaW5nLCBzZXNzaW9uOiBTZXNzaW9uRGF0YSkgPT4gdm9pZDtcbiAgb25TZXNzaW9uUmVtb3ZlZD86IChjbGllbnRJZDogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgb25DbGllbnRTdGF0dXNDaGFuZ2VkPzogKGNsaWVudElkOiBzdHJpbmcsIHN0YXR1czogJ3dhaXRpbmcnIHwgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJykgPT4gdm9pZDsgLy8gdG9kbyBjYWxsZXJcbiAgb25TZXNzaW9uU3RhdHVzQ2hhbmdlZD86IChjbGllbnRJZDogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZywgc3RhdHVzOiAnd2FpdGluZycgfCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnKSA9PiB2b2lkO1xuICBvbkFjdGl2ZUNsaWVudENoYW5nZWQ/OiAoY2xpZW50OiBDbGllbnREYXRhIHwgbnVsbCkgPT4gdm9pZDtcbiAgb25BY3RpdmVTZXNzaW9uQ2hhbmdlZD86IChzZXNzaW9uOiBTZXNzaW9uRGF0YSB8IG51bGwpID0+IHZvaWQ7XG4gIG9uQ3Vyc29yU3RhdGU/OiAoc2Vzc2lvbklkOiBzdHJpbmcsIGNvbW1hbmQ6IHN0cmluZywgcG9zaXRpb246IG51bWJlcikgPT4gdm9pZDtcbiAgb25SZW1vdmVUZXJtaW5hbERPTT86IChzZXNzaW9uSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgb25Ib3RLZXk/OiAoZGF0YTogSG90S2V5RGF0YSkgPT4gdm9pZDtcbn1cbmludGVyZmFjZSBTZXNzaW9uQ29yZURhdGF7XG4gIHNlc3Npb25JZDogc3RyaW5nIDtcbiAgbmFtZTogc3RyaW5nO1xuICBjbGllbnRJZDogc3RyaW5nO1xuICBzdGF0dXM6ICd3YWl0aW5nJyB8ICdjb25uZWN0ZWQnIHwgJ2Rpc2Nvbm5lY3RlZCc7XG4gIGlzQWN0aXZlOiBib29sZWFuO1xuICBzZW50S2V5c0luZGV4OiBudW1iZXI7XG59XG4vLyDQotC40L/RiyDQtNC70Y8g0YHQtdGB0YHQuNC5XG5pbnRlcmZhY2UgU2Vzc2lvbkRhdGEge1xuICBkYXRhOlNlc3Npb25Db3JlRGF0YVxuICB0ZXJtaW5hbFVpOiBUZXJtaW5hbCB8IG51bGw7XG4gIHRlcm1pbmFsVWlXcml0ZXI6IFRlcm1pbmFsVWlXcml0ZXIgfCBudWxsO1xuICB0ZXJtaW5hbE1hbmFnZXI6IFRlcm1pbmFsTWFuYWdlciB8IG51bGw7XG4gIHRlcm1pbmFsRGl2OiBIVE1MRGl2RWxlbWVudCB8IG51bGw7XG4gIGZpdEFkZG9uOiBGaXRBZGRvbiB8IG51bGw7XG4gIGxpbmtBZGRvbjogV2ViTGlua3NBZGRvbiB8IG51bGw7XG4gXG59XG4vLyDQotC40L/RiyDQtNC70Y8g0LrQu9C40LXQvdGC0L7QslxuaW50ZXJmYWNlIENsaWVudERhdGEge1xuICBjbGllbnRJZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgY2xpZW50VHlwZTogc3RyaW5nO1xuICBzZXNzaW9uczogU2Vzc2lvbkRhdGFbXTtcbiAgaXNFeHBhbmRlZDogYm9vbGVhbjtcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIHN0YXR1czogJ3dhaXRpbmcnIHwgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJztcbn1cblxuaW50ZXJmYWNlIFNlcnZlclNlc3Npb25EYXRhIHtcbiAgaWQ6IHN0cmluZyA7XG4gIG5hbWU6IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgc3RhdHVzOiAnd2FpdGluZycgfCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnO1xufVxuXG5pbnRlcmZhY2UgU2VydmVyQ2xpZW50RGF0YSB7XG4gIGNsaWVudElkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBjbGllbnRUeXBlOiBzdHJpbmc7XG4gIHNlc3Npb25zOiBTZXJ2ZXJTZXNzaW9uRGF0YVtdO1xufVxuXG5cbi8vINCa0LvQsNGB0YEg0LTQu9GPINGD0L/RgNCw0LLQu9C10L3QuNGPINGC0LXRgNC80LjQvdCw0LvQsNC80Lgg0Lgg0YLQsNCx0LDQvNC4XG5jbGFzcyBUZXJtaW5hbFRhYk1hbmFnZXIge1xuICBwcml2YXRlIGNsaWVudHM6IENsaWVudERhdGFbXSA9IFtdO1xuICBwcml2YXRlIGFjdGl2ZVRhYkluZGV4OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHRhYkNvdW50ZXI6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgY2FsbGJhY2tzOiBUZXJtaW5hbFRhYk1hbmFnZXJDYWxsYmFja3MgPSB7fTtcbiAgcHJpdmF0ZSBhcGlIb3N0OiBzdHJpbmcgPSAnJztcbiAgcHVibGljIGNvbm5lY3Rpb246IElDb25uZWN0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcm9vbUlkOiBzdHJpbmcgPSAnJztcblxuICAvLyDQndCw0YHRgtGA0L7QudC60LAgY2FsbGJhY2tzXG4gIHB1YmxpYyBzZXRDYWxsYmFja3MoY2FsbGJhY2tzOiBUZXJtaW5hbFRhYk1hbmFnZXJDYWxsYmFja3MpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IHsgLi4udGhpcy5jYWxsYmFja3MsIC4uLmNhbGxiYWNrcyB9O1xuICB9XG5cbiAgLy8g0J3QsNGB0YLRgNC+0LnQutCwIEFQSSDRhdC+0YHRgtCwXG4gIHB1YmxpYyBzZXRBcGlIb3N0KGFwaUhvc3Q6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYXBpSG9zdCA9IGFwaUhvc3Q7XG4gIH1cblxuICAvLyDQndCw0YHRgtGA0L7QudC60LAgcm9vbUlkXG4gIHB1YmxpYyBzZXRSb29tSWQocm9vbUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJvb21JZCA9IHJvb21JZDtcbiAgfVxuXG4gIHB1YmxpYyBjb25uZWN0VG9Vcmwoc2VydmVyVXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uID09IG51bGwpIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKHNlcnZlclVybCk7XG4gICAgICB0aGlzLnNldHVwQ29ubmVjdGlvbkhhbmRsZXJzKCk7XG4gICAgICB0aGlzLmNvbm5lY3Rpb24uY29ubmVjdCgnd2ViJyk7XG4gICAgfSBcbiAgfVxuXG4gIC8vINCd0LDRgdGC0YDQvtC50LrQsCDQvtCx0YDQsNCx0L7RgtGH0LjQutC+0LIg0YHQvtC10LTQuNC90LXQvdC40Y9cbiAgcHJpdmF0ZSBzZXR1cENvbm5lY3Rpb25IYW5kbGVycygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikgcmV0dXJuO1xuXG4gICAgLy8g0J7QsdGA0LDQsdC+0YLRh9C40Log0LTQu9GPINC90L7QstGL0YUg0LrQu9C40LXQvdGC0L7QslxuICAgIHRoaXMuY29ubmVjdGlvbi5zZXRPbk5ld0NsaWVudCgoZGF0YTogTmV3Q2xpZW50RGF0YSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ05ldyBjbGllbnQgcmVjZWl2ZWQ6JywgZGF0YSk7XG4gICAgICB0aGlzLmhhbmRsZU5ld0NsaWVudChkYXRhKTtcbiAgICB9KTtcblxuICAgIC8vINCe0LHRgNCw0LHQvtGC0YfQuNC6INC00LvRjyDRg9C00LDQu9C10L3QuNGPINC60LvQuNC10L3RgtC+0LJcbiAgICB0aGlzLmNvbm5lY3Rpb24uc2V0T25EZWxldGVDbGllbnQoKGRhdGE6IERlbGV0ZUNsaWVudERhdGEpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdEZWxldGUgY2xpZW50IHJlY2VpdmVkOicsIGRhdGEpO1xuICAgICAgdGhpcy5oYW5kbGVEZWxldGVDbGllbnQoZGF0YSk7XG4gICAgfSk7XG5cbiAgICAvLyDQntCx0YDQsNCx0L7RgtGH0LjQuiDQtNC70Y8g0LfQsNC60YDRi9GC0LjRjyDRgdC10YHRgdC40LhcbiAgICB0aGlzLmNvbm5lY3Rpb24uc2V0T25DbG9zZVNlc3Npb24oKGRhdGE6IENsb3NlU2Vzc2lvbkRhdGEpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdDbG9zZSBzZXNzaW9uIHJlY2VpdmVkOicsIGRhdGEpO1xuICAgICAgdGhpcy5oYW5kbGVDbG9zZVNlc3Npb24oZGF0YSk7XG4gICAgfSk7XG5cbiAgICAvLyDQntCx0YDQsNCx0L7RgtGH0LjQuiDQtNC70Y8g0LjQt9C80LXQvdC10L3QuNGPINGB0YLQsNGC0YPRgdCwINC60LvQuNC10L3RgtCwXG4gICAgdGhpcy5jb25uZWN0aW9uLnNldE9uQ2xpZW50U3RhdHVzKChkYXRhOiBDbGllbnRTdGF0dXNEYXRhKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnQ2xpZW50IHN0YXR1cyByZWNlaXZlZDonLCBkYXRhKTtcbiAgICAgIHRoaXMuaGFuZGxlQ2xpZW50U3RhdHVzKGRhdGEpO1xuICAgIH0pO1xuXG4gICAgLy8g0J7QsdGA0LDQsdC+0YLRh9C40Log0LTQu9GPINGB0L7RgdGC0L7Rj9C90LjRjyDQutGD0YDRgdC+0YDQsFxuICAgIHRoaXMuY29ubmVjdGlvbi5zZXRPbkN1cnNvclN0YXRlKChkYXRhOiBDdXJzb3JTdGF0ZURhdGEpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdDdXJzb3Igc3RhdGUgcmVjZWl2ZWQ6JywgZGF0YSk7XG4gICAgICB0aGlzLmhhbmRsZUN1cnNvclN0YXRlKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8g0J7QsdGA0LDQsdC+0YLQutCwINC90L7QstC+0LPQviDQutC70LjQtdC90YLQsFxuICBwcml2YXRlIGhhbmRsZU5ld0NsaWVudChkYXRhOiBOZXdDbGllbnREYXRhKTogdm9pZCB7XG4gICAgLy8g0J/RgNC+0LLQtdGA0Y/QtdC8LCDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCINC70Lgg0YPQttC1INC60LvQuNC10L3RgiDRgSDRgtCw0LrQuNC8IElEXG4gICAgY29uc3QgZXhpc3RpbmdDbGllbnQgPSB0aGlzLmNsaWVudHMuZmluZChjbGllbnQgPT4gY2xpZW50LmNsaWVudElkID09PSBkYXRhLmNsaWVudElkKTtcbiAgICBpZiAoZXhpc3RpbmdDbGllbnQpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBDbGllbnQgJHtkYXRhLmNsaWVudElkfSBhbHJlYWR5IGV4aXN0cywgdXBkYXRpbmcgc3RhdHVzYCk7XG4gICAgICB0aGlzLnVwZGF0ZUNsaWVudFN0YXR1cyhkYXRhLmNsaWVudElkLCAnY29ubmVjdGVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g0KHQvtC30LTQsNC10Lwg0L3QvtCy0YvQuSDQutC70LjQtdC90YJcbiAgICBjb25zdCBuZXdDbGllbnQ6IENsaWVudERhdGEgPSB7XG4gICAgICBjbGllbnRJZDogZGF0YS5jbGllbnRJZCxcbiAgICAgIG5hbWU6IGRhdGEubmFtZSxcbiAgICAgIHR5cGU6IGRhdGEuY2xpZW50VHlwZSxcbiAgICAgIGNsaWVudFR5cGU6IGRhdGEuY2xpZW50VHlwZSxcbiAgICAgIHNlc3Npb25zOiBbXSxcbiAgICAgIGlzRXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgc3RhdHVzOiAnY29ubmVjdGVkJ1xuICAgIH07XG5cbiAgICAvLyDQlNC+0LHQsNCy0LvRj9C10Lwg0LrQu9C40LXQvdGC0LAg0LIg0YHQv9C40YHQvtC6XG4gICAgdGhpcy5jbGllbnRzLnB1c2gobmV3Q2xpZW50KTtcblxuICAgIC8vINCj0LLQtdC00L7QvNC70Y/QtdC8IGNhbGxiYWNrXG4gICAgdGhpcy5jYWxsYmFja3Mub25OZXdDbGllbnQ/LihuZXdDbGllbnQpO1xuXG4gICAgY29uc29sZS5sb2coYE5ldyBjbGllbnQgYWRkZWQ6ICR7ZGF0YS5jbGllbnRJZH0gKCR7ZGF0YS5uYW1lfSlgKTtcbiAgfVxuXG4gIC8vINCe0LHRgNCw0LHQvtGC0LrQsCDRg9C00LDQu9C10L3QuNGPINC60LvQuNC10L3RgtCwXG4gIHByaXZhdGUgaGFuZGxlRGVsZXRlQ2xpZW50KGRhdGE6IERlbGV0ZUNsaWVudERhdGEpOiB2b2lkIHtcbiAgICAvLyDQndCw0YXQvtC00LjQvCDQutC70LjQtdC90YLQsCDQtNC70Y8g0YPQtNCw0LvQtdC90LjRj1xuICAgIGNvbnN0IGNsaWVudFRvRGVsZXRlID0gdGhpcy5jbGllbnRzLmZpbmQoY2xpZW50ID0+IGNsaWVudC5jbGllbnRJZCA9PT0gZGF0YS5jbGllbnRJZCk7XG4gICAgaWYgKCFjbGllbnRUb0RlbGV0ZSkge1xuICAgICAgY29uc29sZS5sb2coYENsaWVudCAke2RhdGEuY2xpZW50SWR9IG5vdCBmb3VuZCBmb3IgZGVsZXRpb25gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDQl9Cw0LrRgNGL0LLQsNC10Lwg0LLRgdC1INGB0LXRgdGB0LjQuCDQutC70LjQtdC90YLQsFxuICAgIGNsaWVudFRvRGVsZXRlLnNlc3Npb25zLmZvckVhY2goc2Vzc2lvbiA9PiB7XG4gICAgICB0aGlzLmNsb3NlU2Vzc2lvbihjbGllbnRUb0RlbGV0ZS5jbGllbnRJZCwgc2Vzc2lvbi5kYXRhLnNlc3Npb25JZCk7XG4gICAgfSk7XG5cbiAgICAvLyDQo9C00LDQu9GP0LXQvCDQutC70LjQtdC90YLQsCDQuNC3INGB0L/QuNGB0LrQsFxuICAgIGNvbnN0IGNsaWVudEluZGV4ID0gdGhpcy5jbGllbnRzLmZpbmRJbmRleChjbGllbnQgPT4gY2xpZW50LmNsaWVudElkID09PSBkYXRhLmNsaWVudElkKTtcbiAgICBpZiAoY2xpZW50SW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmNsaWVudHMuc3BsaWNlKGNsaWVudEluZGV4LCAxKTtcbiAgICB9XG5cbiAgICAvLyDQo9Cy0LXQtNC+0LzQu9GP0LXQvCBjYWxsYmFja1xuICAgIHRoaXMuY2FsbGJhY2tzLm9uQ2xpZW50UmVtb3ZlZD8uKGRhdGEuY2xpZW50SWQpO1xuXG4gICAgY29uc29sZS5sb2coYENsaWVudCBkZWxldGVkOiAke2RhdGEuY2xpZW50SWR9ICgke2RhdGEubmFtZX0pYCk7XG4gIH1cblxuICAvLyDQntCx0YDQsNCx0L7RgtC60LAg0LfQsNC60YDRi9GC0LjRjyDRgdC10YHRgdC40LhcbiAgcHJpdmF0ZSBoYW5kbGVDbG9zZVNlc3Npb24oZGF0YTogQ2xvc2VTZXNzaW9uRGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IHsgY2xpZW50SWQsIHNlc3Npb25JZCB9ID0gZGF0YTtcbiAgICBcbiAgICBjb25zb2xlLmxvZyhgSGFuZGxpbmcgY2xvc2Ugc2Vzc2lvbjogY2xpZW50SWQ9JHtjbGllbnRJZH0sIHNlc3Npb25JZD0ke3Nlc3Npb25JZH1gKTtcbiAgICBcbiAgICAvLyDQndCw0YXQvtC00LjQvCDQutC70LjQtdC90YLQsFxuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50cy5maW5kKGMgPT4gYy5jbGllbnRJZCA9PT0gY2xpZW50SWQpO1xuICAgIGlmICghY2xpZW50KSB7XG4gICAgICBjb25zb2xlLmxvZyhgQ2xpZW50ICR7Y2xpZW50SWR9IG5vdCBmb3VuZCBmb3Igc2Vzc2lvbiBjbG9zdXJlYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g0J3QsNGF0L7QtNC40Lwg0YHQtdGB0YHQuNGOXG4gICAgY29uc3Qgc2Vzc2lvbiA9IGNsaWVudC5zZXNzaW9ucy5maW5kKHMgPT4gcy5kYXRhLnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKTtcbiAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgIGNvbnNvbGUubG9nKGBTZXNzaW9uICR7c2Vzc2lvbklkfSBub3QgZm91bmQgaW4gY2xpZW50ICR7Y2xpZW50SWR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g0JfQsNC60YDRi9Cy0LDQtdC8INGB0LXRgdGB0LjRjlxuICAgIGNvbnNvbGUubG9nKGBDbG9zaW5nIHNlc3Npb24gJHtzZXNzaW9uLmRhdGEuc2Vzc2lvbklkfSAoJHtzZXNzaW9uSWR9KSBmb3IgY2xpZW50ICR7Y2xpZW50SWR9YCk7XG4gICAgdGhpcy5jbG9zZVNlc3Npb24oY2xpZW50LmNsaWVudElkLCBzZXNzaW9uLmRhdGEuc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8vINCe0LHRgNCw0LHQvtGC0LrQsCDQuNC30LzQtdC90LXQvdC40Y8g0YHRgtCw0YLRg9GB0LAg0LrQu9C40LXQvdGC0LBcbiAgcHJpdmF0ZSBoYW5kbGVDbGllbnRTdGF0dXMoZGF0YTogQ2xpZW50U3RhdHVzRGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IHsgY2xpZW50SWQsIHN0YXR1cyB9ID0gZGF0YTtcbiAgICBcbiAgICBjb25zb2xlLmxvZyhgSGFuZGxpbmcgY2xpZW50IHN0YXR1cyBjaGFuZ2U6IGNsaWVudElkPSR7Y2xpZW50SWR9LCBzdGF0dXM9JHtzdGF0dXN9YCk7XG4gICAgXG4gICAgLy8g0J7QsdC90L7QstC70Y/QtdC8INGB0YLQsNGC0YPRgSDQutC70LjQtdC90YLQsFxuICAgIHRoaXMudXBkYXRlQ2xpZW50U3RhdHVzKGNsaWVudElkLCBzdGF0dXMpO1xuICB9XG5cbiAgLy8g0J7QsdGA0LDQsdC+0YLQutCwINGB0L7RgdGC0L7Rj9C90LjRjyDQutGD0YDRgdC+0YDQsFxuICBwcml2YXRlIGhhbmRsZUN1cnNvclN0YXRlKGRhdGE6IEN1cnNvclN0YXRlRGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBjb21tYW5kLCBwb3NpdGlvbiB9ID0gZGF0YTtcbiAgICBcbiAgICBjb25zb2xlLmxvZyhgSGFuZGxpbmcgY3Vyc29yIHN0YXRlOiBzZXNzaW9uSWQ9JHtzZXNzaW9uSWR9LCBjb21tYW5kPSR7Y29tbWFuZH0sIHBvc2l0aW9uPSR7cG9zaXRpb259YCk7XG4gICAgXG4gICAgLy8g0J/RgNC+0LLQtdGA0Y/QtdC8LCDRj9Cy0LvRj9C10YLRgdGPINC70Lgg0Y3RgtCwINGB0LXRgdGB0LjRjyDQsNC60YLQuNCy0L3QvtC5XG4gICAgY29uc3QgYWN0aXZlU2Vzc2lvbiA9IHRoaXMuZ2V0QWN0aXZlU2Vzc2lvbigpO1xuICAgIGlmICghYWN0aXZlU2Vzc2lvbiB8fCBhY3RpdmVTZXNzaW9uLmRhdGEuc2Vzc2lvbklkICE9PSBzZXNzaW9uSWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBDdXJzb3Igc3RhdGUgcmVjZWl2ZWQgZm9yIGluYWN0aXZlIHNlc3Npb246ICR7c2Vzc2lvbklkfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyDQo9Cy0LXQtNC+0LzQu9GP0LXQvCBjYWxsYmFjayDQtNC70Y8g0L7RgtGA0LjRgdC+0LLQutC4INC90LAgVUkgKNCx0LXQtyDQuNC30LzQtdC90LXQvdC40Y8g0LvQvtC60LDQu9GM0L3QvtCz0L4gQ29tbWFuZEJ1aWxkZXIpXG4gICAgdGhpcy5jYWxsYmFja3Mub25DdXJzb3JTdGF0ZT8uKHNlc3Npb25JZCwgY29tbWFuZCwgcG9zaXRpb24pO1xuICB9XG5cbiAgLy8g0J/QvtC70YPRh9C10L3QuNC1INGB0L/QuNGB0LrQsCDQutC70LjQtdC90YLQvtCyINGBINGB0LXRgNCy0LXRgNCwXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q2xpZW50cygpOiBQcm9taXNlPFNlcnZlckNsaWVudERhdGFbXT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDQlNC+0LHQsNCy0LvRj9C10Lwgcm9vbUlkINCyIHF1ZXJ5INC/0LDRgNCw0LzQtdGC0YDRi1xuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGlIb3N0fS9hcGkvY29ubmVjdGlvbnMke3RoaXMucm9vbUlkID8gYD9yb29tSWQ9JHt0aGlzLnJvb21JZH1gIDogJyd9YDtcbiAgICAgIGNvbnNvbGUubG9nKGBGZXRjaGluZyBjbGllbnRzIGZyb206ICR7dXJsfWApO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEFQSSByZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBkYXRhOiBBcGlSZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIFxuICAgICAgLy8g0J7RgtC70LDQtNC+0YfQvdGL0LUg0LvQvtCz0LhcbiAgICAgIGNvbnNvbGUubG9nKCdBUEkgUmVzcG9uc2U6JywgZGF0YSk7XG4gICAgICBjb25zb2xlLmxvZygnQ2xpZW50cyBmcm9tIEFQSTonLCBkYXRhLmNsaWVudHMpO1xuICAgICAgXG4gICAgICBpZiAoZGF0YS5jbGllbnRzICYmIGRhdGEuY2xpZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdGaXJzdCBjbGllbnQgZGF0YTonLCBkYXRhLmNsaWVudHNbMF0pO1xuICAgICAgICBjb25zb2xlLmxvZygnRmlyc3QgY2xpZW50IHNlc3Npb25zOicsIGRhdGEuY2xpZW50c1swXT8uc2Vzc2lvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ05vIGNsaWVudHMgcmV0dXJuZWQgZnJvbSBBUEknKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIGRhdGEuY2xpZW50cyB8fCBbXTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2xpZW50czonLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLy8g0KHQuNC90YXRgNC+0L3QuNC30LDRhtC40Y8g0YHQvtGB0YLQvtGP0L3QuNGPINGBINGB0LXRgNCy0LXRgNC+0LxcbiAgcHVibGljIGFzeW5jIHN5bmNXaXRoU2VydmVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRDbGllbnRzID0gYXdhaXQgdGhpcy5nZXRDbGllbnRzKCk7XG4gICAgY29uc3QgY3VycmVudENsaWVudElkcyA9IGN1cnJlbnRDbGllbnRzLm1hcChjID0+IGMuY2xpZW50SWQpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ2xpZW50cyA9IHRoaXMuY2xpZW50cztcbiAgICBjb25zdCBleGlzdGluZ0NsaWVudElkcyA9IGV4aXN0aW5nQ2xpZW50cy5tYXAoYyA9PiBjLmNsaWVudElkKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgXG4gICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8INC90L7QstGL0YUg0LrQu9C40LXQvdGC0L7QsiAo0YLQvtC70YzQutC+INGC0LXRhSwg0LrQvtGC0L7RgNGL0YUg0LXRidC1INC90LXRgilcbiAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiBjdXJyZW50Q2xpZW50cykge1xuICAgICAgaWYgKCFleGlzdGluZ0NsaWVudElkcy5pbmNsdWRlcyhjbGllbnQuY2xpZW50SWQpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDcmVhdGluZyBuZXcgY2xpZW50OiAke2NsaWVudC5jbGllbnRJZH0gKCR7Y2xpZW50Lm5hbWV9KWApO1xuICAgICAgICBsZXQgY2xpZW50RGF0YSA9IHRoaXMuY3JlYXRlQ2xpZW50KGNsaWVudC5jbGllbnRJZCwgY2xpZW50Lm5hbWUsIGNsaWVudC5jbGllbnRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIFxuICAgICAgICAvLyDQo9Cy0LXQtNC+0LzQu9GP0LXQvCDQviDQvdC+0LLQvtC8INC60LvQuNC10L3RgtC1XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLm9uTmV3Q2xpZW50Py4oY2xpZW50RGF0YSk7XG4gICAgICAgIC8vINCh0L7Qt9C00LDQtdC8INGB0LXRgdGB0LjQuCDQtNC70Y8g0Y3RgtC+0LPQviDQutC70LjQtdC90YLQsFxuICAgICAgICBpZiAoY2xpZW50LnNlc3Npb25zICYmIGNsaWVudC5zZXNzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYENyZWF0aW5nICR7Y2xpZW50LnNlc3Npb25zLmxlbmd0aH0gc2Vzc2lvbnMgZm9yIGNsaWVudCAke2NsaWVudC5jbGllbnRJZH1gKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHNlc3Npb25EYXRhIG9mIGNsaWVudC5zZXNzaW9ucykge1xuICAgICAgICAgICAgY29uc3QgY2xpZW50VGFiID0gdGhpcy5jbGllbnRzLmZpbmQodCA9PiB0LmNsaWVudElkID09PSBjbGllbnQuY2xpZW50SWQpO1xuICAgICAgICAgICAgaWYgKGNsaWVudFRhYikge1xuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVNlc3Npb25Gcm9tU2VydmVyKGNsaWVudERhdGEuY2xpZW50SWQsIHNlc3Npb25EYXRhLmlkLCBzZXNzaW9uRGF0YS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8g0KPQtNCw0LvRj9C10Lwg0LrQu9C40LXQvdGC0L7Qsiwg0LrQvtGC0L7RgNGL0YUg0LHQvtC70YzRiNC1INC90LXRglxuICAgIGV4aXN0aW5nQ2xpZW50cy5mb3JFYWNoKChjbGllbnQ6Q2xpZW50RGF0YSkgPT4ge1xuICAgICAgaWYgKGNsaWVudC5jbGllbnRJZCAmJiAhY3VycmVudENsaWVudElkcy5pbmNsdWRlcyhjbGllbnQuY2xpZW50SWQpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmluZyBjbGllbnQ6ICR7Y2xpZW50LmNsaWVudElkfWApO1xuICAgICAgICB0aGlzLmNsb3NlQ2xpZW50KGNsaWVudC5jbGllbnRJZCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmNhbGxiYWNrcy5vbkNsaWVudFJlbW92ZWQ/LihjbGllbnQuY2xpZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8g0JfQsNC/0YPRgdC6INC/0LXRgNC40L7QtNC40YfQtdGB0LrQvtCz0L4g0L7QsdC90L7QstC70LXQvdC40Y8g0LrQu9C40LXQvdGC0L7QslxuICBwdWJsaWMgc3RhcnRQb2xsaW5nKCk6IHZvaWQge1xuICAgXG4gICAgLy8g0J/QtdGA0LLQvtC90LDRh9Cw0LvRjNC90LDRjyDRgdC40L3RhdGA0L7QvdC40LfQsNGG0LjRj1xuICAgIHRoaXMuc3luY1dpdGhTZXJ2ZXIoKTtcbiAgfVxuXG5cbiAgLy8g0J/RgNC40LLQsNGC0L3Ri9C5INC80LXRgtC+0LQg0LTQu9GPINGB0L7Qt9C00LDQvdC40Y8g0LrQu9C40LXQvdGC0LAgLSDQuNGB0L/QvtC70YzQt9GD0LXRgtGB0Y8g0YLQvtC70YzQutC+INCy0L3Rg9GC0YDQtdC90L3QtSDQv9GA0Lgg0YHQuNC90YXRgNC+0L3QuNC30LDRhtC40Lgg0YEg0YHQtdGA0LLQtdGA0L7QvFxuICBwcml2YXRlIGNyZWF0ZUNsaWVudChjbGllbnRJZDogc3RyaW5nICwgY2xpZW50TmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGwsIGNsaWVudFR5cGU6IHN0cmluZyA9ICd3ZWInKTogQ2xpZW50RGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVGFiKGNsaWVudElkLCBjbGllbnROYW1lLCBjbGllbnRUeXBlKTtcbiAgfVxuXG4gIC8vINCh0L7Qt9C00LDQvdC40LUg0L3QvtCy0L7Qs9C+INC60LvQuNC10L3RgtCwICjRgtCw0LHQsCDQstC10YDRhdC90LXQs9C+INGD0YDQvtCy0L3RjykgLSDQv9GA0LjQstCw0YLQvdGL0Lkg0LzQtdGC0L7QtFxuICBwcml2YXRlIGNyZWF0ZVRhYihjbGllbnRJZDogc3RyaW5nICwgY2xpZW50TmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGwsIGNsaWVudFR5cGU6IHN0cmluZyA9ICd3ZWInKTogQ2xpZW50RGF0YSB7XG4gICAgY29uc29sZS5sb2coYFRlcm1pbmFsVGFiTWFuYWdlci5jcmVhdGVUYWIgY2FsbGVkIHdpdGggY2xpZW50SWQ6ICR7Y2xpZW50SWR9LCBjbGllbnROYW1lOiAke2NsaWVudE5hbWV9LCBjbGllbnRUeXBlOiAke2NsaWVudFR5cGV9YCk7XG4gICAgXG4gICAgLy8g0J/RgNC+0LLQtdGA0Y/QtdC8LCDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCINC70Lgg0YPQttC1INC60LvQuNC10L3RgiDRgSDRgtCw0LrQuNC8IElEXG4gICAgaWYgKGNsaWVudElkKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NsaWVudCA9IHRoaXMuY2xpZW50cy5maW5kKHRhYiA9PiB0YWIuY2xpZW50SWQgPT09IGNsaWVudElkKTtcbiAgICAgIGlmIChleGlzdGluZ0NsaWVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQ2xpZW50IGFscmVhZHkgZXhpc3RzOiAke2NsaWVudElkfSwgc3dpdGNoaW5nIHRvIGl0YCk7XG4gICAgICAgIHRoaXMuc3dpdGNoVG9UYWIoZXhpc3RpbmdDbGllbnQuY2xpZW50SWQpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2xpZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBjb25zdCB0YWJJZCA9IGBjbGllbnQtJHt0aGlzLnRhYkNvdW50ZXIrK31gO1xuICAgIGNvbnN0IHRhYkRhdGE6IENsaWVudERhdGEgPSB7XG4gICAgICBjbGllbnRJZDogY2xpZW50SWQsXG4gICAgICBuYW1lOiBjbGllbnROYW1lIHx8IGBDbGllbnQgJHt0aGlzLnRhYkNvdW50ZXJ9YCxcbiAgICAgIHR5cGU6IGNsaWVudFR5cGUsXG4gICAgICBjbGllbnRUeXBlOiBjbGllbnRUeXBlLFxuICAgICAgc2Vzc2lvbnM6IFtdLFxuICAgICAgaXNFeHBhbmRlZDogdHJ1ZSxcbiAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgIHN0YXR1czogJ3dhaXRpbmcnXG4gICAgfTtcbiAgICBcbiAgICBjb25zb2xlLmxvZyhgQ3JlYXRpbmcgbmV3IGNsaWVudDogJHtjbGllbnRJZH0gd2l0aCBjbGllbnRJZDogJHtjbGllbnRJZCB8fCAnbmV3J31gKTtcbiAgICBjb25zb2xlLmxvZyhgVGFiRGF0YSBjcmVhdGVkOmAsIHsgaWQ6IHRhYkRhdGEuY2xpZW50SWQsIGNsaWVudElkOiB0YWJEYXRhLmNsaWVudElkLCBuYW1lOiB0YWJEYXRhLm5hbWUgfSk7XG4gICAgdGhpcy5jbGllbnRzLnB1c2godGFiRGF0YSk7XG4gICAgXG4gICAgXG4gICAgLy8g0J/QtdGA0LXQutC70Y7Rh9Cw0LXQvNGB0Y8g0L3QsCDQvdC+0LLRi9C5INC60LvQuNC10L3RgiDRgtC+0LvRjNC60L4g0LXRgdC70Lgg0Y3RgtC+INC/0LXRgNCy0YvQuVxuICAgIGlmICh0aGlzLmNsaWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAvLyAgIHRoaXMuc3dpdGNoVG9UYWIoY2xpZW50SWQpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGFiRGF0YTtcbiAgfVxuXG4gIC8vINCf0YDQuNCy0LDRgtC90YvQuSDQvNC10YLQvtC0INC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINGB0LXRgdGB0LjQuCAo0L7QsdGJ0LDRjyDQu9C+0LPQuNC60LApXG4gIHByaXZhdGUgY3JlYXRlU2Vzc2lvbkludGVybmFsKFxuICAgIGNsaWVudElkOiBzdHJpbmcsIFxuICAgIHNlc3Npb25JZDogc3RyaW5nICwgXG4gICAgc2Vzc2lvbk5hbWU6IHN0cmluZywgXG4gICAgc291cmNlOiAndWknIHwgJ3NlcnZlcidcbiAgKTogU2Vzc2lvbkRhdGEge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50cy5maW5kKHRhYiA9PiB0YWIuY2xpZW50SWQgPT09IGNsaWVudElkKTtcbiAgICBpZiAoIWNsaWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGllbnQgbm90IGZvdW5kOiAke2NsaWVudElkfWApO1xuICAgIH1cbiAgICAvL2NvbnN0IGNsaWVudFRhYklkID0gY2xpZW50LnRhYklkO1xuXG4gICAgLy8g0J/RgNC+0LLQtdGA0Y/QtdC8LCDQvdC1INGB0YPRidC10YHRgtCy0YPQtdGCINC70Lgg0YPQttC1INGB0LXRgdGB0LjRjyDRgSDRgtCw0LrQuNC8IElEICjRgtC+0LvRjNC60L4g0LTQu9GPINGB0LXRgNCy0LXRgNC90YvRhSDRgdC10YHRgdC40LkpXG4gICAgaWYgKHNvdXJjZSA9PT0gJ3NlcnZlcicgJiYgc2Vzc2lvbklkKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1Nlc3Npb24gPSBjbGllbnQuc2Vzc2lvbnMuZmluZChzZXNzaW9uID0+IHNlc3Npb24uZGF0YS5zZXNzaW9uSWQgPT09IHNlc3Npb25JZCk7XG4gICAgICBpZiAoZXhpc3RpbmdTZXNzaW9uKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBTZXNzaW9uIGFscmVhZHkgZXhpc3RzOiAke3Nlc3Npb25JZH0sIHN3aXRjaGluZyB0byBpdGApO1xuICAgICAgICB0aGlzLnN3aXRjaFRvU2Vzc2lvbihjbGllbnQuY2xpZW50SWQsIGV4aXN0aW5nU2Vzc2lvbi5kYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ1Nlc3Npb247XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHNlc3Npb25EYXRhOiBTZXNzaW9uRGF0YSA9IHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWQsXG4gICAgICAgIG5hbWU6IHNlc3Npb25OYW1lLFxuICAgICAgICBjbGllbnRJZDogY2xpZW50SWQsXG4gICAgICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgIHNlbnRLZXlzSW5kZXg6IDBcbiAgICAgIH0sXG4gICAgICB0ZXJtaW5hbFVpOiBudWxsLFxuICAgICAgdGVybWluYWxVaVdyaXRlcjogbnVsbCxcbiAgICAgIHRlcm1pbmFsTWFuYWdlcjogbnVsbCxcbiAgICAgIHRlcm1pbmFsRGl2OiBudWxsLFxuICAgICAgZml0QWRkb246IG51bGwsXG4gICAgICBsaW5rQWRkb246IG51bGwsXG4gICAgfTtcbiAgICBcbiAgICBjb25zdCBsb2dNZXNzYWdlID0gc291cmNlID09PSAndWknIFxuICAgICAgPyBgQ3JlYXRpbmcgbmV3IHNlc3Npb246ICR7c2Vzc2lvbklkfSBmb3IgY2xpZW50OiAke2NsaWVudElkfWBcbiAgICAgIDogYENyZWF0aW5nIHNlc3Npb24gZnJvbSBzZXJ2ZXI6ICR7c2Vzc2lvbklkfSBmb3IgY2xpZW50OiAke2NsaWVudElkfWA7XG4gICAgY29uc29sZS5sb2cobG9nTWVzc2FnZSk7XG4gICAgY2xpZW50LnNlc3Npb25zLnB1c2goc2Vzc2lvbkRhdGEpO1xuICAgIGNvbnN0IGNsaWVudFRhYklkID0gY2xpZW50LmNsaWVudElkO1xuICAgIC8vINCh0L7Qt9C00LDQtdC8INGC0LXRgNC80LjQvdCw0Lsg0LTQu9GPINGN0YLQvtC5INGB0LXRgdGB0LjQuFxuICAgIHRoaXMuY3JlYXRlVGVybWluYWxGb3JTZXNzaW9uKGNsaWVudFRhYklkLCBzZXNzaW9uRGF0YSk7XG4gICAgXG4gICAgLy8g0KPQstC10LTQvtC80LvRj9C10Lwg0L4g0L3QvtCy0L7QuSDRgdC10YHRgdC40LhcbiAgICB0aGlzLmNhbGxiYWNrcy5vbk5ld1Nlc3Npb24/LihjbGllbnRJZCwgc2Vzc2lvbkRhdGEpO1xuICAgIFxuICAgIC8vINCf0LXRgNC10LrQu9GO0YfQsNC10LzRgdGPINC90LAg0L3QvtCy0YPRjiDRgdC10YHRgdC40Y5cbiAgICB0aGlzLnN3aXRjaFRvU2Vzc2lvbihjbGllbnQuY2xpZW50SWQsIHNlc3Npb25JZCk7XG4gICAgXG4gICAgcmV0dXJuIHNlc3Npb25EYXRhO1xuICB9XG5cbiAgLy8g0KHQvtC30LTQsNC90LjQtSDQvdC+0LLQvtC5INGB0LXRgdGB0LjQuCDQtNC70Y8g0LrQu9C40LXQvdGC0LAgKNCy0YvQt9GL0LLQsNC10YLRgdGPINC40LcgVUkpXG4gIHB1YmxpYyBjcmVhdGVOZXdTZXNzaW9uKGNsaWVudElkOiBzdHJpbmcsIHNlc3Npb25OYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbCk6IFNlc3Npb25EYXRhIHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudHMuZmluZCh0YWIgPT4gdGFiLmNsaWVudElkID09PSBjbGllbnRJZCk7XG4gICAgaWYgKCFjbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xpZW50IG5vdCBmb3VuZDogJHtjbGllbnRJZH1gKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZmluYWxTZXNzaW9uTmFtZSA9IHNlc3Npb25OYW1lIHx8IGBTZXNzaW9uICR7Y2xpZW50LnNlc3Npb25zLmxlbmd0aCArIDF9YDtcbiAgICBsZXQgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gYHNlc3Npb24tJHtub3d9YDtcbiAgICBjb25zdCBzZXNzaW9uRGF0YSA9IHRoaXMuY3JlYXRlU2Vzc2lvbkludGVybmFsKGNsaWVudC5jbGllbnRJZCwgc2Vzc2lvbklkLCBmaW5hbFNlc3Npb25OYW1lLCAndWknKTtcbiAgICBcbiAgICAvLyDQntGC0L/RgNCw0LLQu9GP0LXQvCDQt9Cw0L/RgNC+0YEg0L3QsCDRgdC10YDQstC10YAg0LTQu9GPINGB0L7Qt9C00LDQvdC40Y8g0L3QvtCy0L7QuSDRgdC10YHRgdC40LhcbiAgICB0aGlzLmNvbm5lY3Rpb24/LnNlbmROZXdTZXNzaW9uKGNsaWVudC5jbGllbnRJZCwgc2Vzc2lvbklkLCBzZXNzaW9uRGF0YS5kYXRhLm5hbWUpO1xuICAgIFxuICAgIHJldHVybiBzZXNzaW9uRGF0YTtcbiAgfVxuXG4gIC8vINCh0L7Qt9C00LDQvdC40LUg0YHQtdGB0YHQuNC4INC40Lcg0LTQsNC90L3Ri9GFINGB0LXRgNCy0LXRgNCwICjQstGL0LfRi9Cy0LDQtdGC0YHRjyDQv9GA0Lgg0YHQuNC90YXRgNC+0L3QuNC30LDRhtC40LgpXG4gIHB1YmxpYyBjcmVhdGVTZXNzaW9uRnJvbVNlcnZlcihjbGllbnRJZDogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZywgc2Vzc2lvbk5hbWU6IHN0cmluZyk6IFNlc3Npb25EYXRhIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTZXNzaW9uSW50ZXJuYWwoY2xpZW50SWQsIHNlc3Npb25JZCwgc2Vzc2lvbk5hbWUsICdzZXJ2ZXInKTtcbiAgfVxuXG5cbiAgLy8g0KHQvtC30LTQsNC90LjQtSDRgtC10YDQvNC40L3QsNC70LAg0LTQu9GPINGB0LXRgdGB0LjQuFxuICBwcml2YXRlIGNyZWF0ZVRlcm1pbmFsRm9yU2Vzc2lvbihjbGllbnRJZDogc3RyaW5nLCBzZXNzaW9uRGF0YTogU2Vzc2lvbkRhdGEpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXJtaW5hbENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXJtaW5hbC1jb250YWluZXInKTtcbiAgICBcbiAgICBpZiAoIXRlcm1pbmFsQ29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rlcm1pbmFsIGNvbnRhaW5lciBub3QgZm91bmQnKTtcbiAgICB9XG4gICAgXG4gICAgLy8g0KHQvtC30LTQsNC10Lwg0LrQvtC90YLQtdC50L3QtdGAINC00LvRjyDRgtC10YDQvNC40L3QsNC70LBcbiAgICBjb25zdCB0ZXJtaW5hbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRlcm1pbmFsRGl2LmlkID0gYHRlcm1pbmFsLSR7c2Vzc2lvbkRhdGEuZGF0YS5zZXNzaW9uSWR9YDtcbiAgICB0ZXJtaW5hbERpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRlcm1pbmFsRGl2LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgIHRlcm1pbmFsRGl2LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICB0ZXJtaW5hbERpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgdGVybWluYWxEaXYuc3R5bGUudG9wID0gJzAnO1xuICAgIHRlcm1pbmFsRGl2LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgdGVybWluYWxDb250YWluZXIuYXBwZW5kQ2hpbGQodGVybWluYWxEaXYpO1xuICAgIFxuICAgIC8vINCh0L7Qt9C00LDQtdC8IFRlcm1pbmFsVWlcbiAgICBjb25zdCB0ZXJtaW5hbFVpID0gbmV3IFRlcm1pbmFsKHtcbiAgICAgIGN1cnNvckJsaW5rOiB0cnVlLFxuICAgICAgZm9udEZhbWlseTogJ0NvdXJpZXIgTmV3LCBtb25vc3BhY2UnLFxuICAgICAgZm9udFNpemU6IDE0LFxuICAgICAgdGhlbWU6IHtcbiAgICAgICAgYmFja2dyb3VuZDogJyMwMDAwMDAnLFxuICAgICAgICBmb3JlZ3JvdW5kOiAnI2ZmZmZmZidcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyDQlNC+0LHQsNCy0LvRj9C10LwgYWRkb24n0YtcbiAgICBjb25zdCBmaXRBZGRvbiA9IG5ldyBGaXRBZGRvbigpO1xuICAgIGNvbnN0IGxpbmtBZGRvbiA9IG5ldyBXZWJMaW5rc0FkZG9uKCk7XG4gICAgXG4gICAgdGVybWluYWxVaS5sb2FkQWRkb24oZml0QWRkb24pO1xuICAgIHRlcm1pbmFsVWkubG9hZEFkZG9uKGxpbmtBZGRvbik7XG4gICAgdGVybWluYWxVaS5vcGVuKHRlcm1pbmFsRGl2KTtcbiAgICBcbiAgICAvLyDQodC+0YXRgNCw0L3Rj9C10Lwg0YHRgdGL0LvQutC4INC90LAgYWRkb24n0YtcbiAgICBzZXNzaW9uRGF0YS5maXRBZGRvbiA9IGZpdEFkZG9uO1xuICAgIHNlc3Npb25EYXRhLmxpbmtBZGRvbiA9IGxpbmtBZGRvbjtcbiAgICBzZXNzaW9uRGF0YS50ZXJtaW5hbFVpID0gdGVybWluYWxVaTtcbiAgICBzZXNzaW9uRGF0YS50ZXJtaW5hbERpdiA9IHRlcm1pbmFsRGl2O1xuICAgIFxuICAgIC8vINCh0L7Qt9C00LDQtdC8IFRlcm1pbmFsVWlXcml0ZXIg0LTQu9GPINGB0L7Qs9C70LDRgdC+0LLQsNC90L3QvtC5INC+0YLRgNC40YHQvtCy0LrQuFxuICAgIHNlc3Npb25EYXRhLnRlcm1pbmFsVWlXcml0ZXIgPSBuZXcgVGVybWluYWxVaVdyaXRlcih0ZXJtaW5hbFVpKTtcblxuICAgIC8vINCh0L7Qt9C00LDQtdC8IFRlcm1pbmFsTWFuYWdlciDRgSDQuNC90YLQtdCz0YDQsNGG0LjQtdC5IHh0ZXJtLmpzXG4gICAgY29uc3QgdGVybWluYWxNYW5hZ2VyID0gbmV3IFRlcm1pbmFsTWFuYWdlcih7XG4gICAgICBjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25EYXRhLmRhdGEuc2Vzc2lvbklkLFxuICAgICAgY2xpZW50TmFtZTogc2Vzc2lvbkRhdGEuZGF0YS5uYW1lLFxuICAgICAgYXV0b0Nvbm5lY3Q6IGZhbHNlLCAvLyDQndC1INC/0L7QtNC60LvRjtGH0LDQtdC80YHRjyDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQuFxuICAgICAgYXV0b0Nvbm5lY3REZWxheTogMTAwMCxcbiAgICAgIHdvcmtNb2RlOiAnbG9jYWwnXG4gICAgfSk7XG4gICAgLy8g0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10LwgaGFuZGxlcnMg0YfQtdGA0LXQtyDQvtGC0LTQtdC70YzQvdGL0Lkg0LzQtdGC0L7QtFxuICAgIHRlcm1pbmFsTWFuYWdlci5zZXRIYW5kbGVycyh7XG4gICAgICBvbkRhdGE6IChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFNlc3Npb24gJHtzZXNzaW9uRGF0YS5kYXRhLnNlc3Npb25JZH0gcmVjZWl2ZWQgZGF0YTpgLCBkYXRhKTtcbiAgICAgICAgLy8gdG9kbyByZXBsYWNlIFxcbiB0byBcXHJcXG5cbiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgvXFxuL2csICdcXHJcXG4nKTtcbiAgICAgICAgLy8g0JLRi9Cy0L7QtNC40Lwg0LTQsNC90L3Ri9C1INCyIHh0ZXJtLmpzINGH0LXRgNC10LcgVGVybWluYWxVaVdyaXRlclxuICAgICAgICBpZiAoc2Vzc2lvbkRhdGEudGVybWluYWxVaVdyaXRlcikge1xuICAgICAgICAgIHNlc3Npb25EYXRhLnRlcm1pbmFsVWlXcml0ZXIud3JpdGVUZXh0KGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKGVycm9yOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8g0JLRi9Cy0L7QtNC40Lwg0L7RiNC40LHQutC4INCyIHh0ZXJtLmpzINGH0LXRgNC10LcgVGVybWluYWxVaVdyaXRlclxuICAgICAgICBpZiAoc2Vzc2lvbkRhdGEudGVybWluYWxVaVdyaXRlcikge1xuICAgICAgICAgIHNlc3Npb25EYXRhLnRlcm1pbmFsVWlXcml0ZXIud3JpdGVFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbkNvbm5lY3Q6ICgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVTZXNzaW9uQ29ubmVjdGlvblN0YXR1cyhjbGllbnRJZCwgc2Vzc2lvbkRhdGEuZGF0YS5zZXNzaW9uSWQsICdjb25uZWN0ZWQnKTtcbiAgICAgICAgY29uc29sZS5sb2coYFNlc3Npb24gJHtzZXNzaW9uRGF0YS5kYXRhLnNlc3Npb25JZH0gY29ubmVjdGVkIHRvIHNlcnZlcmApO1xuICAgICAgfSxcbiAgICAgIG9uRGlzY29ubmVjdDogKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVNlc3Npb25Db25uZWN0aW9uU3RhdHVzKGNsaWVudElkLCBzZXNzaW9uRGF0YS5kYXRhLnNlc3Npb25JZCwgJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICBjb25zb2xlLmxvZyhgU2Vzc2lvbiAke3Nlc3Npb25EYXRhLmRhdGEuc2Vzc2lvbklkfSBkaXNjb25uZWN0ZWQgZnJvbSBzZXJ2ZXJgKTtcbiAgICAgIH0sXG4gICAgICBvbk1lc3NhZ2U6IChtZXNzYWdlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFNlc3Npb24gJHtzZXNzaW9uRGF0YS5kYXRhLnNlc3Npb25JZH0gcmVjZWl2ZWQgbWVzc2FnZTpgLCBtZXNzYWdlKTtcbiAgICAgICAgLy8g0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdC8INGB0L7QvtCx0YnQtdC90LjRjyDQvtGCINGB0LXRgNCy0LXRgNCwXG4gICAgICAgIGlmIChtZXNzYWdlLmV2ZW50ID09PSBcInNlbmRLZXlcIiAmJiBtZXNzYWdlLmRhdGEgJiYgbWVzc2FnZS5kYXRhLmtleXMpIHtcbiAgICAgICAgICAvLyDQntGC0L/RgNCw0LLQu9GP0LXQvCDRgdC40LzQstC+0LvRiyDQsiBUZXJtaW5hbE1hbmFnZXJcbiAgICAgICAgICB0ZXJtaW5hbE1hbmFnZXIud3JpdGUobWVzc2FnZS5kYXRhLmtleXMpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25DdXJzb3JTdGF0ZTogKHNlc3Npb25JZDogc3RyaW5nLCBjb21tYW5kOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8g0JjRgdC/0L7Qu9GM0LfRg9C10LwgVGVybWluYWxVaVdyaXRlciDQtNC70Y8g0YHQvtCz0LvQsNGB0L7QstCw0L3QvdC+0Lkg0L7RgtGA0LjRgdC+0LLQutC4XG4gICAgICAgIGlmIChzZXNzaW9uRGF0YS50ZXJtaW5hbFVpV3JpdGVyKSB7XG4gICAgICAgICAgc2Vzc2lvbkRhdGEudGVybWluYWxVaVdyaXRlci53cml0ZShjb21tYW5kLCBwb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vINCh0L7RhdGA0LDQvdGP0LXQvCBUZXJtaW5hbE1hbmFnZXJcbiAgICBzZXNzaW9uRGF0YS50ZXJtaW5hbE1hbmFnZXIgPSB0ZXJtaW5hbE1hbmFnZXI7XG5cbiAgICAvLyDQntCx0YDQsNCx0L7RgtGH0LjQuiDQstCy0L7QtNCwINCyIFRlcm1pbmFsVWlcbiAgICB0ZXJtaW5hbFVpLm9uRGF0YSgoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAvLyDQntGC0L/RgNCw0LLQu9GP0LXQvCDQstCy0L7QtCDQsiBUZXJtaW5hbE1hbmFnZXJcbiAgICAgIHRlcm1pbmFsTWFuYWdlci53cml0ZShkYXRhKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyDQntCx0YDQsNCx0L7RgtGH0LjQuiDQuNC30LzQtdC90LXQvdC40Y8g0YDQsNC30LzQtdGA0LAg0YLQtdGA0LzQuNC90LDQu9CwXG4gICAgdGVybWluYWxVaS5vblJlc2l6ZSgoc2l6ZTogeyBjb2xzOiBudW1iZXI7IHJvd3M6IG51bWJlciB9KSA9PiB7XG4gICAgICAvLyDQntGC0L/RgNCw0LLQu9GP0LXQvCDQvdC+0LLRi9C5INGA0LDQt9C80LXRgCDQvdCwINGB0LXRgNCy0LXRgCDRh9C10YDQtdC3IFRlcm1pbmFsTWFuYWdlclxuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHNlc3Npb25EYXRhLnRlcm1pbmFsTWFuYWdlcj8uY29ubmVjdGlvbjtcbiAgICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IHtcbiAgICAgICAgICBldmVudDogXCJyZXNpemVcIiBhcyBjb25zdCxcbiAgICAgICAgICB0YXJnZXQ6IHNlc3Npb25EYXRhLmRhdGEuc2Vzc2lvbklkICxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBjb2xzOiBzaXplLmNvbHMsXG4gICAgICAgICAgICByb3dzOiBzaXplLnJvd3MsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAvLyBjb25uZWN0aW9uLnNlbmRNZXNzYWdlKG1zZyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLy8g0JLRi9Cy0L7QtNC40Lwg0L/RgNC40LLQtdGC0YHRgtCy0LXQvdC90L7QtSDRgdC+0L7QsdGJ0LXQvdC40LVcbiAgICAvL3RoaXMucHJpbnRXZWxjb21lTWVzc2FnZShjbGllbnRJZCwgc2Vzc2lvbkRhdGEuZGF0YS50YWJJZCk7XG4gICAgXG4gICAgLy8g0J/QvtC00LrQu9GO0YfQsNC10LzRgdGPINC6INGB0LXRgNCy0LXRgNGDINGH0LXRgNC10LcgVGVybWluYWxNYW5hZ2VyXG4gICAgc2Vzc2lvbkRhdGEudGVybWluYWxNYW5hZ2VyPy5jb25uZWN0KCd3ZWInKTtcbiAgfVxuXG4gIC8vINCS0YvQstC+0LQg0L/RgNC40LLQtdGC0YHRgtCy0LXQvdC90L7Qs9C+INGB0L7QvtCx0YnQtdC90LjRj1xuICBwcml2YXRlIHByaW50V2VsY29tZU1lc3NhZ2UoY2xpZW50SWQ6IHN0cmluZywgc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudHMuZmluZCh0ID0+IHQuY2xpZW50SWQgPT09IGNsaWVudElkKTtcbiAgICBpZiAoIWNsaWVudCkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHNlc3Npb24gPSBjbGllbnQuc2Vzc2lvbnMuZmluZChzID0+IHMuZGF0YS5zZXNzaW9uSWQgPT09IHNlc3Npb25JZCk7XG4gICAgaWYgKCFzZXNzaW9uIHx8ICFzZXNzaW9uLnRlcm1pbmFsVWlXcml0ZXIpIHJldHVybjtcbiAgICBcbiAgICAvLyBzZXNzaW9uLnRlcm1pbmFsVWlXcml0ZXIud3JpdGVMaW5lKFwiSGVsbG8gZnJvbSBKYXZhU2NyaXB0IFRlcm1pbmFsIVwiKTtcbiAgICAvLyBzZXNzaW9uLnRlcm1pbmFsVWlXcml0ZXIud3JpdGVMaW5lKFwiVHlwZSAnaGVscCcgZm9yIGF2YWlsYWJsZSBjb21tYW5kc1wiKTtcbiAgICAvLyBzZXNzaW9uLnRlcm1pbmFsVWlXcml0ZXIud3JpdGVMaW5lKFwiVXNlIHRlc3QgY29udHJvbHMgaW4gdG9wLXJpZ2h0IGNvcm5lclwiKTtcbiAgICAvLyBzZXNzaW9uLnRlcm1pbmFsVWlXcml0ZXIud3JpdGVMaW5lKFwiXCIpO1xuICB9XG5cbiAgLy8g0J7QsdC90L7QstC70LXQvdC40LUg0YHRgtCw0YLRg9GB0LAg0L/QvtC00LrQu9GO0YfQtdC90LjRjyDRgdC10YHRgdC40LhcbiAgcHJpdmF0ZSB1cGRhdGVTZXNzaW9uQ29ubmVjdGlvblN0YXR1cyhjbGllbnRJZDogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZywgc3RhdHVzOiAnd2FpdGluZycgfCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnKTogdm9pZCB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnRzLmZpbmQodCA9PiB0LmNsaWVudElkID09PSBjbGllbnRJZCk7XG4gICAgXG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGNsaWVudC5zZXNzaW9ucy5maW5kKHMgPT4gcy5kYXRhLnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKTtcbiAgICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICAgIHNlc3Npb24uZGF0YS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIC8vINCj0LLQtdC00L7QvNC70Y/QtdC8INC+0LEg0LjQt9C80LXQvdC10L3QuNC4INGB0YLQsNGC0YPRgdCwINGB0LXRgdGB0LjQuFxuICAgICAgICB0aGlzLmNhbGxiYWNrcy5vblNlc3Npb25TdGF0dXNDaGFuZ2VkPy4oY2xpZW50SWQsIHNlc3Npb25JZCwgc3RhdHVzKTtcbiAgICAgIFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vINCe0LHQvdC+0LLQu9C10L3QuNC1INGB0YLQsNGC0YPRgdCwINC60LvQuNC10L3RgtCwXG4gIHByaXZhdGUgdXBkYXRlQ2xpZW50U3RhdHVzKGNsaWVudElkOiBzdHJpbmcsIHN0YXR1czogJ3dhaXRpbmcnIHwgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJyk6IHZvaWQge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50cy5maW5kKGMgPT4gYy5jbGllbnRJZCA9PT0gY2xpZW50SWQpO1xuICAgIFxuICAgIGlmIChjbGllbnQpIHtcbiAgICAgIGNsaWVudC5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAvLyDQo9Cy0LXQtNC+0LzQu9GP0LXQvCDQvtCxINC40LfQvNC10L3QtdC90LjQuCDRgdGC0LDRgtGD0YHQsCDQutC70LjQtdC90YLQsFxuICAgICAgdGhpcy5jYWxsYmFja3Mub25DbGllbnRTdGF0dXNDaGFuZ2VkPy4oY2xpZW50SWQsIHN0YXR1cyk7XG4gICAgfVxuICB9XG5cbiBcblxuICAvLyDQn9C10YDQtdC60LvRjtGH0LXQvdC40LUg0L3QsCDQutC70LjQtdC90YLQsFxuICBwdWJsaWMgc3dpdGNoVG9UYWIoY2xpZW50SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdUZXJtaW5hbFRhYk1hbmFnZXIuc3dpdGNoVG9UYWIgY2FsbGVkIHdpdGg6JywgY2xpZW50SWQpO1xuICAgIGNvbnN0IGNsaWVudEluZGV4ID0gdGhpcy5jbGllbnRzLmZpbmRJbmRleCh0YWIgPT4gdGFiLmNsaWVudElkID09PSBjbGllbnRJZCk7XG4gXG4gICAgY29uc29sZS5sb2coJ0ZvdW5kIGNsaWVudCBpbmRleDonLCBjbGllbnRJbmRleCk7XG4gICAgaWYgKGNsaWVudEluZGV4ID09PSAtMSkgcmV0dXJuO1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50c1tjbGllbnRJbmRleF07XG4gICAgaWYgKCFjbGllbnQpIHJldHVybjtcbiAgICAvLyDQodC60YDRi9Cy0LDQtdC8INCy0YHQtSDRgtC10YDQvNC40L3QsNC70YtcbiAgICB0aGlzLmNsaWVudHMuZm9yRWFjaChjbGllbnQgPT4ge1xuICAgICAgY2xpZW50LnNlc3Npb25zLmZvckVhY2goc2Vzc2lvbiA9PiB7XG4gICAgICAgIHNlc3Npb24uZGF0YS5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgICBjbGllbnQuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyDQn9C+0LrQsNC30YvQstCw0LXQvCDQstGL0LHRgNCw0L3QvdC+0LPQviDQutC70LjQtdC90YLQsFxuICAgIGNvbnN0IGFjdGl2ZUNsaWVudCA9IHRoaXMuY2xpZW50c1tjbGllbnRJbmRleF07XG4gICAgaWYgKCFhY3RpdmVDbGllbnQpIHJldHVybjtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnU2V0dGluZyBhY3RpdmUgY2xpZW50OicsIGFjdGl2ZUNsaWVudC5jbGllbnRJZCwgYWN0aXZlQ2xpZW50Lm5hbWUpO1xuICAgICAvLyDQo9Cy0LXQtNC+0LzQu9GP0LXQvCDQvtCxINC40LfQvNC10L3QtdC90LjQuCDQsNC60YLQuNCy0L3QvtCz0L4g0LrQu9C40LXQvdGC0LBcbiAgICAgY29uc29sZS5sb2coJ0NhbGxpbmcgb25BY3RpdmVDbGllbnRDaGFuZ2VkIGNhbGxiYWNrIHdpdGg6JywgYWN0aXZlQ2xpZW50KTtcbiAgICAgdGhpcy5jYWxsYmFja3Mub25BY3RpdmVDbGllbnRDaGFuZ2VkPy4oYWN0aXZlQ2xpZW50KTsvLyB0b2RvIGZpeCBzZWN1ZW5jZSBjYWxsaW5nIGJlZm9yZSBjYWxsaW5nIG9uTmV3Q2xpZW50XG4gICAgLy8g0J/QvtC60LDQt9GL0LLQsNC10Lwg0L/QtdGA0LLRg9GOINCw0LrRgtC40LLQvdGD0Y4g0YHQtdGB0YHQuNGOINC40LvQuCDQv9C10YDQstGD0Y4g0YHQtdGB0YHQuNGOXG4gICAgY29uc3QgYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZUNsaWVudC5zZXNzaW9ucy5maW5kKHMgPT4gcy5kYXRhLmlzQWN0aXZlKSB8fCBhY3RpdmVDbGllbnQuc2Vzc2lvbnNbMF07XG4gICAgaWYgKGFjdGl2ZVNlc3Npb24pIHtcbiAgICAgIHRoaXMuc3dpdGNoVG9TZXNzaW9uKGNsaWVudC5jbGllbnRJZCwgYWN0aXZlU2Vzc2lvbi5kYXRhLnNlc3Npb25JZCk7XG4gICAgfVxuICAgIFxuICAgIC8vINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8INCw0LrRgtC40LLQvdC+0LPQviDQutC70LjQtdC90YLQsFxuICAgIHRoaXMuYWN0aXZlVGFiSW5kZXggPSBjbGllbnRJbmRleDtcbiAgICBhY3RpdmVDbGllbnQuaXNBY3RpdmUgPSB0cnVlO1xuICAgIFxuICAgXG4gIH1cblxuICAvLyDQn9C10YDQtdC60LvRjtGH0LXQvdC40LUg0L3QsCDRgdC10YHRgdC40Y5cbiAgcHVibGljIHN3aXRjaFRvU2Vzc2lvbihjbGllbnRJZDogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50cy5maW5kKHRhYiA9PiB0YWIuY2xpZW50SWQgPT09IGNsaWVudElkKTtcbiAgICBpZiAoIWNsaWVudCkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHNlc3Npb24gPSBjbGllbnQuc2Vzc2lvbnMuZmluZChzID0+IHMuZGF0YS5zZXNzaW9uSWQgPT09IHNlc3Npb25JZCk7XG4gICAgaWYgKCFzZXNzaW9uKSByZXR1cm47XG4gICAgXG4gICAgLy8g0KHQutGA0YvQstCw0LXQvCDQstGB0LUg0YLQtdGA0LzQuNC90LDQu9GLXG4gICAgdGhpcy5jbGllbnRzLmZvckVhY2goY2xpZW50ID0+IHtcbiAgICAgIGNsaWVudC5zZXNzaW9ucy5mb3JFYWNoKHNlc3Npb24gPT4ge1xuICAgICAgICBzZXNzaW9uLmRhdGEuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIC8vINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8INCw0LrRgtC40LLQvdGD0Y4g0YHQtdGB0YHQuNGOXG4gICAgc2Vzc2lvbi5kYXRhLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICAvLyDQo9Cy0LXQtNC+0LzQu9GP0LXQvCDQvtCxINC40LfQvNC10L3QtdC90LjQuCDQsNC60YLQuNCy0L3QvtC5INGB0LXRgdGB0LjQuFxuICAgIHRoaXMuY2FsbGJhY2tzLm9uQWN0aXZlU2Vzc2lvbkNoYW5nZWQ/LihzZXNzaW9uKTtcbiAgICBcbiAgICAvLyDQpNC+0LrRg9GB0LjRgNGD0LXQvNGB0Y8g0L3QsCBUZXJtaW5hbFVpXG4gICAgaWYgKHNlc3Npb24udGVybWluYWxVaSkge1xuICAgICAgc2Vzc2lvbi50ZXJtaW5hbFVpLmZvY3VzKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHNlc3Npb24uZml0QWRkb24pIHtcbiAgICAgICAgICBzZXNzaW9uLmZpdEFkZG9uLmZpdCgpO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIC8vINCX0LDQutGA0YvRgtC40LUg0LrQu9C40LXQvdGC0LBcbiAgcHVibGljIGNsb3NlQ2xpZW50KGNsaWVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjbGllbnRJbmRleCA9IHRoaXMuY2xpZW50cy5maW5kSW5kZXgodGFiID0+IHRhYi5jbGllbnRJZCA9PT0gY2xpZW50SWQpO1xuICAgIGlmIChjbGllbnRJbmRleCA9PT0gLTEpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudHNbY2xpZW50SW5kZXhdO1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG4gICAgXG4gICAgLy8g0KPQvdC40YfRgtC+0LbQsNC10Lwg0LLRgdC1INGB0LXRgdGB0LjQuCDQutC70LjQtdC90YLQsFxuICAgIGNsaWVudC5zZXNzaW9ucy5mb3JFYWNoKHNlc3Npb24gPT4ge1xuICAgICAgdGhpcy5kZXN0cm95U2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgIHRoaXMuY2FsbGJhY2tzLm9uU2Vzc2lvblJlbW92ZWQ/LihjbGllbnRJZCwgc2Vzc2lvbi5kYXRhLnNlc3Npb25JZCk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8g0KPQtNCw0LvRj9C10Lwg0LjQtyDQvNCw0YHRgdC40LLQsFxuICAgIHRoaXMuY2xpZW50cy5zcGxpY2UoY2xpZW50SW5kZXgsIDEpO1xuICAgIFxuICAgIC8vINCj0LLQtdC00L7QvNC70Y/QtdC8INC+0LEg0YPQtNCw0LvQtdC90LjQuCDQutC70LjQtdC90YLQsFxuICAgIHRoaXMuY2FsbGJhY2tzLm9uQ2xpZW50UmVtb3ZlZD8uKGNsaWVudC5jbGllbnRJZCk7XG4gICAgXG4gICAgLy8g0JXRgdC70Lgg0LfQsNC60YDRi9C70Lgg0LDQutGC0LjQstC90L7Qs9C+INC60LvQuNC10L3RgtCwLCDQv9C10YDQtdC60LvRjtGH0LDQtdC80YHRjyDQvdCwINC00YDRg9Cz0L7Qs9C+XG4gICAgaWYgKGNsaWVudEluZGV4ID09PSB0aGlzLmFjdGl2ZVRhYkluZGV4KSB7XG4gICAgICBpZiAodGhpcy5jbGllbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbmV3QWN0aXZlSW5kZXggPSBNYXRoLm1pbihjbGllbnRJbmRleCwgdGhpcy5jbGllbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgICBjb25zdCBuZXdDbGllbnQgPSB0aGlzLmNsaWVudHNbbmV3QWN0aXZlSW5kZXhdO1xuICAgICAgICBpZiAobmV3Q2xpZW50KSB7XG4gICAgICAgICAgdGhpcy5zd2l0Y2hUb1RhYihuZXdDbGllbnQuY2xpZW50SWQpO1xuICAgICAgICB9XG4gICAgICB9IFxuICAgIH0gZWxzZSBpZiAoY2xpZW50SW5kZXggPCB0aGlzLmFjdGl2ZVRhYkluZGV4KSB7XG4gICAgICB0aGlzLmFjdGl2ZVRhYkluZGV4LS07XG4gICAgfVxuICB9XG5cbiAgLy8g0JfQsNC60YDRi9GC0LjQtSDRgdC10YHRgdC40LhcbiAgcHVibGljIGNsb3NlU2Vzc2lvbihjbGllbnRJZDogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50cy5maW5kKHRhYiA9PiB0YWIuY2xpZW50SWQgPT09IGNsaWVudElkKTtcbiAgICBpZiAoIWNsaWVudCkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHNlc3Npb25JbmRleCA9IGNsaWVudC5zZXNzaW9ucy5maW5kSW5kZXgocyA9PiBzLmRhdGEuc2Vzc2lvbklkID09PSBzZXNzaW9uSWQpO1xuICAgIGlmIChzZXNzaW9uSW5kZXggPT09IC0xKSByZXR1cm47XG4gICAgXG4gICAgY29uc3Qgc2Vzc2lvbiA9IGNsaWVudC5zZXNzaW9uc1tzZXNzaW9uSW5kZXhdO1xuICAgIGlmICghc2Vzc2lvbikgcmV0dXJuO1xuICAgIFxuICAgIC8vINCj0L3QuNGH0YLQvtC20LDQtdC8INGB0LXRgdGB0LjRjlxuICAgIHRoaXMuZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7XG4gICAgXG4gICAgLy8g0KPQtNCw0LvRj9C10Lwg0LjQtyDQvNCw0YHRgdC40LLQsFxuICAgIGNsaWVudC5zZXNzaW9ucy5zcGxpY2Uoc2Vzc2lvbkluZGV4LCAxKTtcbiAgICBcbiAgICAvLyDQo9Cy0LXQtNC+0LzQu9GP0LXQvCDQvtCxINGD0LTQsNC70LXQvdC40Lgg0YHQtdGB0YHQuNC4XG4gICAgdGhpcy5jYWxsYmFja3Mub25TZXNzaW9uUmVtb3ZlZD8uKGNsaWVudElkLCBzZXNzaW9uSWQpO1xuICAgIFxuICAgIC8vINCV0YHQu9C4INGN0YLQviDQsdGL0LvQsCDQv9C+0YHQu9C10LTQvdGP0Y8g0YHQtdGB0YHQuNGPINC60LvQuNC10L3RgtCwLCDQt9Cw0LrRgNGL0LLQsNC10Lwg0LrQu9C40LXQvdGC0LBcbiAgICBpZiAoY2xpZW50LnNlc3Npb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jbG9zZUNsaWVudChjbGllbnRJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vINCV0YHQu9C4INC30LDQutGA0YvQu9C4INCw0LrRgtC40LLQvdGD0Y4g0YHQtdGB0YHQuNGOLCDQv9C10YDQtdC60LvRjtGH0LDQtdC80YHRjyDQvdCwINC00YDRg9Cz0YPRjlxuICAgIGlmIChzZXNzaW9uLmRhdGEuaXNBY3RpdmUpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZVNlc3Npb24gPSBjbGllbnQuc2Vzc2lvbnNbTWF0aC5taW4oc2Vzc2lvbkluZGV4LCBjbGllbnQuc2Vzc2lvbnMubGVuZ3RoIC0gMSldO1xuICAgICAgaWYgKG5ld0FjdGl2ZVNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5zd2l0Y2hUb1Nlc3Npb24oY2xpZW50SWQsIG5ld0FjdGl2ZVNlc3Npb24uZGF0YS5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgXG4gIH0gXG5cbiAgLy8g0KPQvdC40YfRgtC+0LbQtdC90LjQtSDRgdC10YHRgdC40LhcbiAgcHJpdmF0ZSBkZXN0cm95U2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uRGF0YSk6IHZvaWQge1xuICAgIC8vINCj0L3QuNGH0YLQvtC20LDQtdC8IFRlcm1pbmFsTWFuYWdlclxuICAgIGlmIChzZXNzaW9uLnRlcm1pbmFsTWFuYWdlcikge1xuICAgICAgc2Vzc2lvbi50ZXJtaW5hbE1hbmFnZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICBcbiAgICAvLyDQo9C90LjRh9GC0L7QttCw0LXQvCBUZXJtaW5hbFVpV3JpdGVyXG4gICAgaWYgKHNlc3Npb24udGVybWluYWxVaVdyaXRlcikge1xuICAgICAgc2Vzc2lvbi50ZXJtaW5hbFVpV3JpdGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgXG4gICAgLy8g0KPQvdC40YfRgtC+0LbQsNC10LwgVGVybWluYWxVaVxuICAgIGlmIChzZXNzaW9uLnRlcm1pbmFsVWkpIHtcbiAgICAgIHNlc3Npb24udGVybWluYWxVaS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIFxuICAgIC8vINCj0LTQsNC70Y/QtdC8IERPTSDRjdC70LXQvNC10L3RgiDRgtC10YDQvNC40L3QsNC70LAg0YfQtdGA0LXQtyBjYWxsYmFja1xuICAgIHRoaXMuY2FsbGJhY2tzLm9uUmVtb3ZlVGVybWluYWxET00/LihzZXNzaW9uLmRhdGEuc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8vINCf0LXRgNC10LrQu9GO0YfQtdC90LjQtSDRgNCw0LfQstC10YDQvdGD0YLQvtGB0YLQuCDQutC70LjQtdC90YLQsCAo0LfQsNCz0LvRg9GI0LrQsCDQtNC70Y8g0YHQvtCy0LzQtdGB0YLQuNC80L7RgdGC0LgpXG4gIHB1YmxpYyB0b2dnbGVDbGllbnRFeHBhbnNpb24oY2xpZW50SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vINCSINGD0L/RgNC+0YnQtdC90L3QvtC5INGB0YLRgNGD0LrRgtGD0YDQtSDRgNCw0LfQstC10YDRgtGL0LLQsNC90LjQtSDQvdC1INC40YHQv9C+0LvRjNC30YPQtdGC0YHRj1xuICAgIC8vINCh0LXRgdGB0LjQuCDQvtGC0L7QsdGA0LDQttCw0Y7RgtGB0Y8g0LIg0L7RgtC00LXQu9GM0L3QvtC8INC60L7QvdGC0LXQudC90LXRgNC1XG4gICAgY29uc29sZS5sb2coJ1RvZ2dsZSBleHBhbnNpb24gbm90IGltcGxlbWVudGVkIGluIHNpbXBsaWZpZWQgc3RydWN0dXJlJyk7XG4gIH1cblxuICAvLyDQn9C+0LvRg9GH0LXQvdC40LUg0LDQutGC0LjQstC90L7QuSDRgdC10YHRgdC40LhcbiAgcHVibGljIGdldEFjdGl2ZVNlc3Npb24oKTogU2Vzc2lvbkRhdGEgfCBudWxsIHtcbiAgICBjb25zdCBhY3RpdmVDbGllbnQgPSB0aGlzLmNsaWVudHNbdGhpcy5hY3RpdmVUYWJJbmRleF07XG4gICAgaWYgKCFhY3RpdmVDbGllbnQpIHJldHVybiBudWxsO1xuICAgIFxuICAgIHJldHVybiBhY3RpdmVDbGllbnQuc2Vzc2lvbnMuZmluZChzID0+IHMuZGF0YS5pc0FjdGl2ZSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8vINCf0L7Qu9GD0YfQtdC90LjQtSDQsNC60YLQuNCy0L3QvtCz0L4g0LrQu9C40LXQvdGC0LBcbiAgcHVibGljIGdldEFjdGl2ZUNsaWVudCgpOiBDbGllbnREYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50c1t0aGlzLmFjdGl2ZVRhYkluZGV4XSB8fCBudWxsO1xuICB9XG5cbiAgLy8g0J/QvtC70YPRh9C10L3QuNC1INCy0YHQtdGFINC60LvQuNC10L3RgtC+0LJcbiAgcHVibGljIGdldEFsbENsaWVudHMoKTogQ2xpZW50RGF0YVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY2xpZW50c107XG4gIH1cblxuICAvLyDQn9C+0LvRg9GH0LXQvdC40LUg0LLRgdC10YUg0YHQtdGB0YHQuNC5INC60LvQuNC10L3RgtCwXG4gIHB1YmxpYyBnZXRDbGllbnRTZXNzaW9ucyhjbGllbnRJZDogc3RyaW5nKTogU2Vzc2lvbkRhdGFbXSB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnRzLmZpbmQodGFiID0+IHRhYi5jbGllbnRJZCA9PT0gY2xpZW50SWQpO1xuICAgIHJldHVybiBjbGllbnQgPyBbLi4uY2xpZW50LnNlc3Npb25zXSA6IFtdO1xuICB9XG5cbiAgcHVibGljIHNlbmRIb3RLZXkoZGF0YTogSG90S2V5RGF0YSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhbGxiYWNrcy5vbkhvdEtleSkge1xuICAgICAgdGhpcy5jYWxsYmFja3Mub25Ib3RLZXkoZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgLy8g0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0LzQtdC90LXQtNC20LXRgNCwINGC0LDQsdC+0LJcbiAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgLy8g0J7QsdGA0LDQsdC+0YLRh9C40Log0LjQt9C80LXQvdC10L3QuNGPINGA0LDQt9C80LXRgNCwINC+0LrQvdCwXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aXZlU2Vzc2lvbiA9IHRoaXMuZ2V0QWN0aXZlU2Vzc2lvbigpO1xuICAgICAgaWYgKGFjdGl2ZVNlc3Npb24gJiYgYWN0aXZlU2Vzc2lvbi5maXRBZGRvbikge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBhY3RpdmVTZXNzaW9uLmZpdEFkZG9uPy5maXQoKTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyDQntCx0YDQsNCx0L7RgtGH0LjQuiDQt9Cw0LrRgNGL0YLQuNGPINGB0YLRgNCw0L3QuNGG0YtcbiAgICB3aW5kb3cub25iZWZvcmV1bmxvYWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNsaWVudHMuZm9yRWFjaChjbGllbnQgPT4ge1xuICAgICAgICBjbGllbnQuc2Vzc2lvbnMuZm9yRWFjaChzZXNzaW9uID0+IHtcbiAgICAgICAgICBpZiAoc2Vzc2lvbi50ZXJtaW5hbE1hbmFnZXIpIHtcbiAgICAgICAgICAgIHNlc3Npb24udGVybWluYWxNYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlc3Npb24udGVybWluYWxVaVdyaXRlcikge1xuICAgICAgICAgICAgc2Vzc2lvbi50ZXJtaW5hbFVpV3JpdGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxufVxuXG4vLyDQrdC60YHQv9C+0YDRgtC40YDRg9C10Lwg0LrQu9Cw0YHRgSDQtNC70Y8g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0LIg0LTRgNGD0LPQuNGFINC80L7QtNGD0LvRj9GFXG5leHBvcnQgeyBUZXJtaW5hbFRhYk1hbmFnZXIgfTtcbmV4cG9ydCB0eXBlIHsgQ2xpZW50RGF0YSwgU2Vzc2lvbkRhdGEsIFRlcm1pbmFsVGFiTWFuYWdlckNhbGxiYWNrcyB9O1xuIiwiaW1wb3J0IHsgVGVybWluYWxUYWJNYW5hZ2VyIH0gZnJvbSAnLi90ZXJtaW5hbC10YWItbWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7ICBDbGllbnREYXRhLCBTZXNzaW9uRGF0YSwgVGVybWluYWxUYWJNYW5hZ2VyQ2FsbGJhY2tzIH0gZnJvbSAnLi90ZXJtaW5hbC10YWItbWFuYWdlcic7XG5pbXBvcnQgeyBJZEdlbmVyYXRvciB9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBkZWNsYXJlIGNvbnN0IHByb2Nlc3M6IGFueTsgIFxuLy8g0KDQsNGB0YjQuNGA0Y/QtdC8INC40L3RgtC10YDRhNC10LnRgSBXaW5kb3cg0LTQu9GPINC00L7QsdCw0LLQu9C10L3QuNGPIHRlcm1pbmFsQXBwXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIHRlcm1pbmFsQXBwOiBUZXJtaW5hbEFwcDtcbiAgfVxufVxuXG4vLyDQrdC60YHQv9C+0YDRgtC40YDRg9C10LwgVGVybWluYWxVaVdyaXRlciDQtNC70Y8g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0LIg0LTRgNGD0LPQuNGFINC80L7QtNGD0LvRj9GFXG5leHBvcnQgeyBUZXJtaW5hbFVpV3JpdGVyIH0gZnJvbSAnLi90ZXJtaW5hbC11aS13cml0ZXInO1xuZXhwb3J0IHsgQ29tbWFuZEJ1aWxkZXIgfSBmcm9tICcuL2NvbW1hbmQtYnVpbGRlcic7XG5leHBvcnQgdHlwZSB7IFNlc3Npb25EYXRhIGFzIFNlc3Npb25NYW5hZ2VyRGF0YSwgU2Vzc2lvbkNyZWF0ZU9wdGlvbnMsIFNlc3Npb25NYW5hZ2VyQ2FsbGJhY2tzLCBTZXNzaW9uTWFuYWdlck9wdGlvbnMgfSBmcm9tICcuL3Nlc3Npb24tbWFuYWdlcic7XG5cbi8vINCi0LjQv9GLINC00LvRjyDQutC+0L3RhNC40LPRg9GA0LDRhtC40Lgg0YLQtdGA0LzQuNC90LDQu9CwXG5pbnRlcmZhY2UgVGVybWluYWxPcHRpb25zIHtcbiAgY3Vyc29yQmxpbms6IGJvb2xlYW47XG4gIGZvbnRGYW1pbHk/OiBzdHJpbmc7XG4gIGZvbnRTaXplPzogbnVtYmVyO1xufVxuXG4vLyDQmNGB0L/QvtC70YzQt9GD0LXQvCDRgtC40L/RiyDQuNC3IFRlcm1pbmFsVGFiTWFuYWdlclxuLy8gQ2xpZW50RGF0YSDQuCBTZXNzaW9uRGF0YSDRg9C20LUg0LjQvNC/0L7RgNGC0LjRgNC+0LLQsNC90Ysg0LjQtyB0ZXJtaW5hbC10YWItbWFuYWdlclxuXG4vLyDQotC40L/RiyDQtNC70Y8g0L7RgtCy0LXRgtCwIEFQSVxuaW50ZXJmYWNlIEFwaVJlc3BvbnNlIHtcbiAgY2xpZW50czogQ2xpZW50RGF0YVtdO1xufVxuXG4vKipcbiAqINCe0YHQvdC+0LLQvdC+0Lkg0LrQu9Cw0YHRgSDQv9GA0LjQu9C+0LbQtdC90LjRjyDRgtC10YDQvNC40L3QsNC70LBcbiAqINCY0L3QutCw0L/RgdGD0LvQuNGA0YPQtdGCINCy0YHRjiDQu9C+0LPQuNC60YMg0YPQv9GA0LDQstC70LXQvdC40Y8g0YLQsNCx0LDQvNC4INC4INGB0LXRgdGB0LjRj9C80LhcbiAqL1xuY2xhc3MgVGVybWluYWxBcHAge1xuICAvLyDQmtC+0L3RhNC40LPRg9GA0LDRhtC40Y8g0YLQtdGA0LzQuNC90LDQu9CwXG4gIHByaXZhdGUgdGVybWluYWxPcHRpb25zITogVGVybWluYWxPcHRpb25zO1xuICBcbiAgLy8gVGVybWluYWxUYWJNYW5hZ2VyINC00LvRjyDRg9C/0YDQsNCy0LvQtdC90LjRjyDRgtCw0LHQsNC80Lgg0Lgg0YHQtdGB0YHQuNGP0LzQuFxuICBwcml2YXRlIHRhYk1hbmFnZXIhOiBUZXJtaW5hbFRhYk1hbmFnZXI7XG4gIFxuICBcbiAgLy8g0JPQu9C+0LHQsNC70YzQvdGL0LUg0L/QtdGA0LXQvNC10L3QvdGL0LUg0LjQtyDRiNCw0LHQu9C+0L3QsFxuICBwcml2YXRlIHJlYWRvbmx5IGZvbnRGYW1pbHk6IHN0cmluZyA9IFwie2ZvbnRGYW1pbHl9XCI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9udFNpemU6IHN0cmluZyA9IFwie2ZvbnRTaXplfVwiO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudE5hbWU6IHN0cmluZyA9IFwie2NsaWVudE5hbWV9XCI7XG4gIHByaXZhdGUgIHdzVXJsOiBzdHJpbmcgPSAnd3M6Ly97YWRkcn06e3BvcnR9L3dzJztcbiAgcHJpdmF0ZSAgYXBpSG9zdDogc3RyaW5nID0gJ3tzY2hhbWV9Oi8ve2FkZHJ9Ontwb3J0fSc7XG4gIHByaXZhdGUgaXNEZWJ1ZyA9IHRydWU7XG5cbiAgcHJpdmF0ZSByb29tSWQ6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIGNsaWVudElkOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBkcmFnZ2VkRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zb2xlLmxvZyhgSXMgZGVidWcgOiAke3RoaXMuaXNEZWJ1Z31gKVxuICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCDQuCDQvdCw0YHRgtGA0LDQuNCy0LDQtdC8IHJvb21JZCAo0LTQtdC70LDQtdGCIHJlZGlyZWN0INC10YHQu9C4INC90YPQttC90L4pXG4gICAgY29uc3Qgcm9vbUlkUmVzdWx0ID0gdGhpcy5jaGVja0FuZFNldHVwUm9vbUlkKCk7XG4gICAgaWYgKHJvb21JZFJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgLy8g0J/RgNC+0LjQt9C+0YjQtdC7IHJlZGlyZWN0LCDQv9GA0LXRgNGL0LLQsNC10Lwg0LjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y5cbiAgICAgIC8vIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yb29tSWQgPSByb29tSWRSZXN1bHQ7XG5cbiAgICAvLyDQn9C+0LvRg9GH0LDQtdC8INC40LvQuCDQs9C10L3QtdGA0LjRgNGD0LXQvCBjbGllbnRJZFxuICAgIHRoaXMuY2xpZW50SWQgPSB0aGlzLmdldE9yR2VuZXJhdGVDbGllbnRJZCgpO1xuXG4gICAgY29uc29sZS5sb2coJ1Rlcm1pbmFsQXBwIGluaXRpYWxpemVkIHdpdGggcm9vbUlkOicsIHRoaXMucm9vbUlkLCAnY2xpZW50SWQ6JywgdGhpcy5jbGllbnRJZCwgJ2RlYnVnOicsIHRoaXMuaXNEZWJ1Zyk7XG5cbiAgICAvLyDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdC8INC+0L/RhtC40Lgg0YLQtdGA0LzQuNC90LDQu9CwXG4gICAgdGhpcy50ZXJtaW5hbE9wdGlvbnMgPSB7XG4gICAgICBjdXJzb3JCbGluazogdHJ1ZSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuZm9udEZhbWlseSkge1xuICAgICAgdGhpcy50ZXJtaW5hbE9wdGlvbnMuZm9udEZhbWlseSA9IHRoaXMuZm9udEZhbWlseTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb250U2l6ZSkge1xuICAgICAgdGhpcy50ZXJtaW5hbE9wdGlvbnMuZm9udFNpemUgPSBwYXJzZUludCh0aGlzLmZvbnRTaXplKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0RlYnVnKSB7XG4gICAgICAvLyDQldGB0LvQuCDRiNCw0LHQu9C+0L0g0L3QtSDQt9Cw0LzQtdC90LXQvSwg0LjRgdC/0L7Qu9GM0LfRg9C10LwgZmFsbGJhY2tcbiAgICAgIHRoaXMud3NVcmwgPSBgd3M6Ly9sb2NhbGhvc3Q6OTk5OS93cz9yb29tSWQ9JHt0aGlzLnJvb21JZH0mY2xpZW50SWQ9JHt0aGlzLmNsaWVudElkfSZjbGllbnRUeXBlPXdlYmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud3NVcmwgPSBgd3M6Ly8ke2RvY3VtZW50LmxvY2F0aW9uLmhvc3R9L3dzP3Jvb21JZD0ke3RoaXMucm9vbUlkfSZjbGllbnRJZD0ke3RoaXMuY2xpZW50SWR9JmNsaWVudFR5cGU9d2ViYDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0RlYnVnKSB7XG4gICAgICAvLyDQldGB0LvQuCDRiNCw0LHQu9C+0L0g0L3QtSDQt9Cw0LzQtdC90LXQvSwg0LjRgdC/0L7Qu9GM0LfRg9C10LwgZmFsbGJhY2tcbiAgICAgIHRoaXMuYXBpSG9zdCA9ICdodHRwOi8vbG9jYWxob3N0Ojk5OTknO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwaUhvc3QgPSBgJHtkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbH0vLyR7ZG9jdW1lbnQubG9jYXRpb24uaG9zdH1gO1xuICAgIH1cblxuICAgIC8vINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10LwgVGVybWluYWxUYWJNYW5hZ2VyXG4gICAgdGhpcy50YWJNYW5hZ2VyID0gbmV3IFRlcm1pbmFsVGFiTWFuYWdlcigpO1xuXG4gICAgLy8g0J3QsNGB0YLRgNCw0LjQstCw0LXQvCBBUEkg0YXQvtGB0YJcbiAgICB0aGlzLnRhYk1hbmFnZXIuc2V0QXBpSG9zdCh0aGlzLmFwaUhvc3QpO1xuXG4gICAgLy8g0J3QsNGB0YLRgNCw0LjQstCw0LXQvCByb29tSWQg0LTQu9GPINGE0LjQu9GM0YLRgNCw0YbQuNC4INC60LvQuNC10L3RgtC+0LJcbiAgICB0aGlzLnRhYk1hbmFnZXIuc2V0Um9vbUlkKHRoaXMucm9vbUlkKTtcblxuICAgIC8vINCd0LDRgdGC0YDQsNC40LLQsNC10LwgY2FsbGJhY2tzINC00LvRjyDQvtCx0L3QvtCy0LvQtdC90LjRjyBVSVxuICAgIHRoaXMuc2V0dXBUYWJNYW5hZ2VyQ2FsbGJhY2tzKCk7XG4gICAgdGhpcy50YWJNYW5hZ2VyLmNvbm5lY3RUb1VybCh0aGlzLndzVXJsKVxuICB9XG5cbiAgLyoqXG4gICAqINCf0YDQvtCy0LXRgNGP0LXRgiDQuCDQvdCw0YHRgtGA0LDQuNCy0LDQtdGCIHJvb21JZCDQsiBVUkxcbiAgICog0JLQvtC30LLRgNCw0YnQsNC10YIgcm9vbUlkINC40LvQuCBudWxsINC10YHQu9C4INC/0YDQvtC40LfQvtGI0LXQuyByZWRpcmVjdFxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0FuZFNldHVwUm9vbUlkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuXG4gICAgbGV0IHJvb21JZCA9ICcnO1xuXG4gICAgLy8g0J7Qv9GA0LXQtNC10LvRj9C10Lwg0L7RgtC60YPQtNCwINCx0YDQsNGC0Ywgcm9vbUlkINCyINC30LDQstC40YHQuNC80L7RgdGC0Lgg0L7RgiDRgNC10LbQuNC80LAg0L7RgtC70LDQtNC60LhcbiAgICBpZiAocm9vbUlkID09ICcnKSB7XG4gICAgICAvLyDQkiDRgNC10LbQuNC80LUg0L7RgtC70LDQtNC60Lgg0LjRgdC/0L7Qu9GM0LfRg9C10LwgcXVlcnkg0L/QsNGA0LDQvNC10YLRgFxuICAgICAgcm9vbUlkID0gdXJsUGFyYW1zLmdldCgncm9vbUlkJykgfHwgJyc7XG4gICAgICBjb25zb2xlLmxvZygnRGVidWcgbW9kZTogZXh0cmFjdGluZyByb29tSWQgZnJvbSBxdWVyeSBwYXJhbWV0ZXI6Jywgcm9vbUlkKTtcbiAgICB9XG4gICAgaWYgKHJvb21JZCA9PSAnJykge1xuICAgICAgLy8g0JIgcHJvZHVjdGlvbiDQuNGB0L/QvtC70YzQt9GD0LXQvCBwYXRoINC/0LDRgNCw0LzQtdGC0YBcbiAgICAgIHJvb21JZCA9IHBhdGguc3Vic3RyaW5nKDEpOyAvLyDQo9Cx0LjRgNCw0LXQvCDQv9C10YDQstGL0Lkg0YHQu9C10YhcbiAgICAgIGNvbnNvbGUubG9nKCdQcm9kdWN0aW9uIG1vZGU6IGV4dHJhY3Rpbmcgcm9vbUlkIGZyb20gcGF0aDonLCByb29tSWQpO1xuICAgIH1cbiAgICBpZiAoIUlkR2VuZXJhdG9yLmlzVmFsaWRJZChyb29tSWQpKSB7XG4gICAgICByb29tSWQgPSAnJ1xuICAgIH1cblxuICAgIC8vINCV0YHQu9C4IHJvb21JZCDQvdC10YIg0LIgVVJMINC40LvQuCDRjdGC0L4g0L/Rg9GB0YLQsNGPINGB0YLRgNC+0LrQsFxuICAgIGlmICghcm9vbUlkIHx8IHJvb21JZCA9PT0gJycpIHtcbiAgICAgIC8vINCf0YvRgtCw0LXQvNGB0Y8g0L/QvtC70YPRh9C40YLRjCDRgdC+0YXRgNCw0L3QtdC90L3Ri9C5IHJvb21JZCDQuNC3IGxvY2FsU3RvcmFnZVxuICAgICAgbGV0IHNhdmVkUm9vbUlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Jvb21JZCcpO1xuICAgICAgaWYgKHNhdmVkUm9vbUlkKSB7XG4gICAgICAgIHJvb21JZCA9IHNhdmVkUm9vbUlkO1xuICAgICAgfVxuICAgICAgLy8g0JXRgdC70Lgg0L3QtdGCINGB0L7RhdGA0LDQvdC10L3QvdC+0LPQviwg0LPQtdC90LXRgNC40YDRg9C10Lwg0L3QvtCy0YvQuVxuICAgICAgaWYgKCFJZEdlbmVyYXRvci5pc1ZhbGlkSWQoc2F2ZWRSb29tSWQgfHwgJycpKSB7XG4gICAgICAgIHNhdmVkUm9vbUlkID0gSWRHZW5lcmF0b3IuZ2VuZXJhdGVJZCgpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncm9vbUlkJywgc2F2ZWRSb29tSWQpO1xuICAgICAgICBjb25zb2xlLmxvZygnR2VuZXJhdGVkIG5ldyByb29tSWQ6Jywgc2F2ZWRSb29tSWQpO1xuICAgICAgICBpZiAoc2F2ZWRSb29tSWQpIHtcbiAgICAgICAgICByb29tSWQgPSBzYXZlZFJvb21JZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1VzaW5nIHNhdmVkIHJvb21JZDonLCBzYXZlZFJvb21JZCk7XG4gICAgICB9XG4gICAgICAvLyDQlNC10LvQsNC10LwgcmVkaXJlY3Qg0L3QsCBVUkwg0YEgcm9vbUlkINCyINC30LDQstC40YHQuNC80L7RgdGC0Lgg0L7RgiDRgNC10LbQuNC80LBcbiAgICAgIGlmICh0aGlzLmlzRGVidWcpIHtcbiAgICAgICAgLy8g0JIg0YDQtdC20LjQvNC1INC+0YLQu9Cw0LTQutC4INC40YHQv9C+0LvRjNC30YPQtdC8IHF1ZXJ5INC/0LDRgNCw0LzQtdGC0YBcbiAgICAgICAgLy8gIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYC8/cm9vbUlkPSR7c2F2ZWRSb29tSWR9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vINCSIHByb2R1Y3Rpb24g0LjRgdC/0L7Qu9GM0LfRg9C10LwgcGF0aCDQv9Cw0YDQsNC80LXRgtGAXG4gICAgICAgIC8vd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgLyR7c2F2ZWRSb29tSWR9YDtcblxuICAgICAgfVxuICAgICAgcmV0dXJuIHJvb21JZDsgLy8g0JLQvtC30LLRgNCw0YnQsNC10LwgbnVsbCDRh9GC0L7QsdGLINGD0LrQsNC30LDRgtGMINGH0YLQviDQsdGL0LsgcmVkaXJlY3RcbiAgICB9XG5cbiAgICAvLyDQodC+0YXRgNCw0L3Rj9C10Lwgcm9vbUlkINCyIGxvY2FsU3RvcmFnZVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyb29tSWQnLCByb29tSWQpO1xuICAgIGNvbnNvbGUubG9nKCdDdXJyZW50IHJvb21JZDonLCByb29tSWQsICdEZWJ1ZyBtb2RlOicsIHRoaXMuaXNEZWJ1Zyk7XG4gICAgcmV0dXJuIHJvb21JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDQn9C+0LvRg9GH0LDQtdGCINC40LvQuCDQs9C10L3QtdGA0LjRgNGD0LXRgiBjbGllbnRJZFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRPckdlbmVyYXRlQ2xpZW50SWQoKTogc3RyaW5nIHtcbiAgICAvLyDQn9GL0YLQsNC10LzRgdGPINC/0L7Qu9GD0YfQuNGC0Ywg0YHQvtGF0YDQsNC90LXQvdC90YvQuSBjbGllbnRJZFxuICAgIGxldCBjbGllbnRJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjbGllbnRJZCcpO1xuXG4gICAgLy8g0JXRgdC70Lgg0L3QtdGCINGB0L7RhdGA0LDQvdC10L3QvdC+0LPQviwg0LPQtdC90LXRgNC40YDRg9C10Lwg0L3QvtCy0YvQuVxuICAgIGlmICghY2xpZW50SWQpIHtcbiAgICAgIGNsaWVudElkID0gSWRHZW5lcmF0b3IuZ2VuZXJhdGVJZCgpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NsaWVudElkJywgY2xpZW50SWQpO1xuICAgICAgY29uc29sZS5sb2coJ0dlbmVyYXRlZCBuZXcgY2xpZW50SWQ6JywgY2xpZW50SWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnVXNpbmcgc2F2ZWQgY2xpZW50SWQ6JywgY2xpZW50SWQpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGllbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDQndCw0YHRgtGA0L7QudC60LAgY2FsbGJhY2tzINC00LvRjyBUZXJtaW5hbFRhYk1hbmFnZXJcbiAgICovXG4gIHByaXZhdGUgc2V0dXBUYWJNYW5hZ2VyQ2FsbGJhY2tzKCk6IHZvaWQge1xuICAgIGNvbnN0IGNhbGxiYWNrczogVGVybWluYWxUYWJNYW5hZ2VyQ2FsbGJhY2tzID0ge1xuICAgICAgb25OZXdDbGllbnQ6IChjbGllbnQ6IENsaWVudERhdGEpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ05ldyBjbGllbnQgY2FsbGJhY2s6JywgY2xpZW50KTtcbiAgICAgICAgdGhpcy5jcmVhdGVDbGllbnRET00oY2xpZW50KTtcbiAgICAgIH0sXG4gICAgICBvbkNsaWVudFJlbW92ZWQ6IChjbGllbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDbGllbnQgcmVtb3ZlZCBjYWxsYmFjazonLCBjbGllbnRJZCk7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2xpZW50RE9NKGNsaWVudElkKTtcblxuICAgICAgICAvLyDQldGB0LvQuCDQsdC+0LvRjNGI0LUg0L3QtdGCINC60LvQuNC10L3RgtC+0LIsINC/0L7QutCw0LfRi9Cy0LDQtdC8INC40L3RgdGC0YDRg9C60YbQuNC4XG4gICAgICAgIGNvbnN0IGFsbENsaWVudHMgPSB0aGlzLnRhYk1hbmFnZXIuZ2V0QWxsQ2xpZW50cygpO1xuICAgICAgICBpZiAoYWxsQ2xpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnNob3dDbGllbnRJbnN0cnVjdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uTmV3U2Vzc2lvbjogKGNsaWVudElkOiBzdHJpbmcsIHNlc3Npb246IFNlc3Npb25EYXRhKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdOZXcgc2Vzc2lvbiBjYWxsYmFjazonLCBjbGllbnRJZCwgc2Vzc2lvbik7XG4gICAgICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCwg0Y/QstC70Y/QtdGC0YHRjyDQu9C4INC60LvQuNC10L3RgiDQsNC60YLQuNCy0L3Ri9C8XG4gICAgICAgIGNvbnN0IGFjdGl2ZUNsaWVudCA9IHRoaXMudGFiTWFuYWdlci5nZXRBY3RpdmVDbGllbnQoKTtcbiAgICAgICAgaWYgKGFjdGl2ZUNsaWVudCAmJiBhY3RpdmVDbGllbnQuY2xpZW50SWQgPT09IGNsaWVudElkKSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVTZXNzaW9uRE9NKGNsaWVudElkLCBzZXNzaW9uKTtcbiAgICAgICAgICAvLyDQntCx0L3QvtCy0LvRj9C10Lwg0LDQutGC0LjQstC90YPRjiDRgdC10YHRgdC40Y4g0LIgRE9NXG4gICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVTZXNzaW9uRE9NKHNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25TZXNzaW9uUmVtb3ZlZDogKGNsaWVudElkOiBzdHJpbmcsIHNlc3Npb25JZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTZXNzaW9uIHJlbW92ZWQgY2FsbGJhY2s6JywgY2xpZW50SWQsIHNlc3Npb25JZCk7XG4gICAgICAgIHRoaXMucmVtb3ZlU2Vzc2lvbkRPTShzZXNzaW9uSWQpO1xuXG4gICAgICAgIC8vINCe0LHQvdC+0LLQu9GP0LXQvCDQvtGC0L7QsdGA0LDQttC10L3QuNC1INGB0LXRgdGB0LjQuSDQtNC70Y8g0LDQutGC0LjQstC90L7Qs9C+INC60LvQuNC10L3RgtCwXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNsaWVudCA9IHRoaXMudGFiTWFuYWdlci5nZXRBY3RpdmVDbGllbnQoKTtcbiAgICAgICAgaWYgKGFjdGl2ZUNsaWVudCAmJiBhY3RpdmVDbGllbnQuY2xpZW50SWQgPT09IGNsaWVudElkKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVTZXNzaW9uc0RPTShhY3RpdmVDbGllbnQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25DbGllbnRTdGF0dXNDaGFuZ2VkOiAoY2xpZW50SWQ6IHN0cmluZywgc3RhdHVzOiAnd2FpdGluZycgfCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDbGllbnQgc3RhdHVzIGNoYW5nZWQgY2FsbGJhY2s6JywgY2xpZW50SWQsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2xpZW50U3RhdHVzRE9NKGNsaWVudElkLCBzdGF0dXMpO1xuICAgICAgfSxcbiAgICAgIG9uU2Vzc2lvblN0YXR1c0NoYW5nZWQ6IChjbGllbnRJZDogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZywgc3RhdHVzOiAnd2FpdGluZycgfCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTZXNzaW9uIHN0YXR1cyBjaGFuZ2VkIGNhbGxiYWNrOicsIGNsaWVudElkLCBzZXNzaW9uSWQsIHN0YXR1cyk7XG4gICAgICAgIHRoaXMudXBkYXRlU2Vzc2lvblN0YXR1c0RPTShzZXNzaW9uSWQsIHN0YXR1cyk7XG4gICAgICB9LFxuICAgICAgb25BY3RpdmVDbGllbnRDaGFuZ2VkOiAoY2xpZW50OiBDbGllbnREYXRhIHwgbnVsbCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnQWN0aXZlIGNsaWVudCBjaGFuZ2VkIGNhbGxiYWNrOicsIGNsaWVudCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDbGllbnQgSUQ6JywgY2xpZW50Py5jbGllbnRJZCwgJ0NsaWVudCBuYW1lOicsIGNsaWVudD8ubmFtZSk7XG4gICAgICAgIHRoaXMudXBkYXRlQWN0aXZlQ2xpZW50RE9NKGNsaWVudCk7XG4gICAgICAgIC8vINCe0LHQvdC+0LLQu9GP0LXQvCDQvtGC0L7QsdGA0LDQttC10L3QuNC1INGB0LXRgdGB0LjQuSDQtNC70Y8g0LDQutGC0LjQstC90L7Qs9C+INC60LvQuNC10L3RgtCwXG4gICAgICAgIHRoaXMudXBkYXRlU2Vzc2lvbnNET00oY2xpZW50KTtcblxuICAgICAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgICAgLy8g0KHQutGA0YvQstCw0LXQvCDQuNC90YHRgtGA0YPQutGG0LjQuCDQv9GA0Lgg0L/QtdGA0LXQutC70Y7Rh9C10L3QuNC4INC90LAg0YHRg9GJ0LXRgdGC0LLRg9GO0YnQtdCz0L4g0LrQu9C40LXQvdGC0LBcbiAgICAgICAgICB0aGlzLmhpZGVDbGllbnRJbnN0cnVjdGlvbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDQldGB0LvQuCDQvdC10YIg0LDQutGC0LjQstC90L7Qs9C+INC60LvQuNC10L3RgtCwLCDQv9C+0LrQsNC30YvQstCw0LXQvCDQuNC90YHRgtGA0YPQutGG0LjQuFxuICAgICAgICAgIHRoaXMuc2hvd0NsaWVudEluc3RydWN0aW9ucygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25BY3RpdmVTZXNzaW9uQ2hhbmdlZDogKHNlc3Npb246IFNlc3Npb25EYXRhIHwgbnVsbCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnQWN0aXZlIHNlc3Npb24gY2hhbmdlZCBjYWxsYmFjazonLCBzZXNzaW9uKTtcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVTZXNzaW9uRE9NKHNlc3Npb24pO1xuICAgICAgICAvLyDQodC60YDRi9Cy0LDQtdC8INCy0YHQtSDRgtC10YDQvNC40L3QsNC70YtcbiAgICAgICAgdGhpcy5oaWRlQWxsVGVybWluYWxzKCk7XG4gICAgICAgIC8vINCf0L7QutCw0LfRi9Cy0LDQtdC8INCw0LrRgtC40LLQvdGL0Lkg0YLQtdGA0LzQuNC90LDQu1xuICAgICAgICBpZiAoc2Vzc2lvbikge1xuICAgICAgICAgIHRoaXMuc2hvd1Rlcm1pbmFsKHNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25DdXJzb3JTdGF0ZTogKHNlc3Npb25JZDogc3RyaW5nLCBjb21tYW5kOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0N1cnNvciBzdGF0ZSBjYWxsYmFjazonLCB7IHNlc3Npb25JZCwgY29tbWFuZCwgcG9zaXRpb24gfSk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ3Vyc29yU3RhdGVVcGRhdGUoc2Vzc2lvbklkLCBjb21tYW5kLCBwb3NpdGlvbik7XG4gICAgICB9LFxuICAgICAgb25SZW1vdmVUZXJtaW5hbERPTTogKHNlc3Npb25JZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmUgdGVybWluYWwgRE9NIGNhbGxiYWNrOicsIHNlc3Npb25JZCk7XG4gICAgICAgIHRoaXMucmVtb3ZlVGVybWluYWxET00oc2Vzc2lvbklkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy50YWJNYW5hZ2VyLnNldENhbGxiYWNrcyhjYWxsYmFja3MpO1xuICB9XG5cbiAgLyoqXG4gICAqINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10YIg0LjQvdGB0YLRgNGD0LrRhtC40Lgg0LTQu9GPINC/0L7QtNC60LvRjtGH0LXQvdC40Y8g0LrQu9C40LXQvdGC0L7QslxuICAgKiDQl9Cw0LzQtdC90Y/QtdGCINC/0LvQtdC50YHRhdC+0LvQtNC10YDRiyDQuCDQvdCw0YHRgtGA0LDQuNCy0LDQtdGCINC60L3QvtC/0LrQuCDQutC+0L/QuNGA0L7QstCw0L3QuNGPXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVDbGllbnRJbnN0cnVjdGlvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudEhvc3QgPSB3aW5kb3cubG9jYXRpb24uaG9zdDtcbiAgICBjb25zdCBob3N0UGFydHMgPSBjdXJyZW50SG9zdC5zcGxpdCgnOicpO1xuICAgIGNvbnN0IGhvc3RuYW1lID0gaG9zdFBhcnRzWzBdIHx8ICdsb2NhbGhvc3QnO1xuICAgIGNvbnN0IHBvcnQgPSBob3N0UGFydHNbMV07XG5cbiAgICAvLyDQldGB0LvQuCDQv9C+0YDRgiDQvdC1INGD0LrQsNC30LDQvSwg0LjRgdC/0L7Qu9GM0LfRg9C10Lwg0YHRgtCw0L3QtNCw0YDRgtC90YvQtSDQv9C+0YDRgtGLXG4gICAgY29uc3QgZGVmYXVsdFBvcnQgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonID8gJzQ0MycgOiAnODAnO1xuICAgIGNvbnN0IGZpbmFsUG9ydCA9IHBvcnQgfHwgZGVmYXVsdFBvcnQ7XG5cbiAgICAvLyDQndCw0YXQvtC00LjQvCDQstGB0LUg0Y3Qu9C10LzQtdC90YLRiyDRgSDQv9C70LXQudGB0YXQvtC70LTQtdGA0LDQvNC4XG4gICAgY29uc3QgY29tbWFuZEJveGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNvbW1hbmQtYm94Jyk7XG5cbiAgICBjb21tYW5kQm94ZXMuZm9yRWFjaChib3ggPT4ge1xuICAgICAgY29uc3QgY29tbWFuZFRleHRFbGVtZW50ID0gYm94LnF1ZXJ5U2VsZWN0b3IoJy5jb21tYW5kLXRleHQnKTtcbiAgICAgIGlmICghY29tbWFuZFRleHRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gY29tbWFuZFRleHRFbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgaWYgKCF0ZXh0Q29udGVudCkgcmV0dXJuO1xuXG4gICAgICAvLyDQn9GA0L7QstC10YDRj9C10LwsINC10YHRgtGMINC70Lgg0LXRidC1INC/0LvQtdC50YHRhdC+0LvQtNC10YDRi1xuICAgICAgaWYgKHRleHRDb250ZW50LmluY2x1ZGVzKCd7c2VydmVyfScpIHx8IHRleHRDb250ZW50LmluY2x1ZGVzKCd7cG9ydH0nKSB8fCB0ZXh0Q29udGVudC5pbmNsdWRlcygne3Jvb21JZH0nKSkge1xuICAgICAgICAvLyDQl9Cw0LzQtdC90Y/QtdC8INC/0LvQtdC50YHRhdC+0LvQtNC10YDRiyDQvdCwINCw0LrRgtGD0LDQu9GM0L3Ri9C1INC30L3QsNGH0LXQvdC40Y9cbiAgICAgICAgY29uc3QgdXBkYXRlZFRleHQgPSB0ZXh0Q29udGVudFxuICAgICAgICAgIC5yZXBsYWNlKC97c2VydmVyfS9nLCBob3N0bmFtZSlcbiAgICAgICAgICAucmVwbGFjZSgve3BvcnR9L2csIGZpbmFsUG9ydClcbiAgICAgICAgICAucmVwbGFjZSgve3Jvb21JZH0vZywgdGhpcy5yb29tSWQpO1xuICAgICAgICAvLyDQntCx0L3QvtCy0LvRj9C10Lwg0YLQtdC60YHRgiDQutC+0LzQsNC90LTRi1xuICAgICAgICBjb21tYW5kVGV4dEVsZW1lbnQudGV4dENvbnRlbnQgPSB1cGRhdGVkVGV4dDtcbiAgICAgIH1cblxuICAgICAgLy8g0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10Lwg0L7QsdGA0LDQsdC+0YLRh9C40Log0LrQvdC+0L/QutC4INC60L7Qv9C40YDQvtCy0LDQvdC40Y8g0LTQu9GPINCy0YHQtdGFINC60L3QvtC/0L7QulxuICAgICAgY29uc3QgY29weUJ0biA9IGJveC5xdWVyeVNlbGVjdG9yKCcuY29weS1idG4nKTtcbiAgICAgIGlmIChjb3B5QnRuKSB7XG4gICAgICAgIGNvcHlCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFRleHQgPSBjb21tYW5kVGV4dEVsZW1lbnQudGV4dENvbnRlbnQgfHwgJyc7XG4gICAgICAgICAgdGhpcy5jb3B5VG9DbGlwYm9hcmQoY3VycmVudFRleHQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKCdJbnN0cnVjdGlvbnMgaW5pdGlhbGl6ZWQgd2l0aCBob3N0OicsIGN1cnJlbnRIb3N0LCAncm9vbUlkOicsIHRoaXMucm9vbUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQmtC+0L/QuNGA0YPQtdGCINGC0LXQutGB0YIg0LIg0LHRg9GE0LXRgCDQvtCx0LzQtdC90LBcbiAgICovXG4gIHByaXZhdGUgY29weVRvQ2xpcGJvYXJkKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ0NvbW1hbmQgY29waWVkIHRvIGNsaXBib2FyZDonLCB0ZXh0KTtcbiAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNvcHkgdG8gY2xpcGJvYXJkOicsIGVycik7XG4gICAgICAvLyBGYWxsYmFjayDQtNC70Y8g0YHRgtCw0YDRi9GFINCx0YDQsNGD0LfQtdGA0L7QslxuICAgICAgY29uc3QgdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgICAgdGV4dEFyZWEudmFsdWUgPSB0ZXh0O1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0QXJlYSk7XG4gICAgICB0ZXh0QXJlYS5zZWxlY3QoKTtcbiAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRleHRBcmVhKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINC/0YDQuNC70L7QttC10L3QuNC1XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdC8IFRlcm1pbmFsVGFiTWFuYWdlclxuICAgIHRoaXMudGFiTWFuYWdlci5pbml0aWFsaXplKCk7XG5cbiAgICAvLyDQndCw0YHRgtGA0LDQuNCy0LDQtdC8INC+0LHRgNCw0LHQvtGC0YfQuNC60Lgg0YHQvtCx0YvRgtC40LlcbiAgICB0aGlzLnNldHVwRXZlbnRIYW5kbGVycygpO1xuICAgIC8vINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10Lwg0LjQvdGB0YLRgNGD0LrRhtC40Lgg0L/QvtC00LrQu9GO0YfQtdC90LjRj1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNsaWVudEluc3RydWN0aW9ucygpO1xuXG4gICAgLy8g0J/QvtC60LDQt9GL0LLQsNC10Lwg0LjQvdGB0YLRgNGD0LrRhtC40Lgg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4gKNC/0L7QutCwINC90LXRgiDQutC70LjQtdC90YLQvtCyKVxuICAgIHRoaXMuc2hvd0NsaWVudEluc3RydWN0aW9ucygpO1xuXG4gICAgLy8g0JfQsNC/0YPRgdC60LDQtdC8INC/0LXRgNC40L7QtNC40YfQtdGB0LrQvtC1INC+0LHQvdC+0LLQu9C10L3QuNC1INC60LvQuNC10L3RgtC+0LJcbiAgICB0aGlzLnRhYk1hbmFnZXIuc3RhcnRQb2xsaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICog0KHQvtC30LTQsNC90LjQtSBET00g0Y3Qu9C10LzQtdC90YLQsCDQtNC70Y8g0LrQu9C40LXQvdGC0LBcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ2xpZW50RE9NKGNsaWVudERhdGE6IENsaWVudERhdGEpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsaWVudHMnKTtcbiAgICBjb25zdCBuZXdUYWJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3LWNsaWVudC1idG4nKTtcblxuICAgIGlmICghdGFic0NvbnRhaW5lciB8fCAhbmV3VGFiQnRuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIERPTSBlbGVtZW50cyBub3QgZm91bmQnKTtcbiAgICB9XG5cbiAgICAvLyDQodC+0LfQtNCw0LXQvCDRjdC70LXQvNC10L3RgiDQutC70LjQtdC90YLQsCAo0YHQvtC+0YLQstC10YLRgdGC0LLRg9C10YIg0YHRg9GJ0LXRgdGC0LLRg9GO0YnQtdC80YMgSFRNTClcbiAgICBjb25zdCBjbGllbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY2xpZW50RWxlbWVudC5jbGFzc05hbWUgPSAnY2xpZW50JztcbiAgICBjbGllbnRFbGVtZW50LmlkID0gYCR7Y2xpZW50RGF0YS5jbGllbnRJZH1gO1xuICAgIGNsaWVudEVsZW1lbnQuZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgIGNvbnNvbGUubG9nKCdDcmVhdGluZyBjbGllbnQgRE9NIGVsZW1lbnQgd2l0aCBJRDonLCBgJHtjbGllbnREYXRhLmNsaWVudElkfWAsICdmb3IgY2xpZW50OicsIGNsaWVudERhdGEpO1xuXG4gICAgY2xpZW50RWxlbWVudC5pbm5lckhUTUwgPSBgXG4gICAgICA8c3BhbiBjbGFzcz1cImNsaWVudC1zdGF0dXNcIiBpZD1cImNsaWVudC1zdGF0dXMtJHtjbGllbnREYXRhLmNsaWVudElkfVwiIHN0eWxlPVwiXG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgd2lkdGg6IDhweDtcbiAgICAgICAgaGVpZ2h0OiA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYmFja2dyb3VuZDogIzY2NjtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiA2cHg7XG4gICAgICBcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImNsaWVudC1uYW1lXCI+JHtjbGllbnREYXRhLm5hbWV9PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjbGllbnQtdHlwZVwiPigke2NsaWVudERhdGEuY2xpZW50VHlwZX0pPC9zcGFuPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImNsaWVudC1jbG9zZVwiPsOXPC9idXR0b24+XG4gICAgYDtcblxuICAgIC8vINCe0LHRgNCw0LHQvtGC0YfQuNC6INC60LvQuNC60LAg0L3QsCDQutC70LjQtdC90YLQsCAo0L/QtdGA0LXQutC70Y7Rh9C10L3QuNC1KVxuICAgIGNsaWVudEVsZW1lbnQub25jbGljayA9IChldmVudCkgPT4ge1xuICAgICAgLy8g0J/RgNC+0LLQtdGA0Y/QtdC8LCDRh9GC0L4g0LrQu9C40Log0L3QtSDQv9C+INC60L3QvtC/0LrQtSDQt9Cw0LrRgNGL0YLQuNGPXG4gICAgICBpZiAoIShldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygnY2xpZW50LWNsb3NlJykpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NsaWVudCBjbGlja2VkOicsIGNsaWVudERhdGEuY2xpZW50SWQsIGNsaWVudERhdGEubmFtZSk7XG4gICAgICAgIHRoaXMudGFiTWFuYWdlci5zd2l0Y2hUb1RhYihjbGllbnREYXRhLmNsaWVudElkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8g0J7QsdGA0LDQsdC+0YLRh9C40Log0LrQu9C40LrQsCDQvdCwINC60L3QvtC/0LrRgyDQt9Cw0LrRgNGL0YLQuNGPXG4gICAgY29uc3QgY2xvc2VCdXR0b24gPSBjbGllbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jbGllbnQtY2xvc2UnKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBpZiAoY2xvc2VCdXR0b24pIHtcbiAgICAgIGNsb3NlQnV0dG9uLm9uY2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vINCf0YDQtdC00L7RgtCy0YDQsNGJ0LDQtdC8INCy0YHQv9C70YvRgtC40LUg0YHQvtCx0YvRgtC40Y9cbiAgICAgICAgdGhpcy5jbG9zZUNsaWVudChjbGllbnREYXRhLmNsaWVudElkIHx8IGNsaWVudERhdGEuY2xpZW50SWQpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBEcmFnIGFuZCBkcm9wINC+0LHRgNCw0LHQvtGC0YfQuNC60LhcbiAgICB0aGlzLnNldHVwRHJhZ0FuZERyb3AoY2xpZW50RWxlbWVudCwgJ2NsaWVudCcpO1xuXG4gICAgdGFic0NvbnRhaW5lci5pbnNlcnRCZWZvcmUoY2xpZW50RWxlbWVudCwgbmV3VGFiQnRuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQo9C00LDQu9C10L3QuNC1IERPTSDRjdC70LXQvNC10L3RgtCwINC60LvQuNC10L3RgtCwXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZUNsaWVudERPTShjbGllbnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2xpZW50RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNsaWVudElkKTtcbiAgICBpZiAoY2xpZW50RWxlbWVudCkge1xuICAgICAgY2xpZW50RWxlbWVudC5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog0KHQvtC30LTQsNC90LjQtSBET00g0Y3Qu9C10LzQtdC90YLQsCDQtNC70Y8g0YHQtdGB0YHQuNC4XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVNlc3Npb25ET00oY2xpZW50SWQ6IHN0cmluZywgc2Vzc2lvbkRhdGE6IFNlc3Npb25EYXRhKTogdm9pZCB7XG4gICAgY29uc3Qgc2Vzc2lvbnNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMnKTtcbiAgICBjb25zdCBuZXdTZXNzaW9uQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ldy1zZXNzaW9uLWJ0bicpO1xuXG4gICAgaWYgKCFzZXNzaW9uc0NvbnRhaW5lciB8fCAhbmV3U2Vzc2lvbkJ0bikgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2Vzc2lvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzZXNzaW9uRWxlbWVudC5jbGFzc05hbWUgPSAnc2Vzc2lvbic7XG4gICAgc2Vzc2lvbkVsZW1lbnQuaWQgPSBgc2Vzc2lvbi0ke3Nlc3Npb25EYXRhLmRhdGEuc2Vzc2lvbklkfWA7XG4gICAgc2Vzc2lvbkVsZW1lbnQuZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgIHNlc3Npb25FbGVtZW50LmlubmVySFRNTCA9IGBcbiAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1zdGF0dXNcIiBpZD1cInNlc3Npb24tc3RhdHVzLSR7c2Vzc2lvbkRhdGEuZGF0YS5zZXNzaW9uSWR9XCIgc3R5bGU9XCJcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB3aWR0aDogNnB4O1xuICAgICAgICBoZWlnaHQ6IDZweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjNjY2O1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICAgIFwiPjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1uYW1lXCI+JHtzZXNzaW9uRGF0YS5kYXRhLm5hbWV9PC9zcGFuPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlc3Npb24tY2xvc2VcIj7DlzwvYnV0dG9uPlxuICAgIGA7XG5cbiAgICAvLyDQntCx0YDQsNCx0L7RgtGH0LjQuiDQutC70LjQutCwINC90LAg0YHQtdGB0YHQuNGOICjQv9C10YDQtdC60LvRjtGH0LXQvdC40LUpXG4gICAgc2Vzc2lvbkVsZW1lbnQub25jbGljayA9IChldmVudCkgPT4ge1xuICAgICAgLy8g0J/RgNC+0LLQtdGA0Y/QtdC8LCDRh9GC0L4g0LrQu9C40Log0L3QtSDQv9C+INC60L3QvtC/0LrQtSDQt9Cw0LrRgNGL0YLQuNGPXG4gICAgICBpZiAoIShldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygnc2Vzc2lvbi1jbG9zZScpKSB7XG4gICAgICAgIHRoaXMudGFiTWFuYWdlci5zd2l0Y2hUb1Nlc3Npb24oY2xpZW50SWQsIHNlc3Npb25EYXRhLmRhdGEuc2Vzc2lvbklkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8g0J7QsdGA0LDQsdC+0YLRh9C40Log0LrQu9C40LrQsCDQvdCwINC60L3QvtC/0LrRgyDQt9Cw0LrRgNGL0YLQuNGPXG4gICAgY29uc3QgY2xvc2VCdXR0b24gPSBzZXNzaW9uRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2Vzc2lvbi1jbG9zZScpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xuICAgIGlmIChjbG9zZUJ1dHRvbikge1xuICAgICAgY2xvc2VCdXR0b24ub25jbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8g0J/RgNC10LTQvtGC0LLRgNCw0YnQsNC10Lwg0LLRgdC/0LvRi9GC0LjQtSDRgdC+0LHRi9GC0LjRj1xuICAgICAgICB0aGlzLmNsb3NlU2Vzc2lvbihjbGllbnRJZCwgc2Vzc2lvbkRhdGEuZGF0YS5zZXNzaW9uSWQpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBEcmFnIGFuZCBkcm9wINC+0LHRgNCw0LHQvtGC0YfQuNC60LhcbiAgICB0aGlzLnNldHVwRHJhZ0FuZERyb3Aoc2Vzc2lvbkVsZW1lbnQsICdzZXNzaW9uJyk7XG5cbiAgICBzZXNzaW9uc0NvbnRhaW5lci5pbnNlcnRCZWZvcmUoc2Vzc2lvbkVsZW1lbnQsIG5ld1Nlc3Npb25CdG4pO1xuICB9XG5cbiAgLyoqXG4gICAqINCj0LTQsNC70LXQvdC40LUgRE9NINGN0LvQtdC80LXQvdGC0LAg0YHQtdGB0YHQuNC4XG4gICAqL1xuICBwcml2YXRlIHJlbW92ZVNlc3Npb25ET00oc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzZXNzaW9uRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzZXNzaW9uLSR7c2Vzc2lvbklkfWApO1xuICAgIGlmIChzZXNzaW9uRWxlbWVudCkge1xuICAgICAgc2Vzc2lvbkVsZW1lbnQucmVtb3ZlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiDQntCx0L3QvtCy0LvQtdC90LjQtSDRgdGC0LDRgtGD0YHQsCDQutC70LjQtdC90YLQsCDQsiBET01cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ2xpZW50U3RhdHVzRE9NKGNsaWVudElkOiBzdHJpbmcsIHN0YXR1czogJ3dhaXRpbmcnIHwgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJyk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXR1c0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgY2xpZW50LXN0YXR1cy0ke2NsaWVudElkfWApO1xuICAgIGlmICghc3RhdHVzRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgJ2Nvbm5lY3RlZCc6XG4gICAgICAgIHN0YXR1c0VsZW1lbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjNENBRjUwJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkaXNjb25uZWN0ZWQnOlxuICAgICAgICBzdGF0dXNFbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSAnI2Y0NDMzNic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2FpdGluZyc6XG4gICAgICAgIHN0YXR1c0VsZW1lbnQuc3R5bGUuYmFja2dyb3VuZCA9ICcjRkY5ODAwJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzdGF0dXNFbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSAnIzY2Nic7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqINCe0LHQvdC+0LLQu9C10L3QuNC1INGB0YLQsNGC0YPRgdCwINGB0LXRgdGB0LjQuCDQsiBET01cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlU2Vzc2lvblN0YXR1c0RPTShzZXNzaW9uSWQ6IHN0cmluZywgc3RhdHVzOiAnd2FpdGluZycgfCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdHVzRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzZXNzaW9uLXN0YXR1cy0ke3Nlc3Npb25JZH1gKTtcbiAgICBpZiAoIXN0YXR1c0VsZW1lbnQpIHJldHVybjtcblxuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICBjYXNlICdjb25uZWN0ZWQnOlxuICAgICAgICBzdGF0dXNFbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSAnIzRDQUY1MCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGlzY29ubmVjdGVkJzpcbiAgICAgICAgc3RhdHVzRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmNDQzMzYnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dhaXRpbmcnOlxuICAgICAgICBzdGF0dXNFbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSAnI0ZGOTgwMCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc3RhdHVzRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJyM2NjYnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDQntCx0L3QvtCy0LvQtdC90LjQtSDQsNC60YLQuNCy0L3QvtCz0L4g0LrQu9C40LXQvdGC0LAg0LIgRE9NXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUFjdGl2ZUNsaWVudERPTShjbGllbnQ6IENsaWVudERhdGEgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ3VwZGF0ZUFjdGl2ZUNsaWVudERPTSBjYWxsZWQgd2l0aCBjbGllbnQ6JywgY2xpZW50KTtcbiAgICAvLyDQo9Cx0LjRgNCw0LXQvCDQsNC60YLQuNCy0L3Ri9C5INC60LvQsNGB0YEg0YHQviDQstGB0LXRhSDQutC70LjQtdC90YLQvtCyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNsaWVudCcpLmZvckVhY2godGFiID0+IHtcbiAgICAgIHRhYi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICB9KTtcblxuICAgIGlmIChjbGllbnQpIHtcbiAgICAgIC8vINCY0YHQv9C+0LvRjNC30YPQtdC8IGNsaWVudC5pZCAo0LLQvdGD0YLRgNC10L3QvdC40LkgSUQpLCDQsCDQvdC1IGNsaWVudC5jbGllbnRJZFxuICAgICAgY29uc3QgY2xpZW50RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNsaWVudC5jbGllbnRJZCk7XG4gICAgICBjb25zb2xlLmxvZygnTG9va2luZyBmb3IgY2xpZW50IGVsZW1lbnQgd2l0aCBJRDonLCBgJHtjbGllbnQuY2xpZW50SWR9YCwgJ0ZvdW5kOicsIGNsaWVudEVsZW1lbnQpO1xuXG4gICAgICBpZiAoY2xpZW50RWxlbWVudCkge1xuICAgICAgICAvLyDQlNC+0LHQsNCy0LvRj9C10Lwg0LDQutGC0LjQstC90YvQuSDQutC70LDRgdGBXG4gICAgICAgIGNsaWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdBZGRlZCBhY3RpdmUgY2xhc3MgdG86JywgY2xpZW50RWxlbWVudC5pZCk7XG5cbiAgICAgICAgLy8g0J7QsdC90L7QstC70Y/QtdC8INGB0L7QtNC10YDQttC40LzQvtC1INGN0LvQtdC80LXQvdGC0LAgKNGB0LjQvdGF0YDQvtC90LjQt9Cw0YbQuNGPINGBIGNyZWF0ZUNsaWVudERPTSlcbiAgICAgICAgY29uc3Qgc3RhdHVzRWxlbWVudCA9IGNsaWVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmNsaWVudC1zdGF0dXMnKTtcbiAgICAgICAgY29uc3QgbmFtZUVsZW1lbnQgPSBjbGllbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jbGllbnQtbmFtZScpO1xuICAgICAgICBjb25zdCB0eXBlRWxlbWVudCA9IGNsaWVudEVsZW1lbnQucXVlcnlTZWxlY3RvcignLmNsaWVudC10eXBlJyk7XG5cbiAgICAgICAgaWYgKHN0YXR1c0VsZW1lbnQpIHtcbiAgICAgICAgICAvLyDQntCx0L3QvtCy0LvRj9C10LwgSUQg0YHRgtCw0YLRg9GB0LAg0LTQu9GPINC60L7RgNGA0LXQutGC0L3QvtC5INGA0LDQsdC+0YLRiyB1cGRhdGVDbGllbnRTdGF0dXNET01cbiAgICAgICAgICBzdGF0dXNFbGVtZW50LmlkID0gYGNsaWVudC1zdGF0dXMtJHtjbGllbnQuY2xpZW50SWR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYW1lRWxlbWVudCkge1xuICAgICAgICAgIG5hbWVFbGVtZW50LnRleHRDb250ZW50ID0gY2xpZW50Lm5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZUVsZW1lbnQpIHtcbiAgICAgICAgICB0eXBlRWxlbWVudC50ZXh0Q29udGVudCA9IGAoJHtjbGllbnQuY2xpZW50VHlwZX0pYDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vINCe0LHQvdC+0LLQu9GP0LXQvCDQvtCx0YDQsNCx0L7RgtGH0LjQutC4INGB0L7QsdGL0YLQuNC5ICjRgdC40L3RhdGA0L7QvdC40LfQsNGG0LjRjyDRgSBjcmVhdGVDbGllbnRET00pXG4gICAgICAgIGNsaWVudEVsZW1lbnQub25jbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICAgIGlmICghKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbGllbnQtY2xvc2UnKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0NsaWVudCBjbGlja2VkOicsIGNsaWVudC5jbGllbnRJZCwgY2xpZW50Lm5hbWUpO1xuICAgICAgICAgICAgdGhpcy50YWJNYW5hZ2VyLnN3aXRjaFRvVGFiKGNsaWVudC5jbGllbnRJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNsb3NlQnV0dG9uID0gY2xpZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuY2xpZW50LWNsb3NlJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgICAgIGlmIChjbG9zZUJ1dHRvbikge1xuICAgICAgICAgIGNsb3NlQnV0dG9uLm9uY2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZUNsaWVudChjbGllbnQuY2xpZW50SWQpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NsaWVudCBlbGVtZW50IG5vdCBmb3VuZCBmb3IgSUQ6JywgYCR7Y2xpZW50LmNsaWVudElkfWApO1xuICAgICAgICAvLyDQntGC0LvQsNC00L7Rh9C90LDRjyDQuNC90YTQvtGA0LzQsNGG0LjRj1xuICAgICAgICBjb25zdCBhbGxDbGllbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNsaWVudCcpO1xuICAgICAgICBjb25zb2xlLmxvZygnQWxsIGNsaWVudCBlbGVtZW50cyBmb3VuZDonLCBBcnJheS5mcm9tKGFsbENsaWVudHMpLm1hcChlbCA9PiBlbC5pZCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnTm8gYWN0aXZlIGNsaWVudCwgYWxsIGNsaWVudHMgZGVhY3RpdmF0ZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog0J7QsdC90L7QstC70LXQvdC40LUg0LDQutGC0LjQstC90L7QuSDRgdC10YHRgdC40Lgg0LIgRE9NXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUFjdGl2ZVNlc3Npb25ET00oc2Vzc2lvbjogU2Vzc2lvbkRhdGEgfCBudWxsKTogdm9pZCB7XG4gICAgLy8g0KPQsdC40YDQsNC10Lwg0LDQutGC0LjQstC90YvQuSDQutC70LDRgdGBINGB0L4g0LLRgdC10YUg0YHQtdGB0YHQuNC5XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlc3Npb24nKS5mb3JFYWNoKHRhYiA9PiB7XG4gICAgICB0YWIuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgfSk7XG5cbiAgICBpZiAoc2Vzc2lvbikge1xuICAgICAgY29uc3Qgc2Vzc2lvbkVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc2Vzc2lvbi0ke3Nlc3Npb24uZGF0YS5zZXNzaW9uSWR9YCk7XG4gICAgICBpZiAoc2Vzc2lvbkVsZW1lbnQpIHtcbiAgICAgICAgc2Vzc2lvbkVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqINCe0LHQvdC+0LLQu9C10L3QuNC1INC+0YLQvtCx0YDQsNC20LXQvdC40Y8g0YHQtdGB0YHQuNC5INC00LvRjyDQsNC60YLQuNCy0L3QvtCz0L4g0LrQu9C40LXQvdGC0LBcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlU2Vzc2lvbnNET00oY2xpZW50OiBDbGllbnREYXRhIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHNlc3Npb25zQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zJyk7XG4gICAgY29uc3QgbmV3U2Vzc2lvbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctc2Vzc2lvbi1idG4nKTtcblxuICAgIGlmICghc2Vzc2lvbnNDb250YWluZXIgfHwgIW5ld1Nlc3Npb25CdG4pIHJldHVybjtcblxuICAgIC8vINCj0LTQsNC70Y/QtdC8INCy0YHQtSDRgdGD0YnQtdGB0YLQstGD0Y7RidC40LUg0YHQtdGB0YHQuNC4INC40LcgRE9NICjQutGA0L7QvNC1INC60L3QvtC/0LrQuCBOZXcgU2Vzc2lvbilcbiAgICBjb25zdCBleGlzdGluZ1Nlc3Npb25zID0gc2Vzc2lvbnNDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnNlc3Npb24nKTtcbiAgICBleGlzdGluZ1Nlc3Npb25zLmZvckVhY2goc2Vzc2lvbiA9PiBzZXNzaW9uLnJlbW92ZSgpKTtcblxuICAgIGlmIChjbGllbnQgJiYgY2xpZW50LnNlc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vINCU0L7QsdCw0LLQu9GP0LXQvCDRgdC10YHRgdC40Lgg0LDQutGC0LjQstC90L7Qs9C+INC60LvQuNC10L3RgtCwXG4gICAgICBjbGllbnQuc2Vzc2lvbnMuZm9yRWFjaChzZXNzaW9uID0+IHtcbiAgICAgICAgdGhpcy5jcmVhdGVTZXNzaW9uRE9NKGNsaWVudC5jbGllbnRJZCwgc2Vzc2lvbik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog0KHQutGA0YvRgtC40LUg0LLRgdC10YUg0YLQtdGA0LzQuNC90LDQu9C+0LJcbiAgICovXG4gIHByaXZhdGUgaGlkZUFsbFRlcm1pbmFscygpOiB2b2lkIHtcbiAgICBjb25zdCBhbGxDbGllbnRzID0gdGhpcy50YWJNYW5hZ2VyLmdldEFsbENsaWVudHMoKTtcbiAgICBhbGxDbGllbnRzLmZvckVhY2goY2xpZW50ID0+IHtcbiAgICAgIGNsaWVudC5zZXNzaW9ucy5mb3JFYWNoKHNlc3Npb24gPT4ge1xuICAgICAgICBjb25zdCB0ZXJtaW5hbERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGB0ZXJtaW5hbC0ke3Nlc3Npb24uZGF0YS5zZXNzaW9uSWR9YCk7XG4gICAgICAgIGlmICh0ZXJtaW5hbERpdikge1xuICAgICAgICAgIHRlcm1pbmFsRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqINCf0L7QutCw0Lcg0YLQtdGA0LzQuNC90LDQu9C+0LIg0LrQu9C40LXQvdGC0LBcbiAgICovXG4gIHByaXZhdGUgc2hvd0NsaWVudFRlcm1pbmFscyhjbGllbnQ6IENsaWVudERhdGEpOiB2b2lkIHtcbiAgICBjbGllbnQuc2Vzc2lvbnMuZm9yRWFjaChzZXNzaW9uID0+IHtcbiAgICAgIGNvbnN0IHRlcm1pbmFsRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHRlcm1pbmFsLSR7c2Vzc2lvbi5kYXRhLnNlc3Npb25JZH1gKTtcbiAgICAgIGlmICh0ZXJtaW5hbERpdikge1xuICAgICAgICB0ZXJtaW5hbERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQn9C+0LrQsNC3INC60L7QvdC60YDQtdGC0L3QvtCz0L4g0YLQtdGA0LzQuNC90LDQu9CwXG4gICAqL1xuICBwcml2YXRlIHNob3dUZXJtaW5hbChzZXNzaW9uOiBTZXNzaW9uRGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IHRlcm1pbmFsRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHRlcm1pbmFsLSR7c2Vzc2lvbi5kYXRhLnNlc3Npb25JZH1gKTtcbiAgICBpZiAodGVybWluYWxEaXYpIHtcbiAgICAgIHRlcm1pbmFsRGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICog0J/QtdGA0LXQutC70Y7Rh9C10L3QuNC1INC90LAg0LrQu9C40LXQvdGC0LBcbiAgICovXG4gIHB1YmxpYyBzd2l0Y2hUb0NsaWVudChjbGllbnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy50YWJNYW5hZ2VyLmdldEFsbENsaWVudHMoKS5maW5kKGMgPT4gYy5jbGllbnRJZCA9PT0gY2xpZW50SWQpO1xuICAgIGlmIChjbGllbnQpIHtcbiAgICAgIHRoaXMudGFiTWFuYWdlci5zd2l0Y2hUb1RhYihjbGllbnQuY2xpZW50SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDQn9C10YDQtdC60LvRjtGH0LXQvdC40LUg0L3QsCDRgdC10YHRgdC40Y5cbiAgICovXG4gIHB1YmxpYyBzd2l0Y2hUb1Nlc3Npb24oY2xpZW50SWQ6IHN0cmluZywgc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLnRhYk1hbmFnZXIuZ2V0QWxsQ2xpZW50cygpLmZpbmQoYyA9PiBjLmNsaWVudElkID09PSBjbGllbnRJZCk7XG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgdGhpcy50YWJNYW5hZ2VyLnN3aXRjaFRvU2Vzc2lvbihjbGllbnQuY2xpZW50SWQsIHNlc3Npb25JZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqINCX0LDQutGA0YvRgtC40LUg0LrQu9C40LXQvdGC0LBcbiAgICovXG4gIHB1YmxpYyBjbG9zZUNsaWVudChjbGllbnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy50YWJNYW5hZ2VyLmdldEFsbENsaWVudHMoKS5maW5kKGMgPT4gYy5jbGllbnRJZCA9PT0gY2xpZW50SWQpO1xuICAgIGlmIChjbGllbnQpIHtcbiAgICAgIHRoaXMudGFiTWFuYWdlci5jbG9zZUNsaWVudChjbGllbnQuY2xpZW50SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDQl9Cw0LrRgNGL0YLQuNC1INGB0LXRgdGB0LjQuFxuICAgKi9cbiAgcHVibGljIGNsb3NlU2Vzc2lvbihjbGllbnRJZDogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMudGFiTWFuYWdlci5nZXRBbGxDbGllbnRzKCkuZmluZChjID0+IGMuY2xpZW50SWQgPT09IGNsaWVudElkKTtcbiAgICBpZiAoY2xpZW50KSB7XG4gICAgICB0aGlzLnRhYk1hbmFnZXIuY2xvc2VTZXNzaW9uKGNsaWVudC5jbGllbnRJZCwgc2Vzc2lvbklkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog0J3QsNGB0YLRgNC+0LnQutCwINC+0LHRgNCw0LHQvtGC0YfQuNC60L7QsiDRgdC+0LHRi9GC0LjQuVxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50SGFuZGxlcnMoKTogdm9pZCB7XG4gICAgLy8g0J7QsdGA0LDQsdC+0YLRh9C40Log0LTQu9GPINC60L3QvtC/0LrQuCDQvdC+0LLQvtC5INGB0LXRgdGB0LjQuFxuICAgIGNvbnN0IG5ld1Nlc3Npb25CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3LXNlc3Npb24tYnRuJyk7XG4gICAgaWYgKG5ld1Nlc3Npb25CdG4pIHtcbiAgICAgIGNvbnNvbGUubG9nKCdOZXcgc2Vzc2lvbiBidXR0b24gZm91bmQgYW5kIGhhbmRsZXIgYXR0YWNoZWQnKTtcbiAgICAgIG5ld1Nlc3Npb25CdG4ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ05ldyBzZXNzaW9uIGJ1dHRvbiBjbGlja2VkJyk7XG4gICAgICAgIHRoaXMuY3JlYXRlTmV3U2Vzc2lvbigpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignTmV3IHNlc3Npb24gYnV0dG9uIG5vdCBmb3VuZCEnKTtcbiAgICB9XG5cbiAgICAvLyDQntCx0YDQsNCx0L7RgtGH0LjQuiDQtNC70Y8g0LrQvdC+0L/QutC4INC90L7QstC+0LPQviDQutC70LjQtdC90YLQsFxuICAgIGNvbnN0IG5ld0NsaWVudEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctY2xpZW50LWJ0bicpO1xuICAgIGlmIChuZXdDbGllbnRCdG4pIHtcbiAgICAgIGNvbnNvbGUubG9nKCdOZXcgY2xpZW50IGJ1dHRvbiBmb3VuZCBhbmQgaGFuZGxlciBhdHRhY2hlZCcpO1xuICAgICAgbmV3Q2xpZW50QnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdOZXcgY2xpZW50IGJ1dHRvbiBjbGlja2VkJyk7XG4gICAgICAgIHRoaXMuc2hvd0NsaWVudEluc3RydWN0aW9ucygpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignTmV3IGNsaWVudCBidXR0b24gbm90IGZvdW5kIScpO1xuICAgIH1cblxuICAgIC8vINCe0LHRgNCw0LHQvtGC0YfQuNC6INC40LfQvNC10L3QtdC90LjRjyDRgNCw0LfQvNC10YDQsCDQvtC60L3QsFxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGl2ZVNlc3Npb24gPSB0aGlzLnRhYk1hbmFnZXIuZ2V0QWN0aXZlU2Vzc2lvbigpO1xuICAgICAgaWYgKGFjdGl2ZVNlc3Npb24gJiYgYWN0aXZlU2Vzc2lvbi5maXRBZGRvbikge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBhY3RpdmVTZXNzaW9uLmZpdEFkZG9uPy5maXQoKTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIXRoaXMuaXNEZWJ1Zykge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGlzTWFjID0gbmF2aWdhdG9yLnBsYXRmb3JtLnRvVXBwZXJDYXNlKCkuaW5kZXhPZignTUFDJykgPj0gMDtcbiAgICAgICAgLy8gRGV2ZWxvcGVyIHRvb2xzIGhvdGtleXNcbiAgICAgICAgY29uc3QgaXNEZXZUb29scyA9XG4gICAgICAgICAgKGlzTWFjICYmIGUubWV0YUtleSAmJiBlLmFsdEtleSAmJiBlLmtleSA9PT0gJ2knKSB8fCAvLyBDbWQrT3B0aW9uK0lcbiAgICAgICAgICAoIWlzTWFjICYmIGUuY3RybEtleSAmJiBlLnNoaWZ0S2V5ICYmIGUua2V5ID09PSAnSScpIHx8IC8vIEN0cmwrU2hpZnQrSVxuICAgICAgICAgIGUua2V5ID09PSAnRjEyJztcbiAgICAgICAgaWYgKGlzRGV2VG9vbHMpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgcmV0dXJuOyAvLyBEbyBub3QgcHJldmVudCBkZWZhdWx0IGFuZCBkbyBub3Qgc2VuZCB0byBzZXJ2ZXJcbiAgICAgICAgfVxuICAgICAgICBpZiAoZS5jdHJsS2V5IHx8IGUuYWx0S2V5IHx8IGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgY29uc3QgYWN0aXZlU2Vzc2lvbiA9IHRoaXMudGFiTWFuYWdlci5nZXRBY3RpdmVTZXNzaW9uKCk7XG4gICAgICAgICAgaWYgKGFjdGl2ZVNlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMudGFiTWFuYWdlci5zZW5kSG90S2V5KHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkOiBhY3RpdmVTZXNzaW9uLmRhdGEuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICBrZXk6IGUua2V5LFxuICAgICAgICAgICAgICBjdHJsOiBlLmN0cmxLZXksXG4gICAgICAgICAgICAgIGFsdDogZS5hbHRLZXksXG4gICAgICAgICAgICAgIHNoaWZ0OiBlLnNoaWZ0S2V5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8g0J7QsdGA0LDQsdC+0YLRh9C40Log0LrQu9C40LrQsCDQstC90LUg0L7QsdC70LDRgdGC0Lgg0LjQvdGB0YLRgNGD0LrRhtC40Lkg0LTQu9GPINC40YUg0YHQutGA0YvRgtC40Y9cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnNFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsaWVudC1pbnN0cnVjdGlvbnMnKTtcbiAgICAgIGNvbnN0IG5ld0NsaWVudEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctY2xpZW50LWJ0bicpO1xuICAgICAgaWYgKGluc3RydWN0aW9uc0VsZW1lbnQgJiYgaW5zdHJ1Y3Rpb25zRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSkge1xuICAgICAgICAvLyDQn9GA0L7QstC10YDRj9C10LwsINGH0YLQviDQutC70LjQuiDQvdC1INC/0L4g0LjQvdGB0YLRgNGD0LrRhtC40Y/QvCDQuCDQvdC1INC/0L4g0LrQvdC+0L/QutC1IE5ldyBDbGllbnRcbiAgICAgICAgaWYgKCFpbnN0cnVjdGlvbnNFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSAmJlxuICAgICAgICAgICFuZXdDbGllbnRCdG4/LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgICAgIC8vINCh0LrRgNGL0LLQsNC10Lwg0LjQvdGB0YLRgNGD0LrRhtC40Lgg0YLQvtC70YzQutC+INC10YHQu9C4INC10YHRgtGMINCw0LrRgtC40LLQvdGL0LUg0LrQu9C40LXQvdGC0YtcbiAgICAgICAgICBjb25zdCBhY3RpdmVDbGllbnQgPSB0aGlzLnRhYk1hbmFnZXIuZ2V0QWN0aXZlQ2xpZW50KCk7XG4gICAgICAgICAgaWYgKGFjdGl2ZUNsaWVudCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlQ2xpZW50SW5zdHJ1Y3Rpb25zKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog0KHQvtC30LTQsNC90LjQtSDQvdC+0LLQvtC5INGB0LXRgdGB0LjQuCDQtNC70Y8g0LDQutGC0LjQstC90L7Qs9C+INC60LvQuNC10L3RgtCwXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTmV3U2Vzc2lvbigpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnY3JlYXRlTmV3U2Vzc2lvbiBjYWxsZWQnKTtcblxuICAgIGNvbnN0IGFjdGl2ZUNsaWVudCA9IHRoaXMudGFiTWFuYWdlci5nZXRBY3RpdmVDbGllbnQoKTtcbiAgICBpZiAoIWFjdGl2ZUNsaWVudCkge1xuICAgICAgY29uc29sZS5sb2coJ05vIGFjdGl2ZSBjbGllbnQgc2VsZWN0ZWQgLSBjYW5ub3QgY3JlYXRlIHNlc3Npb24nKTtcbiAgICAgIGFsZXJ0KCfQodC90LDRh9Cw0LvQsCDQstGL0LHQtdGA0LjRgtC1INC60LvQuNC10L3RgtCwINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINGB0LXRgdGB0LjQuCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdDcmVhdGluZyBuZXcgc2Vzc2lvbiBmb3IgY2xpZW50OicsIGFjdGl2ZUNsaWVudC5uYW1lKTtcblxuICAgIC8vINCY0YHQv9C+0LvRjNC30YPQtdC8INC90L7QstGL0Lkg0LzQtdGC0L7QtCBjcmVhdGVOZXdTZXNzaW9uLCDQutC+0YLQvtGA0YvQuSDQvtGC0L/RgNCw0LLQuNGCINC30LDQv9GA0L7RgSDQvdCwINGB0LXRgNCy0LXRgFxuICAgIHRoaXMudGFiTWFuYWdlci5jcmVhdGVOZXdTZXNzaW9uKGFjdGl2ZUNsaWVudC5jbGllbnRJZCwgYFNlc3Npb24gJHthY3RpdmVDbGllbnQuc2Vzc2lvbnMubGVuZ3RoICsgMX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQn9C+0LrQsNC30LDRgtGMINC40L3RgdGC0YDRg9C60YbQuNC4INC00LvRjyDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC60LvQuNC10L3RgtCwXG4gICAqL1xuICBwdWJsaWMgc2hvd0NsaWVudEluc3RydWN0aW9ucygpOiB2b2lkIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnNFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsaWVudC1pbnN0cnVjdGlvbnMnKTtcbiAgICBjb25zdCBuZXdDbGllbnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3LWNsaWVudC1idG4nKTtcbiAgICBjb25zdCBzZXNzaW9uc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMnKTtcbiAgICB0aGlzLmhpZGVBbGxUZXJtaW5hbHMoKTtcbiAgICBpZiAoaW5zdHJ1Y3Rpb25zRWxlbWVudCkge1xuICAgICAgaW5zdHJ1Y3Rpb25zRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgICBjb25zb2xlLmxvZygnQ2xpZW50IGluc3RydWN0aW9ucyBzaG93bicpO1xuICAgIH1cblxuICAgIGlmIChuZXdDbGllbnRCdG4pIHtcbiAgICAgIG5ld0NsaWVudEJ0bi5jbGFzc0xpc3QuYWRkKCdzaG93aW5nLWluc3RydWN0aW9ucycpO1xuICAgIH1cblxuICAgIGlmIChzZXNzaW9uc0VsZW1lbnQpIHtcbiAgICAgIHNlc3Npb25zRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgY29uc29sZS5sb2coJ1Nlc3Npb25zIGVsZW1lbnQgaGlkZGVuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqINCh0LrRgNGL0YLRjCDQuNC90YHRgtGA0YPQutGG0LjQuCDQtNC70Y8g0L/QvtC00LrQu9GO0YfQtdC90LjRjyDQutC70LjQtdC90YLQsFxuICAgKi9cbiAgcHVibGljIGhpZGVDbGllbnRJbnN0cnVjdGlvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGllbnQtaW5zdHJ1Y3Rpb25zJyk7XG4gICAgY29uc3QgbmV3Q2xpZW50QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ldy1jbGllbnQtYnRuJyk7XG4gICAgY29uc3Qgc2Vzc2lvbnNFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zJyk7XG5cbiAgICBpZiAoaW5zdHJ1Y3Rpb25zRWxlbWVudCkge1xuICAgICAgaW5zdHJ1Y3Rpb25zRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBjb25zb2xlLmxvZygnQ2xpZW50IGluc3RydWN0aW9ucyBoaWRkZW4nKTtcbiAgICB9XG5cbiAgICBpZiAobmV3Q2xpZW50QnRuKSB7XG4gICAgICBuZXdDbGllbnRCdG4uY2xhc3NMaXN0LnJlbW92ZSgnc2hvd2luZy1pbnN0cnVjdGlvbnMnKTtcbiAgICB9XG5cbiAgICBpZiAoc2Vzc2lvbnNFbGVtZW50KSB7XG4gICAgICBzZXNzaW9uc0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgIGNvbnNvbGUubG9nKCdTZXNzaW9ucyBlbGVtZW50IHNob3duJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqINCe0LHRgNCw0LHQvtGC0LrQsCDQvtCx0L3QvtCy0LvQtdC90LjRjyDRgdC+0YHRgtC+0Y/QvdC40Y8g0LrRg9GA0YHQvtGA0LBcbiAgICog0J7RgtGA0LjRgdC+0LLRi9Cy0LDQtdGCINGB0L7RgdGC0L7Rj9C90LjQtSDQvdCwIFVJINCx0LXQtyDQuNC30LzQtdC90LXQvdC40Y8g0LvQvtC60LDQu9GM0L3QvtCz0L4gQ29tbWFuZEJ1aWxkZXJcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQ3Vyc29yU3RhdGVVcGRhdGUoc2Vzc2lvbklkOiBzdHJpbmcsIGNvbW1hbmQ6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKGBIYW5kbGluZyBjdXJzb3Igc3RhdGUgdXBkYXRlIGZvciBzZXNzaW9uICR7c2Vzc2lvbklkfTogY29tbWFuZD1cIiR7Y29tbWFuZH1cIiwgcG9zaXRpb249JHtwb3NpdGlvbn1gKTtcblxuICAgIC8vINCf0L7Qu9GD0YfQsNC10Lwg0LDQutGC0LjQstC90YPRjiDRgdC10YHRgdC40Y5cbiAgICBjb25zdCBhY3RpdmVTZXNzaW9uID0gdGhpcy50YWJNYW5hZ2VyLmdldEFjdGl2ZVNlc3Npb24oKTtcbiAgICBpZiAoIWFjdGl2ZVNlc3Npb24gfHwgYWN0aXZlU2Vzc2lvbi5kYXRhLnNlc3Npb25JZCAhPT0gc2Vzc2lvbklkKSB7XG4gICAgICBjb25zb2xlLmxvZyhgU2Vzc2lvbiAke3Nlc3Npb25JZH0gaXMgbm90IGFjdGl2ZSwgc2tpcHBpbmcgY3Vyc29yIHN0YXRlIHVwZGF0ZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vINCe0YLRgNC40YHQvtCy0YvQstCw0LXQvCDRgdC+0YHRgtC+0Y/QvdC40LUg0YfQtdGA0LXQtyBUZXJtaW5hbFVpV3JpdGVyICjQsdC10Lcg0LjQt9C80LXQvdC10L3QuNGPIENvbW1hbmRCdWlsZGVyKVxuICAgIGlmIChhY3RpdmVTZXNzaW9uLnRlcm1pbmFsVWlXcml0ZXIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBSZW5kZXJpbmcgY3Vyc29yIHN0YXRlIHRvIFVJIGZvciBzZXNzaW9uICR7c2Vzc2lvbklkfWApO1xuICAgICAgYWN0aXZlU2Vzc2lvbi50ZXJtaW5hbFVpV3JpdGVyLndyaXRlKGNvbW1hbmQsIHBvc2l0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBUZXJtaW5hbFVpV3JpdGVyIG5vdCBmb3VuZCBmb3Igc2Vzc2lvbiAke3Nlc3Npb25JZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog0KPQtNCw0LvQtdC90LjQtSBET00g0Y3Qu9C10LzQtdC90YLQsCDRgtC10YDQvNC40L3QsNC70LBcbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlVGVybWluYWxET00oc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXJtaW5hbERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGB0ZXJtaW5hbC0ke3Nlc3Npb25JZH1gKTtcbiAgICBpZiAodGVybWluYWxEaXYpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmluZyB0ZXJtaW5hbCBET00gZWxlbWVudCBmb3Igc2Vzc2lvbiAke3Nlc3Npb25JZH1gKTtcbiAgICAgIHRlcm1pbmFsRGl2LnJlbW92ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oYFRlcm1pbmFsIERPTSBlbGVtZW50IG5vdCBmb3VuZCBmb3Igc2Vzc2lvbiAke3Nlc3Npb25JZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog0J3QsNGB0YLRgNC+0LnQutCwIGRyYWcgYW5kIGRyb3Ag0LTQu9GPINGN0LvQtdC80LXQvdGC0LBcbiAgICovXG4gIHByaXZhdGUgc2V0dXBEcmFnQW5kRHJvcChlbGVtZW50OiBIVE1MRWxlbWVudCwgdHlwZTogJ2NsaWVudCcgfCAnc2Vzc2lvbicpOiB2b2lkIHtcbiAgICAvLyDQndCw0YfQsNC70L4g0L/QtdGA0LXRgtCw0YHQutC40LLQsNC90LjRj1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgKGU6IERyYWdFdmVudCkgPT4ge1xuICAgICAgdGhpcy5kcmFnZ2VkRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2RyYWdnaW5nJyk7XG4gICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJztcbiAgICAgICAgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9odG1sJywgZWxlbWVudC5pbm5lckhUTUwpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g0J7QutC+0L3Rh9Cw0L3QuNC1INC/0LXRgNC10YLQsNGB0LrQuNCy0LDQvdC40Y9cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCAoZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdnaW5nJyk7XG4gICAgICAvLyDQo9C00LDQu9GP0LXQvCDQstC40LfRg9Cw0LvRjNC90YvQtSDQuNC90LTQuNC60LDRgtC+0YDRiyDRgdC+INCy0YHQtdGFINGN0LvQtdC80LXQvdGC0L7QslxuICAgICAgY29uc3QgY29udGFpbmVyID0gdHlwZSA9PT0gJ2NsaWVudCdcbiAgICAgICAgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xpZW50cycpXG4gICAgICAgIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb25zJyk7XG4gICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGAuJHt0eXBlfWApLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHJhZ2dlZEVsZW1lbnQgPSBudWxsO1xuICAgIH0pO1xuXG4gICAgLy8g0J/QtdGA0LXRgtCw0YHQutC40LLQsNC90LjQtSDQvdCw0LQg0Y3Qu9C10LzQtdC90YLQvtC8XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIChlOiBEcmFnRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChlLmRhdGFUcmFuc2Zlcikge1xuICAgICAgICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kcmFnZ2VkRWxlbWVudCAmJiB0aGlzLmRyYWdnZWRFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZHJhZy1vdmVyJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyDQn9C+0LrQuNC00LDQvdC40LUg0L7QsdC70LDRgdGC0Lgg0Y3Qu9C10LzQtdC90YLQsFxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgKGU6IERyYWdFdmVudCkgPT4ge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnLW92ZXInKTtcbiAgICB9KTtcblxuICAgIC8vINCe0YLQv9GD0YHQutCw0L3QuNC1INGN0LvQtdC80LXQvdGC0LBcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCAoZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpO1xuXG4gICAgICBpZiAodGhpcy5kcmFnZ2VkRWxlbWVudCAmJiB0aGlzLmRyYWdnZWRFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHR5cGUgPT09ICdjbGllbnQnXG4gICAgICAgICAgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xpZW50cycpXG4gICAgICAgICAgOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbnMnKTtcblxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgICAgLy8g0J7Qv9GA0LXQtNC10LvRj9C10Lwg0L/QvtC30LjRhtC40Y4g0LTQu9GPINCy0YHRgtCw0LLQutC4XG4gICAgICAgICAgY29uc3QgYWZ0ZXJFbGVtZW50ID0gdGhpcy5nZXREcmFnQWZ0ZXJFbGVtZW50KGNvbnRhaW5lciwgZS5jbGllbnRYLCB0eXBlKTtcblxuICAgICAgICAgIGlmIChhZnRlckVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8g0JLRgdGC0LDQstC70Y/QtdC8INC/0LXRgNC10LQg0LrQvdC+0L/QutC+0LkgTmV3IENsaWVudC9TZXNzaW9uXG4gICAgICAgICAgICBjb25zdCBuZXdCdG4gPSB0eXBlID09PSAnY2xpZW50J1xuICAgICAgICAgICAgICA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctY2xpZW50LWJ0bicpXG4gICAgICAgICAgICAgIDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ldy1zZXNzaW9uLWJ0bicpO1xuICAgICAgICAgICAgaWYgKG5ld0J0bikge1xuICAgICAgICAgICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuZHJhZ2dlZEVsZW1lbnQsIG5ld0J0bik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vINCS0YHRgtCw0LLQu9GP0LXQvCDQv9C+0YHQu9C1INC90LDQudC00LXQvdC90L7Qs9C+INGN0LvQtdC80LXQvdGC0LBcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5kcmFnZ2VkRWxlbWVudCwgYWZ0ZXJFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDQntC/0YDQtdC00LXQu9GP0LXRgiDRjdC70LXQvNC10L3Rgiwg0L/QvtGB0LvQtSDQutC+0YLQvtGA0L7Qs9C+INC90YPQttC90L4g0LLRgdGC0LDQstC40YLRjCDQv9C10YDQtdGC0LDRgdC60LjQstCw0LXQvNGL0Lkg0Y3Qu9C10LzQtdC90YJcbiAgICovXG4gIHByaXZhdGUgZ2V0RHJhZ0FmdGVyRWxlbWVudChjb250YWluZXI6IEhUTUxFbGVtZW50LCB4OiBudW1iZXIsIHR5cGU6ICdjbGllbnQnIHwgJ3Nlc3Npb24nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBkcmFnZ2FibGVFbGVtZW50cyA9IEFycmF5LmZyb20oXG4gICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChgLiR7dHlwZX06bm90KC5kcmFnZ2luZylgKVxuICAgICkgYXMgSFRNTEVsZW1lbnRbXTtcblxuICAgIHJldHVybiBkcmFnZ2FibGVFbGVtZW50cy5yZWR1Y2U8SFRNTEVsZW1lbnQgfCBudWxsPigoY2xvc2VzdCwgY2hpbGQpID0+IHtcbiAgICAgIGNvbnN0IGJveCA9IGNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0geCAtIGJveC5sZWZ0IC0gYm94LndpZHRoIC8gMjtcblxuICAgICAgaWYgKG9mZnNldCA8IDAgJiYgKGNsb3Nlc3QgPT09IG51bGwgfHwgb2Zmc2V0ID4gKGNsb3Nlc3QgYXMgYW55KS5vZmZzZXQpKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGNoaWxkLCB7IG9mZnNldCB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjbG9zZXN0O1xuICAgICAgfVxuICAgIH0sIG51bGwpO1xuICB9XG59XG5cbi8vINCh0L7Qt9C00LDQtdC8INCz0LvQvtCx0LDQu9GM0L3Ri9C5INGN0LrQt9C10LzQv9C70Y/RgCDQv9GA0LjQu9C+0LbQtdC90LjRj1xuY29uc29sZS5sb2coJ2luZGV4LnRzIHNjcmlwdCBsb2FkZWQnKTtcbmNvbnN0IHRlcm1pbmFsQXBwID0gbmV3IFRlcm1pbmFsQXBwKCk7XG5cblxuXG53aW5kb3cudGVybWluYWxBcHAgPSB0ZXJtaW5hbEFwcDtcbi8vINCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINC/0YDQuCDQt9Cw0LPRgNGD0LfQutC1IERPTVxuZnVuY3Rpb24gaW5pdGlhbGl6ZVN5bmMoKSB7XG4gIGNvbnNvbGUubG9nKCdpbml0aWFsaXplU3luYyBjYWxsZWQnKTtcbiAgaW5pdGlhbGl6ZUFwcCgpLnRoZW4oKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVBcHAoKSB7XG4gIGNvbnNvbGUubG9nKCdpbml0aWFsaXplQXBwIGNhbGxlZCcpO1xuICBhd2FpdCB0ZXJtaW5hbEFwcC5pbml0aWFsaXplKCk7XG59XG5cbi8vINCf0YDQvtCy0LXRgNGP0LXQvCDRgdC+0YHRgtC+0Y/QvdC40LUg0LTQvtC60YPQvNC10L3RgtCwINC4INC40L3QuNGG0LjQsNC70LjQt9C40YDRg9C10Lwg0YHQvtC+0YLQstC10YLRgdGC0LLQtdC90L3QvlxuaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAvLyDQlNC+0LrRg9C80LXQvdGCINC10YnQtSDQt9Cw0LPRgNGD0LbQsNC10YLRgdGPXG4gIGNvbnNvbGUubG9nKCdEb2N1bWVudCBpcyBsb2FkaW5nLCBhZGRpbmcgRE9NQ29udGVudExvYWRlZCBsaXN0ZW5lcicpO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdGlhbGl6ZUFwcCk7XG59IGVsc2Uge1xuICAvLyDQlNC+0LrRg9C80LXQvdGCINGD0LbQtSDQt9Cw0LPRgNGD0LbQtdC9XG4gIGNvbnNvbGUubG9nKCdEb2N1bWVudCBpcyBhbHJlYWR5IGxvYWRlZCwgY2FsbGluZyBpbml0aWFsaXplQXBwIGltbWVkaWF0ZWx5Jyk7XG4gIGluaXRpYWxpemVTeW5jKClcbn0iXSwibmFtZXMiOlsiRXZlbnRUeXBlQ29uc3QiLCJDVVJTT1JfU1RBVEUiLCJDT05ORUNUIiwiRElTQ09OTkVDVCIsIkNMT1NFIiwiSURFTlRJRlkiLCJDT01NQU5EIiwiUkVTSVpFIiwiU0VORF9LRVkiLCJIT1RLRVkiLCJPVVRQVVQiLCJFUlJPUiIsIlNFU1NJT04iLCJORVdfU0VTU0lPTiIsIk5FV19DTElFTlQiLCJERUxFVEVfQ0xJRU5UIiwiQ0xPU0VfU0VTU0lPTiIsIkNMSUVOVF9TVEFUVVMiLCJJZEdlbmVyYXRvciIsIl9jbGFzc0NhbGxDaGVjayIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiZ2VuZXJhdGVJZCIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0cmluZyIsImlzVmFsaWRJZCIsImlkIiwibGVuZ3RoIiwiaW5kZXhPZiIsIkRFRkFVTFRfU0VUVElOR1MiLCJDb25uZWN0aW9uIiwic2VydmVyVXJsIiwic2Vzc2lvbklkIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwic29ja2V0IiwiX2lzQ29ubmVjdGVkIiwicmVjb25uZWN0QXR0ZW1wdHMiLCJtYXhSZWNvbm5lY3RBdHRlbXB0cyIsIk1BWF9SRUNPTk5FQ1RfQVRURU1QVFMiLCJyZWNvbm5lY3REZWxheSIsIlJFQ09OTkVDVF9ERUxBWSIsInJlY29ubmVjdERlbGF5TWF4IiwiUkVDT05ORUNUX0RFTEFZX01BWCIsInJlY29ubmVjdEJhY2tvZmZNdWx0aXBsaWVyIiwiUkVDT05ORUNUX0JBQ0tPRkZfTVVMVElQTElFUiIsImF1dG9SZWNvbm5lY3RFbmFibGVkIiwiRU5BQkxFX0FVVE9fUkVDT05ORUNUIiwicmVjb25uZWN0VGltZXIiLCJvbkNvbm5lY3QiLCJvbkRpc2Nvbm5lY3QiLCJvbkN1cnNvclN0YXRlIiwib25FcnJvciIsIm9uU2VuZEtleSIsIm9uQ29tbWFuZCIsIm9uUmVzaXplIiwib25UZXJtaW5hbCIsIm9uQ2xvc2UiLCJvbk5ld0NsaWVudCIsIm9uRGVsZXRlQ2xpZW50Iiwib25DbG9zZVNlc3Npb24iLCJvbkNsaWVudFN0YXR1cyIsIm9yaWdpbmFsQ29uc29sZSIsImxvZyIsImNvbnNvbGUiLCJlcnJvciIsIndhcm4iLCJpbmZvIiwiZGVidWciLCJzZXRPbkNvbm5lY3QiLCJjYWxsYmFjayIsInNldE9uQ3Vyc29yU3RhdGUiLCJzZXRPbkRpc2Nvbm5lY3QiLCJzZXRPbkVycm9yIiwic2V0T25TZW5kS2V5Iiwic2V0T25Db21tYW5kIiwic2V0T25UZXJtaW5hbCIsInNldE9uUmVzaXplIiwic2V0T25DbG9zZSIsInNldE9uTmV3Q2xpZW50Iiwic2V0T25EZWxldGVDbGllbnQiLCJzZXRPblJlY29ubmVjdEF0dGVtcHQiLCJvblJlY29ubmVjdEF0dGVtcHQiLCJzZXRPblJlY29ubmVjdEZhaWxlZCIsIm9uUmVjb25uZWN0RmFpbGVkIiwic2V0T25DbG9zZVNlc3Npb24iLCJzZXRPbkNsaWVudFN0YXR1cyIsInNldEF1dG9SZWNvbm5lY3RTZXR0aW5ncyIsImVuYWJsZWQiLCJtYXhBdHRlbXB0cyIsImRlbGF5IiwibWF4RGVsYXkiLCJiYWNrb2ZmTXVsdGlwbGllciIsImNvbmNhdCIsImdldEF1dG9SZWNvbm5lY3RTZXR0aW5ncyIsImN1cnJlbnRBdHRlbXB0cyIsImNvbm5lY3QiLCJjbGllbnRUeXBlIiwiX3RoaXMiLCJyZWFkeVN0YXRlIiwiV2ViU29ja2V0IiwiT1BFTiIsInNlbmRDb25uZWN0IiwiY29ubmVjdFdzIiwib25Db25uZWN0ZWQiLCJfdGhpczIiLCJjbGVhclJlY29ubmVjdFRpbWVyIiwib25vcGVuIiwib25tZXNzYWdlIiwiZXZlbnQiLCJoYW5kbGVNZXNzYWdlIiwiZGF0YSIsInRoZW4iLCJvbmNsb3NlIiwiX3RoaXMyJG9yaWdpbmFsQ29uc29sIiwiY29kZSIsInJlYXNvbiIsImF0dGVtcHRSZWNvbm5lY3QiLCJvbmVycm9yIiwiX3RoaXMyJG9yaWdpbmFsQ29uc29sMiIsIl90aGlzJG9yaWdpbmFsQ29uc29sZSIsIl90aGlzMyIsIl90aGlzJG9yaWdpbmFsQ29uc29sZTIiLCJfdGhpcyRvcmlnaW5hbENvbnNvbGUzIiwibWluIiwicG93Iiwid2luZG93Iiwic2V0VGltZW91dCIsIl90aGlzJG9yaWdpbmFsQ29uc29sZTQiLCJjbGVhclRpbWVvdXQiLCJtZXNzYWdlIiwibmFtZSIsInNlbmRNZXNzYWdlIiwic2VuZENvbW1hbmQiLCJ0YXJnZXQiLCJjb21tYW5kIiwic2VuZElkZW50aWZ5Iiwic2VuZFRlcm1pbmFsRGF0YSIsImluZGV4Iiwic2VuZE5ld1Nlc3Npb24iLCJjbGllbnRJZCIsInNlbmRDdXJzb3JTdGF0ZSIsInNlbmRTZW5kS2V5Iiwic2VuZEhvdEtleSIsInNlbmROZXdDbGllbnQiLCJzZW5kRGVsZXRlQ2xpZW50IiwianNvbk1lc3NhZ2UiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VuZCIsIl9oYW5kbGVNZXNzYWdlIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3IiLCJtIiwiX2NhbGxlZSIsIl90IiwiX3QyIiwidyIsIl9jb250ZXh0IiwicCIsIm4iLCJwYXJzZSIsImEiLCJ2IiwiX3giLCJhcHBseSIsImRpc2Nvbm5lY3QiLCJjbG9zZSIsImlzQ29ubmVjdGVkIiwiZGVzdHJveSIsIkNvbW1hbmRCdWlsZGVyIiwiY29tbWFuZEJ1ZmZlciIsImN1cnNvclBvc2l0aW9uIiwiaGlzdG9yeSIsImhpc3RvcnlJbmRleCIsInRlcm1pbmFsVWlXcml0ZXIiLCJvblN0YXRlQ2hhbmdlIiwib25FeGVjdXRlQ29tbWFuZCIsInNldE9uU3RhdGVDaGFuZ2UiLCJzZXRPbkV4ZWN1dGVDb21tYW5kIiwic2V0VGVybWluYWxVaVdyaXRlciIsIndyaXRlciIsIl93cml0ZSIsImNoYXIiLCJlbmRzV2l0aCIsIm5vdGlmeVN0YXRlQ2hhbmdlIiwiZXhlY3V0ZUNvbW1hbmQiLCJzbGljZSIsIm1vdmVDdXJzb3JVcCIsIm5hdmlnYXRlSGlzdG9yeSIsIm1vdmVDdXJzb3JEb3duIiwibW92ZUN1cnNvclJpZ2h0IiwibW92ZUN1cnNvckxlZnQiLCJ3cml0ZSIsIl9leGVjdXRlQ29tbWFuZCIsIl9jYWxsZWUyIiwicHJlcGFyZWQiLCJfY29udGV4dDIiLCJyZXBsYWNlIiwidHJpbSIsInB1c2giLCJzaGlmdCIsImJlZm9yZSIsImN1cnJlbnRMaW5lU3RhcnQiLCJsYXN0SW5kZXhPZiIsInByZXZOZXdsaW5lIiwicHJldkxpbmVTdGFydCIsInByZXZMaW5lRW5kIiwiY3VycmVudENvbHVtbiIsInByZXZMaW5lTGVuZ3RoIiwibWF4IiwidGFyZ2V0Q29sdW1uIiwibmV3UG9zaXRpb24iLCJjdXJyZW50TGluZUVuZE5ld2xpbmUiLCJjdXJyZW50TGluZUVuZCIsIm5leHRMaW5lU3RhcnQiLCJuZXh0TGluZUVuZE5ld2xpbmUiLCJuZXh0TGluZUVuZCIsIm5leHRMaW5lTGVuZ3RoIiwiZGlyZWN0aW9uIiwiX3RoaXMkaGlzdG9yeSR0aGlzJGhpIiwiX3RoaXMkaGlzdG9yeSR0aGlzJGhpMiIsInBvc3RpdGlvbiIsInNldFN0YXRlIiwic3RhdGUiLCJjbGVhckJ1ZmZlciIsIkN1c3RvbUNvbW1hbmQiLCJJbmZvQ29tbWFuZCIsIl9DdXN0b21Db21tYW5kIiwiZGVzY3JpcHRpb24iLCJfaW5oZXJpdHMiLCJleGVjdXRlIiwiZ2V0RW52aXJvbm1lbnRJbmZvIiwiZ2V0SlNFbmdpbmUiLCJnZXRKU1ZlcnNpb24iLCJuYXZpZ2F0b3IiLCJsYW5ndWFnZSIsInBsYXRmb3JtIiwidXNlckFnZW50IiwiZ2V0QnJvd3NlckluZm8iLCJnZXRCcm93c2VyVmVyc2lvbiIsImNvb2tpZUVuYWJsZWQiLCJvbkxpbmUiLCJkb05vdFRyYWNrIiwic2NyZWVuIiwid2lkdGgiLCJoZWlnaHQiLCJhdmFpbFdpZHRoIiwiYXZhaWxIZWlnaHQiLCJjb2xvckRlcHRoIiwicGl4ZWxEZXB0aCIsImRldmljZVBpeGVsUmF0aW8iLCJpbm5lcldpZHRoIiwiaW5uZXJIZWlnaHQiLCJvdXRlcldpZHRoIiwib3V0ZXJIZWlnaHQiLCJzY3JvbGxYIiwic2Nyb2xsWSIsIkRhdGUiLCJ0b0xvY2FsZVN0cmluZyIsIkludGwiLCJEYXRlVGltZUZvcm1hdCIsInJlc29sdmVkT3B0aW9ucyIsInRpbWVab25lIiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJwZXJmb3JtYW5jZSIsIm5hdmlnYXRpb24iLCJ0eXBlIiwidGltaW5nIiwibG9hZEV2ZW50RW5kIiwibmF2aWdhdGlvblN0YXJ0IiwiZG9tQ29udGVudExvYWRlZEV2ZW50RW5kIiwibWVtb3J5Iiwicm91bmQiLCJ1c2VkSlNIZWFwU2l6ZSIsInRvdGFsSlNIZWFwU2l6ZSIsImpzSGVhcFNpemVMaW1pdCIsImNvbm5lY3Rpb24iLCJlZmZlY3RpdmVUeXBlIiwiZG93bmxpbmsiLCJydHQiLCJzYXZlRGF0YSIsImdlb2xvY2F0aW9uIiwibWVkaWFEZXZpY2VzIiwiV2ViR0xSZW5kZXJpbmdDb250ZXh0IiwiY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiZ2wiLCJnZXRDb250ZXh0IiwiZ2V0UGFyYW1ldGVyIiwiVkVSU0lPTiIsIlZFTkRPUiIsIlJFTkRFUkVSIiwibG9jYWxTdG9yYWdlIiwic2Vzc2lvblN0b3JhZ2UiLCJpbmRleGVkREIiLCJXb3JrZXIiLCJTZXJ2aWNlV29ya2VyIiwiZmV0Y2giLCJQcm9taXNlIiwiaXNBc3luY0F3YWl0U3VwcG9ydGVkIiwiaW5jbHVkZXMiLCJCaWdJbnQiLCJwcm90b3R5cGUiLCJPYmplY3QiLCJlbnRyaWVzIiwiQXJyYXkiLCJkZWZpbmVQcm9wZXJ0eSIsIm1hdGNoIiwiRnVuY3Rpb24iLCJIZWxwQ29tbWFuZCIsImNvbW1hbmRTdG9yYWdlIiwiX2NhbGxTdXBlciIsImN1c3RvbUNvbW1hbmRzIiwiZ2V0Q3VzdG9tQ29tbWFuZHMiLCJoZWxwVGV4dCIsImZvckVhY2giLCJjbWQiLCJBTlNJX0VTQ0FQRVMiLCJDbGVhckNvbW1hbmQiLCJDTEVBUl9TQ1JFRU4iLCJleGVjdXRlQ3VybCIsIl9leGVjdXRlQ3VybCIsImFyZ3MiLCJjb21tYW5kTGluZSIsInBhcnRzIiwidXJsIiwib3B0aW9ucyIsInJlc3VsdCIsInN0YXJ0c1dpdGgiLCJzcGxpdCIsImdldEN1cmxIZWxwIiwicGFyc2VDdXJsT3B0aW9ucyIsImlzVmFsaWRVcmwiLCJtYWtlSHR0cFJlcXVlc3QiLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsInZlcmJvc2UiLCJzaG93SGVhZGVycyIsInNpbGVudCIsImkiLCJhcmciLCJ0b1VwcGVyQ2FzZSIsImhlYWRlciIsImNvbG9uSW5kZXgiLCJVUkwiLCJfdW51c2VkIiwiX3gyIiwiX3gzIiwiX21ha2VIdHRwUmVxdWVzdCIsImZldGNoT3B0aW9ucyIsInN0YXJ0VGltZSIsInJlc3BvbnNlIiwiZW5kVGltZSIsInJlc3BvbnNlVGV4dCIsImNvbnRlbnRUeXBlIiwianNvbkRhdGEiLCJibG9iIiwibm93Iiwic3RhdHVzIiwic3RhdHVzVGV4dCIsImdldCIsImpzb24iLCJ0ZXh0Iiwic2l6ZSIsIkVycm9yIiwiQ3VybENvbW1hbmQiLCJfZXhlY3V0ZSIsImV4ZWN1dGVKcSIsIkpxQ29tbWFuZCIsIkVjaG9Db21tYW5kIiwiQ3VzdG9tQ29tbWFuZFN0b3JhZ2UiLCJjb21tYW5kcyIsIk1hcCIsInJlZ2lzdGVyQ29tbWFuZCIsInNldCIsInVucmVnaXN0ZXJDb21tYW5kIiwiY29tbWFuZE5hbWUiLCJmcm9tIiwidmFsdWVzIiwibWFwIiwiaGFzQ3VzdG9tQ29tbWFuZCIsImhhcyIsImdldENvbW1hbmQiLCJjbGVhciIsImdldENvbW1hbmRDb3VudCIsIl9pdGVyYXRvciIsIl9zdGVwIiwiX3N0ZXAkdmFsdWUiLCJjbWROYW1lIiwiY21kSW5zdGFuY2UiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInMiLCJkb25lIiwiX3NsaWNlZFRvQXJyYXkiLCJtYXRjaGVzIiwiU3RyaW5nIiwiZSIsImYiLCJpbml0QnVpbHRpbkNvbW1hbmRzIiwidGVybWluYWxNYW5hZ2VyIiwiVGVybWluYWxDbGkiLCJUZXJtaW5hbE1hbmFnZXIiLCJpc0luaXRpYWxpemVkIiwidGVybWluYWwiLCJjb21tYW5kQnVpbGRlciIsImhhbmRsZXJzIiwid29ya01vZGUiLCJjbGllbnROYW1lIiwiREVGQVVMVF9DTElFTlRfTkFNRSIsImF1dG9Db25uZWN0IiwiYXV0b0Nvbm5lY3REZWxheSIsIkFVVE9fQ09OTkVDVF9ERUxBWSIsIl9vcHRpb25zJGNvbm5lY3Rpb25PcCIsImNvbm5lY3Rpb25PcHRpb25zIiwiREVGQVVMVF9TRVJWRVJfVVJMIiwiY3VzdG9tQ29tbWFuZFN0b3JhZ2UiLCJpbml0Iiwic2V0RXh0ZXJuYWxDb25uZWN0aW9uIiwic2V0SGFuZGxlcnMiLCJvbkRhdGEiLCJzZXRPbkRhdGEiLCJwb3NpdGlvbiIsImtleXMiLCJfcmVmIiwiX3RoaXMyJHRlcm1pbmFsIiwiX3JlZjIiLCJfdGhpczIkaGFuZGxlcnMiLCJfdGhpczIkaGFuZGxlcnMyIiwiX3RoaXMyJGNvbm5lY3Rpb24iLCJfdGhpczIkaGFuZGxlcnMzIiwiX3RoaXMyJGhhbmRsZXJzNCIsIl90aGlzMiRoYW5kbGVyczUiLCJfdGhpcyRoYW5kbGVycyIsIl90aGlzJGhhbmRsZXJzMiIsIl9jYWxsZWUzIiwiX3RoaXMkY29tbWFuZEJ1aWxkZXIiLCJfdGhpcyRjb21tYW5kQnVpbGRlcjIiLCJfY29udGV4dDMiLCJUZXJtaW5hbFVpV3JpdGVyIiwidGVybWluYWxVaSIsImN1cnJlbnRMaW5lIiwibGFzdENvbW1hbmQiLCJsYXN0UG9zaXRpb24iLCJ0cnlNaWRsaW5lSW5zZXJ0IiwidHJ5TWlkbGluZURlbGV0ZSIsIm1vdmVDdXJzb3JSZWxhdGl2ZSIsInRyeUZhc3RBcHBlbmQiLCJ1cGRhdGVDb21tYW5kUmVnaW9uIiwiYXRFbmQiLCJzZXRDdXJzb3JQb3NpdGlvbkluQ29tbWFuZCIsImZyb21Qb3NpdGlvbiIsInRvUG9zaXRpb24iLCJmcm9tSW5mbyIsImdldEN1cnNvckluZm8iLCJ0b0luZm8iLCJsaW5lRGVsdGEiLCJsaW5lIiwiY29sdW1uRGVsdGEiLCJjb2x1bW4iLCJvbGRDb21tYW5kIiwibmV3Q29tbWFuZCIsImFwcGVuZGVkIiwiY2h1bmsiLCJfb2xkTGluZXMkbGluZUluZGV4IiwiX25ld0xpbmVzJGxpbmVJbmRleCIsIm9sZExpbmVzIiwibmV3TGluZXMiLCJsaW5lSW5kZXgiLCJvbGRMaW5lIiwibmV3TGluZSIsIm9sZFByZWZpeCIsIm9sZFN1ZmZpeCIsIm5ld1ByZWZpeCIsIm5ld1N1ZmZpeEZyb21DdXJzb3IiLCJyZXN0VG9Xcml0ZSIsIm1vdmVMZWZ0IiwiX29sZExpbmVzJGxpbmVJbmRleDIiLCJfbmV3TGluZXMkbGluZUluZGV4MiIsImRlbGV0ZWRDaGFyIiwiaGFuZGxlTmV3bGluZURlbGV0aW9uIiwiZXhwZWN0ZWROZXdMaW5lIiwibmV4dExpbmVDb250ZW50Iiwid3JpdGVUZXh0Iiwid3JpdGVMaW5lIiwiY2xlYXJDdXJyZW50TGluZSIsImNsZWFyQ29tbWFuZExpbmVzIiwibGluZXMiLCJsaW5lQ291bnQiLCJtYXhMaW5lcyIsInByZXZJbmZvIiwiX29sZExpbmVzJGkiLCJfbmV3TGluZXMkaSIsInRvdGFsTGVuZ3RoIiwiY3VycmVudFBvc2l0aW9uIiwidGFyZ2V0TGluZSIsInNhZmVQb3NpdGlvbiIsIl9saW5lcyRpIiwibGluZUxlbmd0aCIsIl9saW5lcyR0YXJnZXRMaW5lJGxlbiIsIl9saW5lcyR0YXJnZXRMaW5lIiwic2V0Q3Vyc29yUG9zaXRpb24iLCJtb3ZlQ3Vyc29yVG9TdGFydCIsIm1vdmVDdXJzb3JUb0VuZE9mQ29tbWFuZCIsIm1vdmVDdXJzb3JUb0VuZCIsImNvbW1hbmRMZW5ndGgiLCJjbGVhclNjcmVlbiIsInNldENvbW1hbmRTdGF0ZSIsImdldEN1cnJlbnRDdXJzb3JQb3NpdGlvbiIsIngiLCJidWZmZXIiLCJhY3RpdmUiLCJjdXJzb3JYIiwieSIsImN1cnNvclkiLCJ3cml0ZVByb21wdCIsInByb21wdCIsIndyaXRlRXJyb3IiLCJ3cml0ZVdhcm5pbmciLCJ3YXJuaW5nIiwid3JpdGVTdWNjZXNzIiwid3JpdGVJbmZvIiwiYmFja3NwYWNlIiwiX2xpbmVzJGkyIiwiX2xpbmVzJHRhcmdldExpbmUkbGVuMiIsIl9saW5lcyR0YXJnZXRMaW5lMiIsImxpbmVUZXh0IiwiZ2V0Q29tbWFuZExpbmVDb3VudCIsImdldExhc3RMaW5lTGVuZ3RoIiwibGFzdExpbmUiLCJ0IiwiciIsIlN5bWJvbCIsIml0ZXJhdG9yIiwibyIsInRvU3RyaW5nVGFnIiwiYyIsIkdlbmVyYXRvciIsInUiLCJjcmVhdGUiLCJfcmVnZW5lcmF0b3JEZWZpbmUyIiwiRyIsImQiLCJiaW5kIiwibCIsIlR5cGVFcnJvciIsImNhbGwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImRpc3BsYXlOYW1lIiwiX3JlZ2VuZXJhdG9yRGVmaW5lIiwiX2ludm9rZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImFzeW5jR2VuZXJhdG9yU3RlcCIsInJlc29sdmUiLCJfbmV4dCIsIl90aHJvdyIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfb2JqZWN0U3ByZWFkIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwiX3RvUHJpbWl0aXZlIiwiX3R5cGVvZiIsInRvUHJpbWl0aXZlIiwiTnVtYmVyIiwiVGVybWluYWwiLCJGaXRBZGRvbiIsIldlYkxpbmtzQWRkb24iLCJUZXJtaW5hbFRhYk1hbmFnZXIiLCJjbGllbnRzIiwiYWN0aXZlVGFiSW5kZXgiLCJ0YWJDb3VudGVyIiwiY2FsbGJhY2tzIiwiYXBpSG9zdCIsInJvb21JZCIsInNldENhbGxiYWNrcyIsInNldEFwaUhvc3QiLCJzZXRSb29tSWQiLCJjb25uZWN0VG9VcmwiLCJzZXR1cENvbm5lY3Rpb25IYW5kbGVycyIsImhhbmRsZU5ld0NsaWVudCIsImhhbmRsZURlbGV0ZUNsaWVudCIsImhhbmRsZUNsb3NlU2Vzc2lvbiIsImhhbmRsZUNsaWVudFN0YXR1cyIsImhhbmRsZUN1cnNvclN0YXRlIiwiX3RoaXMkY2FsbGJhY2tzJG9uTmV3IiwiX3RoaXMkY2FsbGJhY2tzIiwiZXhpc3RpbmdDbGllbnQiLCJmaW5kIiwiY2xpZW50IiwidXBkYXRlQ2xpZW50U3RhdHVzIiwibmV3Q2xpZW50Iiwic2Vzc2lvbnMiLCJpc0V4cGFuZGVkIiwiaXNBY3RpdmUiLCJfdGhpcyRjYWxsYmFja3Mkb25DbGkiLCJfdGhpcyRjYWxsYmFja3MyIiwiY2xpZW50VG9EZWxldGUiLCJzZXNzaW9uIiwiY2xvc2VTZXNzaW9uIiwiY2xpZW50SW5kZXgiLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJvbkNsaWVudFJlbW92ZWQiLCJfdGhpcyRjYWxsYmFja3Mkb25DdXIiLCJfdGhpcyRjYWxsYmFja3MzIiwiYWN0aXZlU2Vzc2lvbiIsImdldEFjdGl2ZVNlc3Npb24iLCJfZ2V0Q2xpZW50cyIsIl9kYXRhJGNsaWVudHMkIiwib2siLCJnZXRDbGllbnRzIiwiX3N5bmNXaXRoU2VydmVyIiwiY3VycmVudENsaWVudHMiLCJjdXJyZW50Q2xpZW50SWRzIiwiZXhpc3RpbmdDbGllbnRzIiwiZXhpc3RpbmdDbGllbnRJZHMiLCJfbG9vcCIsIkJvb2xlYW4iLCJfdGhpczMkY2FsbGJhY2tzJG9uTmUiLCJfdGhpczMkY2FsbGJhY2tzMiIsImNsaWVudERhdGEiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwic2Vzc2lvbkRhdGEiLCJjbGllbnRUYWIiLCJjcmVhdGVDbGllbnQiLCJjcmVhdGVTZXNzaW9uRnJvbVNlcnZlciIsImVyciIsIl9yZWdlbmVyYXRvclZhbHVlcyIsIl90aGlzMyRjYWxsYmFja3Mkb25DbCIsIl90aGlzMyRjYWxsYmFja3MiLCJjbG9zZUNsaWVudCIsInN5bmNXaXRoU2VydmVyIiwic3RhcnRQb2xsaW5nIiwiY3JlYXRlVGFiIiwidGFiIiwic3dpdGNoVG9UYWIiLCJ0YWJEYXRhIiwiY3JlYXRlU2Vzc2lvbkludGVybmFsIiwic2Vzc2lvbk5hbWUiLCJzb3VyY2UiLCJfdGhpcyRjYWxsYmFja3Mkb25OZXcyIiwiX3RoaXMkY2FsbGJhY2tzNCIsImV4aXN0aW5nU2Vzc2lvbiIsInN3aXRjaFRvU2Vzc2lvbiIsInNlbnRLZXlzSW5kZXgiLCJ0ZXJtaW5hbERpdiIsImZpdEFkZG9uIiwibGlua0FkZG9uIiwibG9nTWVzc2FnZSIsImNsaWVudFRhYklkIiwiY3JlYXRlVGVybWluYWxGb3JTZXNzaW9uIiwib25OZXdTZXNzaW9uIiwiY3JlYXRlTmV3U2Vzc2lvbiIsIl90aGlzJGNvbm5lY3Rpb24iLCJmaW5hbFNlc3Npb25OYW1lIiwiZ2V0VGltZSIsIl90aGlzNCIsIl9zZXNzaW9uRGF0YSR0ZXJtaW5hbDIiLCJ0ZXJtaW5hbENvbnRhaW5lciIsImdldEVsZW1lbnRCeUlkIiwic3R5bGUiLCJkaXNwbGF5IiwidG9wIiwibGVmdCIsImFwcGVuZENoaWxkIiwiY3Vyc29yQmxpbmsiLCJmb250RmFtaWx5IiwiZm9udFNpemUiLCJ0aGVtZSIsImJhY2tncm91bmQiLCJmb3JlZ3JvdW5kIiwibG9hZEFkZG9uIiwib3BlbiIsInVwZGF0ZVNlc3Npb25Db25uZWN0aW9uU3RhdHVzIiwib25NZXNzYWdlIiwiX3Nlc3Npb25EYXRhJHRlcm1pbmFsIiwibXNnIiwiY29scyIsInJvd3MiLCJwcmludFdlbGNvbWVNZXNzYWdlIiwiX3RoaXMkY2FsbGJhY2tzJG9uU2VzIiwiX3RoaXMkY2FsbGJhY2tzNSIsIm9uU2Vzc2lvblN0YXR1c0NoYW5nZWQiLCJfdGhpcyRjYWxsYmFja3Mkb25DbGkyIiwiX3RoaXMkY2FsbGJhY2tzNiIsIm9uQ2xpZW50U3RhdHVzQ2hhbmdlZCIsIl90aGlzJGNhbGxiYWNrcyRvbkFjdCIsIl90aGlzJGNhbGxiYWNrczciLCJhY3RpdmVDbGllbnQiLCJvbkFjdGl2ZUNsaWVudENoYW5nZWQiLCJfdGhpcyRjYWxsYmFja3Mkb25BY3QyIiwiX3RoaXMkY2FsbGJhY2tzOCIsIm9uQWN0aXZlU2Vzc2lvbkNoYW5nZWQiLCJmb2N1cyIsImZpdCIsIl90aGlzNSIsIl90aGlzJGNhbGxiYWNrcyRvbkNsaTMiLCJfdGhpcyRjYWxsYmFja3M5IiwiX3RoaXM1JGNhbGxiYWNrcyRvblNlIiwiX3RoaXM1JGNhbGxiYWNrcyIsImRlc3Ryb3lTZXNzaW9uIiwib25TZXNzaW9uUmVtb3ZlZCIsIm5ld0FjdGl2ZUluZGV4IiwiX3RoaXMkY2FsbGJhY2tzJG9uU2VzMiIsIl90aGlzJGNhbGxiYWNrczAiLCJzZXNzaW9uSW5kZXgiLCJuZXdBY3RpdmVTZXNzaW9uIiwiX3RoaXMkY2FsbGJhY2tzJG9uUmVtIiwiX3RoaXMkY2FsbGJhY2tzMSIsImRpc3Bvc2UiLCJvblJlbW92ZVRlcm1pbmFsRE9NIiwidG9nZ2xlQ2xpZW50RXhwYW5zaW9uIiwiZ2V0QWN0aXZlQ2xpZW50IiwiZ2V0QWxsQ2xpZW50cyIsIl90b0NvbnN1bWFibGVBcnJheSIsImdldENsaWVudFNlc3Npb25zIiwib25Ib3RLZXkiLCJpbml0aWFsaXplIiwiX3RoaXM2IiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9hY3RpdmVTZXNzaW9uJGZpdEFkZCIsIm9uYmVmb3JldW5sb2FkIiwiVGVybWluYWxBcHAiLCJ3c1VybCIsImlzRGVidWciLCJkcmFnZ2VkRWxlbWVudCIsInJvb21JZFJlc3VsdCIsImNoZWNrQW5kU2V0dXBSb29tSWQiLCJnZXRPckdlbmVyYXRlQ2xpZW50SWQiLCJ0ZXJtaW5hbE9wdGlvbnMiLCJwYXJzZUludCIsImxvY2F0aW9uIiwiaG9zdCIsInByb3RvY29sIiwidGFiTWFuYWdlciIsInNldHVwVGFiTWFuYWdlckNhbGxiYWNrcyIsInVybFBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInNlYXJjaCIsInBhdGgiLCJwYXRobmFtZSIsInNhdmVkUm9vbUlkIiwiZ2V0SXRlbSIsInNldEl0ZW0iLCJjcmVhdGVDbGllbnRET00iLCJyZW1vdmVDbGllbnRET00iLCJhbGxDbGllbnRzIiwic2hvd0NsaWVudEluc3RydWN0aW9ucyIsImNyZWF0ZVNlc3Npb25ET00iLCJ1cGRhdGVBY3RpdmVTZXNzaW9uRE9NIiwicmVtb3ZlU2Vzc2lvbkRPTSIsInVwZGF0ZVNlc3Npb25zRE9NIiwidXBkYXRlQ2xpZW50U3RhdHVzRE9NIiwidXBkYXRlU2Vzc2lvblN0YXR1c0RPTSIsInVwZGF0ZUFjdGl2ZUNsaWVudERPTSIsImhpZGVDbGllbnRJbnN0cnVjdGlvbnMiLCJoaWRlQWxsVGVybWluYWxzIiwic2hvd1Rlcm1pbmFsIiwiaGFuZGxlQ3Vyc29yU3RhdGVVcGRhdGUiLCJyZW1vdmVUZXJtaW5hbERPTSIsImluaXRpYWxpemVDbGllbnRJbnN0cnVjdGlvbnMiLCJjdXJyZW50SG9zdCIsImhvc3RQYXJ0cyIsImhvc3RuYW1lIiwicG9ydCIsImRlZmF1bHRQb3J0IiwiZmluYWxQb3J0IiwiY29tbWFuZEJveGVzIiwicXVlcnlTZWxlY3RvckFsbCIsImJveCIsImNvbW1hbmRUZXh0RWxlbWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJ0ZXh0Q29udGVudCIsInVwZGF0ZWRUZXh0IiwiY29weUJ0biIsImN1cnJlbnRUZXh0IiwiY29weVRvQ2xpcGJvYXJkIiwiY2xpcGJvYXJkIiwidGV4dEFyZWEiLCJzZWxlY3QiLCJleGVjQ29tbWFuZCIsInJlbW92ZUNoaWxkIiwiX2luaXRpYWxpemUiLCJzZXR1cEV2ZW50SGFuZGxlcnMiLCJ0YWJzQ29udGFpbmVyIiwibmV3VGFiQnRuIiwiY2xpZW50RWxlbWVudCIsImNsYXNzTmFtZSIsImRyYWdnYWJsZSIsImlubmVySFRNTCIsIm9uY2xpY2siLCJjbGFzc0xpc3QiLCJjb250YWlucyIsImNsb3NlQnV0dG9uIiwic3RvcFByb3BhZ2F0aW9uIiwic2V0dXBEcmFnQW5kRHJvcCIsImluc2VydEJlZm9yZSIsInJlbW92ZSIsInNlc3Npb25zQ29udGFpbmVyIiwibmV3U2Vzc2lvbkJ0biIsInNlc3Npb25FbGVtZW50Iiwic3RhdHVzRWxlbWVudCIsImFkZCIsIm5hbWVFbGVtZW50IiwidHlwZUVsZW1lbnQiLCJlbCIsImV4aXN0aW5nU2Vzc2lvbnMiLCJzaG93Q2xpZW50VGVybWluYWxzIiwic3dpdGNoVG9DbGllbnQiLCJfdGhpczciLCJuZXdDbGllbnRCdG4iLCJpc01hYyIsImlzRGV2VG9vbHMiLCJtZXRhS2V5IiwiYWx0S2V5IiwiY3RybEtleSIsInNoaWZ0S2V5IiwicHJldmVudERlZmF1bHQiLCJjdHJsIiwiYWx0IiwiaW5zdHJ1Y3Rpb25zRWxlbWVudCIsImFsZXJ0Iiwic2Vzc2lvbnNFbGVtZW50IiwiZWxlbWVudCIsIl90aGlzOCIsImRhdGFUcmFuc2ZlciIsImVmZmVjdEFsbG93ZWQiLCJzZXREYXRhIiwiY29udGFpbmVyIiwiZHJvcEVmZmVjdCIsImFmdGVyRWxlbWVudCIsImdldERyYWdBZnRlckVsZW1lbnQiLCJjbGllbnRYIiwibmV3QnRuIiwiZHJhZ2dhYmxlRWxlbWVudHMiLCJyZWR1Y2UiLCJjbG9zZXN0IiwiY2hpbGQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJvZmZzZXQiLCJhc3NpZ24iLCJ0ZXJtaW5hbEFwcCIsImluaXRpYWxpemVTeW5jIiwiaW5pdGlhbGl6ZUFwcCIsIl9pbml0aWFsaXplQXBwIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///222\n\n}"); /***/ }), /***/ 409: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ L: () => (/* binding */ TerminalCli)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(581);\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * TerminalCli - Реализация терминала для JavaScript клиента\n * Выполняет команды через eval и отправляет результаты\n */\n\nvar TerminalCli = /*#__PURE__*/function () {\n function TerminalCli(customCommandStorage) {\n _classCallCheck(this, TerminalCli);\n this.onData = null;\n this.onError = null;\n this.customCommandStorage = customCommandStorage;\n // Сохраняем оригинальные методы console\n this.originalConsole = {\n log: console.log,\n error: console.error,\n warn: console.warn,\n info: console.info,\n debug: console.debug\n };\n }\n /**\n * Устанавливает callback для вывода данных\n * @param callback - функция для вывода данных\n */\n return _createClass(TerminalCli, [{\n key: \"setOnData\",\n value: function setOnData(callback) {\n this.onData = callback;\n }\n /**\n * Устанавливает callback для ошибок\n * @param callback - функция для обработки ошибок\n */\n }, {\n key: \"setOnError\",\n value: function setOnError(callback) {\n this.onError = callback;\n }\n /**\n * Переопределяет методы console для перенаправления вывода\n */\n }, {\n key: \"overrideConsole\",\n value: function overrideConsole() {\n var _this = this;\n // Флаг для защиты от рекурсии\n var isOverriding = false;\n // Переопределяем console.log\n console.log = function () {\n // Защита от рекурсии\n if (isOverriding) {\n return;\n }\n isOverriding = true;\n try {\n var _this$originalConsole;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var message = args.map(function (arg) {\n return _typeof(arg) === 'object' ? JSON.stringify(arg, null, 2) : String(arg);\n }).join(' ');\n if (_this.onData) {\n _this.onData(message + '\\n');\n }\n // Также выводим в оригинальный console.log для отладки\n (_this$originalConsole = _this.originalConsole).log.apply(_this$originalConsole, args);\n } finally {\n isOverriding = false;\n }\n };\n // Переопределяем console.error\n console.error = function () {\n // Защита от рекурсии\n if (isOverriding) {\n return;\n }\n isOverriding = true;\n try {\n var _this$originalConsole2;\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n var message = args.map(function (arg) {\n return _typeof(arg) === 'object' ? JSON.stringify(arg, null, 2) : String(arg);\n }).join(' ');\n if (_this.onError) {\n _this.onError(message + '\\n');\n }\n // Также выводим в оригинальный console.error для отладки\n (_this$originalConsole2 = _this.originalConsole).error.apply(_this$originalConsole2, args);\n } finally {\n isOverriding = false;\n }\n };\n // Переопределяем console.warn\n console.warn = function () {\n // Защита от рекурсии\n if (isOverriding) {\n return;\n }\n isOverriding = true;\n try {\n var _this$originalConsole3;\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n var message = args.map(function (arg) {\n return _typeof(arg) === 'object' ? JSON.stringify(arg, null, 2) : String(arg);\n }).join(' ');\n if (_this.onData) {\n _this.onData('WARNING: ' + message + '\\n');\n }\n // Также выводим в оригинальный console.warn для отладки\n (_this$originalConsole3 = _this.originalConsole).warn.apply(_this$originalConsole3, args);\n } finally {\n isOverriding = false;\n }\n };\n // Переопределяем console.info\n console.info = function () {\n // Защита от рекурсии\n if (isOverriding) {\n return;\n }\n isOverriding = true;\n try {\n var _this$originalConsole4;\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n var message = args.map(function (arg) {\n return _typeof(arg) === 'object' ? JSON.stringify(arg, null, 2) : String(arg);\n }).join(' ');\n if (_this.onData) {\n _this.onData('INFO: ' + message + '\\n');\n }\n // Также выводим в оригинальный console.info для отладки\n (_this$originalConsole4 = _this.originalConsole).info.apply(_this$originalConsole4, args);\n } finally {\n isOverriding = false;\n }\n };\n // Переопределяем console.debug\n console.debug = function () {\n // Защита от рекурсии\n if (isOverriding) {\n return;\n }\n isOverriding = true;\n try {\n var _this$originalConsole5;\n for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n args[_key5] = arguments[_key5];\n }\n var message = args.map(function (arg) {\n return _typeof(arg) === 'object' ? JSON.stringify(arg, null, 2) : String(arg);\n }).join(' ');\n if (_this.onData) {\n _this.onData('DEBUG: ' + message + '\\n');\n }\n // Также выводим в оригинальный console.debug для отладки\n (_this$originalConsole5 = _this.originalConsole).debug.apply(_this$originalConsole5, args);\n } finally {\n isOverriding = false;\n }\n };\n }\n /**\n * Восстанавливает оригинальные методы console\n */\n }, {\n key: \"restoreConsole\",\n value: function restoreConsole() {\n console.log = this.originalConsole.log;\n console.error = this.originalConsole.error;\n console.warn = this.originalConsole.warn;\n console.info = this.originalConsole.info;\n console.debug = this.originalConsole.debug;\n }\n /**\n * Выполняет команду\n * @param command - команда для выполнения\n */\n }, {\n key: \"executeCommand\",\n value: (function () {\n var _executeCommand = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(command) {\n var customResult, terminalOut, result, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n if (!(command.length === 0)) {\n _context.n = 1;\n break;\n }\n // Пустая команда - просто новая строка\n if (this.onData) {\n this.onData(_constants__WEBPACK_IMPORTED_MODULE_0__/* .ANSI_ESCAPES */ .hY.NEWLINE);\n }\n return _context.a(2);\n case 1:\n // Выводим команду\n if (this.onData) {\n this.onData(_constants__WEBPACK_IMPORTED_MODULE_0__/* .ANSI_ESCAPES */ .hY.NEWLINE);\n }\n _context.p = 2;\n _context.n = 3;\n return this.customCommandStorage.executeCommand(command);\n case 3:\n customResult = _context.v;\n if (customResult !== null) {\n // Пользовательская команда найдена и выполнена\n if (this.onData) {\n terminalOut = customResult.replace(/\\n/g, '\\r\\n');\n this.onData(terminalOut + '\\r\\n');\n }\n } else {\n // Выполняем команду через eval\n result = eval(command); // Выводим результат\n if (this.onData) {\n if (result !== undefined) {\n this.onData(String(result) + '\\r\\n');\n }\n }\n }\n _context.n = 5;\n break;\n case 4:\n _context.p = 4;\n _t = _context.v;\n // Выводим ошибку\n if (this.onError) {\n this.onError(\"\".concat(_t.message) + '\\r\\n');\n }\n case 5:\n return _context.a(2);\n }\n }, _callee, this, [[2, 4]]);\n }));\n function executeCommand(_x) {\n return _executeCommand.apply(this, arguments);\n }\n return executeCommand;\n }()\n /**\n * Очищает ресурсы и восстанавливает оригинальные методы console\n */\n )\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.restoreConsole();\n this.onData = null;\n this.onError = null;\n }\n }]);\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QSxPQUFBYixTQUFBO01BQUE7TUFBQSxPQUFkMkMsY0FBYztJQUFBO0lBNENwQjs7O0lBQUE7RUFBQTtJQUFBckQsR0FBQTtJQUFBQyxLQUFBLEVBR0EsU0FBQTJELE9BQU9BLENBQUE7TUFDSCxJQUFJLENBQUN4QixjQUFjLEVBQUU7TUFDckIsSUFBSSxDQUFDOUMsTUFBTSxHQUFHLElBQUk7TUFDbEIsSUFBSSxDQUFDQyxPQUFPLEdBQUcsSUFBSTtJQUN2QjtFQUFDO0FBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ydHR5LXdlYnBhY2svLi9zcmMvdHMvdGVybWluYWwtY2xpLnRzP2JiMWEiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUZXJtaW5hbENsaSAtINCg0LXQsNC70LjQt9Cw0YbQuNGPINGC0LXRgNC80LjQvdCw0LvQsCDQtNC70Y8gSmF2YVNjcmlwdCDQutC70LjQtdC90YLQsFxuICog0JLRi9C/0L7Qu9C90Y/QtdGCINC60L7QvNCw0L3QtNGLINGH0LXRgNC10LcgZXZhbCDQuCDQvtGC0L/RgNCw0LLQu9GP0LXRgiDRgNC10LfRg9C70YzRgtCw0YLRi1xuICovXG5cbmltcG9ydCB7IFxuICAgIE9yaWdpbmFsQ29uc29sZSBcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBBTlNJX0VTQ0FQRVMsIFNQRUNJQUxfQ0hBUlMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDdXN0b21Db21tYW5kU3RvcmFnZSB9IGZyb20gJy4vY3VzdG9tLWNvbW1hbmQtc3RvcmFnZSc7XG5cbmV4cG9ydCBjbGFzcyBUZXJtaW5hbENsaSB7XG4gICAgcHVibGljIG9uRGF0YTogKChkYXRhOiBzdHJpbmcpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9uRXJyb3I6ICgoZXJyb3I6IHN0cmluZykgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgY3VzdG9tQ29tbWFuZFN0b3JhZ2U6IEN1c3RvbUNvbW1hbmRTdG9yYWdlO1xuICAgIHB1YmxpYyBvcmlnaW5hbENvbnNvbGU6IE9yaWdpbmFsQ29uc29sZTtcblxuICAgIGNvbnN0cnVjdG9yKGN1c3RvbUNvbW1hbmRTdG9yYWdlOiBDdXN0b21Db21tYW5kU3RvcmFnZSkge1xuICAgICAgICB0aGlzLmN1c3RvbUNvbW1hbmRTdG9yYWdlID0gY3VzdG9tQ29tbWFuZFN0b3JhZ2U7XG4gICAgICAgIC8vINCh0L7RhdGA0LDQvdGP0LXQvCDQvtGA0LjQs9C40L3QsNC70YzQvdGL0LUg0LzQtdGC0L7QtNGLIGNvbnNvbGVcbiAgICAgICAgdGhpcy5vcmlnaW5hbENvbnNvbGUgPSB7XG4gICAgICAgICAgICBsb2c6IGNvbnNvbGUubG9nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUuZXJyb3IsXG4gICAgICAgICAgICB3YXJuOiBjb25zb2xlLndhcm4sXG4gICAgICAgICAgICBpbmZvOiBjb25zb2xlLmluZm8sXG4gICAgICAgICAgICBkZWJ1ZzogY29uc29sZS5kZWJ1Z1xuICAgICAgICB9O1xuICAgIH1cblxuXG5cblxuICAgIC8qKlxuICAgICAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCIGNhbGxiYWNrINC00LvRjyDQstGL0LLQvtC00LAg0LTQsNC90L3Ri9GFXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0g0YTRg9C90LrRhtC40Y8g0LTQu9GPINCy0YvQstC+0LTQsCDQtNCw0L3QvdGL0YVcbiAgICAgKi9cbiAgICBzZXRPbkRhdGEoY2FsbGJhY2s6IChkYXRhOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkRhdGEgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiBjYWxsYmFjayDQtNC70Y8g0L7RiNC40LHQvtC6XG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0g0YTRg9C90LrRhtC40Y8g0LTQu9GPINC+0LHRgNCw0LHQvtGC0LrQuCDQvtGI0LjQsdC+0LpcbiAgICAgKi9cbiAgICBzZXRPbkVycm9yKGNhbGxiYWNrOiAoZXJyb3I6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uRXJyb3IgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9C10YDQtdC+0L/RgNC10LTQtdC70Y/QtdGCINC80LXRgtC+0LTRiyBjb25zb2xlINC00LvRjyDQv9C10YDQtdC90LDQv9GA0LDQstC70LXQvdC40Y8g0LLRi9Cy0L7QtNCwXG4gICAgICovXG4gICAgb3ZlcnJpZGVDb25zb2xlKCk6IHZvaWQge1xuICAgICAgICAvLyDQpNC70LDQsyDQtNC70Y8g0LfQsNGJ0LjRgtGLINC+0YIg0YDQtdC60YPRgNGB0LjQuFxuICAgICAgICBsZXQgaXNPdmVycmlkaW5nID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICAvLyDQn9C10YDQtdC+0L/RgNC10LTQtdC70Y/QtdC8IGNvbnNvbGUubG9nXG4gICAgICAgIGNvbnNvbGUubG9nID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICAvLyDQl9Cw0YnQuNGC0LAg0L7RgiDRgNC10LrRg9GA0YHQuNC4XG4gICAgICAgICAgICBpZiAoaXNPdmVycmlkaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpc092ZXJyaWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhcmdzLm1hcChhcmcgPT4gXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCAyKSA6IFN0cmluZyhhcmcpXG4gICAgICAgICAgICAgICAgKS5qb2luKCcgJyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25EYXRhKG1lc3NhZ2UgKyAnXFxuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vINCi0LDQutC20LUg0LLRi9Cy0L7QtNC40Lwg0LIg0L7RgNC40LPQuNC90LDQu9GM0L3Ri9C5IGNvbnNvbGUubG9nINC00LvRjyDQvtGC0LvQsNC00LrQuFxuICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxDb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaXNPdmVycmlkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8g0J/QtdGA0LXQvtC/0YDQtdC00LXQu9GP0LXQvCBjb25zb2xlLmVycm9yXG4gICAgICAgIGNvbnNvbGUuZXJyb3IgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICAgIC8vINCX0LDRidC40YLQsCDQvtGCINGA0LXQutGD0YDRgdC40LhcbiAgICAgICAgICAgIGlmIChpc092ZXJyaWRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlzT3ZlcnJpZGluZyA9IHRydWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGFyZ3MubWFwKGFyZyA9PiBcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIDIpIDogU3RyaW5nKGFyZylcbiAgICAgICAgICAgICAgICApLmpvaW4oJyAnKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihtZXNzYWdlICsgJ1xcbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyDQotCw0LrQttC1INCy0YvQstC+0LTQuNC8INCyINC+0YDQuNCz0LjQvdCw0LvRjNC90YvQuSBjb25zb2xlLmVycm9yINC00LvRjyDQvtGC0LvQsNC00LrQuFxuICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxDb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBpc092ZXJyaWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyDQn9C10YDQtdC+0L/RgNC10LTQtdC70Y/QtdC8IGNvbnNvbGUud2FyblxuICAgICAgICBjb25zb2xlLndhcm4gPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICAgIC8vINCX0LDRidC40YLQsCDQvtGCINGA0LXQutGD0YDRgdC40LhcbiAgICAgICAgICAgIGlmIChpc092ZXJyaWRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlzT3ZlcnJpZGluZyA9IHRydWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGFyZ3MubWFwKGFyZyA9PiBcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIDIpIDogU3RyaW5nKGFyZylcbiAgICAgICAgICAgICAgICApLmpvaW4oJyAnKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRhdGEoJ1dBUk5JTkc6ICcgKyBtZXNzYWdlICsgJ1xcbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyDQotCw0LrQttC1INCy0YvQstC+0LTQuNC8INCyINC+0YDQuNCz0LjQvdCw0LvRjNC90YvQuSBjb25zb2xlLndhcm4g0LTQu9GPINC+0YLQu9Cw0LTQutC4XG4gICAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbENvbnNvbGUud2FybiguLi5hcmdzKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaXNPdmVycmlkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8g0J/QtdGA0LXQvtC/0YDQtdC00LXQu9GP0LXQvCBjb25zb2xlLmluZm9cbiAgICAgICAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICAvLyDQl9Cw0YnQuNGC0LAg0L7RgiDRgNC10LrRg9GA0YHQuNC4XG4gICAgICAgICAgICBpZiAoaXNPdmVycmlkaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpc092ZXJyaWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhcmdzLm1hcChhcmcgPT4gXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCAyKSA6IFN0cmluZyhhcmcpXG4gICAgICAgICAgICAgICAgKS5qb2luKCcgJyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25EYXRhKCdJTkZPOiAnICsgbWVzc2FnZSArICdcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8g0KLQsNC60LbQtSDQstGL0LLQvtC00LjQvCDQsiDQvtGA0LjQs9C40L3QsNC70YzQvdGL0LkgY29uc29sZS5pbmZvINC00LvRjyDQvtGC0LvQsNC00LrQuFxuICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxDb25zb2xlLmluZm8oLi4uYXJncyk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGlzT3ZlcnJpZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vINCf0LXRgNC10L7Qv9GA0LXQtNC10LvRj9C10LwgY29uc29sZS5kZWJ1Z1xuICAgICAgICBjb25zb2xlLmRlYnVnID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICAvLyDQl9Cw0YnQuNGC0LAg0L7RgiDRgNC10LrRg9GA0YHQuNC4XG4gICAgICAgICAgICBpZiAoaXNPdmVycmlkaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpc092ZXJyaWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhcmdzLm1hcChhcmcgPT4gXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCAyKSA6IFN0cmluZyhhcmcpXG4gICAgICAgICAgICApLmpvaW4oJyAnKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRhdGEoJ0RFQlVHOiAnICsgbWVzc2FnZSArICdcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8g0KLQsNC60LbQtSDQstGL0LLQvtC00LjQvCDQsiDQvtGA0LjQs9C40L3QsNC70YzQvdGL0LkgY29uc29sZS5kZWJ1ZyDQtNC70Y8g0L7RgtC70LDQtNC60LhcbiAgICAgICAgICAgICAgICB0aGlzLm9yaWdpbmFsQ29uc29sZS5kZWJ1ZyguLi5hcmdzKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaXNPdmVycmlkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLQvtGB0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC+0YDQuNCz0LjQvdCw0LvRjNC90YvQtSDQvNC10YLQvtC00YsgY29uc29sZVxuICAgICAqL1xuICAgIHJlc3RvcmVDb25zb2xlKCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZyA9IHRoaXMub3JpZ2luYWxDb25zb2xlLmxvZztcbiAgICAgICAgY29uc29sZS5lcnJvciA9IHRoaXMub3JpZ2luYWxDb25zb2xlLmVycm9yO1xuICAgICAgICBjb25zb2xlLndhcm4gPSB0aGlzLm9yaWdpbmFsQ29uc29sZS53YXJuO1xuICAgICAgICBjb25zb2xlLmluZm8gPSB0aGlzLm9yaWdpbmFsQ29uc29sZS5pbmZvO1xuICAgICAgICBjb25zb2xlLmRlYnVnID0gdGhpcy5vcmlnaW5hbENvbnNvbGUuZGVidWc7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiDQktGL0L/QvtC70L3Rj9C10YIg0LrQvtC80LDQvdC00YNcbiAgICAgKiBAcGFyYW0gY29tbWFuZCAtINC60L7QvNCw0L3QtNCwINC00LvRjyDQstGL0L/QvtC70L3QtdC90LjRj1xuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoY29tbWFuZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vINCf0YPRgdGC0LDRjyDQutC+0LzQsNC90LTQsCAtINC/0YDQvtGB0YLQviDQvdC+0LLQsNGPINGB0YLRgNC+0LrQsFxuICAgICAgICAgICAgaWYgKHRoaXMub25EYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRhdGEoQU5TSV9FU0NBUEVTLk5FV0xJTkUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g0JLRi9Cy0L7QtNC40Lwg0LrQvtC80LDQvdC00YNcbiAgICAgICAgaWYgKHRoaXMub25EYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm9uRGF0YShBTlNJX0VTQ0FQRVMuTkVXTElORSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g0KHQvdCw0YfQsNC70LAg0L/RgNC+0LLQtdGA0Y/QtdC8LCDQtdGB0YLRjCDQu9C4INC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjNGB0LrQsNGPINC60L7QvNCw0L3QtNCwXG4gICAgICAgICAgICBjb25zdCBjdXN0b21SZXN1bHQgPSBhd2FpdCB0aGlzLmN1c3RvbUNvbW1hbmRTdG9yYWdlLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoY3VzdG9tUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8g0J/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutCw0Y8g0LrQvtC80LDQvdC00LAg0L3QsNC50LTQtdC90LAg0Lgg0LLRi9C/0L7Qu9C90LXQvdCwXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsT3V0ID0gY3VzdG9tUmVzdWx0LnJlcGxhY2UoL1xcbi9nLCAnXFxyXFxuJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25EYXRhKHRlcm1pbmFsT3V0ICsgJ1xcclxcbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8g0JLRi9C/0L7Qu9C90Y/QtdC8INC60L7QvNCw0L3QtNGDINGH0LXRgNC10LcgZXZhbFxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV2YWwoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8g0JLRi9Cy0L7QtNC40Lwg0YDQtdC30YPQu9GM0YLQsNGCXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRhdGEoU3RyaW5nKHJlc3VsdCkgKyAnXFxyXFxuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIC8vINCS0YvQstC+0LTQuNC8INC+0YjQuNCx0LrRg1xuICAgICAgICAgICAgaWYgKHRoaXMub25FcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihgJHtlcnJvci5tZXNzYWdlfWAgKyAnXFxyXFxuJyk7XG4gICAgICAgICAgICB9IFxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiDQntGH0LjRidCw0LXRgiDRgNC10YHRg9GA0YHRiyDQuCDQstC+0YHRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0L7RgNC40LPQuNC90LDQu9GM0L3Ri9C1INC80LXRgtC+0LTRiyBjb25zb2xlXG4gICAgICovXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXN0b3JlQ29uc29sZSgpO1xuICAgICAgICB0aGlzLm9uRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMub25FcnJvciA9IG51bGw7XG4gICAgfVxuXG59XG4iXSwibmFtZXMiOlsiQU5TSV9FU0NBUEVTIiwiVGVybWluYWxDbGkiLCJjdXN0b21Db21tYW5kU3RvcmFnZSIsIl9jbGFzc0NhbGxDaGVjayIsIm9uRGF0YSIsIm9uRXJyb3IiLCJvcmlnaW5hbENvbnNvbGUiLCJsb2ciLCJjb25zb2xlIiwiZXJyb3IiLCJ3YXJuIiwiaW5mbyIsImRlYnVnIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJzZXRPbkRhdGEiLCJjYWxsYmFjayIsInNldE9uRXJyb3IiLCJvdmVycmlkZUNvbnNvbGUiLCJfdGhpcyIsImlzT3ZlcnJpZGluZyIsIl90aGlzJG9yaWdpbmFsQ29uc29sZSIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwibWVzc2FnZSIsIm1hcCIsImFyZyIsIl90eXBlb2YiLCJKU09OIiwic3RyaW5naWZ5IiwiU3RyaW5nIiwiam9pbiIsImFwcGx5IiwiX3RoaXMkb3JpZ2luYWxDb25zb2xlMiIsIl9sZW4yIiwiX2tleTIiLCJfdGhpcyRvcmlnaW5hbENvbnNvbGUzIiwiX2xlbjMiLCJfa2V5MyIsIl90aGlzJG9yaWdpbmFsQ29uc29sZTQiLCJfbGVuNCIsIl9rZXk0IiwiX3RoaXMkb3JpZ2luYWxDb25zb2xlNSIsIl9sZW41IiwiX2tleTUiLCJyZXN0b3JlQ29uc29sZSIsIl9leGVjdXRlQ29tbWFuZCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yIiwibSIsIl9jYWxsZWUiLCJjb21tYW5kIiwiY3VzdG9tUmVzdWx0IiwidGVybWluYWxPdXQiLCJyZXN1bHQiLCJfdCIsInciLCJfY29udGV4dCIsInAiLCJuIiwiTkVXTElORSIsImEiLCJleGVjdXRlQ29tbWFuZCIsInYiLCJyZXBsYWNlIiwiZXZhbCIsInVuZGVmaW5lZCIsImNvbmNhdCIsIl94IiwiZGVzdHJveSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///409\n\n}"); /***/ }), /***/ 506: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ F: () => (/* binding */ EchoCommand)\n/* harmony export */ });\n/* harmony import */ var _custom_command__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(717);\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\n/**\n * Команда echo - выводит текст в терминал\n */\n\nvar EchoCommand = /*#__PURE__*/function (_CustomCommand) {\n function EchoCommand() {\n var _this;\n _classCallCheck(this, EchoCommand);\n _this = _callSuper(this, EchoCommand, arguments);\n _this.name = 'echo';\n _this.description = 'Outputs text to terminal. Usage: echo ';\n return _this;\n }\n _inherits(EchoCommand, _CustomCommand);\n return _createClass(EchoCommand, [{\n key: \"execute\",\n value: function execute(command) {\n // Если command начинается с 'echo', убираем это\n var text = command;\n if (text.startsWith('echo')) {\n text = text.substring(4).trim();\n }\n // Если текст пустой, выводим пустую строку\n if (text === '') {\n return '';\n }\n // Конвертируем в вызов console.log и выполняем через eval\n // Это позволит использовать всю мощь JavaScript для форматирования\n var jsCode = \"console.log(\".concat(text, \")\");\n // if text not start and end with \"`\" add \"`\"\"\n if (!text.startsWith('\"') && !text.endsWith('\"')) {\n text = \"\\\"\".concat(text, \"\\\"\");\n }\n try {\n var result = eval(jsCode);\n // console.log возвращает undefined, поэтому возвращаем пустую строку\n return '';\n } catch (error) {\n // Если произошла ошибка, возвращаем её\n return \"Error: \".concat(error.message);\n }\n }\n }]);\n}(_custom_command__WEBPACK_IMPORTED_MODULE_0__/* .CustomCommand */ .j);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTA2LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7OztBQUlrRDtBQUUzQyxJQUFNQyxXQUFZLDBCQUFBQyxjQUFBO0VBQXpCLFNBQUFELFlBQUE7SUFBQSxJQUFBRSxLQUFBO0lBQUFDLGVBQUEsT0FBQUgsV0FBQTs7SUFDYUUsS0FBQSxDQUFBRSxJQUFJLEdBQUcsTUFBTTtJQUNiRixLQUFBLENBQUFHLFdBQVcsR0FBRyw4Q0FBOEM7SUFBQyxPQUFBSCxLQUFBO0VBOEIxRTtFQUFDSSxTQUFBLENBQUFOLFdBQUEsRUFBQUMsY0FBQTtFQUFBLE9BQUFNLFlBQUEsQ0FBQVAsV0FBQTtJQUFBUSxHQUFBO0lBQUFDLEtBQUEsRUE1QkcsU0FBQUMsT0FBT0EsQ0FBQ0MsT0FBZTtNQUNuQjtNQUNBLElBQUlDLElBQUksR0FBR0QsT0FBTztNQUNsQixJQUFJQyxJQUFJLENBQUNDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN6QkQsSUFBSSxHQUFHQSxJQUFJLENBQUNFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxFQUFFO01BQ25DO01BRUE7TUFDQSxJQUFJSCxJQUFJLEtBQUssRUFBRSxFQUFFO1FBQ2IsT0FBTyxFQUFFO01BQ2I7TUFFQTtNQUNBO01BQ0EsSUFBTUksTUFBTSxrQkFBQUMsTUFBQSxDQUFrQkwsSUFBSSxNQUFHO01BQ3JDO01BQ0EsSUFBSSxDQUFDQSxJQUFJLENBQUNDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDRCxJQUFJLENBQUNNLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUM5Q04sSUFBSSxRQUFBSyxNQUFBLENBQU9MLElBQUksT0FBRztNQUN0QjtNQUNBLElBQUk7UUFDQSxJQUFNTyxNQUFNLEdBQUdDLElBQUksQ0FBQ0osTUFBTSxDQUFDO1FBQzNCO1FBQ0EsT0FBTyxFQUFFO01BQ2IsQ0FBQyxDQUFDLE9BQU9LLEtBQVUsRUFBRTtRQUNqQjtRQUNBLGlCQUFBSixNQUFBLENBQWlCSSxLQUFLLENBQUNDLE9BQU87TUFDbEM7SUFDSjtFQUFDO0FBQUEsRUEvQjRCdkIsbUVBQWEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ydHR5LXdlYnBhY2svLi9zcmMvdHMvY29tbWFuZHMvZWNoby50cz85MWYyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog0JrQvtC80LDQvdC00LAgZWNobyAtINCy0YvQstC+0LTQuNGCINGC0LXQutGB0YIg0LIg0YLQtdGA0LzQuNC90LDQu1xuICovXG5cbmltcG9ydCB7IEN1c3RvbUNvbW1hbmQgfSBmcm9tIFwiLi4vY3VzdG9tLWNvbW1hbmRcIjtcblxuZXhwb3J0IGNsYXNzIEVjaG9Db21tYW5kIGV4dGVuZHMgQ3VzdG9tQ29tbWFuZCB7XG4gICAgcmVhZG9ubHkgbmFtZSA9ICdlY2hvJztcbiAgICByZWFkb25seSBkZXNjcmlwdGlvbiA9ICdPdXRwdXRzIHRleHQgdG8gdGVybWluYWwuIFVzYWdlOiBlY2hvIDx0ZXh0Pic7XG4gICAgXG4gICAgZXhlY3V0ZShjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyDQldGB0LvQuCBjb21tYW5kINC90LDRh9C40L3QsNC10YLRgdGPINGBICdlY2hvJywg0YPQsdC40YDQsNC10Lwg0Y3RgtC+XG4gICAgICAgIGxldCB0ZXh0ID0gY29tbWFuZDtcbiAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aCgnZWNobycpKSB7XG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoNCkudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyDQldGB0LvQuCDRgtC10LrRgdGCINC/0YPRgdGC0L7QuSwg0LLRi9Cy0L7QtNC40Lwg0L/Rg9GB0YLRg9GOINGB0YLRgNC+0LrRg1xuICAgICAgICBpZiAodGV4dCA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8g0JrQvtC90LLQtdGA0YLQuNGA0YPQtdC8INCyINCy0YvQt9C+0LIgY29uc29sZS5sb2cg0Lgg0LLRi9C/0L7Qu9C90Y/QtdC8INGH0LXRgNC10LcgZXZhbFxuICAgICAgICAvLyDQrdGC0L4g0L/QvtC30LLQvtC70LjRgiDQuNGB0L/QvtC70YzQt9C+0LLQsNGC0Ywg0LLRgdGOINC80L7RidGMIEphdmFTY3JpcHQg0LTQu9GPINGE0L7RgNC80LDRgtC40YDQvtCy0LDQvdC40Y9cbiAgICAgICAgY29uc3QganNDb2RlID0gYGNvbnNvbGUubG9nKCR7dGV4dH0pYDtcbiAgICAgICAgLy8gaWYgdGV4dCBub3Qgc3RhcnQgYW5kIGVuZCB3aXRoIFwiYFwiIGFkZCBcImBcIlwiXG4gICAgICAgIGlmICghdGV4dC5zdGFydHNXaXRoKCdcIicpICYmICF0ZXh0LmVuZHNXaXRoKCdcIicpKSB7IFxuICAgICAgICAgICAgdGV4dCA9IGBcIiR7dGV4dH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV2YWwoanNDb2RlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCIHVuZGVmaW5lZCwg0L/QvtGN0YLQvtC80YMg0LLQvtC30LLRgNCw0YnQsNC10Lwg0L/Rg9GB0YLRg9GOINGB0YLRgNC+0LrRg1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAvLyDQldGB0LvQuCDQv9GA0L7QuNC30L7RiNC70LAg0L7RiNC40LHQutCwLCDQstC+0LfQstGA0LDRidCw0LXQvCDQtdGRXG4gICAgICAgICAgICByZXR1cm4gYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJDdXN0b21Db21tYW5kIiwiRWNob0NvbW1hbmQiLCJfQ3VzdG9tQ29tbWFuZCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrIiwibmFtZSIsImRlc2NyaXB0aW9uIiwiX2luaGVyaXRzIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJleGVjdXRlIiwiY29tbWFuZCIsInRleHQiLCJzdGFydHNXaXRoIiwic3Vic3RyaW5nIiwidHJpbSIsImpzQ29kZSIsImNvbmNhdCIsImVuZHNXaXRoIiwicmVzdWx0IiwiZXZhbCIsImVycm9yIiwibWVzc2FnZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///506\n\n}"); /***/ }), /***/ 581: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ a$: () => (/* binding */ DEFAULT_SETTINGS),\n/* harmony export */ hY: () => (/* binding */ ANSI_ESCAPES)\n/* harmony export */ });\n/* unused harmony exports CLIENT_TYPES, SPECIAL_CHARS */\n/**\n * Константы для терминального клиента\n */\n// Типы клиентов\nvar CLIENT_TYPES = {\n WEB: 'web',\n CMD: 'cmd',\n JS: 'js'\n};\n// ANSI escape sequences\nvar ANSI_ESCAPES = {\n CLEAR_SCREEN: '\\x1b[2J\\x1b[H',\n CURSOR_HOME: '\\x1b[H',\n CLEAR_LINE: '\\x1b[K',\n CURSOR_RIGHT: '\\x1b[C',\n CURSOR_LEFT: '\\x1b[D',\n CURSOR_UP: '\\x1b[A',\n CURSOR_DOWN: '\\x1b[B',\n BACKSPACE: '\\b \\b',\n NEWLINE: '\\r\\n',\n CARRIAGE_RETURN: '\\r'\n};\n// Специальные символы\nvar SPECIAL_CHARS = {\n CTRL_C: '\\x03',\n CTRL_D: '\\x04',\n CTRL_L: '\\x0c',\n BACKSPACE: '\\b',\n DELETE: '\\x7f'\n};\n// Настройки по умолчанию\nvar DEFAULT_SETTINGS = {\n MAX_RECONNECT_ATTEMPTS: 5,\n RECONNECT_DELAY: 1000,\n RECONNECT_DELAY_MAX: 30000,\n // Максимальная задержка 30 секунд\n RECONNECT_BACKOFF_MULTIPLIER: 1.5,\n // Множитель для экспоненциального backoff\n AUTO_CONNECT_DELAY: 1000,\n DEFAULT_SERVER_URL: 'ws://localhost:9999/ws',\n DEFAULT_CLIENT_NAME: 'JavaScript Terminal',\n ENABLE_AUTO_RECONNECT: true\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTgxLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7OztBQVFBO0FBQ08sSUFBTUEsWUFBWSxHQUErQjtFQUNwREMsR0FBRyxFQUFFLEtBQUs7RUFDVkMsR0FBRyxFQUFFLEtBQUs7RUFDVkMsRUFBRSxFQUFFO0NBQ0U7QUFFVjtBQUNPLElBQU1DLFlBQVksR0FBRztFQUN4QkMsWUFBWSxFQUFFLGVBQWU7RUFDN0JDLFdBQVcsRUFBRSxRQUFRO0VBQ3JCQyxVQUFVLEVBQUUsUUFBUTtFQUNwQkMsWUFBWSxFQUFFLFFBQVE7RUFDdEJDLFdBQVcsRUFBRSxRQUFRO0VBQ3JCQyxTQUFTLEVBQUUsUUFBUTtFQUNuQkMsV0FBVyxFQUFFLFFBQVE7RUFDckJDLFNBQVMsRUFBRSxPQUFPO0VBQ2xCQyxPQUFPLEVBQUUsTUFBTTtFQUNmQyxlQUFlLEVBQUU7Q0FDWDtBQUVWO0FBQ08sSUFBTUMsYUFBYSxHQUFHO0VBQ3pCQyxNQUFNLEVBQUUsTUFBTTtFQUNkQyxNQUFNLEVBQUUsTUFBTTtFQUNkQyxNQUFNLEVBQUUsTUFBTTtFQUNkTixTQUFTLEVBQUUsSUFBSTtFQUNmTyxNQUFNLEVBQUU7Q0FDRjtBQUVWO0FBQ08sSUFBTUMsZ0JBQWdCLEdBQUc7RUFDNUJDLHNCQUFzQixFQUFFLENBQUM7RUFDekJDLGVBQWUsRUFBRSxJQUFJO0VBQ3JCQyxtQkFBbUIsRUFBRSxLQUFLO0VBQUU7RUFDNUJDLDRCQUE0QixFQUFFLEdBQUc7RUFBRTtFQUNuQ0Msa0JBQWtCLEVBQUUsSUFBSTtFQUN4QkMsa0JBQWtCLEVBQUUsd0JBQXdCO0VBQzVDQyxtQkFBbUIsRUFBRSxxQkFBcUI7RUFDMUNDLHFCQUFxQixFQUFFO0NBQ2pCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcnR0eS13ZWJwYWNrLy4vc3JjL3RzL2NvbnN0YW50cy50cz8xYTQzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog0JrQvtC90YHRgtCw0L3RgtGLINC00LvRjyDRgtC10YDQvNC40L3QsNC70YzQvdC+0LPQviDQutC70LjQtdC90YLQsFxuICovXG5cbmltcG9ydCB7IEV2ZW50VHlwZSwgQ2xpZW50VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5cblxuLy8g0KLQuNC/0Ysg0LrQu9C40LXQvdGC0L7QslxuZXhwb3J0IGNvbnN0IENMSUVOVF9UWVBFUzogUmVjb3JkPHN0cmluZywgQ2xpZW50VHlwZT4gPSB7XG4gICAgV0VCOiAnd2ViJyxcbiAgICBDTUQ6ICdjbWQnLFxuICAgIEpTOiAnanMnXG59IGFzIGNvbnN0O1xuXG4vLyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXNcbmV4cG9ydCBjb25zdCBBTlNJX0VTQ0FQRVMgPSB7XG4gICAgQ0xFQVJfU0NSRUVOOiAnXFx4MWJbMkpcXHgxYltIJyxcbiAgICBDVVJTT1JfSE9NRTogJ1xceDFiW0gnLFxuICAgIENMRUFSX0xJTkU6ICdcXHgxYltLJyxcbiAgICBDVVJTT1JfUklHSFQ6ICdcXHgxYltDJyxcbiAgICBDVVJTT1JfTEVGVDogJ1xceDFiW0QnLFxuICAgIENVUlNPUl9VUDogJ1xceDFiW0EnLFxuICAgIENVUlNPUl9ET1dOOiAnXFx4MWJbQicsXG4gICAgQkFDS1NQQUNFOiAnXFxiIFxcYicsXG4gICAgTkVXTElORTogJ1xcclxcbicsXG4gICAgQ0FSUklBR0VfUkVUVVJOOiAnXFxyJ1xufSBhcyBjb25zdDtcblxuLy8g0KHQv9C10YbQuNCw0LvRjNC90YvQtSDRgdC40LzQstC+0LvRi1xuZXhwb3J0IGNvbnN0IFNQRUNJQUxfQ0hBUlMgPSB7XG4gICAgQ1RSTF9DOiAnXFx4MDMnLFxuICAgIENUUkxfRDogJ1xceDA0JyxcbiAgICBDVFJMX0w6ICdcXHgwYycsXG4gICAgQkFDS1NQQUNFOiAnXFxiJyxcbiAgICBERUxFVEU6ICdcXHg3Zidcbn0gYXMgY29uc3Q7XG5cbi8vINCd0LDRgdGC0YDQvtC50LrQuCDQv9C+INGD0LzQvtC70YfQsNC90LjRjlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1MgPSB7XG4gICAgTUFYX1JFQ09OTkVDVF9BVFRFTVBUUzogNSxcbiAgICBSRUNPTk5FQ1RfREVMQVk6IDEwMDAsXG4gICAgUkVDT05ORUNUX0RFTEFZX01BWDogMzAwMDAsIC8vINCc0LDQutGB0LjQvNCw0LvRjNC90LDRjyDQt9Cw0LTQtdGA0LbQutCwIDMwINGB0LXQutGD0L3QtFxuICAgIFJFQ09OTkVDVF9CQUNLT0ZGX01VTFRJUExJRVI6IDEuNSwgLy8g0JzQvdC+0LbQuNGC0LXQu9GMINC00LvRjyDRjdC60YHQv9C+0L3QtdC90YbQuNCw0LvRjNC90L7Qs9C+IGJhY2tvZmZcbiAgICBBVVRPX0NPTk5FQ1RfREVMQVk6IDEwMDAsXG4gICAgREVGQVVMVF9TRVJWRVJfVVJMOiAnd3M6Ly9sb2NhbGhvc3Q6OTk5OS93cycsXG4gICAgREVGQVVMVF9DTElFTlRfTkFNRTogJ0phdmFTY3JpcHQgVGVybWluYWwnLFxuICAgIEVOQUJMRV9BVVRPX1JFQ09OTkVDVDogdHJ1ZVxufSBhcyBjb25zdDtcbiJdLCJuYW1lcyI6WyJDTElFTlRfVFlQRVMiLCJXRUIiLCJDTUQiLCJKUyIsIkFOU0lfRVNDQVBFUyIsIkNMRUFSX1NDUkVFTiIsIkNVUlNPUl9IT01FIiwiQ0xFQVJfTElORSIsIkNVUlNPUl9SSUdIVCIsIkNVUlNPUl9MRUZUIiwiQ1VSU09SX1VQIiwiQ1VSU09SX0RPV04iLCJCQUNLU1BBQ0UiLCJORVdMSU5FIiwiQ0FSUklBR0VfUkVUVVJOIiwiU1BFQ0lBTF9DSEFSUyIsIkNUUkxfQyIsIkNUUkxfRCIsIkNUUkxfTCIsIkRFTEVURSIsIkRFRkFVTFRfU0VUVElOR1MiLCJNQVhfUkVDT05ORUNUX0FUVEVNUFRTIiwiUkVDT05ORUNUX0RFTEFZIiwiUkVDT05ORUNUX0RFTEFZX01BWCIsIlJFQ09OTkVDVF9CQUNLT0ZGX01VTFRJUExJRVIiLCJBVVRPX0NPTk5FQ1RfREVMQVkiLCJERUZBVUxUX1NFUlZFUl9VUkwiLCJERUZBVUxUX0NMSUVOVF9OQU1FIiwiRU5BQkxFX0FVVE9fUkVDT05ORUNUIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///581\n\n}"); /***/ }), /***/ 616: /***/ ((module) => { eval("{!function(e,t){ true?module.exports=t():0}(self,(()=>(()=>{\"use strict\";var e={};return(()=>{var t=e;Object.defineProperty(t,\"__esModule\",{value:!0}),t.FitAddon=void 0,t.FitAddon=class{activate(e){this._terminal=e}dispose(){}fit(){const e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;const t=this._terminal._core;this._terminal.rows===e.rows&&this._terminal.cols===e.cols||(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal)return;if(!this._terminal.element||!this._terminal.element.parentElement)return;const e=this._terminal._core,t=e._renderService.dimensions;if(0===t.css.cell.width||0===t.css.cell.height)return;const r=0===this._terminal.options.scrollback?0:e.viewport.scrollBarWidth,i=window.getComputedStyle(this._terminal.element.parentElement),o=parseInt(i.getPropertyValue(\"height\")),s=Math.max(0,parseInt(i.getPropertyValue(\"width\"))),n=window.getComputedStyle(this._terminal.element),l=o-(parseInt(n.getPropertyValue(\"padding-top\"))+parseInt(n.getPropertyValue(\"padding-bottom\"))),a=s-(parseInt(n.getPropertyValue(\"padding-right\"))+parseInt(n.getPropertyValue(\"padding-left\")))-r;return{cols:Math.max(2,Math.floor(a/t.css.cell.width)),rows:Math.max(1,Math.floor(l/t.css.cell.height))}}}})(),e})()));\n//# sourceMappingURL=addon-fit.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjE2LmpzIiwibWFwcGluZ3MiOiJBQUFBLGVBQWUsS0FBaUQsb0JBQW9CLENBQStHLENBQUMsaUJBQWlCLGFBQWEsU0FBUyxZQUFZLFFBQVEsc0NBQXNDLFNBQVMscUNBQXFDLFlBQVksaUJBQWlCLFdBQVcsTUFBTSxpQ0FBaUMsNERBQTRELDZCQUE2Qiw0SEFBNEgsb0JBQW9CLDBCQUEwQix5RUFBeUUsMkRBQTJELHNEQUFzRCw2ZEFBNmQsT0FBTyxvR0FBb0csTUFBTTtBQUM3NkMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ydHR5LXdlYnBhY2svLi9ub2RlX21vZHVsZXMvQHh0ZXJtL2FkZG9uLWZpdC9saWIvYWRkb24tZml0LmpzP2NmYjIiXSwic291cmNlc0NvbnRlbnQiOlsiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sdCk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5GaXRBZGRvbj10KCk6ZS5GaXRBZGRvbj10KCl9KHNlbGYsKCgpPT4oKCk9PntcInVzZSBzdHJpY3RcIjt2YXIgZT17fTtyZXR1cm4oKCk9Pnt2YXIgdD1lO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuRml0QWRkb249dm9pZCAwLHQuRml0QWRkb249Y2xhc3N7YWN0aXZhdGUoZSl7dGhpcy5fdGVybWluYWw9ZX1kaXNwb3NlKCl7fWZpdCgpe2NvbnN0IGU9dGhpcy5wcm9wb3NlRGltZW5zaW9ucygpO2lmKCFlfHwhdGhpcy5fdGVybWluYWx8fGlzTmFOKGUuY29scyl8fGlzTmFOKGUucm93cykpcmV0dXJuO2NvbnN0IHQ9dGhpcy5fdGVybWluYWwuX2NvcmU7dGhpcy5fdGVybWluYWwucm93cz09PWUucm93cyYmdGhpcy5fdGVybWluYWwuY29scz09PWUuY29sc3x8KHQuX3JlbmRlclNlcnZpY2UuY2xlYXIoKSx0aGlzLl90ZXJtaW5hbC5yZXNpemUoZS5jb2xzLGUucm93cykpfXByb3Bvc2VEaW1lbnNpb25zKCl7aWYoIXRoaXMuX3Rlcm1pbmFsKXJldHVybjtpZighdGhpcy5fdGVybWluYWwuZWxlbWVudHx8IXRoaXMuX3Rlcm1pbmFsLmVsZW1lbnQucGFyZW50RWxlbWVudClyZXR1cm47Y29uc3QgZT10aGlzLl90ZXJtaW5hbC5fY29yZSx0PWUuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucztpZigwPT09dC5jc3MuY2VsbC53aWR0aHx8MD09PXQuY3NzLmNlbGwuaGVpZ2h0KXJldHVybjtjb25zdCByPTA9PT10aGlzLl90ZXJtaW5hbC5vcHRpb25zLnNjcm9sbGJhY2s/MDplLnZpZXdwb3J0LnNjcm9sbEJhcldpZHRoLGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fdGVybWluYWwuZWxlbWVudC5wYXJlbnRFbGVtZW50KSxvPXBhcnNlSW50KGkuZ2V0UHJvcGVydHlWYWx1ZShcImhlaWdodFwiKSkscz1NYXRoLm1heCgwLHBhcnNlSW50KGkuZ2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIpKSksbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl90ZXJtaW5hbC5lbGVtZW50KSxsPW8tKHBhcnNlSW50KG4uZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmctdG9wXCIpKStwYXJzZUludChuLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nLWJvdHRvbVwiKSkpLGE9cy0ocGFyc2VJbnQobi5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1yaWdodFwiKSkrcGFyc2VJbnQobi5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1sZWZ0XCIpKSktcjtyZXR1cm57Y29sczpNYXRoLm1heCgyLE1hdGguZmxvb3IoYS90LmNzcy5jZWxsLndpZHRoKSkscm93czpNYXRoLm1heCgxLE1hdGguZmxvb3IobC90LmNzcy5jZWxsLmhlaWdodCkpfX19fSkoKSxlfSkoKSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWRkb24tZml0LmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///616\n\n}"); /***/ }), /***/ 717: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ j: () => (/* binding */ CustomCommand)\n/* harmony export */ });\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * Базовый абстрактный класс для пользовательских команд\n */\nvar CustomCommand = /*#__PURE__*/function () {\n function CustomCommand() {\n _classCallCheck(this, CustomCommand);\n }\n return _createClass(CustomCommand, [{\n key: \"matches\",\n value: function matches(input) {\n return input.startsWith(this.name);\n }\n }]);\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzE3LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOzs7QUFJTyxJQUFlQSxhQUFhO0VBQUEsU0FBQUEsY0FBQTtJQUFBQyxlQUFBLE9BQUFELGFBQUE7RUFBQTtFQUFBLE9BQUFFLFlBQUEsQ0FBQUYsYUFBQTtJQUFBRyxHQUFBO0lBQUFDLEtBQUEsRUFNL0IsU0FBQUMsT0FBT0EsQ0FBQ0MsS0FBYTtNQUNqQixPQUFPQSxLQUFLLENBQUNDLFVBQVUsQ0FBQyxJQUFJLENBQUNDLElBQUksQ0FBQztJQUN0QztFQUFDO0FBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ydHR5LXdlYnBhY2svLi9zcmMvdHMvY3VzdG9tLWNvbW1hbmQudHM/ODg2OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqINCR0LDQt9C+0LLRi9C5INCw0LHRgdGC0YDQsNC60YLQvdGL0Lkg0LrQu9Cw0YHRgSDQtNC70Y8g0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GM0YHQutC40YUg0LrQvtC80LDQvdC0XG4gKi9cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEN1c3RvbUNvbW1hbmQge1xuICAgIGFic3RyYWN0IHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICBhYnN0cmFjdCByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIFxuICAgIGFic3RyYWN0IGV4ZWN1dGUoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuICAgIFxuICAgIG1hdGNoZXMoaW5wdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaW5wdXQuc3RhcnRzV2l0aCh0aGlzLm5hbWUpO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJDdXN0b21Db21tYW5kIiwiX2NsYXNzQ2FsbENoZWNrIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwidmFsdWUiLCJtYXRjaGVzIiwiaW5wdXQiLCJzdGFydHNXaXRoIiwibmFtZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///717\n\n}"); /***/ }), /***/ 832: /***/ ((module) => { eval("{!function(e,t){ true?module.exports=t():0}(self,(()=>(()=>{\"use strict\";var e={6:(e,t)=>{function n(e){try{const t=new URL(e),n=t.password&&t.username?`${t.protocol}//${t.username}:${t.password}@${t.host}`:t.username?`${t.protocol}//${t.username}@${t.host}`:`${t.protocol}//${t.host}`;return e.toLocaleLowerCase().startsWith(n.toLocaleLowerCase())}catch(e){return!1}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.LinkComputer=t.WebLinkProvider=void 0,t.WebLinkProvider=class{constructor(e,t,n,o={}){this._terminal=e,this._regex=t,this._handler=n,this._options=o}provideLinks(e,t){const n=o.computeLink(e,this._regex,this._terminal,this._handler);t(this._addCallbacks(n))}_addCallbacks(e){return e.map((e=>(e.leave=this._options.leave,e.hover=(t,n)=>{if(this._options.hover){const{range:o}=e;this._options.hover(t,n,o)}},e)))}};class o{static computeLink(e,t,r,i){const s=new RegExp(t.source,(t.flags||\"\")+\"g\"),[a,c]=o._getWindowedLineStrings(e-1,r),l=a.join(\"\");let d;const p=[];for(;d=s.exec(l);){const e=d[0];if(!n(e))continue;const[t,s]=o._mapStrIdx(r,c,0,d.index),[a,l]=o._mapStrIdx(r,t,s,e.length);if(-1===t||-1===s||-1===a||-1===l)continue;const h={start:{x:s+1,y:t+1},end:{x:l,y:a+1}};p.push({range:h,text:e,activate:i})}return p}static _getWindowedLineStrings(e,t){let n,o=e,r=e,i=0,s=\"\";const a=[];if(n=t.buffer.active.getLine(e)){const e=n.translateToString(!0);if(n.isWrapped&&\" \"!==e[0]){for(i=0;(n=t.buffer.active.getLine(--o))&&i<2048&&(s=n.translateToString(!0),i+=s.length,a.push(s),n.isWrapped&&-1===s.indexOf(\" \")););a.reverse()}for(a.push(e),i=0;(n=t.buffer.active.getLine(++r))&&n.isWrapped&&i<2048&&(s=n.translateToString(!0),i+=s.length,a.push(s),-1===s.indexOf(\" \")););}return[a,o]}static _mapStrIdx(e,t,n,o){const r=e.buffer.active,i=r.getNullCell();let s=n;for(;o;){const e=r.getLine(t);if(!e)return[-1,-1];for(let n=s;n{var e=o;Object.defineProperty(e,\"__esModule\",{value:!0}),e.WebLinksAddon=void 0;const t=n(6),r=/(https?|HTTPS?):[/]{2}[^\\s\"'!*(){}|\\\\\\^<>`]*[^\\s\"':,.!?{}|\\\\\\^~\\[\\]`()<>]/;function i(e,t){const n=window.open();if(n){try{n.opener=null}catch{}n.location.href=t}else console.warn(\"Opening link blocked as opener could not be cleared\")}e.WebLinksAddon=class{constructor(e=i,t={}){this._handler=e,this._options=t}activate(e){this._terminal=e;const n=this._options,o=n.urlRegex||r;this._linkProvider=this._terminal.registerLinkProvider(new t.WebLinkProvider(this._terminal,o,this._handler,n))}dispose(){this._linkProvider?.dispose()}}})(),o})()));\n//# sourceMappingURL=addon-web-links.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMyLmpzIiwibWFwcGluZ3MiOiJBQUFBLGVBQWUsS0FBaUQsb0JBQW9CLENBQXlILENBQUMsaUJBQWlCLGFBQWEsT0FBTyxVQUFVLGNBQWMsSUFBSSwrQ0FBK0MsV0FBVyxJQUFJLFdBQVcsR0FBRyxXQUFXLEdBQUcsT0FBTyxnQkFBZ0IsV0FBVyxJQUFJLFdBQVcsR0FBRyxPQUFPLEtBQUssV0FBVyxJQUFJLE9BQU8sRUFBRSwrREFBK0QsU0FBUyxVQUFVLHNDQUFzQyxTQUFTLGtFQUFrRSxzQkFBc0IsRUFBRSwrREFBK0Qsa0JBQWtCLGtFQUFrRSx5QkFBeUIsaUJBQWlCLDhEQUE4RCx3QkFBd0IsTUFBTSxRQUFRLEdBQUcsNEJBQTRCLFFBQVEsUUFBUSw0QkFBNEIsbUdBQW1HLE1BQU0sV0FBVyxLQUFLLFlBQVksRUFBRSxhQUFhLGtCQUFrQiwwRUFBMEUsMkNBQTJDLFNBQVMsT0FBTyxZQUFZLE1BQU0sWUFBWSxRQUFRLDBCQUEwQixFQUFFLFNBQVMsb0NBQW9DLHVCQUF1QixXQUFXLGlDQUFpQyxnQ0FBZ0MsNEJBQTRCLFFBQVEsNkhBQTZILEVBQUUsWUFBWSxrQkFBa0IsNkhBQTZILEdBQUcsWUFBWSwyQkFBMkIsMENBQTBDLFFBQVEsS0FBSyxFQUFFLEVBQUUscUJBQXFCLG9CQUFvQixZQUFZLFdBQVcsS0FBSyxlQUFlLHFCQUFxQiwwREFBMEQsdUJBQXVCLDBEQUEwRCxtQkFBbUIsUUFBUSxhQUFhLGtCQUFrQixNQUFNLGNBQWMsV0FBVywrQkFBK0IsWUFBWSxZQUFZLHFDQUFxQyxTQUFTLFlBQVksUUFBUSxzQ0FBc0MsU0FBUyx5QkFBeUIsb0NBQW9DLEVBQUUsWUFBWSx1QkFBdUIsa0JBQWtCLGdCQUFnQixzQkFBc0IsTUFBTSxJQUFJLGNBQWMsT0FBTyxrQkFBa0IseUVBQXlFLHNCQUFzQixvQkFBb0IsRUFBRSxnQ0FBZ0MsWUFBWSxpQkFBaUIsc0NBQXNDLGdIQUFnSCxVQUFVLGdDQUFnQyxNQUFNO0FBQ2grRiIsInNvdXJjZXMiOlsid2VicGFjazovL3J0dHktd2VicGFjay8uL25vZGVfbW9kdWxlcy9AeHRlcm0vYWRkb24td2ViLWxpbmtzL2xpYi9hZGRvbi13ZWItbGlua3MuanM/ZjhjYiJdLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSx0KTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLldlYkxpbmtzQWRkb249dCgpOmUuV2ViTGlua3NBZGRvbj10KCl9KHNlbGYsKCgpPT4oKCk9PntcInVzZSBzdHJpY3RcIjt2YXIgZT17NjooZSx0KT0+e2Z1bmN0aW9uIG4oZSl7dHJ5e2NvbnN0IHQ9bmV3IFVSTChlKSxuPXQucGFzc3dvcmQmJnQudXNlcm5hbWU/YCR7dC5wcm90b2NvbH0vLyR7dC51c2VybmFtZX06JHt0LnBhc3N3b3JkfUAke3QuaG9zdH1gOnQudXNlcm5hbWU/YCR7dC5wcm90b2NvbH0vLyR7dC51c2VybmFtZX1AJHt0Lmhvc3R9YDpgJHt0LnByb3RvY29sfS8vJHt0Lmhvc3R9YDtyZXR1cm4gZS50b0xvY2FsZUxvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobi50b0xvY2FsZUxvd2VyQ2FzZSgpKX1jYXRjaChlKXtyZXR1cm4hMX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5MaW5rQ29tcHV0ZXI9dC5XZWJMaW5rUHJvdmlkZXI9dm9pZCAwLHQuV2ViTGlua1Byb3ZpZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuLG89e30pe3RoaXMuX3Rlcm1pbmFsPWUsdGhpcy5fcmVnZXg9dCx0aGlzLl9oYW5kbGVyPW4sdGhpcy5fb3B0aW9ucz1vfXByb3ZpZGVMaW5rcyhlLHQpe2NvbnN0IG49by5jb21wdXRlTGluayhlLHRoaXMuX3JlZ2V4LHRoaXMuX3Rlcm1pbmFsLHRoaXMuX2hhbmRsZXIpO3QodGhpcy5fYWRkQ2FsbGJhY2tzKG4pKX1fYWRkQ2FsbGJhY2tzKGUpe3JldHVybiBlLm1hcCgoZT0+KGUubGVhdmU9dGhpcy5fb3B0aW9ucy5sZWF2ZSxlLmhvdmVyPSh0LG4pPT57aWYodGhpcy5fb3B0aW9ucy5ob3Zlcil7Y29uc3R7cmFuZ2U6b309ZTt0aGlzLl9vcHRpb25zLmhvdmVyKHQsbixvKX19LGUpKSl9fTtjbGFzcyBve3N0YXRpYyBjb21wdXRlTGluayhlLHQscixpKXtjb25zdCBzPW5ldyBSZWdFeHAodC5zb3VyY2UsKHQuZmxhZ3N8fFwiXCIpK1wiZ1wiKSxbYSxjXT1vLl9nZXRXaW5kb3dlZExpbmVTdHJpbmdzKGUtMSxyKSxsPWEuam9pbihcIlwiKTtsZXQgZDtjb25zdCBwPVtdO2Zvcig7ZD1zLmV4ZWMobCk7KXtjb25zdCBlPWRbMF07aWYoIW4oZSkpY29udGludWU7Y29uc3RbdCxzXT1vLl9tYXBTdHJJZHgocixjLDAsZC5pbmRleCksW2EsbF09by5fbWFwU3RySWR4KHIsdCxzLGUubGVuZ3RoKTtpZigtMT09PXR8fC0xPT09c3x8LTE9PT1hfHwtMT09PWwpY29udGludWU7Y29uc3QgaD17c3RhcnQ6e3g6cysxLHk6dCsxfSxlbmQ6e3g6bCx5OmErMX19O3AucHVzaCh7cmFuZ2U6aCx0ZXh0OmUsYWN0aXZhdGU6aX0pfXJldHVybiBwfXN0YXRpYyBfZ2V0V2luZG93ZWRMaW5lU3RyaW5ncyhlLHQpe2xldCBuLG89ZSxyPWUsaT0wLHM9XCJcIjtjb25zdCBhPVtdO2lmKG49dC5idWZmZXIuYWN0aXZlLmdldExpbmUoZSkpe2NvbnN0IGU9bi50cmFuc2xhdGVUb1N0cmluZyghMCk7aWYobi5pc1dyYXBwZWQmJlwiIFwiIT09ZVswXSl7Zm9yKGk9MDsobj10LmJ1ZmZlci5hY3RpdmUuZ2V0TGluZSgtLW8pKSYmaTwyMDQ4JiYocz1uLnRyYW5zbGF0ZVRvU3RyaW5nKCEwKSxpKz1zLmxlbmd0aCxhLnB1c2gocyksbi5pc1dyYXBwZWQmJi0xPT09cy5pbmRleE9mKFwiIFwiKSk7KTthLnJldmVyc2UoKX1mb3IoYS5wdXNoKGUpLGk9MDsobj10LmJ1ZmZlci5hY3RpdmUuZ2V0TGluZSgrK3IpKSYmbi5pc1dyYXBwZWQmJmk8MjA0OCYmKHM9bi50cmFuc2xhdGVUb1N0cmluZyghMCksaSs9cy5sZW5ndGgsYS5wdXNoKHMpLC0xPT09cy5pbmRleE9mKFwiIFwiKSk7KTt9cmV0dXJuW2Esb119c3RhdGljIF9tYXBTdHJJZHgoZSx0LG4sbyl7Y29uc3Qgcj1lLmJ1ZmZlci5hY3RpdmUsaT1yLmdldE51bGxDZWxsKCk7bGV0IHM9bjtmb3IoO287KXtjb25zdCBlPXIuZ2V0TGluZSh0KTtpZighZSlyZXR1cm5bLTEsLTFdO2ZvcihsZXQgbj1zO248ZS5sZW5ndGg7KytuKXtlLmdldENlbGwobixpKTtjb25zdCBzPWkuZ2V0Q2hhcnMoKTtpZihpLmdldFdpZHRoKCkmJihvLT1zLmxlbmd0aHx8MSxuPT09ZS5sZW5ndGgtMSYmXCJcIj09PXMpKXtjb25zdCBlPXIuZ2V0TGluZSh0KzEpO2UmJmUuaXNXcmFwcGVkJiYoZS5nZXRDZWxsKDAsaSksMj09PWkuZ2V0V2lkdGgoKSYmKG8rPTEpKX1pZihvPDApcmV0dXJuW3Qsbl19dCsrLHM9MH1yZXR1cm5bdCxzXX19dC5MaW5rQ29tcHV0ZXI9b319LHQ9e307ZnVuY3Rpb24gbihvKXt2YXIgcj10W29dO2lmKHZvaWQgMCE9PXIpcmV0dXJuIHIuZXhwb3J0czt2YXIgaT10W29dPXtleHBvcnRzOnt9fTtyZXR1cm4gZVtvXShpLGkuZXhwb3J0cyxuKSxpLmV4cG9ydHN9dmFyIG89e307cmV0dXJuKCgpPT57dmFyIGU9bztPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLldlYkxpbmtzQWRkb249dm9pZCAwO2NvbnN0IHQ9big2KSxyPS8oaHR0cHM/fEhUVFBTPyk6Wy9dezJ9W15cXHNcIichKigpe318XFxcXFxcXjw+YF0qW15cXHNcIic6LC4hP3t9fFxcXFxcXF5+XFxbXFxdYCgpPD5dLztmdW5jdGlvbiBpKGUsdCl7Y29uc3Qgbj13aW5kb3cub3BlbigpO2lmKG4pe3RyeXtuLm9wZW5lcj1udWxsfWNhdGNoe31uLmxvY2F0aW9uLmhyZWY9dH1lbHNlIGNvbnNvbGUud2FybihcIk9wZW5pbmcgbGluayBibG9ja2VkIGFzIG9wZW5lciBjb3VsZCBub3QgYmUgY2xlYXJlZFwiKX1lLldlYkxpbmtzQWRkb249Y2xhc3N7Y29uc3RydWN0b3IoZT1pLHQ9e30pe3RoaXMuX2hhbmRsZXI9ZSx0aGlzLl9vcHRpb25zPXR9YWN0aXZhdGUoZSl7dGhpcy5fdGVybWluYWw9ZTtjb25zdCBuPXRoaXMuX29wdGlvbnMsbz1uLnVybFJlZ2V4fHxyO3RoaXMuX2xpbmtQcm92aWRlcj10aGlzLl90ZXJtaW5hbC5yZWdpc3RlckxpbmtQcm92aWRlcihuZXcgdC5XZWJMaW5rUHJvdmlkZXIodGhpcy5fdGVybWluYWwsbyx0aGlzLl9oYW5kbGVyLG4pKX1kaXNwb3NlKCl7dGhpcy5fbGlua1Byb3ZpZGVyPy5kaXNwb3NlKCl9fX0pKCksb30pKCkpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkZG9uLXdlYi1saW5rcy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///832\n\n}"); /***/ }), /***/ 856: /***/ ((module) => { eval("{!function(e,t){if(true)module.exports=t();else // removed by dead control flow\n{ var s, i; }}(globalThis,(()=>(()=>{\"use strict\";var e={4567:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.AccessibilityManager=void 0;const n=i(9042),o=i(9924),a=i(844),h=i(4725),c=i(2585),l=i(3656);let d=t.AccessibilityManager=class extends a.Disposable{constructor(e,t,i,s){super(),this._terminal=e,this._coreBrowserService=i,this._renderService=s,this._rowColumns=new WeakMap,this._liveRegionLineCount=0,this._charsToConsume=[],this._charsToAnnounce=\"\",this._accessibilityContainer=this._coreBrowserService.mainDocument.createElement(\"div\"),this._accessibilityContainer.classList.add(\"xterm-accessibility\"),this._rowContainer=this._coreBrowserService.mainDocument.createElement(\"div\"),this._rowContainer.setAttribute(\"role\",\"list\"),this._rowContainer.classList.add(\"xterm-accessibility-tree\"),this._rowElements=[];for(let e=0;ethis._handleBoundaryFocus(e,0),this._bottomBoundaryFocusListener=e=>this._handleBoundaryFocus(e,1),this._rowElements[0].addEventListener(\"focus\",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener(\"focus\",this._bottomBoundaryFocusListener),this._refreshRowsDimensions(),this._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=this._coreBrowserService.mainDocument.createElement(\"div\"),this._liveRegion.classList.add(\"live-region\"),this._liveRegion.setAttribute(\"aria-live\",\"assertive\"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this.register(new o.TimeBasedDebouncer(this._renderRows.bind(this))),!this._terminal.element)throw new Error(\"Cannot enable accessibility before Terminal.open\");this._terminal.element.insertAdjacentElement(\"afterbegin\",this._accessibilityContainer),this.register(this._terminal.onResize((e=>this._handleResize(e.rows)))),this.register(this._terminal.onRender((e=>this._refreshRows(e.start,e.end)))),this.register(this._terminal.onScroll((()=>this._refreshRows()))),this.register(this._terminal.onA11yChar((e=>this._handleChar(e)))),this.register(this._terminal.onLineFeed((()=>this._handleChar(\"\\n\")))),this.register(this._terminal.onA11yTab((e=>this._handleTab(e)))),this.register(this._terminal.onKey((e=>this._handleKey(e.key)))),this.register(this._terminal.onBlur((()=>this._clearLiveRegion()))),this.register(this._renderService.onDimensionsChange((()=>this._refreshRowsDimensions()))),this.register((0,l.addDisposableDomListener)(document,\"selectionchange\",(()=>this._handleSelectionChange()))),this.register(this._coreBrowserService.onDprChange((()=>this._refreshRowsDimensions()))),this._refreshRows(),this.register((0,a.toDisposable)((()=>{this._accessibilityContainer.remove(),this._rowElements.length=0})))}_handleTab(e){for(let t=0;t0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,\"\\n\"===e&&(this._liveRegionLineCount++,21===this._liveRegionLineCount&&(this._liveRegion.textContent+=n.tooMuchOutput)))}_clearLiveRegion(){this._liveRegion.textContent=\"\",this._liveRegionLineCount=0}_handleKey(e){this._clearLiveRegion(),/\\p{Control}/u.test(e)||this._charsToConsume.push(e)}_refreshRows(e,t){this._liveRegionDebouncer.refresh(e,t,this._terminal.rows)}_renderRows(e,t){const i=this._terminal.buffer,s=i.lines.length.toString();for(let r=e;r<=t;r++){const e=i.lines.get(i.ydisp+r),t=[],n=e?.translateToString(!0,void 0,void 0,t)||\"\",o=(i.ydisp+r+1).toString(),a=this._rowElements[r];a&&(0===n.length?(a.innerText=\" \",this._rowColumns.set(a,[0,1])):(a.textContent=n,this._rowColumns.set(a,t)),a.setAttribute(\"aria-posinset\",o),a.setAttribute(\"aria-setsize\",s))}this._announceCharacters()}_announceCharacters(){0!==this._charsToAnnounce.length&&(this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce=\"\")}_handleBoundaryFocus(e,t){const i=e.target,s=this._rowElements[0===t?1:this._rowElements.length-2];if(i.getAttribute(\"aria-posinset\")===(0===t?\"1\":`${this._terminal.buffer.lines.length}`))return;if(e.relatedTarget!==s)return;let r,n;if(0===t?(r=i,n=this._rowElements.pop(),this._rowContainer.removeChild(n)):(r=this._rowElements.shift(),n=i,this._rowContainer.removeChild(r)),r.removeEventListener(\"focus\",this._topBoundaryFocusListener),n.removeEventListener(\"focus\",this._bottomBoundaryFocusListener),0===t){const e=this._createAccessibilityTreeNode();this._rowElements.unshift(e),this._rowContainer.insertAdjacentElement(\"afterbegin\",e)}else{const e=this._createAccessibilityTreeNode();this._rowElements.push(e),this._rowContainer.appendChild(e)}this._rowElements[0].addEventListener(\"focus\",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener(\"focus\",this._bottomBoundaryFocusListener),this._terminal.scrollLines(0===t?-1:1),this._rowElements[0===t?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}_handleSelectionChange(){if(0===this._rowElements.length)return;const e=document.getSelection();if(!e)return;if(e.isCollapsed)return void(this._rowContainer.contains(e.anchorNode)&&this._terminal.clearSelection());if(!e.anchorNode||!e.focusNode)return void console.error(\"anchorNode and/or focusNode are null\");let t={node:e.anchorNode,offset:e.anchorOffset},i={node:e.focusNode,offset:e.focusOffset};if((t.node.compareDocumentPosition(i.node)&Node.DOCUMENT_POSITION_PRECEDING||t.node===i.node&&t.offset>i.offset)&&([t,i]=[i,t]),t.node.compareDocumentPosition(this._rowElements[0])&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_FOLLOWING)&&(t={node:this._rowElements[0].childNodes[0],offset:0}),!this._rowContainer.contains(t.node))return;const s=this._rowElements.slice(-1)[0];if(i.node.compareDocumentPosition(s)&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_PRECEDING)&&(i={node:s,offset:s.textContent?.length??0}),!this._rowContainer.contains(i.node))return;const r=({node:e,offset:t})=>{const i=e instanceof Text?e.parentNode:e;let s=parseInt(i?.getAttribute(\"aria-posinset\"),10)-1;if(isNaN(s))return console.warn(\"row is invalid. Race condition?\"),null;const r=this._rowColumns.get(i);if(!r)return console.warn(\"columns is null. Race condition?\"),null;let n=t=this._terminal.cols&&(++s,n=0),{row:s,column:n}},n=r(t),o=r(i);if(n&&o){if(n.row>o.row||n.row===o.row&&n.column>=o.column)throw new Error(\"invalid range\");this._terminal.select(n.column,n.row,(o.row-n.row)*this._terminal.cols-n.column+o.column)}}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener(\"focus\",this._bottomBoundaryFocusListener);for(let e=this._rowContainer.children.length;ee;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener(\"focus\",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){const e=this._coreBrowserService.mainDocument.createElement(\"div\");return e.setAttribute(\"role\",\"listitem\"),e.tabIndex=-1,this._refreshRowDimensions(e),e}_refreshRowsDimensions(){if(this._renderService.dimensions.css.cell.height){this._accessibilityContainer.style.width=`${this._renderService.dimensions.css.canvas.width}px`,this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;e{function i(e){return e.replace(/\\r?\\n/g,\"\\r\")}function s(e,t){return t?\"\u001b[200~\"+e+\"\u001b[201~\":e}function r(e,t,r,n){e=s(e=i(e),r.decPrivateModes.bracketedPasteMode&&!0!==n.rawOptions.ignoreBracketedPasteMode),r.triggerDataEvent(e,!0),t.value=\"\"}function n(e,t,i){const s=i.getBoundingClientRect(),r=e.clientX-s.left-10,n=e.clientY-s.top-10;t.style.width=\"20px\",t.style.height=\"20px\",t.style.left=`${r}px`,t.style.top=`${n}px`,t.style.zIndex=\"1000\",t.focus()}Object.defineProperty(t,\"__esModule\",{value:!0}),t.rightClickHandler=t.moveTextAreaUnderMouseCursor=t.paste=t.handlePasteEvent=t.copyHandler=t.bracketTextForPaste=t.prepareTextForTerminal=void 0,t.prepareTextForTerminal=i,t.bracketTextForPaste=s,t.copyHandler=function(e,t){e.clipboardData&&e.clipboardData.setData(\"text/plain\",t.selectionText),e.preventDefault()},t.handlePasteEvent=function(e,t,i,s){e.stopPropagation(),e.clipboardData&&r(e.clipboardData.getData(\"text/plain\"),t,i,s)},t.paste=r,t.moveTextAreaUnderMouseCursor=n,t.rightClickHandler=function(e,t,i,s,r){n(e,t,i),r&&s.rightClickSelect(e),t.value=s.selectionText,t.select()}},7239:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.ColorContrastCache=void 0;const s=i(1505);t.ColorContrastCache=class{constructor(){this._color=new s.TwoKeyMap,this._css=new s.TwoKeyMap}setCss(e,t,i){this._css.set(e,t,i)}getCss(e,t){return this._css.get(e,t)}setColor(e,t,i){this._color.set(e,t,i)}getColor(e,t){return this._color.get(e,t)}clear(){this._color.clear(),this._css.clear()}}},3656:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.addDisposableDomListener=void 0,t.addDisposableDomListener=function(e,t,i,s){e.addEventListener(t,i,s);let r=!1;return{dispose:()=>{r||(r=!0,e.removeEventListener(t,i,s))}}}},3551:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.Linkifier=void 0;const n=i(3656),o=i(8460),a=i(844),h=i(2585),c=i(4725);let l=t.Linkifier=class extends a.Disposable{get currentLink(){return this._currentLink}constructor(e,t,i,s,r){super(),this._element=e,this._mouseService=t,this._renderService=i,this._bufferService=s,this._linkProviderService=r,this._linkCacheDisposables=[],this._isMouseOut=!0,this._wasResized=!1,this._activeLine=-1,this._onShowLinkUnderline=this.register(new o.EventEmitter),this.onShowLinkUnderline=this._onShowLinkUnderline.event,this._onHideLinkUnderline=this.register(new o.EventEmitter),this.onHideLinkUnderline=this._onHideLinkUnderline.event,this.register((0,a.getDisposeArrayDisposable)(this._linkCacheDisposables)),this.register((0,a.toDisposable)((()=>{this._lastMouseEvent=void 0,this._activeProviderReplies?.clear()}))),this.register(this._bufferService.onResize((()=>{this._clearCurrentLink(),this._wasResized=!0}))),this.register((0,n.addDisposableDomListener)(this._element,\"mouseleave\",(()=>{this._isMouseOut=!0,this._clearCurrentLink()}))),this.register((0,n.addDisposableDomListener)(this._element,\"mousemove\",this._handleMouseMove.bind(this))),this.register((0,n.addDisposableDomListener)(this._element,\"mousedown\",this._handleMouseDown.bind(this))),this.register((0,n.addDisposableDomListener)(this._element,\"mouseup\",this._handleMouseUp.bind(this)))}_handleMouseMove(e){this._lastMouseEvent=e;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);if(!t)return;this._isMouseOut=!1;const i=e.composedPath();for(let e=0;e{e?.forEach((e=>{e.link.dispose&&e.link.dispose()}))})),this._activeProviderReplies=new Map,this._activeLine=e.y);let i=!1;for(const[s,r]of this._linkProviderService.linkProviders.entries())if(t){const t=this._activeProviderReplies?.get(s);t&&(i=this._checkLinkProviderResult(s,e,i))}else r.provideLinks(e.y,(t=>{if(this._isMouseOut)return;const r=t?.map((e=>({link:e})));this._activeProviderReplies?.set(s,r),i=this._checkLinkProviderResult(s,e,i),this._activeProviderReplies?.size===this._linkProviderService.linkProviders.length&&this._removeIntersectingLinks(e.y,this._activeProviderReplies)}))}_removeIntersectingLinks(e,t){const i=new Set;for(let s=0;se?this._bufferService.cols:s.link.range.end.x;for(let e=n;e<=o;e++){if(i.has(e)){r.splice(t--,1);break}i.add(e)}}}}_checkLinkProviderResult(e,t,i){if(!this._activeProviderReplies)return i;const s=this._activeProviderReplies.get(e);let r=!1;for(let t=0;tthis._linkAtPosition(e.link,t)));e&&(i=!0,this._handleNewLink(e))}if(this._activeProviderReplies.size===this._linkProviderService.linkProviders.length&&!i)for(let e=0;ethis._linkAtPosition(e.link,t)));if(s){i=!0,this._handleNewLink(s);break}}return i}_handleMouseDown(){this._mouseDownLink=this._currentLink}_handleMouseUp(e){if(!this._currentLink)return;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);t&&this._mouseDownLink===this._currentLink&&this._linkAtPosition(this._currentLink.link,t)&&this._currentLink.link.activate(e,this._currentLink.link.text)}_clearCurrentLink(e,t){this._currentLink&&this._lastMouseEvent&&(!e||!t||this._currentLink.link.range.start.y>=e&&this._currentLink.link.range.end.y<=t)&&(this._linkLeave(this._element,this._currentLink.link,this._lastMouseEvent),this._currentLink=void 0,(0,a.disposeArray)(this._linkCacheDisposables))}_handleNewLink(e){if(!this._lastMouseEvent)return;const t=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);t&&this._linkAtPosition(e.link,t)&&(this._currentLink=e,this._currentLink.state={decorations:{underline:void 0===e.link.decorations||e.link.decorations.underline,pointerCursor:void 0===e.link.decorations||e.link.decorations.pointerCursor},isHovered:!0},this._linkHover(this._element,e.link,this._lastMouseEvent),e.link.decorations={},Object.defineProperties(e.link.decorations,{pointerCursor:{get:()=>this._currentLink?.state?.decorations.pointerCursor,set:e=>{this._currentLink?.state&&this._currentLink.state.decorations.pointerCursor!==e&&(this._currentLink.state.decorations.pointerCursor=e,this._currentLink.state.isHovered&&this._element.classList.toggle(\"xterm-cursor-pointer\",e))}},underline:{get:()=>this._currentLink?.state?.decorations.underline,set:t=>{this._currentLink?.state&&this._currentLink?.state?.decorations.underline!==t&&(this._currentLink.state.decorations.underline=t,this._currentLink.state.isHovered&&this._fireUnderlineEvent(e.link,t))}}}),this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange((e=>{if(!this._currentLink)return;const t=0===e.start?0:e.start+1+this._bufferService.buffer.ydisp,i=this._bufferService.buffer.ydisp+1+e.end;if(this._currentLink.link.range.start.y>=t&&this._currentLink.link.range.end.y<=i&&(this._clearCurrentLink(t,i),this._lastMouseEvent)){const e=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);e&&this._askForLink(e,!1)}}))))}_linkHover(e,t,i){this._currentLink?.state&&(this._currentLink.state.isHovered=!0,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!0),this._currentLink.state.decorations.pointerCursor&&e.classList.add(\"xterm-cursor-pointer\")),t.hover&&t.hover(i,t.text)}_fireUnderlineEvent(e,t){const i=e.range,s=this._bufferService.buffer.ydisp,r=this._createLinkUnderlineEvent(i.start.x-1,i.start.y-s-1,i.end.x,i.end.y-s-1,void 0);(t?this._onShowLinkUnderline:this._onHideLinkUnderline).fire(r)}_linkLeave(e,t,i){this._currentLink?.state&&(this._currentLink.state.isHovered=!1,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!1),this._currentLink.state.decorations.pointerCursor&&e.classList.remove(\"xterm-cursor-pointer\")),t.leave&&t.leave(i,t.text)}_linkAtPosition(e,t){const i=e.range.start.y*this._bufferService.cols+e.range.start.x,s=e.range.end.y*this._bufferService.cols+e.range.end.x,r=t.y*this._bufferService.cols+t.x;return i<=r&&r<=s}_positionFromMouseEvent(e,t,i){const s=i.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(s)return{x:s[0],y:s[1]+this._bufferService.buffer.ydisp}}_createLinkUnderlineEvent(e,t,i,s,r){return{x1:e,y1:t,x2:i,y2:s,cols:this._bufferService.cols,fg:r}}};t.Linkifier=l=s([r(1,c.IMouseService),r(2,c.IRenderService),r(3,h.IBufferService),r(4,c.ILinkProviderService)],l)},9042:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.tooMuchOutput=t.promptLabel=void 0,t.promptLabel=\"Terminal input\",t.tooMuchOutput=\"Too much output to announce, navigate to rows manually to read\"},3730:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.OscLinkProvider=void 0;const n=i(511),o=i(2585);let a=t.OscLinkProvider=class{constructor(e,t,i){this._bufferService=e,this._optionsService=t,this._oscLinkService=i}provideLinks(e,t){const i=this._bufferService.buffer.lines.get(e-1);if(!i)return void t(void 0);const s=[],r=this._optionsService.rawOptions.linkHandler,o=new n.CellData,a=i.getTrimmedLength();let c=-1,l=-1,d=!1;for(let t=0;tr?r.activate(e,t,n):h(0,t),hover:(e,t)=>r?.hover?.(e,t,n),leave:(e,t)=>r?.leave?.(e,t,n)})}d=!1,o.hasExtendedAttrs()&&o.extended.urlId?(l=t,c=o.extended.urlId):(l=-1,c=-1)}}t(s)}};function h(e,t){if(confirm(`Do you want to navigate to ${t}?\\n\\nWARNING: This link could potentially be dangerous`)){const e=window.open();if(e){try{e.opener=null}catch{}e.location.href=t}else console.warn(\"Opening link blocked as opener could not be cleared\")}}t.OscLinkProvider=a=s([r(0,o.IBufferService),r(1,o.IOptionsService),r(2,o.IOscLinkService)],a)},6193:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.RenderDebouncer=void 0,t.RenderDebouncer=class{constructor(e,t){this._renderCallback=e,this._coreBrowserService=t,this._refreshCallbacks=[]}dispose(){this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}addRefreshCallback(e){return this._refreshCallbacks.push(e),this._animationFrame||(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._innerRefresh()))),this._animationFrame}refresh(e,t,i){this._rowCount=i,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t,this._animationFrame||(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._innerRefresh())))}_innerRefresh(){if(this._animationFrame=void 0,void 0===this._rowStart||void 0===this._rowEnd||void 0===this._rowCount)return void this._runRefreshCallbacks();const e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t),this._runRefreshCallbacks()}_runRefreshCallbacks(){for(const e of this._refreshCallbacks)e(0);this._refreshCallbacks=[]}}},3236:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Terminal=void 0;const s=i(3614),r=i(3656),n=i(3551),o=i(9042),a=i(3730),h=i(1680),c=i(3107),l=i(5744),d=i(2950),_=i(1296),u=i(428),f=i(4269),v=i(5114),p=i(8934),g=i(3230),m=i(9312),S=i(4725),C=i(6731),b=i(8055),w=i(8969),y=i(8460),E=i(844),k=i(6114),L=i(8437),D=i(2584),R=i(7399),x=i(5941),A=i(9074),B=i(2585),T=i(5435),M=i(4567),O=i(779);class P extends w.CoreTerminal{get onFocus(){return this._onFocus.event}get onBlur(){return this._onBlur.event}get onA11yChar(){return this._onA11yCharEmitter.event}get onA11yTab(){return this._onA11yTabEmitter.event}get onWillOpen(){return this._onWillOpen.event}constructor(e={}){super(e),this.browser=k,this._keyDownHandled=!1,this._keyDownSeen=!1,this._keyPressHandled=!1,this._unprocessedDeadKey=!1,this._accessibilityManager=this.register(new E.MutableDisposable),this._onCursorMove=this.register(new y.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onKey=this.register(new y.EventEmitter),this.onKey=this._onKey.event,this._onRender=this.register(new y.EventEmitter),this.onRender=this._onRender.event,this._onSelectionChange=this.register(new y.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onTitleChange=this.register(new y.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onBell=this.register(new y.EventEmitter),this.onBell=this._onBell.event,this._onFocus=this.register(new y.EventEmitter),this._onBlur=this.register(new y.EventEmitter),this._onA11yCharEmitter=this.register(new y.EventEmitter),this._onA11yTabEmitter=this.register(new y.EventEmitter),this._onWillOpen=this.register(new y.EventEmitter),this._setup(),this._decorationService=this._instantiationService.createInstance(A.DecorationService),this._instantiationService.setService(B.IDecorationService,this._decorationService),this._linkProviderService=this._instantiationService.createInstance(O.LinkProviderService),this._instantiationService.setService(S.ILinkProviderService,this._linkProviderService),this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(a.OscLinkProvider)),this.register(this._inputHandler.onRequestBell((()=>this._onBell.fire()))),this.register(this._inputHandler.onRequestRefreshRows(((e,t)=>this.refresh(e,t)))),this.register(this._inputHandler.onRequestSendFocus((()=>this._reportFocus()))),this.register(this._inputHandler.onRequestReset((()=>this.reset()))),this.register(this._inputHandler.onRequestWindowsOptionsReport((e=>this._reportWindowsOptions(e)))),this.register(this._inputHandler.onColor((e=>this._handleColorEvent(e)))),this.register((0,y.forwardEvent)(this._inputHandler.onCursorMove,this._onCursorMove)),this.register((0,y.forwardEvent)(this._inputHandler.onTitleChange,this._onTitleChange)),this.register((0,y.forwardEvent)(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this.register((0,y.forwardEvent)(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this.register(this._bufferService.onResize((e=>this._afterResize(e.cols,e.rows)))),this.register((0,E.toDisposable)((()=>{this._customKeyEventHandler=void 0,this.element?.parentNode?.removeChild(this.element)})))}_handleColorEvent(e){if(this._themeService)for(const t of e){let e,i=\"\";switch(t.index){case 256:e=\"foreground\",i=\"10\";break;case 257:e=\"background\",i=\"11\";break;case 258:e=\"cursor\",i=\"12\";break;default:e=\"ansi\",i=\"4;\"+t.index}switch(t.type){case 0:const s=b.color.toColorRGB(\"ansi\"===e?this._themeService.colors.ansi[t.index]:this._themeService.colors[e]);this.coreService.triggerDataEvent(`${D.C0.ESC}]${i};${(0,x.toRgbString)(s)}${D.C1_ESCAPED.ST}`);break;case 1:if(\"ansi\"===e)this._themeService.modifyColors((e=>e.ansi[t.index]=b.channels.toColor(...t.color)));else{const i=e;this._themeService.modifyColors((e=>e[i]=b.channels.toColor(...t.color)))}break;case 2:this._themeService.restoreColor(t.index)}}}_setup(){super._setup(),this._customKeyEventHandler=void 0}get buffer(){return this.buffers.active}focus(){this.textarea&&this.textarea.focus({preventScroll:!0})}_handleScreenReaderModeOptionChange(e){e?!this._accessibilityManager.value&&this._renderService&&(this._accessibilityManager.value=this._instantiationService.createInstance(M.AccessibilityManager,this)):this._accessibilityManager.clear()}_handleTextAreaFocus(e){this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(D.C0.ESC+\"[I\"),this.element.classList.add(\"focus\"),this._showCursor(),this._onFocus.fire()}blur(){return this.textarea?.blur()}_handleTextAreaBlur(){this.textarea.value=\"\",this.refresh(this.buffer.y,this.buffer.y),this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(D.C0.ESC+\"[O\"),this.element.classList.remove(\"focus\"),this._onBlur.fire()}_syncTextArea(){if(!this.textarea||!this.buffer.isCursorInViewport||this._compositionHelper.isComposing||!this._renderService)return;const e=this.buffer.ybase+this.buffer.y,t=this.buffer.lines.get(e);if(!t)return;const i=Math.min(this.buffer.x,this.cols-1),s=this._renderService.dimensions.css.cell.height,r=t.getWidth(i),n=this._renderService.dimensions.css.cell.width*r,o=this.buffer.y*this._renderService.dimensions.css.cell.height,a=i*this._renderService.dimensions.css.cell.width;this.textarea.style.left=a+\"px\",this.textarea.style.top=o+\"px\",this.textarea.style.width=n+\"px\",this.textarea.style.height=s+\"px\",this.textarea.style.lineHeight=s+\"px\",this.textarea.style.zIndex=\"-5\"}_initGlobal(){this._bindKeys(),this.register((0,r.addDisposableDomListener)(this.element,\"copy\",(e=>{this.hasSelection()&&(0,s.copyHandler)(e,this._selectionService)})));const e=e=>(0,s.handlePasteEvent)(e,this.textarea,this.coreService,this.optionsService);this.register((0,r.addDisposableDomListener)(this.textarea,\"paste\",e)),this.register((0,r.addDisposableDomListener)(this.element,\"paste\",e)),k.isFirefox?this.register((0,r.addDisposableDomListener)(this.element,\"mousedown\",(e=>{2===e.button&&(0,s.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)}))):this.register((0,r.addDisposableDomListener)(this.element,\"contextmenu\",(e=>{(0,s.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)}))),k.isLinux&&this.register((0,r.addDisposableDomListener)(this.element,\"auxclick\",(e=>{1===e.button&&(0,s.moveTextAreaUnderMouseCursor)(e,this.textarea,this.screenElement)})))}_bindKeys(){this.register((0,r.addDisposableDomListener)(this.textarea,\"keyup\",(e=>this._keyUp(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,\"keydown\",(e=>this._keyDown(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,\"keypress\",(e=>this._keyPress(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,\"compositionstart\",(()=>this._compositionHelper.compositionstart()))),this.register((0,r.addDisposableDomListener)(this.textarea,\"compositionupdate\",(e=>this._compositionHelper.compositionupdate(e)))),this.register((0,r.addDisposableDomListener)(this.textarea,\"compositionend\",(()=>this._compositionHelper.compositionend()))),this.register((0,r.addDisposableDomListener)(this.textarea,\"input\",(e=>this._inputEvent(e)),!0)),this.register(this.onRender((()=>this._compositionHelper.updateCompositionElements())))}open(e){if(!e)throw new Error(\"Terminal requires a parent element.\");if(e.isConnected||this._logService.debug(\"Terminal.open was called on an element that was not attached to the DOM\"),this.element?.ownerDocument.defaultView&&this._coreBrowserService)return void(this.element.ownerDocument.defaultView!==this._coreBrowserService.window&&(this._coreBrowserService.window=this.element.ownerDocument.defaultView));this._document=e.ownerDocument,this.options.documentOverride&&this.options.documentOverride instanceof Document&&(this._document=this.optionsService.rawOptions.documentOverride),this.element=this._document.createElement(\"div\"),this.element.dir=\"ltr\",this.element.classList.add(\"terminal\"),this.element.classList.add(\"xterm\"),e.appendChild(this.element);const t=this._document.createDocumentFragment();this._viewportElement=this._document.createElement(\"div\"),this._viewportElement.classList.add(\"xterm-viewport\"),t.appendChild(this._viewportElement),this._viewportScrollArea=this._document.createElement(\"div\"),this._viewportScrollArea.classList.add(\"xterm-scroll-area\"),this._viewportElement.appendChild(this._viewportScrollArea),this.screenElement=this._document.createElement(\"div\"),this.screenElement.classList.add(\"xterm-screen\"),this.register((0,r.addDisposableDomListener)(this.screenElement,\"mousemove\",(e=>this.updateCursorStyle(e)))),this._helperContainer=this._document.createElement(\"div\"),this._helperContainer.classList.add(\"xterm-helpers\"),this.screenElement.appendChild(this._helperContainer),t.appendChild(this.screenElement),this.textarea=this._document.createElement(\"textarea\"),this.textarea.classList.add(\"xterm-helper-textarea\"),this.textarea.setAttribute(\"aria-label\",o.promptLabel),k.isChromeOS||this.textarea.setAttribute(\"aria-multiline\",\"false\"),this.textarea.setAttribute(\"autocorrect\",\"off\"),this.textarea.setAttribute(\"autocapitalize\",\"off\"),this.textarea.setAttribute(\"spellcheck\",\"false\"),this.textarea.tabIndex=0,this._coreBrowserService=this.register(this._instantiationService.createInstance(v.CoreBrowserService,this.textarea,e.ownerDocument.defaultView??window,this._document??\"undefined\"!=typeof window?window.document:null)),this._instantiationService.setService(S.ICoreBrowserService,this._coreBrowserService),this.register((0,r.addDisposableDomListener)(this.textarea,\"focus\",(e=>this._handleTextAreaFocus(e)))),this.register((0,r.addDisposableDomListener)(this.textarea,\"blur\",(()=>this._handleTextAreaBlur()))),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(u.CharSizeService,this._document,this._helperContainer),this._instantiationService.setService(S.ICharSizeService,this._charSizeService),this._themeService=this._instantiationService.createInstance(C.ThemeService),this._instantiationService.setService(S.IThemeService,this._themeService),this._characterJoinerService=this._instantiationService.createInstance(f.CharacterJoinerService),this._instantiationService.setService(S.ICharacterJoinerService,this._characterJoinerService),this._renderService=this.register(this._instantiationService.createInstance(g.RenderService,this.rows,this.screenElement)),this._instantiationService.setService(S.IRenderService,this._renderService),this.register(this._renderService.onRenderedViewportChange((e=>this._onRender.fire(e)))),this.onResize((e=>this._renderService.resize(e.cols,e.rows))),this._compositionView=this._document.createElement(\"div\"),this._compositionView.classList.add(\"composition-view\"),this._compositionHelper=this._instantiationService.createInstance(d.CompositionHelper,this.textarea,this._compositionView),this._helperContainer.appendChild(this._compositionView),this._mouseService=this._instantiationService.createInstance(p.MouseService),this._instantiationService.setService(S.IMouseService,this._mouseService),this.linkifier=this.register(this._instantiationService.createInstance(n.Linkifier,this.screenElement)),this.element.appendChild(t);try{this._onWillOpen.fire(this.element)}catch{}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this.viewport=this._instantiationService.createInstance(h.Viewport,this._viewportElement,this._viewportScrollArea),this.viewport.onRequestScrollLines((e=>this.scrollLines(e.amount,e.suppressScrollEvent,1))),this.register(this._inputHandler.onRequestSyncScrollBar((()=>this.viewport.syncScrollArea()))),this.register(this.viewport),this.register(this.onCursorMove((()=>{this._renderService.handleCursorMove(),this._syncTextArea()}))),this.register(this.onResize((()=>this._renderService.handleResize(this.cols,this.rows)))),this.register(this.onBlur((()=>this._renderService.handleBlur()))),this.register(this.onFocus((()=>this._renderService.handleFocus()))),this.register(this._renderService.onDimensionsChange((()=>this.viewport.syncScrollArea()))),this._selectionService=this.register(this._instantiationService.createInstance(m.SelectionService,this.element,this.screenElement,this.linkifier)),this._instantiationService.setService(S.ISelectionService,this._selectionService),this.register(this._selectionService.onRequestScrollLines((e=>this.scrollLines(e.amount,e.suppressScrollEvent)))),this.register(this._selectionService.onSelectionChange((()=>this._onSelectionChange.fire()))),this.register(this._selectionService.onRequestRedraw((e=>this._renderService.handleSelectionChanged(e.start,e.end,e.columnSelectMode)))),this.register(this._selectionService.onLinuxMouseSelection((e=>{this.textarea.value=e,this.textarea.focus(),this.textarea.select()}))),this.register(this._onScroll.event((e=>{this.viewport.syncScrollArea(),this._selectionService.refresh()}))),this.register((0,r.addDisposableDomListener)(this._viewportElement,\"scroll\",(()=>this._selectionService.refresh()))),this.register(this._instantiationService.createInstance(c.BufferDecorationRenderer,this.screenElement)),this.register((0,r.addDisposableDomListener)(this.element,\"mousedown\",(e=>this._selectionService.handleMouseDown(e)))),this.coreMouseService.areMouseEventsActive?(this._selectionService.disable(),this.element.classList.add(\"enable-mouse-events\")):this._selectionService.enable(),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(M.AccessibilityManager,this)),this.register(this.optionsService.onSpecificOptionChange(\"screenReaderMode\",(e=>this._handleScreenReaderModeOptionChange(e)))),this.options.overviewRulerWidth&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange(\"overviewRulerWidth\",(e=>{!this._overviewRulerRenderer&&e&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer,this._viewportElement,this.screenElement)))})),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this.bindMouse()}_createRenderer(){return this._instantiationService.createInstance(_.DomRenderer,this,this._document,this.element,this.screenElement,this._viewportElement,this._helperContainer,this.linkifier)}bindMouse(){const e=this,t=this.element;function i(t){const i=e._mouseService.getMouseReportCoords(t,e.screenElement);if(!i)return!1;let s,r;switch(t.overrideType||t.type){case\"mousemove\":r=32,void 0===t.buttons?(s=3,void 0!==t.button&&(s=t.button<3?t.button:3)):s=1&t.buttons?0:4&t.buttons?1:2&t.buttons?2:3;break;case\"mouseup\":r=0,s=t.button<3?t.button:3;break;case\"mousedown\":r=1,s=t.button<3?t.button:3;break;case\"wheel\":if(e._customWheelEventHandler&&!1===e._customWheelEventHandler(t))return!1;if(0===e.viewport.getLinesScrolled(t))return!1;r=t.deltaY<0?0:1,s=4;break;default:return!1}return!(void 0===r||void 0===s||s>4)&&e.coreMouseService.triggerMouseEvent({col:i.col,row:i.row,x:i.x,y:i.y,button:s,action:r,ctrl:t.ctrlKey,alt:t.altKey,shift:t.shiftKey})}const s={mouseup:null,wheel:null,mousedrag:null,mousemove:null},n={mouseup:e=>(i(e),e.buttons||(this._document.removeEventListener(\"mouseup\",s.mouseup),s.mousedrag&&this._document.removeEventListener(\"mousemove\",s.mousedrag)),this.cancel(e)),wheel:e=>(i(e),this.cancel(e,!0)),mousedrag:e=>{e.buttons&&i(e)},mousemove:e=>{e.buttons||i(e)}};this.register(this.coreMouseService.onProtocolChange((e=>{e?(\"debug\"===this.optionsService.rawOptions.logLevel&&this._logService.debug(\"Binding to mouse events:\",this.coreMouseService.explainEvents(e)),this.element.classList.add(\"enable-mouse-events\"),this._selectionService.disable()):(this._logService.debug(\"Unbinding from mouse events.\"),this.element.classList.remove(\"enable-mouse-events\"),this._selectionService.enable()),8&e?s.mousemove||(t.addEventListener(\"mousemove\",n.mousemove),s.mousemove=n.mousemove):(t.removeEventListener(\"mousemove\",s.mousemove),s.mousemove=null),16&e?s.wheel||(t.addEventListener(\"wheel\",n.wheel,{passive:!1}),s.wheel=n.wheel):(t.removeEventListener(\"wheel\",s.wheel),s.wheel=null),2&e?s.mouseup||(s.mouseup=n.mouseup):(this._document.removeEventListener(\"mouseup\",s.mouseup),s.mouseup=null),4&e?s.mousedrag||(s.mousedrag=n.mousedrag):(this._document.removeEventListener(\"mousemove\",s.mousedrag),s.mousedrag=null)}))),this.coreMouseService.activeProtocol=this.coreMouseService.activeProtocol,this.register((0,r.addDisposableDomListener)(t,\"mousedown\",(e=>{if(e.preventDefault(),this.focus(),this.coreMouseService.areMouseEventsActive&&!this._selectionService.shouldForceSelection(e))return i(e),s.mouseup&&this._document.addEventListener(\"mouseup\",s.mouseup),s.mousedrag&&this._document.addEventListener(\"mousemove\",s.mousedrag),this.cancel(e)}))),this.register((0,r.addDisposableDomListener)(t,\"wheel\",(e=>{if(!s.wheel){if(this._customWheelEventHandler&&!1===this._customWheelEventHandler(e))return!1;if(!this.buffer.hasScrollback){const t=this.viewport.getLinesScrolled(e);if(0===t)return;const i=D.C0.ESC+(this.coreService.decPrivateModes.applicationCursorKeys?\"O\":\"[\")+(e.deltaY<0?\"A\":\"B\");let s=\"\";for(let e=0;e{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchStart(e),this.cancel(e)}),{passive:!0})),this.register((0,r.addDisposableDomListener)(t,\"touchmove\",(e=>{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchMove(e)?void 0:this.cancel(e)}),{passive:!1}))}refresh(e,t){this._renderService?.refreshRows(e,t)}updateCursorStyle(e){this._selectionService?.shouldColumnSelect(e)?this.element.classList.add(\"column-select\"):this.element.classList.remove(\"column-select\")}_showCursor(){this.coreService.isCursorInitialized||(this.coreService.isCursorInitialized=!0,this.refresh(this.buffer.y,this.buffer.y))}scrollLines(e,t,i=0){1===i?(super.scrollLines(e,t,i),this.refresh(0,this.rows-1)):this.viewport?.scrollLines(e)}paste(e){(0,s.paste)(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}attachCustomWheelEventHandler(e){this._customWheelEventHandler=e}registerLinkProvider(e){return this._linkProviderService.registerLinkProvider(e)}registerCharacterJoiner(e){if(!this._characterJoinerService)throw new Error(\"Terminal must be opened first\");const t=this._characterJoinerService.register(e);return this.refresh(0,this.rows-1),t}deregisterCharacterJoiner(e){if(!this._characterJoinerService)throw new Error(\"Terminal must be opened first\");this._characterJoinerService.deregister(e)&&this.refresh(0,this.rows-1)}get markers(){return this.buffer.markers}registerMarker(e){return this.buffer.addMarker(this.buffer.ybase+this.buffer.y+e)}registerDecoration(e){return this._decorationService.registerDecoration(e)}hasSelection(){return!!this._selectionService&&this._selectionService.hasSelection}select(e,t,i){this._selectionService.setSelection(e,t,i)}getSelection(){return this._selectionService?this._selectionService.selectionText:\"\"}getSelectionPosition(){if(this._selectionService&&this._selectionService.hasSelection)return{start:{x:this._selectionService.selectionStart[0],y:this._selectionService.selectionStart[1]},end:{x:this._selectionService.selectionEnd[0],y:this._selectionService.selectionEnd[1]}}}clearSelection(){this._selectionService?.clearSelection()}selectAll(){this._selectionService?.selectAll()}selectLines(e,t){this._selectionService?.selectLines(e,t)}_keyDown(e){if(this._keyDownHandled=!1,this._keyDownSeen=!0,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;const t=this.browser.isMac&&this.options.macOptionIsMeta&&e.altKey;if(!t&&!this._compositionHelper.keydown(e))return this.options.scrollOnUserInput&&this.buffer.ybase!==this.buffer.ydisp&&this.scrollToBottom(),!1;t||\"Dead\"!==e.key&&\"AltGraph\"!==e.key||(this._unprocessedDeadKey=!0);const i=(0,R.evaluateKeyboardEvent)(e,this.coreService.decPrivateModes.applicationCursorKeys,this.browser.isMac,this.options.macOptionIsMeta);if(this.updateCursorStyle(e),3===i.type||2===i.type){const t=this.rows-1;return this.scrollLines(2===i.type?-t:t),this.cancel(e,!0)}return 1===i.type&&this.selectAll(),!!this._isThirdLevelShift(this.browser,e)||(i.cancel&&this.cancel(e,!0),!i.key||!!(e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&1===e.key.length&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)||(this._unprocessedDeadKey?(this._unprocessedDeadKey=!1,!0):(i.key!==D.C0.ETX&&i.key!==D.C0.CR||(this.textarea.value=\"\"),this._onKey.fire({key:i.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(i.key,!0),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey?this.cancel(e,!0):void(this._keyDownHandled=!0))))}_isThirdLevelShift(e,t){const i=e.isMac&&!this.options.macOptionIsMeta&&t.altKey&&!t.ctrlKey&&!t.metaKey||e.isWindows&&t.altKey&&t.ctrlKey&&!t.metaKey||e.isWindows&&t.getModifierState(\"AltGraph\");return\"keypress\"===t.type?i:i&&(!t.keyCode||t.keyCode>47)}_keyUp(e){this._keyDownSeen=!1,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e)||(function(e){return 16===e.keyCode||17===e.keyCode||18===e.keyCode}(e)||this.focus(),this.updateCursorStyle(e),this._keyPressHandled=!1)}_keyPress(e){let t;if(this._keyPressHandled=!1,this._keyDownHandled)return!1;if(this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;if(this.cancel(e),e.charCode)t=e.charCode;else if(null===e.which||void 0===e.which)t=e.keyCode;else{if(0===e.which||0===e.charCode)return!1;t=e.which}return!(!t||(e.altKey||e.ctrlKey||e.metaKey)&&!this._isThirdLevelShift(this.browser,e)||(t=String.fromCharCode(t),this._onKey.fire({key:t,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(t,!0),this._keyPressHandled=!0,this._unprocessedDeadKey=!1,0))}_inputEvent(e){if(e.data&&\"insertText\"===e.inputType&&(!e.composed||!this._keyDownSeen)&&!this.optionsService.rawOptions.screenReaderMode){if(this._keyPressHandled)return!1;this._unprocessedDeadKey=!1;const t=e.data;return this.coreService.triggerDataEvent(t,!0),this.cancel(e),!0}return!1}resize(e,t){e!==this.cols||t!==this.rows?super.resize(e,t):this._charSizeService&&!this._charSizeService.hasValidSize&&this._charSizeService.measure()}_afterResize(e,t){this._charSizeService?.measure(),this.viewport?.syncScrollArea(!0)}clear(){if(0!==this.buffer.ybase||0!==this.buffer.y){this.buffer.clearAllMarkers(),this.buffer.lines.set(0,this.buffer.lines.get(this.buffer.ybase+this.buffer.y)),this.buffer.lines.length=1,this.buffer.ydisp=0,this.buffer.ybase=0,this.buffer.y=0;for(let e=1;e{Object.defineProperty(t,\"__esModule\",{value:!0}),t.TimeBasedDebouncer=void 0,t.TimeBasedDebouncer=class{constructor(e,t=1e3){this._renderCallback=e,this._debounceThresholdMS=t,this._lastRefreshMs=0,this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&clearTimeout(this._refreshTimeoutID)}refresh(e,t,i){this._rowCount=i,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t;const s=Date.now();if(s-this._lastRefreshMs>=this._debounceThresholdMS)this._lastRefreshMs=s,this._innerRefresh();else if(!this._additionalRefreshRequested){const e=s-this._lastRefreshMs,t=this._debounceThresholdMS-e;this._additionalRefreshRequested=!0,this._refreshTimeoutID=window.setTimeout((()=>{this._lastRefreshMs=Date.now(),this._innerRefresh(),this._additionalRefreshRequested=!1,this._refreshTimeoutID=void 0}),t)}}_innerRefresh(){if(void 0===this._rowStart||void 0===this._rowEnd||void 0===this._rowCount)return;const e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t)}}},1680:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.Viewport=void 0;const n=i(3656),o=i(4725),a=i(8460),h=i(844),c=i(2585);let l=t.Viewport=class extends h.Disposable{constructor(e,t,i,s,r,o,h,c){super(),this._viewportElement=e,this._scrollArea=t,this._bufferService=i,this._optionsService=s,this._charSizeService=r,this._renderService=o,this._coreBrowserService=h,this.scrollBarWidth=0,this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._wheelPartialScroll=0,this._refreshAnimationFrame=null,this._ignoreNextScrollEvent=!1,this._smoothScrollState={startTime:0,origin:-1,target:-1},this._onRequestScrollLines=this.register(new a.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this.scrollBarWidth=this._viewportElement.offsetWidth-this._scrollArea.offsetWidth||15,this.register((0,n.addDisposableDomListener)(this._viewportElement,\"scroll\",this._handleScroll.bind(this))),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._renderDimensions=this._renderService.dimensions,this.register(this._renderService.onDimensionsChange((e=>this._renderDimensions=e))),this._handleThemeChange(c.colors),this.register(c.onChangeColors((e=>this._handleThemeChange(e)))),this.register(this._optionsService.onSpecificOptionChange(\"scrollback\",(()=>this.syncScrollArea()))),setTimeout((()=>this.syncScrollArea()))}_handleThemeChange(e){this._viewportElement.style.backgroundColor=e.background.css}reset(){this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._coreBrowserService.window.requestAnimationFrame((()=>this.syncScrollArea()))}_refresh(e){if(e)return this._innerRefresh(),void(null!==this._refreshAnimationFrame&&this._coreBrowserService.window.cancelAnimationFrame(this._refreshAnimationFrame));null===this._refreshAnimationFrame&&(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._innerRefresh())))}_innerRefresh(){if(this._charSizeService.height>0){this._currentRowHeight=this._renderDimensions.device.cell.height/this._coreBrowserService.dpr,this._currentDeviceCellHeight=this._renderDimensions.device.cell.height,this._lastRecordedViewportHeight=this._viewportElement.offsetHeight;const e=Math.round(this._currentRowHeight*this._lastRecordedBufferLength)+(this._lastRecordedViewportHeight-this._renderDimensions.css.canvas.height);this._lastRecordedBufferHeight!==e&&(this._lastRecordedBufferHeight=e,this._scrollArea.style.height=this._lastRecordedBufferHeight+\"px\")}const e=this._bufferService.buffer.ydisp*this._currentRowHeight;this._viewportElement.scrollTop!==e&&(this._ignoreNextScrollEvent=!0,this._viewportElement.scrollTop=e),this._refreshAnimationFrame=null}syncScrollArea(e=!1){if(this._lastRecordedBufferLength!==this._bufferService.buffer.lines.length)return this._lastRecordedBufferLength=this._bufferService.buffer.lines.length,void this._refresh(e);this._lastRecordedViewportHeight===this._renderService.dimensions.css.canvas.height&&this._lastScrollTop===this._activeBuffer.ydisp*this._currentRowHeight&&this._renderDimensions.device.cell.height===this._currentDeviceCellHeight||this._refresh(e)}_handleScroll(e){if(this._lastScrollTop=this._viewportElement.scrollTop,!this._viewportElement.offsetParent)return;if(this._ignoreNextScrollEvent)return this._ignoreNextScrollEvent=!1,void this._onRequestScrollLines.fire({amount:0,suppressScrollEvent:!0});const t=Math.round(this._lastScrollTop/this._currentRowHeight)-this._bufferService.buffer.ydisp;this._onRequestScrollLines.fire({amount:t,suppressScrollEvent:!0})}_smoothScroll(){if(this._isDisposed||-1===this._smoothScrollState.origin||-1===this._smoothScrollState.target)return;const e=this._smoothScrollPercent();this._viewportElement.scrollTop=this._smoothScrollState.origin+Math.round(e*(this._smoothScrollState.target-this._smoothScrollState.origin)),e<1?this._coreBrowserService.window.requestAnimationFrame((()=>this._smoothScroll())):this._clearSmoothScrollState()}_smoothScrollPercent(){return this._optionsService.rawOptions.smoothScrollDuration&&this._smoothScrollState.startTime?Math.max(Math.min((Date.now()-this._smoothScrollState.startTime)/this._optionsService.rawOptions.smoothScrollDuration,1),0):1}_clearSmoothScrollState(){this._smoothScrollState.startTime=0,this._smoothScrollState.origin=-1,this._smoothScrollState.target=-1}_bubbleScroll(e,t){const i=this._viewportElement.scrollTop+this._lastRecordedViewportHeight;return!(t<0&&0!==this._viewportElement.scrollTop||t>0&&i0&&(i=e),s=\"\"}}return{bufferElements:r,cursorElement:i}}getLinesScrolled(e){if(0===e.deltaY||e.shiftKey)return 0;let t=this._applyScrollModifier(e.deltaY,e);return e.deltaMode===WheelEvent.DOM_DELTA_PIXEL?(t/=this._currentRowHeight+0,this._wheelPartialScroll+=t,t=Math.floor(Math.abs(this._wheelPartialScroll))*(this._wheelPartialScroll>0?1:-1),this._wheelPartialScroll%=1):e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(t*=this._bufferService.rows),t}_applyScrollModifier(e,t){const i=this._optionsService.rawOptions.fastScrollModifier;return\"alt\"===i&&t.altKey||\"ctrl\"===i&&t.ctrlKey||\"shift\"===i&&t.shiftKey?e*this._optionsService.rawOptions.fastScrollSensitivity*this._optionsService.rawOptions.scrollSensitivity:e*this._optionsService.rawOptions.scrollSensitivity}handleTouchStart(e){this._lastTouchY=e.touches[0].pageY}handleTouchMove(e){const t=this._lastTouchY-e.touches[0].pageY;return this._lastTouchY=e.touches[0].pageY,0!==t&&(this._viewportElement.scrollTop+=t,this._bubbleScroll(e,t))}};t.Viewport=l=s([r(2,c.IBufferService),r(3,c.IOptionsService),r(4,o.ICharSizeService),r(5,o.IRenderService),r(6,o.ICoreBrowserService),r(7,o.IThemeService)],l)},3107:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferDecorationRenderer=void 0;const n=i(4725),o=i(844),a=i(2585);let h=t.BufferDecorationRenderer=class extends o.Disposable{constructor(e,t,i,s,r){super(),this._screenElement=e,this._bufferService=t,this._coreBrowserService=i,this._decorationService=s,this._renderService=r,this._decorationElements=new Map,this._altBufferIsActive=!1,this._dimensionsChanged=!1,this._container=document.createElement(\"div\"),this._container.classList.add(\"xterm-decoration-container\"),this._screenElement.appendChild(this._container),this.register(this._renderService.onRenderedViewportChange((()=>this._doRefreshDecorations()))),this.register(this._renderService.onDimensionsChange((()=>{this._dimensionsChanged=!0,this._queueRefresh()}))),this.register(this._coreBrowserService.onDprChange((()=>this._queueRefresh()))),this.register(this._bufferService.buffers.onBufferActivate((()=>{this._altBufferIsActive=this._bufferService.buffer===this._bufferService.buffers.alt}))),this.register(this._decorationService.onDecorationRegistered((()=>this._queueRefresh()))),this.register(this._decorationService.onDecorationRemoved((e=>this._removeDecoration(e)))),this.register((0,o.toDisposable)((()=>{this._container.remove(),this._decorationElements.clear()})))}_queueRefresh(){void 0===this._animationFrame&&(this._animationFrame=this._renderService.addRefreshCallback((()=>{this._doRefreshDecorations(),this._animationFrame=void 0})))}_doRefreshDecorations(){for(const e of this._decorationService.decorations)this._renderDecoration(e);this._dimensionsChanged=!1}_renderDecoration(e){this._refreshStyle(e),this._dimensionsChanged&&this._refreshXPosition(e)}_createElement(e){const t=this._coreBrowserService.mainDocument.createElement(\"div\");t.classList.add(\"xterm-decoration\"),t.classList.toggle(\"xterm-decoration-top-layer\",\"top\"===e?.options?.layer),t.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,t.style.height=(e.options.height||1)*this._renderService.dimensions.css.cell.height+\"px\",t.style.top=(e.marker.line-this._bufferService.buffers.active.ydisp)*this._renderService.dimensions.css.cell.height+\"px\",t.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`;const i=e.options.x??0;return i&&i>this._bufferService.cols&&(t.style.display=\"none\"),this._refreshXPosition(e,t),t}_refreshStyle(e){const t=e.marker.line-this._bufferService.buffers.active.ydisp;if(t<0||t>=this._bufferService.rows)e.element&&(e.element.style.display=\"none\",e.onRenderEmitter.fire(e.element));else{let i=this._decorationElements.get(e);i||(i=this._createElement(e),e.element=i,this._decorationElements.set(e,i),this._container.appendChild(i),e.onDispose((()=>{this._decorationElements.delete(e),i.remove()}))),i.style.top=t*this._renderService.dimensions.css.cell.height+\"px\",i.style.display=this._altBufferIsActive?\"none\":\"block\",e.onRenderEmitter.fire(i)}}_refreshXPosition(e,t=e.element){if(!t)return;const i=e.options.x??0;\"right\"===(e.options.anchor||\"left\")?t.style.right=i?i*this._renderService.dimensions.css.cell.width+\"px\":\"\":t.style.left=i?i*this._renderService.dimensions.css.cell.width+\"px\":\"\"}_removeDecoration(e){this._decorationElements.get(e)?.remove(),this._decorationElements.delete(e),e.dispose()}};t.BufferDecorationRenderer=h=s([r(1,a.IBufferService),r(2,n.ICoreBrowserService),r(3,a.IDecorationService),r(4,n.IRenderService)],h)},5871:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.ColorZoneStore=void 0,t.ColorZoneStore=class{constructor(){this._zones=[],this._zonePool=[],this._zonePoolIndex=0,this._linePadding={full:0,left:0,center:0,right:0}}get zones(){return this._zonePool.length=Math.min(this._zonePool.length,this._zones.length),this._zones}clear(){this._zones.length=0,this._zonePoolIndex=0}addDecoration(e){if(e.options.overviewRulerOptions){for(const t of this._zones)if(t.color===e.options.overviewRulerOptions.color&&t.position===e.options.overviewRulerOptions.position){if(this._lineIntersectsZone(t,e.marker.line))return;if(this._lineAdjacentToZone(t,e.marker.line,e.options.overviewRulerOptions.position))return void this._addLineToZone(t,e.marker.line)}if(this._zonePoolIndex=e.startBufferLine&&t<=e.endBufferLine}_lineAdjacentToZone(e,t,i){return t>=e.startBufferLine-this._linePadding[i||\"full\"]&&t<=e.endBufferLine+this._linePadding[i||\"full\"]}_addLineToZone(e,t){e.startBufferLine=Math.min(e.startBufferLine,t),e.endBufferLine=Math.max(e.endBufferLine,t)}}},5744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.OverviewRulerRenderer=void 0;const n=i(5871),o=i(4725),a=i(844),h=i(2585),c={full:0,left:0,center:0,right:0},l={full:0,left:0,center:0,right:0},d={full:0,left:0,center:0,right:0};let _=t.OverviewRulerRenderer=class extends a.Disposable{get _width(){return this._optionsService.options.overviewRulerWidth||0}constructor(e,t,i,s,r,o,h){super(),this._viewportElement=e,this._screenElement=t,this._bufferService=i,this._decorationService=s,this._renderService=r,this._optionsService=o,this._coreBrowserService=h,this._colorZoneStore=new n.ColorZoneStore,this._shouldUpdateDimensions=!0,this._shouldUpdateAnchor=!0,this._lastKnownBufferLength=0,this._canvas=this._coreBrowserService.mainDocument.createElement(\"canvas\"),this._canvas.classList.add(\"xterm-decoration-overview-ruler\"),this._refreshCanvasDimensions(),this._viewportElement.parentElement?.insertBefore(this._canvas,this._viewportElement);const c=this._canvas.getContext(\"2d\");if(!c)throw new Error(\"Ctx cannot be null\");this._ctx=c,this._registerDecorationListeners(),this._registerBufferChangeListeners(),this._registerDimensionChangeListeners(),this.register((0,a.toDisposable)((()=>{this._canvas?.remove()})))}_registerDecorationListeners(){this.register(this._decorationService.onDecorationRegistered((()=>this._queueRefresh(void 0,!0)))),this.register(this._decorationService.onDecorationRemoved((()=>this._queueRefresh(void 0,!0))))}_registerBufferChangeListeners(){this.register(this._renderService.onRenderedViewportChange((()=>this._queueRefresh()))),this.register(this._bufferService.buffers.onBufferActivate((()=>{this._canvas.style.display=this._bufferService.buffer===this._bufferService.buffers.alt?\"none\":\"block\"}))),this.register(this._bufferService.onScroll((()=>{this._lastKnownBufferLength!==this._bufferService.buffers.normal.lines.length&&(this._refreshDrawHeightConstants(),this._refreshColorZonePadding())})))}_registerDimensionChangeListeners(){this.register(this._renderService.onRender((()=>{this._containerHeight&&this._containerHeight===this._screenElement.clientHeight||(this._queueRefresh(!0),this._containerHeight=this._screenElement.clientHeight)}))),this.register(this._optionsService.onSpecificOptionChange(\"overviewRulerWidth\",(()=>this._queueRefresh(!0)))),this.register(this._coreBrowserService.onDprChange((()=>this._queueRefresh(!0)))),this._queueRefresh(!0)}_refreshDrawConstants(){const e=Math.floor(this._canvas.width/3),t=Math.ceil(this._canvas.width/3);l.full=this._canvas.width,l.left=e,l.center=t,l.right=e,this._refreshDrawHeightConstants(),d.full=0,d.left=0,d.center=l.left,d.right=l.left+l.center}_refreshDrawHeightConstants(){c.full=Math.round(2*this._coreBrowserService.dpr);const e=this._canvas.height/this._bufferService.buffer.lines.length,t=Math.round(Math.max(Math.min(e,12),6)*this._coreBrowserService.dpr);c.left=t,c.center=t,c.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowserService.dpr),this._canvas.style.height=`${this._screenElement.clientHeight}px`,this._canvas.height=Math.round(this._screenElement.clientHeight*this._coreBrowserService.dpr),this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){this._shouldUpdateDimensions&&this._refreshCanvasDimensions(),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._colorZoneStore.clear();for(const e of this._decorationService.decorations)this._colorZoneStore.addDecoration(e);this._ctx.lineWidth=1;const e=this._colorZoneStore.zones;for(const t of e)\"full\"!==t.position&&this._renderColorZone(t);for(const t of e)\"full\"===t.position&&this._renderColorZone(t);this._shouldUpdateDimensions=!1,this._shouldUpdateAnchor=!1}_renderColorZone(e){this._ctx.fillStyle=e.color,this._ctx.fillRect(d[e.position||\"full\"],Math.round((this._canvas.height-1)*(e.startBufferLine/this._bufferService.buffers.active.lines.length)-c[e.position||\"full\"]/2),l[e.position||\"full\"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+c[e.position||\"full\"]))}_queueRefresh(e,t){this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,void 0===this._animationFrame&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._refreshDecorations(),this._animationFrame=void 0})))}};t.OverviewRulerRenderer=_=s([r(2,h.IBufferService),r(3,h.IDecorationService),r(4,o.IRenderService),r(5,h.IOptionsService),r(6,o.ICoreBrowserService)],_)},2950:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CompositionHelper=void 0;const n=i(4725),o=i(2585),a=i(2584);let h=t.CompositionHelper=class{get isComposing(){return this._isComposing}constructor(e,t,i,s,r,n){this._textarea=e,this._compositionView=t,this._bufferService=i,this._optionsService=s,this._coreService=r,this._renderService=n,this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._dataAlreadySent=\"\"}compositionstart(){this._isComposing=!0,this._compositionPosition.start=this._textarea.value.length,this._compositionView.textContent=\"\",this._dataAlreadySent=\"\",this._compositionView.classList.add(\"active\")}compositionupdate(e){this._compositionView.textContent=e.data,this.updateCompositionElements(),setTimeout((()=>{this._compositionPosition.end=this._textarea.value.length}),0)}compositionend(){this._finalizeComposition(!0)}keydown(e){if(this._isComposing||this._isSendingComposition){if(229===e.keyCode)return!1;if(16===e.keyCode||17===e.keyCode||18===e.keyCode)return!1;this._finalizeComposition(!1)}return 229!==e.keyCode||(this._handleAnyTextareaChanges(),!1)}_finalizeComposition(e){if(this._compositionView.classList.remove(\"active\"),this._isComposing=!1,e){const e={start:this._compositionPosition.start,end:this._compositionPosition.end};this._isSendingComposition=!0,setTimeout((()=>{if(this._isSendingComposition){let t;this._isSendingComposition=!1,e.start+=this._dataAlreadySent.length,t=this._isComposing?this._textarea.value.substring(e.start,e.end):this._textarea.value.substring(e.start),t.length>0&&this._coreService.triggerDataEvent(t,!0)}}),0)}else{this._isSendingComposition=!1;const e=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(e,!0)}}_handleAnyTextareaChanges(){const e=this._textarea.value;setTimeout((()=>{if(!this._isComposing){const t=this._textarea.value,i=t.replace(e,\"\");this._dataAlreadySent=i,t.length>e.length?this._coreService.triggerDataEvent(i,!0):t.lengththis.updateCompositionElements(!0)),0)}}};t.CompositionHelper=h=s([r(2,o.IBufferService),r(3,o.IOptionsService),r(4,o.ICoreService),r(5,n.IRenderService)],h)},9806:(e,t)=>{function i(e,t,i){const s=i.getBoundingClientRect(),r=e.getComputedStyle(i),n=parseInt(r.getPropertyValue(\"padding-left\")),o=parseInt(r.getPropertyValue(\"padding-top\"));return[t.clientX-s.left-n,t.clientY-s.top-o]}Object.defineProperty(t,\"__esModule\",{value:!0}),t.getCoords=t.getCoordsRelativeToElement=void 0,t.getCoordsRelativeToElement=i,t.getCoords=function(e,t,s,r,n,o,a,h,c){if(!o)return;const l=i(e,t,s);return l?(l[0]=Math.ceil((l[0]+(c?a/2:0))/a),l[1]=Math.ceil(l[1]/h),l[0]=Math.min(Math.max(l[0],1),r+(c?1:0)),l[1]=Math.min(Math.max(l[1],1),n),l):void 0}},9504:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.moveToCellSequence=void 0;const s=i(2584);function r(e,t,i,s){const r=e-n(e,i),a=t-n(t,i),l=Math.abs(r-a)-function(e,t,i){let s=0;const r=e-n(e,i),a=t-n(t,i);for(let n=0;n=0&&et?\"A\":\"B\"}function a(e,t,i,s,r,n){let o=e,a=t,h=\"\";for(;o!==i||a!==s;)o+=r?1:-1,r&&o>n.cols-1?(h+=n.buffer.translateBufferLineToString(a,!1,e,o),o=0,e=0,a++):!r&&o<0&&(h+=n.buffer.translateBufferLineToString(a,!1,0,e+1),o=n.cols-1,e=o,a--);return h+n.buffer.translateBufferLineToString(a,!1,e,o)}function h(e,t){const i=t?\"O\":\"[\";return s.C0.ESC+i+e}function c(e,t){e=Math.floor(e);let i=\"\";for(let s=0;s0?s-n(s,o):t;const _=s,u=function(e,t,i,s,o,a){let h;return h=r(i,s,o,a).length>0?s-n(s,o):t,e=i&&he?\"D\":\"C\",c(Math.abs(o-e),h(d,s));d=l>t?\"D\":\"C\";const _=Math.abs(l-t);return c(function(e,t){return t.cols-e}(l>t?e:o,i)+(_-1)*i.cols+1+((l>t?o:e)-1),h(d,s))}},1296:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.DomRenderer=void 0;const n=i(3787),o=i(2550),a=i(2223),h=i(6171),c=i(6052),l=i(4725),d=i(8055),_=i(8460),u=i(844),f=i(2585),v=\"xterm-dom-renderer-owner-\",p=\"xterm-rows\",g=\"xterm-fg-\",m=\"xterm-bg-\",S=\"xterm-focus\",C=\"xterm-selection\";let b=1,w=t.DomRenderer=class extends u.Disposable{constructor(e,t,i,s,r,a,l,d,f,g,m,S,w){super(),this._terminal=e,this._document=t,this._element=i,this._screenElement=s,this._viewportElement=r,this._helperContainer=a,this._linkifier2=l,this._charSizeService=f,this._optionsService=g,this._bufferService=m,this._coreBrowserService=S,this._themeService=w,this._terminalClass=b++,this._rowElements=[],this._selectionRenderModel=(0,c.createSelectionRenderModel)(),this.onRequestRedraw=this.register(new _.EventEmitter).event,this._rowContainer=this._document.createElement(\"div\"),this._rowContainer.classList.add(p),this._rowContainer.style.lineHeight=\"normal\",this._rowContainer.setAttribute(\"aria-hidden\",\"true\"),this._refreshRowElements(this._bufferService.cols,this._bufferService.rows),this._selectionContainer=this._document.createElement(\"div\"),this._selectionContainer.classList.add(C),this._selectionContainer.setAttribute(\"aria-hidden\",\"true\"),this.dimensions=(0,h.createRenderDimensions)(),this._updateDimensions(),this.register(this._optionsService.onOptionChange((()=>this._handleOptionsChanged()))),this.register(this._themeService.onChangeColors((e=>this._injectCss(e)))),this._injectCss(this._themeService.colors),this._rowFactory=d.createInstance(n.DomRendererRowFactory,document),this._element.classList.add(v+this._terminalClass),this._screenElement.appendChild(this._rowContainer),this._screenElement.appendChild(this._selectionContainer),this.register(this._linkifier2.onShowLinkUnderline((e=>this._handleLinkHover(e)))),this.register(this._linkifier2.onHideLinkUnderline((e=>this._handleLinkLeave(e)))),this.register((0,u.toDisposable)((()=>{this._element.classList.remove(v+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()}))),this._widthCache=new o.WidthCache(this._document,this._helperContainer),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}_updateDimensions(){const e=this._coreBrowserService.dpr;this.dimensions.device.char.width=this._charSizeService.width*e,this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*e),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.left=0,this.dimensions.device.char.top=0,this.dimensions.device.canvas.width=this.dimensions.device.cell.width*this._bufferService.cols,this.dimensions.device.canvas.height=this.dimensions.device.cell.height*this._bufferService.rows,this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/e),this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/e),this.dimensions.css.cell.width=this.dimensions.css.canvas.width/this._bufferService.cols,this.dimensions.css.cell.height=this.dimensions.css.canvas.height/this._bufferService.rows;for(const e of this._rowElements)e.style.width=`${this.dimensions.css.canvas.width}px`,e.style.height=`${this.dimensions.css.cell.height}px`,e.style.lineHeight=`${this.dimensions.css.cell.height}px`,e.style.overflow=\"hidden\";this._dimensionsStyleElement||(this._dimensionsStyleElement=this._document.createElement(\"style\"),this._screenElement.appendChild(this._dimensionsStyleElement));const t=`${this._terminalSelector} .${p} span { display: inline-block; height: 100%; vertical-align: top;}`;this._dimensionsStyleElement.textContent=t,this._selectionContainer.style.height=this._viewportElement.style.height,this._screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._screenElement.style.height=`${this.dimensions.css.canvas.height}px`}_injectCss(e){this._themeStyleElement||(this._themeStyleElement=this._document.createElement(\"style\"),this._screenElement.appendChild(this._themeStyleElement));let t=`${this._terminalSelector} .${p} { color: ${e.foreground.css}; font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`;t+=`${this._terminalSelector} .${p} .xterm-dim { color: ${d.color.multiplyOpacity(e.foreground,.5).css};}`,t+=`${this._terminalSelector} span:not(.xterm-bold) { font-weight: ${this._optionsService.rawOptions.fontWeight};}${this._terminalSelector} span.xterm-bold { font-weight: ${this._optionsService.rawOptions.fontWeightBold};}${this._terminalSelector} span.xterm-italic { font-style: italic;}`;const i=`blink_underline_${this._terminalClass}`,s=`blink_bar_${this._terminalClass}`,r=`blink_block_${this._terminalClass}`;t+=`@keyframes ${i} { 50% { border-bottom-style: hidden; }}`,t+=`@keyframes ${s} { 50% { box-shadow: none; }}`,t+=`@keyframes ${r} { 0% { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css}; } 50% { background-color: inherit; color: ${e.cursor.css}; }}`,t+=`${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${i} 1s step-end infinite;}${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s} 1s step-end infinite;}${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${r} 1s step-end infinite;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-block { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css};}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e.cursor.css} !important; color: ${e.cursorAccent.css} !important;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .${C} { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .${C} div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .${C} div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(const[i,s]of e.ansi.entries())t+=`${this._terminalSelector} .${g}${i} { color: ${s.css}; }${this._terminalSelector} .${g}${i}.xterm-dim { color: ${d.color.multiplyOpacity(s,.5).css}; }${this._terminalSelector} .${m}${i} { background-color: ${s.css}; }`;t+=`${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR} { color: ${d.color.opaque(e.background).css}; }${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${d.color.multiplyOpacity(d.color.opaque(e.background),.5).css}; }${this._terminalSelector} .${m}${a.INVERTED_DEFAULT_COLOR} { background-color: ${e.foreground.css}; }`,this._themeStyleElement.textContent=t}_setDefaultSpacing(){const e=this.dimensions.css.cell.width-this._widthCache.get(\"W\",!1,!1);this._rowContainer.style.letterSpacing=`${e}px`,this._rowFactory.defaultSpacing=e}handleDevicePixelRatioChange(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}_refreshRowElements(e,t){for(let e=this._rowElements.length;e<=t;e++){const e=this._document.createElement(\"div\");this._rowContainer.appendChild(e),this._rowElements.push(e)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop())}handleResize(e,t){this._refreshRowElements(e,t),this._updateDimensions(),this.handleSelectionChanged(this._selectionRenderModel.selectionStart,this._selectionRenderModel.selectionEnd,this._selectionRenderModel.columnSelectMode)}handleCharSizeChanged(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}handleBlur(){this._rowContainer.classList.remove(S),this.renderRows(0,this._bufferService.rows-1)}handleFocus(){this._rowContainer.classList.add(S),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleSelectionChanged(e,t,i){if(this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,t,i),this.renderRows(0,this._bufferService.rows-1),!e||!t)return;this._selectionRenderModel.update(this._terminal,e,t,i);const s=this._selectionRenderModel.viewportStartRow,r=this._selectionRenderModel.viewportEndRow,n=this._selectionRenderModel.viewportCappedStartRow,o=this._selectionRenderModel.viewportCappedEndRow;if(n>=this._bufferService.rows||o<0)return;const a=this._document.createDocumentFragment();if(i){const i=e[0]>t[0];a.appendChild(this._createSelectionElement(n,i?t[0]:e[0],i?e[0]:t[0],o-n+1))}else{const i=s===n?e[0]:0,h=n===r?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(n,i,h));const c=o-n-1;if(a.appendChild(this._createSelectionElement(n+1,0,this._bufferService.cols,c)),n!==o){const e=r===o?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(o,0,e))}}this._selectionContainer.appendChild(a)}_createSelectionElement(e,t,i,s=1){const r=this._document.createElement(\"div\"),n=t*this.dimensions.css.cell.width;let o=this.dimensions.css.cell.width*(i-t);return n+o>this.dimensions.css.canvas.width&&(o=this.dimensions.css.canvas.width-n),r.style.height=s*this.dimensions.css.cell.height+\"px\",r.style.top=e*this.dimensions.css.cell.height+\"px\",r.style.left=`${n}px`,r.style.width=`${o}px`,r}handleCursorMove(){}_handleOptionsChanged(){this._updateDimensions(),this._injectCss(this._themeService.colors),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}clear(){for(const e of this._rowElements)e.replaceChildren()}renderRows(e,t){const i=this._bufferService.buffer,s=i.ybase+i.y,r=Math.min(i.x,this._bufferService.cols-1),n=this._optionsService.rawOptions.cursorBlink,o=this._optionsService.rawOptions.cursorStyle,a=this._optionsService.rawOptions.cursorInactiveStyle;for(let h=e;h<=t;h++){const e=h+i.ydisp,t=this._rowElements[h],c=i.lines.get(e);if(!t||!c)break;t.replaceChildren(...this._rowFactory.createRow(c,e,e===s,o,a,r,n,this.dimensions.css.cell.width,this._widthCache,-1,-1))}}get _terminalSelector(){return`.${v}${this._terminalClass}`}_handleLinkHover(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!0)}_handleLinkLeave(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!1)}_setCellUnderline(e,t,i,s,r,n){i<0&&(e=0),s<0&&(t=0);const o=this._bufferService.rows-1;i=Math.max(Math.min(i,o),0),s=Math.max(Math.min(s,o),0),r=Math.min(r,this._bufferService.cols);const a=this._bufferService.buffer,h=a.ybase+a.y,c=Math.min(a.x,r-1),l=this._optionsService.rawOptions.cursorBlink,d=this._optionsService.rawOptions.cursorStyle,_=this._optionsService.rawOptions.cursorInactiveStyle;for(let o=i;o<=s;++o){const u=o+a.ydisp,f=this._rowElements[o],v=a.lines.get(u);if(!f||!v)break;f.replaceChildren(...this._rowFactory.createRow(v,u,u===h,d,_,c,l,this.dimensions.css.cell.width,this._widthCache,n?o===i?e:0:-1,n?(o===s?t:r)-1:-1))}}};t.DomRenderer=w=s([r(7,f.IInstantiationService),r(8,l.ICharSizeService),r(9,f.IOptionsService),r(10,f.IBufferService),r(11,l.ICoreBrowserService),r(12,l.IThemeService)],w)},3787:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.DomRendererRowFactory=void 0;const n=i(2223),o=i(643),a=i(511),h=i(2585),c=i(8055),l=i(4725),d=i(4269),_=i(6171),u=i(3734);let f=t.DomRendererRowFactory=class{constructor(e,t,i,s,r,n,o){this._document=e,this._characterJoinerService=t,this._optionsService=i,this._coreBrowserService=s,this._coreService=r,this._decorationService=n,this._themeService=o,this._workCell=new a.CellData,this._columnSelectMode=!1,this.defaultSpacing=0}handleSelectionChanged(e,t,i){this._selectionStart=e,this._selectionEnd=t,this._columnSelectMode=i}createRow(e,t,i,s,r,a,h,l,_,f,p){const g=[],m=this._characterJoinerService.getJoinedCharacters(t),S=this._themeService.colors;let C,b=e.getNoBgTrimmedLength();i&&b0&&M===m[0][0]){O=!0;const t=m.shift();I=new d.JoinedCellData(this._workCell,e.translateToString(!0,t[0],t[1]),t[1]-t[0]),P=t[1]-1,b=I.getWidth()}const H=this._isCellInSelection(M,t),F=i&&M===a,W=T&&M>=f&&M<=p;let U=!1;this._decorationService.forEachDecorationAtCell(M,t,void 0,(e=>{U=!0}));let N=I.getChars()||o.WHITESPACE_CELL_CHAR;if(\" \"===N&&(I.isUnderline()||I.isOverline())&&(N=\" \"),A=b*l-_.get(N,I.isBold(),I.isItalic()),C){if(w&&(H&&x||!H&&!x&&I.bg===E)&&(H&&x&&S.selectionForeground||I.fg===k)&&I.extended.ext===L&&W===D&&A===R&&!F&&!O&&!U){I.isInvisible()?y+=o.WHITESPACE_CELL_CHAR:y+=N,w++;continue}w&&(C.textContent=y),C=this._document.createElement(\"span\"),w=0,y=\"\"}else C=this._document.createElement(\"span\");if(E=I.bg,k=I.fg,L=I.extended.ext,D=W,R=A,x=H,O&&a>=M&&a<=P&&(a=M),!this._coreService.isCursorHidden&&F&&this._coreService.isCursorInitialized)if(B.push(\"xterm-cursor\"),this._coreBrowserService.isFocused)h&&B.push(\"xterm-cursor-blink\"),B.push(\"bar\"===s?\"xterm-cursor-bar\":\"underline\"===s?\"xterm-cursor-underline\":\"xterm-cursor-block\");else if(r)switch(r){case\"outline\":B.push(\"xterm-cursor-outline\");break;case\"block\":B.push(\"xterm-cursor-block\");break;case\"bar\":B.push(\"xterm-cursor-bar\");break;case\"underline\":B.push(\"xterm-cursor-underline\")}if(I.isBold()&&B.push(\"xterm-bold\"),I.isItalic()&&B.push(\"xterm-italic\"),I.isDim()&&B.push(\"xterm-dim\"),y=I.isInvisible()?o.WHITESPACE_CELL_CHAR:I.getChars()||o.WHITESPACE_CELL_CHAR,I.isUnderline()&&(B.push(`xterm-underline-${I.extended.underlineStyle}`),\" \"===y&&(y=\" \"),!I.isUnderlineColorDefault()))if(I.isUnderlineColorRGB())C.style.textDecorationColor=`rgb(${u.AttributeData.toColorRGB(I.getUnderlineColor()).join(\",\")})`;else{let e=I.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&I.isBold()&&e<8&&(e+=8),C.style.textDecorationColor=S.ansi[e].css}I.isOverline()&&(B.push(\"xterm-overline\"),\" \"===y&&(y=\" \")),I.isStrikethrough()&&B.push(\"xterm-strikethrough\"),W&&(C.style.textDecoration=\"underline\");let $=I.getFgColor(),j=I.getFgColorMode(),z=I.getBgColor(),K=I.getBgColorMode();const q=!!I.isInverse();if(q){const e=$;$=z,z=e;const t=j;j=K,K=t}let V,G,X,J=!1;switch(this._decorationService.forEachDecorationAtCell(M,t,void 0,(e=>{\"top\"!==e.options.layer&&J||(e.backgroundColorRGB&&(K=50331648,z=e.backgroundColorRGB.rgba>>8&16777215,V=e.backgroundColorRGB),e.foregroundColorRGB&&(j=50331648,$=e.foregroundColorRGB.rgba>>8&16777215,G=e.foregroundColorRGB),J=\"top\"===e.options.layer)})),!J&&H&&(V=this._coreBrowserService.isFocused?S.selectionBackgroundOpaque:S.selectionInactiveBackgroundOpaque,z=V.rgba>>8&16777215,K=50331648,J=!0,S.selectionForeground&&(j=50331648,$=S.selectionForeground.rgba>>8&16777215,G=S.selectionForeground)),J&&B.push(\"xterm-decoration-top\"),K){case 16777216:case 33554432:X=S.ansi[z],B.push(`xterm-bg-${z}`);break;case 50331648:X=c.channels.toColor(z>>16,z>>8&255,255&z),this._addStyle(C,`background-color:#${v((z>>>0).toString(16),\"0\",6)}`);break;default:q?(X=S.foreground,B.push(`xterm-bg-${n.INVERTED_DEFAULT_COLOR}`)):X=S.background}switch(V||I.isDim()&&(V=c.color.multiplyOpacity(X,.5)),j){case 16777216:case 33554432:I.isBold()&&$<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&($+=8),this._applyMinimumContrast(C,X,S.ansi[$],I,V,void 0)||B.push(`xterm-fg-${$}`);break;case 50331648:const e=c.channels.toColor($>>16&255,$>>8&255,255&$);this._applyMinimumContrast(C,X,e,I,V,G)||this._addStyle(C,`color:#${v($.toString(16),\"0\",6)}`);break;default:this._applyMinimumContrast(C,X,S.foreground,I,V,G)||q&&B.push(`xterm-fg-${n.INVERTED_DEFAULT_COLOR}`)}B.length&&(C.className=B.join(\" \"),B.length=0),F||O||U?C.textContent=y:w++,A!==this.defaultSpacing&&(C.style.letterSpacing=`${A}px`),g.push(C),M=P}return C&&w&&(C.textContent=y),g}_applyMinimumContrast(e,t,i,s,r,n){if(1===this._optionsService.rawOptions.minimumContrastRatio||(0,_.treatGlyphAsBackgroundColor)(s.getCode()))return!1;const o=this._getContrastCache(s);let a;if(r||n||(a=o.getColor(t.rgba,i.rgba)),void 0===a){const e=this._optionsService.rawOptions.minimumContrastRatio/(s.isDim()?2:1);a=c.color.ensureContrastRatio(r||t,n||i,e),o.setColor((r||t).rgba,(n||i).rgba,a??null)}return!!a&&(this._addStyle(e,`color:${a.css}`),!0)}_getContrastCache(e){return e.isDim()?this._themeService.colors.halfContrastCache:this._themeService.colors.contrastCache}_addStyle(e,t){e.setAttribute(\"style\",`${e.getAttribute(\"style\")||\"\"}${t};`)}_isCellInSelection(e,t){const i=this._selectionStart,s=this._selectionEnd;return!(!i||!s)&&(this._columnSelectMode?i[0]<=s[0]?e>=i[0]&&t>=i[1]&&e=i[1]&&e>=s[0]&&t<=s[1]:t>i[1]&&t=i[0]&&e=i[0])}};function v(e,t,i){for(;e.length{Object.defineProperty(t,\"__esModule\",{value:!0}),t.WidthCache=void 0,t.WidthCache=class{constructor(e,t){this._flat=new Float32Array(256),this._font=\"\",this._fontSize=0,this._weight=\"normal\",this._weightBold=\"bold\",this._measureElements=[],this._container=e.createElement(\"div\"),this._container.classList.add(\"xterm-width-cache-measure-container\"),this._container.setAttribute(\"aria-hidden\",\"true\"),this._container.style.whiteSpace=\"pre\",this._container.style.fontKerning=\"none\";const i=e.createElement(\"span\");i.classList.add(\"xterm-char-measure-element\");const s=e.createElement(\"span\");s.classList.add(\"xterm-char-measure-element\"),s.style.fontWeight=\"bold\";const r=e.createElement(\"span\");r.classList.add(\"xterm-char-measure-element\"),r.style.fontStyle=\"italic\";const n=e.createElement(\"span\");n.classList.add(\"xterm-char-measure-element\"),n.style.fontWeight=\"bold\",n.style.fontStyle=\"italic\",this._measureElements=[i,s,r,n],this._container.appendChild(i),this._container.appendChild(s),this._container.appendChild(r),this._container.appendChild(n),t.appendChild(this._container),this.clear()}dispose(){this._container.remove(),this._measureElements.length=0,this._holey=void 0}clear(){this._flat.fill(-9999),this._holey=new Map}setFont(e,t,i,s){e===this._font&&t===this._fontSize&&i===this._weight&&s===this._weightBold||(this._font=e,this._fontSize=t,this._weight=i,this._weightBold=s,this._container.style.fontFamily=this._font,this._container.style.fontSize=`${this._fontSize}px`,this._measureElements[0].style.fontWeight=`${i}`,this._measureElements[1].style.fontWeight=`${s}`,this._measureElements[2].style.fontWeight=`${i}`,this._measureElements[3].style.fontWeight=`${s}`,this.clear())}get(e,t,i){let s=0;if(!t&&!i&&1===e.length&&(s=e.charCodeAt(0))<256){if(-9999!==this._flat[s])return this._flat[s];const t=this._measure(e,0);return t>0&&(this._flat[s]=t),t}let r=e;t&&(r+=\"B\"),i&&(r+=\"I\");let n=this._holey.get(r);if(void 0===n){let s=0;t&&(s|=1),i&&(s|=2),n=this._measure(e,s),n>0&&this._holey.set(r,n)}return n}_measure(e,t){const i=this._measureElements[t];return i.textContent=e.repeat(32),i.offsetWidth/32}}},2223:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.TEXT_BASELINE=t.DIM_OPACITY=t.INVERTED_DEFAULT_COLOR=void 0;const s=i(6114);t.INVERTED_DEFAULT_COLOR=257,t.DIM_OPACITY=.5,t.TEXT_BASELINE=s.isFirefox||s.isLegacyEdge?\"bottom\":\"ideographic\"},6171:(e,t)=>{function i(e){return 57508<=e&&e<=57558}function s(e){return e>=128512&&e<=128591||e>=127744&&e<=128511||e>=128640&&e<=128767||e>=9728&&e<=9983||e>=9984&&e<=10175||e>=65024&&e<=65039||e>=129280&&e<=129535||e>=127462&&e<=127487}Object.defineProperty(t,\"__esModule\",{value:!0}),t.computeNextVariantOffset=t.createRenderDimensions=t.treatGlyphAsBackgroundColor=t.allowRescaling=t.isEmoji=t.isRestrictedPowerlineGlyph=t.isPowerlineGlyph=t.throwIfFalsy=void 0,t.throwIfFalsy=function(e){if(!e)throw new Error(\"value must not be falsy\");return e},t.isPowerlineGlyph=i,t.isRestrictedPowerlineGlyph=function(e){return 57520<=e&&e<=57527},t.isEmoji=s,t.allowRescaling=function(e,t,r,n){return 1===t&&r>Math.ceil(1.5*n)&&void 0!==e&&e>255&&!s(e)&&!i(e)&&!function(e){return 57344<=e&&e<=63743}(e)},t.treatGlyphAsBackgroundColor=function(e){return i(e)||function(e){return 9472<=e&&e<=9631}(e)},t.createRenderDimensions=function(){return{css:{canvas:{width:0,height:0},cell:{width:0,height:0}},device:{canvas:{width:0,height:0},cell:{width:0,height:0},char:{width:0,height:0,left:0,top:0}}}},t.computeNextVariantOffset=function(e,t,i=0){return(e-(2*Math.round(t)-i))%(2*Math.round(t))}},6052:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.createSelectionRenderModel=void 0;class i{constructor(){this.clear()}clear(){this.hasSelection=!1,this.columnSelectMode=!1,this.viewportStartRow=0,this.viewportEndRow=0,this.viewportCappedStartRow=0,this.viewportCappedEndRow=0,this.startCol=0,this.endCol=0,this.selectionStart=void 0,this.selectionEnd=void 0}update(e,t,i,s=!1){if(this.selectionStart=t,this.selectionEnd=i,!t||!i||t[0]===i[0]&&t[1]===i[1])return void this.clear();const r=e.buffers.active.ydisp,n=t[1]-r,o=i[1]-r,a=Math.max(n,0),h=Math.min(o,e.rows-1);a>=e.rows||h<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=n,this.viewportEndRow=o,this.viewportCappedStartRow=a,this.viewportCappedEndRow=h,this.startCol=t[0],this.endCol=i[0])}isCellSelected(e,t,i){return!!this.hasSelection&&(i-=e.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?t>=this.startCol&&i>=this.viewportCappedStartRow&&t=this.viewportCappedStartRow&&t>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i=this.startCol&&t=this.startCol)}}t.createSelectionRenderModel=function(){return new i}},456:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.SelectionModel=void 0,t.SelectionModel=class{constructor(e){this._bufferService=e,this.isSelectAllActive=!1,this.selectionStartLength=0}clearSelection(){this.selectionStart=void 0,this.selectionEnd=void 0,this.isSelectAllActive=!1,this.selectionStartLength=0}get finalSelectionStart(){return this.isSelectAllActive?[0,0]:this.selectionEnd&&this.selectionStart&&this.areSelectionValuesReversed()?this.selectionEnd:this.selectionStart}get finalSelectionEnd(){if(this.isSelectAllActive)return[this._bufferService.cols,this._bufferService.buffer.ybase+this._bufferService.rows-1];if(this.selectionStart){if(!this.selectionEnd||this.areSelectionValuesReversed()){const e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?e%this._bufferService.cols==0?[this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)-1]:[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[e,this.selectionStart[1]]}if(this.selectionStartLength&&this.selectionEnd[1]===this.selectionStart[1]){const e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[Math.max(e,this.selectionEnd[0]),this.selectionEnd[1]]}return this.selectionEnd}}areSelectionValuesReversed(){const e=this.selectionStart,t=this.selectionEnd;return!(!e||!t)&&(e[1]>t[1]||e[1]===t[1]&&e[0]>t[0])}handleTrim(e){return this.selectionStart&&(this.selectionStart[1]-=e),this.selectionEnd&&(this.selectionEnd[1]-=e),this.selectionEnd&&this.selectionEnd[1]<0?(this.clearSelection(),!0):(this.selectionStart&&this.selectionStart[1]<0&&(this.selectionStart[1]=0),!1)}}},428:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CharSizeService=void 0;const n=i(2585),o=i(8460),a=i(844);let h=t.CharSizeService=class extends a.Disposable{get hasValidSize(){return this.width>0&&this.height>0}constructor(e,t,i){super(),this._optionsService=i,this.width=0,this.height=0,this._onCharSizeChange=this.register(new o.EventEmitter),this.onCharSizeChange=this._onCharSizeChange.event;try{this._measureStrategy=this.register(new d(this._optionsService))}catch{this._measureStrategy=this.register(new l(e,t,this._optionsService))}this.register(this._optionsService.onMultipleOptionChange([\"fontFamily\",\"fontSize\"],(()=>this.measure())))}measure(){const e=this._measureStrategy.measure();e.width===this.width&&e.height===this.height||(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};t.CharSizeService=h=s([r(2,n.IOptionsService)],h);class c extends a.Disposable{constructor(){super(...arguments),this._result={width:0,height:0}}_validateAndSet(e,t){void 0!==e&&e>0&&void 0!==t&&t>0&&(this._result.width=e,this._result.height=t)}}class l extends c{constructor(e,t,i){super(),this._document=e,this._parentElement=t,this._optionsService=i,this._measureElement=this._document.createElement(\"span\"),this._measureElement.classList.add(\"xterm-char-measure-element\"),this._measureElement.textContent=\"W\".repeat(32),this._measureElement.setAttribute(\"aria-hidden\",\"true\"),this._measureElement.style.whiteSpace=\"pre\",this._measureElement.style.fontKerning=\"none\",this._parentElement.appendChild(this._measureElement)}measure(){return this._measureElement.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._measureElement.style.fontSize=`${this._optionsService.rawOptions.fontSize}px`,this._validateAndSet(Number(this._measureElement.offsetWidth)/32,Number(this._measureElement.offsetHeight)),this._result}}class d extends c{constructor(e){super(),this._optionsService=e,this._canvas=new OffscreenCanvas(100,100),this._ctx=this._canvas.getContext(\"2d\");const t=this._ctx.measureText(\"W\");if(!(\"width\"in t&&\"fontBoundingBoxAscent\"in t&&\"fontBoundingBoxDescent\"in t))throw new Error(\"Required font metrics not supported\")}measure(){this._ctx.font=`${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;const e=this._ctx.measureText(\"W\");return this._validateAndSet(e.width,e.fontBoundingBoxAscent+e.fontBoundingBoxDescent),this._result}}},4269:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CharacterJoinerService=t.JoinedCellData=void 0;const n=i(3734),o=i(643),a=i(511),h=i(2585);class c extends n.AttributeData{constructor(e,t,i){super(),this.content=0,this.combinedData=\"\",this.fg=e.fg,this.bg=e.bg,this.combinedData=t,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(e){throw new Error(\"not implemented\")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.JoinedCellData=c;let l=t.CharacterJoinerService=class e{constructor(e){this._bufferService=e,this._characterJoiners=[],this._nextCharacterJoinerId=0,this._workCell=new a.CellData}register(e){const t={id:this._nextCharacterJoinerId++,handler:e};return this._characterJoiners.push(t),t.id}deregister(e){for(let t=0;t1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CoreBrowserService=void 0;const s=i(844),r=i(8460),n=i(3656);class o extends s.Disposable{constructor(e,t,i){super(),this._textarea=e,this._window=t,this.mainDocument=i,this._isFocused=!1,this._cachedIsFocused=void 0,this._screenDprMonitor=new a(this._window),this._onDprChange=this.register(new r.EventEmitter),this.onDprChange=this._onDprChange.event,this._onWindowChange=this.register(new r.EventEmitter),this.onWindowChange=this._onWindowChange.event,this.register(this.onWindowChange((e=>this._screenDprMonitor.setWindow(e)))),this.register((0,r.forwardEvent)(this._screenDprMonitor.onDprChange,this._onDprChange)),this._textarea.addEventListener(\"focus\",(()=>this._isFocused=!0)),this._textarea.addEventListener(\"blur\",(()=>this._isFocused=!1))}get window(){return this._window}set window(e){this._window!==e&&(this._window=e,this._onWindowChange.fire(this._window))}get dpr(){return this.window.devicePixelRatio}get isFocused(){return void 0===this._cachedIsFocused&&(this._cachedIsFocused=this._isFocused&&this._textarea.ownerDocument.hasFocus(),queueMicrotask((()=>this._cachedIsFocused=void 0))),this._cachedIsFocused}}t.CoreBrowserService=o;class a extends s.Disposable{constructor(e){super(),this._parentWindow=e,this._windowResizeListener=this.register(new s.MutableDisposable),this._onDprChange=this.register(new r.EventEmitter),this.onDprChange=this._onDprChange.event,this._outerListener=()=>this._setDprAndFireIfDiffers(),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._updateDpr(),this._setWindowResizeListener(),this.register((0,s.toDisposable)((()=>this.clearListener())))}setWindow(e){this._parentWindow=e,this._setWindowResizeListener(),this._setDprAndFireIfDiffers()}_setWindowResizeListener(){this._windowResizeListener.value=(0,n.addDisposableDomListener)(this._parentWindow,\"resize\",(()=>this._setDprAndFireIfDiffers()))}_setDprAndFireIfDiffers(){this._parentWindow.devicePixelRatio!==this._currentDevicePixelRatio&&this._onDprChange.fire(this._parentWindow.devicePixelRatio),this._updateDpr()}_updateDpr(){this._outerListener&&(this._resolutionMediaMatchList?.removeListener(this._outerListener),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._resolutionMediaMatchList=this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`),this._resolutionMediaMatchList.addListener(this._outerListener))}clearListener(){this._resolutionMediaMatchList&&this._outerListener&&(this._resolutionMediaMatchList.removeListener(this._outerListener),this._resolutionMediaMatchList=void 0,this._outerListener=void 0)}}},779:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.LinkProviderService=void 0;const s=i(844);class r extends s.Disposable{constructor(){super(),this.linkProviders=[],this.register((0,s.toDisposable)((()=>this.linkProviders.length=0)))}registerLinkProvider(e){return this.linkProviders.push(e),{dispose:()=>{const t=this.linkProviders.indexOf(e);-1!==t&&this.linkProviders.splice(t,1)}}}}t.LinkProviderService=r},8934:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.MouseService=void 0;const n=i(4725),o=i(9806);let a=t.MouseService=class{constructor(e,t){this._renderService=e,this._charSizeService=t}getCoords(e,t,i,s,r){return(0,o.getCoords)(window,e,t,i,s,this._charSizeService.hasValidSize,this._renderService.dimensions.css.cell.width,this._renderService.dimensions.css.cell.height,r)}getMouseReportCoords(e,t){const i=(0,o.getCoordsRelativeToElement)(window,e,t);if(this._charSizeService.hasValidSize)return i[0]=Math.min(Math.max(i[0],0),this._renderService.dimensions.css.canvas.width-1),i[1]=Math.min(Math.max(i[1],0),this._renderService.dimensions.css.canvas.height-1),{col:Math.floor(i[0]/this._renderService.dimensions.css.cell.width),row:Math.floor(i[1]/this._renderService.dimensions.css.cell.height),x:Math.floor(i[0]),y:Math.floor(i[1])}}};t.MouseService=a=s([r(0,n.IRenderService),r(1,n.ICharSizeService)],a)},3230:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.RenderService=void 0;const n=i(6193),o=i(4725),a=i(8460),h=i(844),c=i(7226),l=i(2585);let d=t.RenderService=class extends h.Disposable{get dimensions(){return this._renderer.value.dimensions}constructor(e,t,i,s,r,o,l,d){super(),this._rowCount=e,this._charSizeService=s,this._renderer=this.register(new h.MutableDisposable),this._pausedResizeTask=new c.DebouncedIdleTask,this._observerDisposable=this.register(new h.MutableDisposable),this._isPaused=!1,this._needsFullRefresh=!1,this._isNextRenderRedrawOnly=!0,this._needsSelectionRefresh=!1,this._canvasWidth=0,this._canvasHeight=0,this._selectionState={start:void 0,end:void 0,columnSelectMode:!1},this._onDimensionsChange=this.register(new a.EventEmitter),this.onDimensionsChange=this._onDimensionsChange.event,this._onRenderedViewportChange=this.register(new a.EventEmitter),this.onRenderedViewportChange=this._onRenderedViewportChange.event,this._onRender=this.register(new a.EventEmitter),this.onRender=this._onRender.event,this._onRefreshRequest=this.register(new a.EventEmitter),this.onRefreshRequest=this._onRefreshRequest.event,this._renderDebouncer=new n.RenderDebouncer(((e,t)=>this._renderRows(e,t)),l),this.register(this._renderDebouncer),this.register(l.onDprChange((()=>this.handleDevicePixelRatioChange()))),this.register(o.onResize((()=>this._fullRefresh()))),this.register(o.buffers.onBufferActivate((()=>this._renderer.value?.clear()))),this.register(i.onOptionChange((()=>this._handleOptionsChanged()))),this.register(this._charSizeService.onCharSizeChange((()=>this.handleCharSizeChanged()))),this.register(r.onDecorationRegistered((()=>this._fullRefresh()))),this.register(r.onDecorationRemoved((()=>this._fullRefresh()))),this.register(i.onMultipleOptionChange([\"customGlyphs\",\"drawBoldTextInBrightColors\",\"letterSpacing\",\"lineHeight\",\"fontFamily\",\"fontSize\",\"fontWeight\",\"fontWeightBold\",\"minimumContrastRatio\",\"rescaleOverlappingGlyphs\"],(()=>{this.clear(),this.handleResize(o.cols,o.rows),this._fullRefresh()}))),this.register(i.onMultipleOptionChange([\"cursorBlink\",\"cursorStyle\"],(()=>this.refreshRows(o.buffer.y,o.buffer.y,!0)))),this.register(d.onChangeColors((()=>this._fullRefresh()))),this._registerIntersectionObserver(l.window,t),this.register(l.onWindowChange((e=>this._registerIntersectionObserver(e,t))))}_registerIntersectionObserver(e,t){if(\"IntersectionObserver\"in e){const i=new e.IntersectionObserver((e=>this._handleIntersectionChange(e[e.length-1])),{threshold:0});i.observe(t),this._observerDisposable.value=(0,h.toDisposable)((()=>i.disconnect()))}}_handleIntersectionChange(e){this._isPaused=void 0===e.isIntersecting?0===e.intersectionRatio:!e.isIntersecting,this._isPaused||this._charSizeService.hasValidSize||this._charSizeService.measure(),!this._isPaused&&this._needsFullRefresh&&(this._pausedResizeTask.flush(),this.refreshRows(0,this._rowCount-1),this._needsFullRefresh=!1)}refreshRows(e,t,i=!1){this._isPaused?this._needsFullRefresh=!0:(i||(this._isNextRenderRedrawOnly=!1),this._renderDebouncer.refresh(e,t,this._rowCount))}_renderRows(e,t){this._renderer.value&&(e=Math.min(e,this._rowCount-1),t=Math.min(t,this._rowCount-1),this._renderer.value.renderRows(e,t),this._needsSelectionRefresh&&(this._renderer.value.handleSelectionChanged(this._selectionState.start,this._selectionState.end,this._selectionState.columnSelectMode),this._needsSelectionRefresh=!1),this._isNextRenderRedrawOnly||this._onRenderedViewportChange.fire({start:e,end:t}),this._onRender.fire({start:e,end:t}),this._isNextRenderRedrawOnly=!0)}resize(e,t){this._rowCount=t,this._fireOnCanvasResize()}_handleOptionsChanged(){this._renderer.value&&(this.refreshRows(0,this._rowCount-1),this._fireOnCanvasResize())}_fireOnCanvasResize(){this._renderer.value&&(this._renderer.value.dimensions.css.canvas.width===this._canvasWidth&&this._renderer.value.dimensions.css.canvas.height===this._canvasHeight||this._onDimensionsChange.fire(this._renderer.value.dimensions))}hasRenderer(){return!!this._renderer.value}setRenderer(e){this._renderer.value=e,this._renderer.value&&(this._renderer.value.onRequestRedraw((e=>this.refreshRows(e.start,e.end,!0))),this._needsSelectionRefresh=!0,this._fullRefresh())}addRefreshCallback(e){return this._renderDebouncer.addRefreshCallback(e)}_fullRefresh(){this._isPaused?this._needsFullRefresh=!0:this.refreshRows(0,this._rowCount-1)}clearTextureAtlas(){this._renderer.value&&(this._renderer.value.clearTextureAtlas?.(),this._fullRefresh())}handleDevicePixelRatioChange(){this._charSizeService.measure(),this._renderer.value&&(this._renderer.value.handleDevicePixelRatioChange(),this.refreshRows(0,this._rowCount-1))}handleResize(e,t){this._renderer.value&&(this._isPaused?this._pausedResizeTask.set((()=>this._renderer.value?.handleResize(e,t))):this._renderer.value.handleResize(e,t),this._fullRefresh())}handleCharSizeChanged(){this._renderer.value?.handleCharSizeChanged()}handleBlur(){this._renderer.value?.handleBlur()}handleFocus(){this._renderer.value?.handleFocus()}handleSelectionChanged(e,t,i){this._selectionState.start=e,this._selectionState.end=t,this._selectionState.columnSelectMode=i,this._renderer.value?.handleSelectionChanged(e,t,i)}handleCursorMove(){this._renderer.value?.handleCursorMove()}clear(){this._renderer.value?.clear()}};t.RenderService=d=s([r(2,l.IOptionsService),r(3,o.ICharSizeService),r(4,l.IDecorationService),r(5,l.IBufferService),r(6,o.ICoreBrowserService),r(7,o.IThemeService)],d)},9312:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.SelectionService=void 0;const n=i(9806),o=i(9504),a=i(456),h=i(4725),c=i(8460),l=i(844),d=i(6114),_=i(4841),u=i(511),f=i(2585),v=String.fromCharCode(160),p=new RegExp(v,\"g\");let g=t.SelectionService=class extends l.Disposable{constructor(e,t,i,s,r,n,o,h,d){super(),this._element=e,this._screenElement=t,this._linkifier=i,this._bufferService=s,this._coreService=r,this._mouseService=n,this._optionsService=o,this._renderService=h,this._coreBrowserService=d,this._dragScrollAmount=0,this._enabled=!0,this._workCell=new u.CellData,this._mouseDownTimeStamp=0,this._oldHasSelection=!1,this._oldSelectionStart=void 0,this._oldSelectionEnd=void 0,this._onLinuxMouseSelection=this.register(new c.EventEmitter),this.onLinuxMouseSelection=this._onLinuxMouseSelection.event,this._onRedrawRequest=this.register(new c.EventEmitter),this.onRequestRedraw=this._onRedrawRequest.event,this._onSelectionChange=this.register(new c.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onRequestScrollLines=this.register(new c.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this._mouseMoveListener=e=>this._handleMouseMove(e),this._mouseUpListener=e=>this._handleMouseUp(e),this._coreService.onUserInput((()=>{this.hasSelection&&this.clearSelection()})),this._trimListener=this._bufferService.buffer.lines.onTrim((e=>this._handleTrim(e))),this.register(this._bufferService.buffers.onBufferActivate((e=>this._handleBufferActivate(e)))),this.enable(),this._model=new a.SelectionModel(this._bufferService),this._activeSelectionMode=0,this.register((0,l.toDisposable)((()=>{this._removeMouseDownListeners()})))}reset(){this.clearSelection()}disable(){this.clearSelection(),this._enabled=!1}enable(){this._enabled=!0}get selectionStart(){return this._model.finalSelectionStart}get selectionEnd(){return this._model.finalSelectionEnd}get hasSelection(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;return!(!e||!t||e[0]===t[0]&&e[1]===t[1])}get selectionText(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;if(!e||!t)return\"\";const i=this._bufferService.buffer,s=[];if(3===this._activeSelectionMode){if(e[0]===t[0])return\"\";const r=e[0]e.replace(p,\" \"))).join(d.isWindows?\"\\r\\n\":\"\\n\")}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(e){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._refresh()))),d.isLinux&&e&&this.selectionText.length&&this._onLinuxMouseSelection.fire(this.selectionText)}_refresh(){this._refreshAnimationFrame=void 0,this._onRedrawRequest.fire({start:this._model.finalSelectionStart,end:this._model.finalSelectionEnd,columnSelectMode:3===this._activeSelectionMode})}_isClickInSelection(e){const t=this._getMouseBufferCoords(e),i=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!!(i&&s&&t)&&this._areCoordsInSelection(t,i,s)}isCellInSelection(e,t){const i=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!(!i||!s)&&this._areCoordsInSelection([e,t],i,s)}_areCoordsInSelection(e,t,i){return e[1]>t[1]&&e[1]=t[0]&&e[0]=t[0]}_selectWordAtCursor(e,t){const i=this._linkifier.currentLink?.link?.range;if(i)return this._model.selectionStart=[i.start.x-1,i.start.y-1],this._model.selectionStartLength=(0,_.getRangeLength)(i,this._bufferService.cols),this._model.selectionEnd=void 0,!0;const s=this._getMouseBufferCoords(e);return!!s&&(this._selectWordAt(s,t),this._model.selectionEnd=void 0,!0)}selectAll(){this._model.isSelectAllActive=!0,this.refresh(),this._onSelectionChange.fire()}selectLines(e,t){this._model.clearSelection(),e=Math.max(e,0),t=Math.min(t,this._bufferService.buffer.lines.length-1),this._model.selectionStart=[0,e],this._model.selectionEnd=[this._bufferService.cols,t],this.refresh(),this._onSelectionChange.fire()}_handleTrim(e){this._model.handleTrim(e)&&this.refresh()}_getMouseBufferCoords(e){const t=this._mouseService.getCoords(e,this._screenElement,this._bufferService.cols,this._bufferService.rows,!0);if(t)return t[0]--,t[1]--,t[1]+=this._bufferService.buffer.ydisp,t}_getMouseEventScrollAmount(e){let t=(0,n.getCoordsRelativeToElement)(this._coreBrowserService.window,e,this._screenElement)[1];const i=this._renderService.dimensions.css.canvas.height;return t>=0&&t<=i?0:(t>i&&(t-=i),t=Math.min(Math.max(t,-50),50),t/=50,t/Math.abs(t)+Math.round(14*t))}shouldForceSelection(e){return d.isMac?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,(2!==e.button||!this.hasSelection)&&0===e.button){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._handleIncrementalClick(e):1===e.detail?this._handleSingleClick(e):2===e.detail?this._handleDoubleClick(e):3===e.detail&&this._handleTripleClick(e),this._addMouseDownListeners(),this.refresh(!0)}}_addMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.addEventListener(\"mousemove\",this._mouseMoveListener),this._screenElement.ownerDocument.addEventListener(\"mouseup\",this._mouseUpListener)),this._dragScrollIntervalTimer=this._coreBrowserService.window.setInterval((()=>this._dragScroll()),50)}_removeMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.removeEventListener(\"mousemove\",this._mouseMoveListener),this._screenElement.ownerDocument.removeEventListener(\"mouseup\",this._mouseUpListener)),this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer),this._dragScrollIntervalTimer=void 0}_handleIncrementalClick(e){this._model.selectionStart&&(this._model.selectionEnd=this._getMouseBufferCoords(e))}_handleSingleClick(e){if(this._model.selectionStartLength=0,this._model.isSelectAllActive=!1,this._activeSelectionMode=this.shouldColumnSelect(e)?3:0,this._model.selectionStart=this._getMouseBufferCoords(e),!this._model.selectionStart)return;this._model.selectionEnd=void 0;const t=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);t&&t.length!==this._model.selectionStart[0]&&0===t.hasWidth(this._model.selectionStart[0])&&this._model.selectionStart[0]++}_handleDoubleClick(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(e){const t=this._getMouseBufferCoords(e);t&&(this._activeSelectionMode=2,this._selectLineAt(t[1]))}shouldColumnSelect(e){return e.altKey&&!(d.isMac&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(e){if(e.stopImmediatePropagation(),!this._model.selectionStart)return;const t=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),!this._model.selectionEnd)return void this.refresh(!0);2===this._activeSelectionMode?this._model.selectionEnd[1]0?this._model.selectionEnd[0]=this._bufferService.cols:this._dragScrollAmount<0&&(this._model.selectionEnd[0]=0));const i=this._bufferService.buffer;if(this._model.selectionEnd[1]0?(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=this._bufferService.cols),this._model.selectionEnd[1]=Math.min(e.ydisp+this._bufferService.rows,e.lines.length-1)):(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=0),this._model.selectionEnd[1]=e.ydisp),this.refresh()}}_handleMouseUp(e){const t=e.timeStamp-this._mouseDownTimeStamp;if(this._removeMouseDownListeners(),this.selectionText.length<=1&&t<500&&e.altKey&&this._optionsService.rawOptions.altClickMovesCursor){if(this._bufferService.buffer.ybase===this._bufferService.buffer.ydisp){const t=this._mouseService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(t&&void 0!==t[0]&&void 0!==t[1]){const e=(0,o.moveToCellSequence)(t[0]-1,t[1]-1,this._bufferService,this._coreService.decPrivateModes.applicationCursorKeys);this._coreService.triggerDataEvent(e,!0)}}}else this._fireEventIfSelectionChanged()}_fireEventIfSelectionChanged(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd,i=!(!e||!t||e[0]===t[0]&&e[1]===t[1]);i?e&&t&&(this._oldSelectionStart&&this._oldSelectionEnd&&e[0]===this._oldSelectionStart[0]&&e[1]===this._oldSelectionStart[1]&&t[0]===this._oldSelectionEnd[0]&&t[1]===this._oldSelectionEnd[1]||this._fireOnSelectionChange(e,t,i)):this._oldHasSelection&&this._fireOnSelectionChange(e,t,i)}_fireOnSelectionChange(e,t,i){this._oldSelectionStart=e,this._oldSelectionEnd=t,this._oldHasSelection=i,this._onSelectionChange.fire()}_handleBufferActivate(e){this.clearSelection(),this._trimListener.dispose(),this._trimListener=e.activeBuffer.lines.onTrim((e=>this._handleTrim(e)))}_convertViewportColToCharacterIndex(e,t){let i=t;for(let s=0;t>=s;s++){const r=e.loadCell(s,this._workCell).getChars().length;0===this._workCell.getWidth()?i--:r>1&&t!==s&&(i+=r-1)}return i}setSelection(e,t,i){this._model.clearSelection(),this._removeMouseDownListeners(),this._model.selectionStart=[e,t],this._model.selectionStartLength=i,this.refresh(),this._fireEventIfSelectionChanged()}rightClickSelect(e){this._isClickInSelection(e)||(this._selectWordAtCursor(e,!1)&&this.refresh(!0),this._fireEventIfSelectionChanged())}_getWordAt(e,t,i=!0,s=!0){if(e[0]>=this._bufferService.cols)return;const r=this._bufferService.buffer,n=r.lines.get(e[1]);if(!n)return;const o=r.translateBufferLineToString(e[1],!1);let a=this._convertViewportColToCharacterIndex(n,e[0]),h=a;const c=e[0]-a;let l=0,d=0,_=0,u=0;if(\" \"===o.charAt(a)){for(;a>0&&\" \"===o.charAt(a-1);)a--;for(;h1&&(u+=s-1,h+=s-1);t>0&&a>0&&!this._isCharWordSeparator(n.loadCell(t-1,this._workCell));){n.loadCell(t-1,this._workCell);const e=this._workCell.getChars().length;0===this._workCell.getWidth()?(l++,t--):e>1&&(_+=e-1,a-=e-1),a--,t--}for(;i1&&(u+=e-1,h+=e-1),h++,i++}}h++;let f=a+c-l+_,v=Math.min(this._bufferService.cols,h-a+l+d-_-u);if(t||\"\"!==o.slice(a,h).trim()){if(i&&0===f&&32!==n.getCodePoint(0)){const t=r.lines.get(e[1]-1);if(t&&n.isWrapped&&32!==t.getCodePoint(this._bufferService.cols-1)){const t=this._getWordAt([this._bufferService.cols-1,e[1]-1],!1,!0,!1);if(t){const e=this._bufferService.cols-t.start;f-=e,v+=e}}}if(s&&f+v===this._bufferService.cols&&32!==n.getCodePoint(this._bufferService.cols-1)){const t=r.lines.get(e[1]+1);if(t?.isWrapped&&32!==t.getCodePoint(0)){const t=this._getWordAt([0,e[1]+1],!1,!1,!0);t&&(v+=t.length)}}return{start:f,length:v}}}_selectWordAt(e,t){const i=this._getWordAt(e,t);if(i){for(;i.start<0;)i.start+=this._bufferService.cols,e[1]--;this._model.selectionStart=[i.start,e[1]],this._model.selectionStartLength=i.length}}_selectToWordAt(e){const t=this._getWordAt(e,!0);if(t){let i=e[1];for(;t.start<0;)t.start+=this._bufferService.cols,i--;if(!this._model.areSelectionValuesReversed())for(;t.start+t.length>this._bufferService.cols;)t.length-=this._bufferService.cols,i++;this._model.selectionEnd=[this._model.areSelectionValuesReversed()?t.start:t.start+t.length,i]}}_isCharWordSeparator(e){return 0!==e.getWidth()&&this._optionsService.rawOptions.wordSeparator.indexOf(e.getChars())>=0}_selectLineAt(e){const t=this._bufferService.buffer.getWrappedRangeForLine(e),i={start:{x:0,y:t.first},end:{x:this._bufferService.cols-1,y:t.last}};this._model.selectionStart=[0,t.first],this._model.selectionEnd=void 0,this._model.selectionStartLength=(0,_.getRangeLength)(i,this._bufferService.cols)}};t.SelectionService=g=s([r(3,f.IBufferService),r(4,f.ICoreService),r(5,h.IMouseService),r(6,f.IOptionsService),r(7,h.IRenderService),r(8,h.ICoreBrowserService)],g)},4725:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.ILinkProviderService=t.IThemeService=t.ICharacterJoinerService=t.ISelectionService=t.IRenderService=t.IMouseService=t.ICoreBrowserService=t.ICharSizeService=void 0;const s=i(8343);t.ICharSizeService=(0,s.createDecorator)(\"CharSizeService\"),t.ICoreBrowserService=(0,s.createDecorator)(\"CoreBrowserService\"),t.IMouseService=(0,s.createDecorator)(\"MouseService\"),t.IRenderService=(0,s.createDecorator)(\"RenderService\"),t.ISelectionService=(0,s.createDecorator)(\"SelectionService\"),t.ICharacterJoinerService=(0,s.createDecorator)(\"CharacterJoinerService\"),t.IThemeService=(0,s.createDecorator)(\"ThemeService\"),t.ILinkProviderService=(0,s.createDecorator)(\"LinkProviderService\")},6731:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ThemeService=t.DEFAULT_ANSI_COLORS=void 0;const n=i(7239),o=i(8055),a=i(8460),h=i(844),c=i(2585),l=o.css.toColor(\"#ffffff\"),d=o.css.toColor(\"#000000\"),_=o.css.toColor(\"#ffffff\"),u=o.css.toColor(\"#000000\"),f={css:\"rgba(255, 255, 255, 0.3)\",rgba:4294967117};t.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const e=[o.css.toColor(\"#2e3436\"),o.css.toColor(\"#cc0000\"),o.css.toColor(\"#4e9a06\"),o.css.toColor(\"#c4a000\"),o.css.toColor(\"#3465a4\"),o.css.toColor(\"#75507b\"),o.css.toColor(\"#06989a\"),o.css.toColor(\"#d3d7cf\"),o.css.toColor(\"#555753\"),o.css.toColor(\"#ef2929\"),o.css.toColor(\"#8ae234\"),o.css.toColor(\"#fce94f\"),o.css.toColor(\"#729fcf\"),o.css.toColor(\"#ad7fa8\"),o.css.toColor(\"#34e2e2\"),o.css.toColor(\"#eeeeec\")],t=[0,95,135,175,215,255];for(let i=0;i<216;i++){const s=t[i/36%6|0],r=t[i/6%6|0],n=t[i%6];e.push({css:o.channels.toCss(s,r,n),rgba:o.channels.toRgba(s,r,n)})}for(let t=0;t<24;t++){const i=8+10*t;e.push({css:o.channels.toCss(i,i,i),rgba:o.channels.toRgba(i,i,i)})}return e})());let v=t.ThemeService=class extends h.Disposable{get colors(){return this._colors}constructor(e){super(),this._optionsService=e,this._contrastCache=new n.ColorContrastCache,this._halfContrastCache=new n.ColorContrastCache,this._onChangeColors=this.register(new a.EventEmitter),this.onChangeColors=this._onChangeColors.event,this._colors={foreground:l,background:d,cursor:_,cursorAccent:u,selectionForeground:void 0,selectionBackgroundTransparent:f,selectionBackgroundOpaque:o.color.blend(d,f),selectionInactiveBackgroundTransparent:f,selectionInactiveBackgroundOpaque:o.color.blend(d,f),ansi:t.DEFAULT_ANSI_COLORS.slice(),contrastCache:this._contrastCache,halfContrastCache:this._halfContrastCache},this._updateRestoreColors(),this._setTheme(this._optionsService.rawOptions.theme),this.register(this._optionsService.onSpecificOptionChange(\"minimumContrastRatio\",(()=>this._contrastCache.clear()))),this.register(this._optionsService.onSpecificOptionChange(\"theme\",(()=>this._setTheme(this._optionsService.rawOptions.theme))))}_setTheme(e={}){const i=this._colors;if(i.foreground=p(e.foreground,l),i.background=p(e.background,d),i.cursor=p(e.cursor,_),i.cursorAccent=p(e.cursorAccent,u),i.selectionBackgroundTransparent=p(e.selectionBackground,f),i.selectionBackgroundOpaque=o.color.blend(i.background,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundTransparent=p(e.selectionInactiveBackground,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundOpaque=o.color.blend(i.background,i.selectionInactiveBackgroundTransparent),i.selectionForeground=e.selectionForeground?p(e.selectionForeground,o.NULL_COLOR):void 0,i.selectionForeground===o.NULL_COLOR&&(i.selectionForeground=void 0),o.color.isOpaque(i.selectionBackgroundTransparent)){const e=.3;i.selectionBackgroundTransparent=o.color.opacity(i.selectionBackgroundTransparent,e)}if(o.color.isOpaque(i.selectionInactiveBackgroundTransparent)){const e=.3;i.selectionInactiveBackgroundTransparent=o.color.opacity(i.selectionInactiveBackgroundTransparent,e)}if(i.ansi=t.DEFAULT_ANSI_COLORS.slice(),i.ansi[0]=p(e.black,t.DEFAULT_ANSI_COLORS[0]),i.ansi[1]=p(e.red,t.DEFAULT_ANSI_COLORS[1]),i.ansi[2]=p(e.green,t.DEFAULT_ANSI_COLORS[2]),i.ansi[3]=p(e.yellow,t.DEFAULT_ANSI_COLORS[3]),i.ansi[4]=p(e.blue,t.DEFAULT_ANSI_COLORS[4]),i.ansi[5]=p(e.magenta,t.DEFAULT_ANSI_COLORS[5]),i.ansi[6]=p(e.cyan,t.DEFAULT_ANSI_COLORS[6]),i.ansi[7]=p(e.white,t.DEFAULT_ANSI_COLORS[7]),i.ansi[8]=p(e.brightBlack,t.DEFAULT_ANSI_COLORS[8]),i.ansi[9]=p(e.brightRed,t.DEFAULT_ANSI_COLORS[9]),i.ansi[10]=p(e.brightGreen,t.DEFAULT_ANSI_COLORS[10]),i.ansi[11]=p(e.brightYellow,t.DEFAULT_ANSI_COLORS[11]),i.ansi[12]=p(e.brightBlue,t.DEFAULT_ANSI_COLORS[12]),i.ansi[13]=p(e.brightMagenta,t.DEFAULT_ANSI_COLORS[13]),i.ansi[14]=p(e.brightCyan,t.DEFAULT_ANSI_COLORS[14]),i.ansi[15]=p(e.brightWhite,t.DEFAULT_ANSI_COLORS[15]),e.extendedAnsi){const s=Math.min(i.ansi.length-16,e.extendedAnsi.length);for(let r=0;r{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CircularList=void 0;const s=i(8460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._maxLength=e,this.onDeleteEmitter=this.register(new s.EventEmitter),this.onDelete=this.onDeleteEmitter.event,this.onInsertEmitter=this.register(new s.EventEmitter),this.onInsert=this.onInsertEmitter.event,this.onTrimEmitter=this.register(new s.EventEmitter),this.onTrim=this.onTrimEmitter.event,this._array=new Array(this._maxLength),this._startIndex=0,this._length=0}get maxLength(){return this._maxLength}set maxLength(e){if(this._maxLength===e)return;const t=new Array(e);for(let i=0;ithis._length)for(let t=this._length;t=e;t--)this._array[this._getCyclicIndex(t+i.length)]=this._array[this._getCyclicIndex(t)];for(let t=0;tthis._maxLength){const e=this._length+i.length-this._maxLength;this._startIndex+=e,this._length=this._maxLength,this.onTrimEmitter.fire(e)}else this._length+=i.length}trimStart(e){e>this._length&&(e=this._length),this._startIndex+=e,this._length-=e,this.onTrimEmitter.fire(e)}shiftElements(e,t,i){if(!(t<=0)){if(e<0||e>=this._length)throw new Error(\"start argument out of range\");if(e+i<0)throw new Error(\"Cannot shift elements in list beyond index 0\");if(i>0){for(let s=t-1;s>=0;s--)this.set(e+s+i,this.get(e+s));const s=e+t+i-this._length;if(s>0)for(this._length+=s;this._length>this._maxLength;)this._length--,this._startIndex++,this.onTrimEmitter.fire(1)}else for(let s=0;s{Object.defineProperty(t,\"__esModule\",{value:!0}),t.clone=void 0,t.clone=function e(t,i=5){if(\"object\"!=typeof t)return t;const s=Array.isArray(t)?[]:{};for(const r in t)s[r]=i<=1?t[r]:t[r]&&e(t[r],i-1);return s}},8055:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.contrastRatio=t.toPaddedHex=t.rgba=t.rgb=t.css=t.color=t.channels=t.NULL_COLOR=void 0;let i=0,s=0,r=0,n=0;var o,a,h,c,l;function d(e){const t=e.toString(16);return t.length<2?\"0\"+t:t}function _(e,t){return e>>0},e.toColor=function(t,i,s,r){return{css:e.toCss(t,i,s,r),rgba:e.toRgba(t,i,s,r)}}}(o||(t.channels=o={})),function(e){function t(e,t){return n=Math.round(255*t),[i,s,r]=l.toChannels(e.rgba),{css:o.toCss(i,s,r,n),rgba:o.toRgba(i,s,r,n)}}e.blend=function(e,t){if(n=(255&t.rgba)/255,1===n)return{css:t.css,rgba:t.rgba};const a=t.rgba>>24&255,h=t.rgba>>16&255,c=t.rgba>>8&255,l=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return i=l+Math.round((a-l)*n),s=d+Math.round((h-d)*n),r=_+Math.round((c-_)*n),{css:o.toCss(i,s,r),rgba:o.toRgba(i,s,r)}},e.isOpaque=function(e){return 255==(255&e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=l.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return o.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[i,s,r]=l.toChannels(t),{css:o.toCss(i,s,r),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return n=255&e.rgba,t(e,n*i/255)},e.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]}}(a||(t.color=a={})),function(e){let t,a;try{const e=document.createElement(\"canvas\");e.width=1,e.height=1;const i=e.getContext(\"2d\",{willReadFrequently:!0});i&&(t=i,t.globalCompositeOperation=\"copy\",a=t.createLinearGradient(0,0,1,1))}catch{}e.toColor=function(e){if(e.match(/#[\\da-f]{3,8}/i))switch(e.length){case 4:return i=parseInt(e.slice(1,2).repeat(2),16),s=parseInt(e.slice(2,3).repeat(2),16),r=parseInt(e.slice(3,4).repeat(2),16),o.toColor(i,s,r);case 5:return i=parseInt(e.slice(1,2).repeat(2),16),s=parseInt(e.slice(2,3).repeat(2),16),r=parseInt(e.slice(3,4).repeat(2),16),n=parseInt(e.slice(4,5).repeat(2),16),o.toColor(i,s,r,n);case 7:return{css:e,rgba:(parseInt(e.slice(1),16)<<8|255)>>>0};case 9:return{css:e,rgba:parseInt(e.slice(1),16)>>>0}}const h=e.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);if(h)return i=parseInt(h[1]),s=parseInt(h[2]),r=parseInt(h[3]),n=Math.round(255*(void 0===h[5]?1:parseFloat(h[5]))),o.toColor(i,s,r,n);if(!t||!a)throw new Error(\"css.toColor: Unsupported css format\");if(t.fillStyle=a,t.fillStyle=e,\"string\"!=typeof t.fillStyle)throw new Error(\"css.toColor: Unsupported css format\");if(t.fillRect(0,0,1,1),[i,s,r,n]=t.getImageData(0,0,1,1).data,255!==n)throw new Error(\"css.toColor: Unsupported css format\");return{rgba:o.toRgba(i,s,r,n),css:e}}}(h||(t.css=h={})),function(e){function t(e,t,i){const s=e/255,r=t/255,n=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(c||(t.rgb=c={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,n=e>>8&255;let o=t>>24&255,a=t>>16&255,h=t>>8&255,l=_(c.relativeLuminance2(o,a,h),c.relativeLuminance2(s,r,n));for(;l0||a>0||h>0);)o-=Math.max(0,Math.ceil(.1*o)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),l=_(c.relativeLuminance2(o,a,h),c.relativeLuminance2(s,r,n));return(o<<24|a<<16|h<<8|255)>>>0}function a(e,t,i){const s=e>>24&255,r=e>>16&255,n=e>>8&255;let o=t>>24&255,a=t>>16&255,h=t>>8&255,l=_(c.relativeLuminance2(o,a,h),c.relativeLuminance2(s,r,n));for(;l>>0}e.blend=function(e,t){if(n=(255&t)/255,1===n)return t;const a=t>>24&255,h=t>>16&255,c=t>>8&255,l=e>>24&255,d=e>>16&255,_=e>>8&255;return i=l+Math.round((a-l)*n),s=d+Math.round((h-d)*n),r=_+Math.round((c-_)*n),o.toRgba(i,s,r)},e.ensureContrastRatio=function(e,i,s){const r=c.relativeLuminance(e>>8),n=c.relativeLuminance(i>>8);if(_(r,n)>8));if(o_(r,c.relativeLuminance(t>>8))?n:t}return n}const o=a(e,i,s),h=_(r,c.relativeLuminance(o>>8));if(h_(r,c.relativeLuminance(n>>8))?o:n}return o}},e.reduceLuminance=t,e.increaseLuminance=a,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]}}(l||(t.rgba=l={})),t.toPaddedHex=d,t.contrastRatio=_},8969:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CoreTerminal=void 0;const s=i(844),r=i(2585),n=i(4348),o=i(7866),a=i(744),h=i(7302),c=i(6975),l=i(8460),d=i(1753),_=i(1480),u=i(7994),f=i(9282),v=i(5435),p=i(5981),g=i(2660);let m=!1;class S extends s.Disposable{get onScroll(){return this._onScrollApi||(this._onScrollApi=this.register(new l.EventEmitter),this._onScroll.event((e=>{this._onScrollApi?.fire(e.position)}))),this._onScrollApi.event}get cols(){return this._bufferService.cols}get rows(){return this._bufferService.rows}get buffers(){return this._bufferService.buffers}get options(){return this.optionsService.options}set options(e){for(const t in e)this.optionsService.options[t]=e[t]}constructor(e){super(),this._windowsWrappingHeuristics=this.register(new s.MutableDisposable),this._onBinary=this.register(new l.EventEmitter),this.onBinary=this._onBinary.event,this._onData=this.register(new l.EventEmitter),this.onData=this._onData.event,this._onLineFeed=this.register(new l.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onResize=this.register(new l.EventEmitter),this.onResize=this._onResize.event,this._onWriteParsed=this.register(new l.EventEmitter),this.onWriteParsed=this._onWriteParsed.event,this._onScroll=this.register(new l.EventEmitter),this._instantiationService=new n.InstantiationService,this.optionsService=this.register(new h.OptionsService(e)),this._instantiationService.setService(r.IOptionsService,this.optionsService),this._bufferService=this.register(this._instantiationService.createInstance(a.BufferService)),this._instantiationService.setService(r.IBufferService,this._bufferService),this._logService=this.register(this._instantiationService.createInstance(o.LogService)),this._instantiationService.setService(r.ILogService,this._logService),this.coreService=this.register(this._instantiationService.createInstance(c.CoreService)),this._instantiationService.setService(r.ICoreService,this.coreService),this.coreMouseService=this.register(this._instantiationService.createInstance(d.CoreMouseService)),this._instantiationService.setService(r.ICoreMouseService,this.coreMouseService),this.unicodeService=this.register(this._instantiationService.createInstance(_.UnicodeService)),this._instantiationService.setService(r.IUnicodeService,this.unicodeService),this._charsetService=this._instantiationService.createInstance(u.CharsetService),this._instantiationService.setService(r.ICharsetService,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(g.OscLinkService),this._instantiationService.setService(r.IOscLinkService,this._oscLinkService),this._inputHandler=this.register(new v.InputHandler(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.coreMouseService,this.unicodeService)),this.register((0,l.forwardEvent)(this._inputHandler.onLineFeed,this._onLineFeed)),this.register(this._inputHandler),this.register((0,l.forwardEvent)(this._bufferService.onResize,this._onResize)),this.register((0,l.forwardEvent)(this.coreService.onData,this._onData)),this.register((0,l.forwardEvent)(this.coreService.onBinary,this._onBinary)),this.register(this.coreService.onRequestScrollToBottom((()=>this.scrollToBottom()))),this.register(this.coreService.onUserInput((()=>this._writeBuffer.handleUserInput()))),this.register(this.optionsService.onMultipleOptionChange([\"windowsMode\",\"windowsPty\"],(()=>this._handleWindowsPtyOptionChange()))),this.register(this._bufferService.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this.register(this._inputHandler.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this._writeBuffer=this.register(new p.WriteBuffer(((e,t)=>this._inputHandler.parse(e,t)))),this.register((0,l.forwardEvent)(this._writeBuffer.onWriteParsed,this._onWriteParsed))}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=r.LogLevelEnum.WARN&&!m&&(this._logService.warn(\"writeSync is unreliable and will be removed soon.\"),m=!0),this._writeBuffer.writeSync(e,t)}input(e,t=!0){this.coreService.triggerDataEvent(e,t)}resize(e,t){isNaN(e)||isNaN(t)||(e=Math.max(e,a.MINIMUM_COLS),t=Math.max(t,a.MINIMUM_ROWS),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t,i){this._bufferService.scrollLines(e,t,i)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(){this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){const t=e-this._bufferService.buffer.ydisp;0!==t&&this.scrollLines(t)}registerEscHandler(e,t){return this._inputHandler.registerEscHandler(e,t)}registerDcsHandler(e,t){return this._inputHandler.registerDcsHandler(e,t)}registerCsiHandler(e,t){return this._inputHandler.registerCsiHandler(e,t)}registerOscHandler(e,t){return this._inputHandler.registerOscHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.coreMouseService.reset()}_handleWindowsPtyOptionChange(){let e=!1;const t=this.optionsService.rawOptions.windowsPty;t&&void 0!==t.buildNumber&&void 0!==t.buildNumber?e=!!(\"conpty\"===t.backend&&t.buildNumber<21376):this.optionsService.rawOptions.windowsMode&&(e=!0),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){const e=[];e.push(this.onLineFeed(f.updateWindowsModeWrappedState.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:\"H\"},(()=>((0,f.updateWindowsModeWrappedState)(this._bufferService),!1)))),this._windowsWrappingHeuristics.value=(0,s.toDisposable)((()=>{for(const t of e)t.dispose()}))}}}t.CoreTerminal=S},8460:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.runAndSubscribe=t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;tt.fire(e)))},t.runAndSubscribe=function(e,t){return t(void 0),e((e=>t(e)))}},5435:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.InputHandler=t.WindowsOptionsReportType=void 0;const n=i(2584),o=i(7116),a=i(2015),h=i(844),c=i(482),l=i(8437),d=i(8460),_=i(643),u=i(511),f=i(3734),v=i(2585),p=i(1480),g=i(6242),m=i(6351),S=i(5941),C={\"(\":0,\")\":1,\"*\":2,\"+\":3,\"-\":1,\".\":2},b=131072;function w(e,t){if(e>24)return t.setWinLines||!1;switch(e){case 1:return!!t.restoreWin;case 2:return!!t.minimizeWin;case 3:return!!t.setWinPosition;case 4:return!!t.setWinSizePixels;case 5:return!!t.raiseWin;case 6:return!!t.lowerWin;case 7:return!!t.refreshWin;case 8:return!!t.setWinSizeChars;case 9:return!!t.maximizeWin;case 10:return!!t.fullscreenWin;case 11:return!!t.getWinState;case 13:return!!t.getWinPosition;case 14:return!!t.getWinSizePixels;case 15:return!!t.getScreenSizePixels;case 16:return!!t.getCellSizePixels;case 18:return!!t.getWinSizeChars;case 19:return!!t.getScreenSizeChars;case 20:return!!t.getIconTitle;case 21:return!!t.getWinTitle;case 22:return!!t.pushTitle;case 23:return!!t.popTitle;case 24:return!!t.setWinLines}return!1}var y;!function(e){e[e.GET_WIN_SIZE_PIXELS=0]=\"GET_WIN_SIZE_PIXELS\",e[e.GET_CELL_SIZE_PIXELS=1]=\"GET_CELL_SIZE_PIXELS\"}(y||(t.WindowsOptionsReportType=y={}));let E=0;class k extends h.Disposable{getAttrData(){return this._curAttrData}constructor(e,t,i,s,r,h,_,f,v=new a.EscapeSequenceParser){super(),this._bufferService=e,this._charsetService=t,this._coreService=i,this._logService=s,this._optionsService=r,this._oscLinkService=h,this._coreMouseService=_,this._unicodeService=f,this._parser=v,this._parseBuffer=new Uint32Array(4096),this._stringDecoder=new c.StringToUtf32,this._utf8Decoder=new c.Utf8ToUtf32,this._workCell=new u.CellData,this._windowTitle=\"\",this._iconName=\"\",this._windowTitleStack=[],this._iconNameStack=[],this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone(),this._onRequestBell=this.register(new d.EventEmitter),this.onRequestBell=this._onRequestBell.event,this._onRequestRefreshRows=this.register(new d.EventEmitter),this.onRequestRefreshRows=this._onRequestRefreshRows.event,this._onRequestReset=this.register(new d.EventEmitter),this.onRequestReset=this._onRequestReset.event,this._onRequestSendFocus=this.register(new d.EventEmitter),this.onRequestSendFocus=this._onRequestSendFocus.event,this._onRequestSyncScrollBar=this.register(new d.EventEmitter),this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event,this._onRequestWindowsOptionsReport=this.register(new d.EventEmitter),this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event,this._onA11yChar=this.register(new d.EventEmitter),this.onA11yChar=this._onA11yChar.event,this._onA11yTab=this.register(new d.EventEmitter),this.onA11yTab=this._onA11yTab.event,this._onCursorMove=this.register(new d.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onLineFeed=this.register(new d.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onScroll=this.register(new d.EventEmitter),this.onScroll=this._onScroll.event,this._onTitleChange=this.register(new d.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onColor=this.register(new d.EventEmitter),this.onColor=this._onColor.event,this._parseStack={paused:!1,cursorStartX:0,cursorStartY:0,decodedLength:0,position:0},this._specialColors=[256,257,258],this.register(this._parser),this._dirtyRowTracker=new L(this._bufferService),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._parser.setCsiHandlerFallback(((e,t)=>{this._logService.debug(\"Unknown CSI code: \",{identifier:this._parser.identToString(e),params:t.toArray()})})),this._parser.setEscHandlerFallback((e=>{this._logService.debug(\"Unknown ESC code: \",{identifier:this._parser.identToString(e)})})),this._parser.setExecuteHandlerFallback((e=>{this._logService.debug(\"Unknown EXECUTE code: \",{code:e})})),this._parser.setOscHandlerFallback(((e,t,i)=>{this._logService.debug(\"Unknown OSC code: \",{identifier:e,action:t,data:i})})),this._parser.setDcsHandlerFallback(((e,t,i)=>{\"HOOK\"===t&&(i=i.toArray()),this._logService.debug(\"Unknown DCS code: \",{identifier:this._parser.identToString(e),action:t,payload:i})})),this._parser.setPrintHandler(((e,t,i)=>this.print(e,t,i))),this._parser.registerCsiHandler({final:\"@\"},(e=>this.insertChars(e))),this._parser.registerCsiHandler({intermediates:\" \",final:\"@\"},(e=>this.scrollLeft(e))),this._parser.registerCsiHandler({final:\"A\"},(e=>this.cursorUp(e))),this._parser.registerCsiHandler({intermediates:\" \",final:\"A\"},(e=>this.scrollRight(e))),this._parser.registerCsiHandler({final:\"B\"},(e=>this.cursorDown(e))),this._parser.registerCsiHandler({final:\"C\"},(e=>this.cursorForward(e))),this._parser.registerCsiHandler({final:\"D\"},(e=>this.cursorBackward(e))),this._parser.registerCsiHandler({final:\"E\"},(e=>this.cursorNextLine(e))),this._parser.registerCsiHandler({final:\"F\"},(e=>this.cursorPrecedingLine(e))),this._parser.registerCsiHandler({final:\"G\"},(e=>this.cursorCharAbsolute(e))),this._parser.registerCsiHandler({final:\"H\"},(e=>this.cursorPosition(e))),this._parser.registerCsiHandler({final:\"I\"},(e=>this.cursorForwardTab(e))),this._parser.registerCsiHandler({final:\"J\"},(e=>this.eraseInDisplay(e,!1))),this._parser.registerCsiHandler({prefix:\"?\",final:\"J\"},(e=>this.eraseInDisplay(e,!0))),this._parser.registerCsiHandler({final:\"K\"},(e=>this.eraseInLine(e,!1))),this._parser.registerCsiHandler({prefix:\"?\",final:\"K\"},(e=>this.eraseInLine(e,!0))),this._parser.registerCsiHandler({final:\"L\"},(e=>this.insertLines(e))),this._parser.registerCsiHandler({final:\"M\"},(e=>this.deleteLines(e))),this._parser.registerCsiHandler({final:\"P\"},(e=>this.deleteChars(e))),this._parser.registerCsiHandler({final:\"S\"},(e=>this.scrollUp(e))),this._parser.registerCsiHandler({final:\"T\"},(e=>this.scrollDown(e))),this._parser.registerCsiHandler({final:\"X\"},(e=>this.eraseChars(e))),this._parser.registerCsiHandler({final:\"Z\"},(e=>this.cursorBackwardTab(e))),this._parser.registerCsiHandler({final:\"`\"},(e=>this.charPosAbsolute(e))),this._parser.registerCsiHandler({final:\"a\"},(e=>this.hPositionRelative(e))),this._parser.registerCsiHandler({final:\"b\"},(e=>this.repeatPrecedingCharacter(e))),this._parser.registerCsiHandler({final:\"c\"},(e=>this.sendDeviceAttributesPrimary(e))),this._parser.registerCsiHandler({prefix:\">\",final:\"c\"},(e=>this.sendDeviceAttributesSecondary(e))),this._parser.registerCsiHandler({final:\"d\"},(e=>this.linePosAbsolute(e))),this._parser.registerCsiHandler({final:\"e\"},(e=>this.vPositionRelative(e))),this._parser.registerCsiHandler({final:\"f\"},(e=>this.hVPosition(e))),this._parser.registerCsiHandler({final:\"g\"},(e=>this.tabClear(e))),this._parser.registerCsiHandler({final:\"h\"},(e=>this.setMode(e))),this._parser.registerCsiHandler({prefix:\"?\",final:\"h\"},(e=>this.setModePrivate(e))),this._parser.registerCsiHandler({final:\"l\"},(e=>this.resetMode(e))),this._parser.registerCsiHandler({prefix:\"?\",final:\"l\"},(e=>this.resetModePrivate(e))),this._parser.registerCsiHandler({final:\"m\"},(e=>this.charAttributes(e))),this._parser.registerCsiHandler({final:\"n\"},(e=>this.deviceStatus(e))),this._parser.registerCsiHandler({prefix:\"?\",final:\"n\"},(e=>this.deviceStatusPrivate(e))),this._parser.registerCsiHandler({intermediates:\"!\",final:\"p\"},(e=>this.softReset(e))),this._parser.registerCsiHandler({intermediates:\" \",final:\"q\"},(e=>this.setCursorStyle(e))),this._parser.registerCsiHandler({final:\"r\"},(e=>this.setScrollRegion(e))),this._parser.registerCsiHandler({final:\"s\"},(e=>this.saveCursor(e))),this._parser.registerCsiHandler({final:\"t\"},(e=>this.windowOptions(e))),this._parser.registerCsiHandler({final:\"u\"},(e=>this.restoreCursor(e))),this._parser.registerCsiHandler({intermediates:\"'\",final:\"}\"},(e=>this.insertColumns(e))),this._parser.registerCsiHandler({intermediates:\"'\",final:\"~\"},(e=>this.deleteColumns(e))),this._parser.registerCsiHandler({intermediates:'\"',final:\"q\"},(e=>this.selectProtected(e))),this._parser.registerCsiHandler({intermediates:\"$\",final:\"p\"},(e=>this.requestMode(e,!0))),this._parser.registerCsiHandler({prefix:\"?\",intermediates:\"$\",final:\"p\"},(e=>this.requestMode(e,!1))),this._parser.setExecuteHandler(n.C0.BEL,(()=>this.bell())),this._parser.setExecuteHandler(n.C0.LF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.VT,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.FF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.CR,(()=>this.carriageReturn())),this._parser.setExecuteHandler(n.C0.BS,(()=>this.backspace())),this._parser.setExecuteHandler(n.C0.HT,(()=>this.tab())),this._parser.setExecuteHandler(n.C0.SO,(()=>this.shiftOut())),this._parser.setExecuteHandler(n.C0.SI,(()=>this.shiftIn())),this._parser.setExecuteHandler(n.C1.IND,(()=>this.index())),this._parser.setExecuteHandler(n.C1.NEL,(()=>this.nextLine())),this._parser.setExecuteHandler(n.C1.HTS,(()=>this.tabSet())),this._parser.registerOscHandler(0,new g.OscHandler((e=>(this.setTitle(e),this.setIconName(e),!0)))),this._parser.registerOscHandler(1,new g.OscHandler((e=>this.setIconName(e)))),this._parser.registerOscHandler(2,new g.OscHandler((e=>this.setTitle(e)))),this._parser.registerOscHandler(4,new g.OscHandler((e=>this.setOrReportIndexedColor(e)))),this._parser.registerOscHandler(8,new g.OscHandler((e=>this.setHyperlink(e)))),this._parser.registerOscHandler(10,new g.OscHandler((e=>this.setOrReportFgColor(e)))),this._parser.registerOscHandler(11,new g.OscHandler((e=>this.setOrReportBgColor(e)))),this._parser.registerOscHandler(12,new g.OscHandler((e=>this.setOrReportCursorColor(e)))),this._parser.registerOscHandler(104,new g.OscHandler((e=>this.restoreIndexedColor(e)))),this._parser.registerOscHandler(110,new g.OscHandler((e=>this.restoreFgColor(e)))),this._parser.registerOscHandler(111,new g.OscHandler((e=>this.restoreBgColor(e)))),this._parser.registerOscHandler(112,new g.OscHandler((e=>this.restoreCursorColor(e)))),this._parser.registerEscHandler({final:\"7\"},(()=>this.saveCursor())),this._parser.registerEscHandler({final:\"8\"},(()=>this.restoreCursor())),this._parser.registerEscHandler({final:\"D\"},(()=>this.index())),this._parser.registerEscHandler({final:\"E\"},(()=>this.nextLine())),this._parser.registerEscHandler({final:\"H\"},(()=>this.tabSet())),this._parser.registerEscHandler({final:\"M\"},(()=>this.reverseIndex())),this._parser.registerEscHandler({final:\"=\"},(()=>this.keypadApplicationMode())),this._parser.registerEscHandler({final:\">\"},(()=>this.keypadNumericMode())),this._parser.registerEscHandler({final:\"c\"},(()=>this.fullReset())),this._parser.registerEscHandler({final:\"n\"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:\"o\"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:\"|\"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:\"}\"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:\"~\"},(()=>this.setgLevel(1))),this._parser.registerEscHandler({intermediates:\"%\",final:\"@\"},(()=>this.selectDefaultCharset())),this._parser.registerEscHandler({intermediates:\"%\",final:\"G\"},(()=>this.selectDefaultCharset()));for(const e in o.CHARSETS)this._parser.registerEscHandler({intermediates:\"(\",final:e},(()=>this.selectCharset(\"(\"+e))),this._parser.registerEscHandler({intermediates:\")\",final:e},(()=>this.selectCharset(\")\"+e))),this._parser.registerEscHandler({intermediates:\"*\",final:e},(()=>this.selectCharset(\"*\"+e))),this._parser.registerEscHandler({intermediates:\"+\",final:e},(()=>this.selectCharset(\"+\"+e))),this._parser.registerEscHandler({intermediates:\"-\",final:e},(()=>this.selectCharset(\"-\"+e))),this._parser.registerEscHandler({intermediates:\".\",final:e},(()=>this.selectCharset(\".\"+e))),this._parser.registerEscHandler({intermediates:\"/\",final:e},(()=>this.selectCharset(\"/\"+e)));this._parser.registerEscHandler({intermediates:\"#\",final:\"8\"},(()=>this.screenAlignmentPattern())),this._parser.setErrorHandler((e=>(this._logService.error(\"Parsing error: \",e),e))),this._parser.registerDcsHandler({intermediates:\"$\",final:\"q\"},new m.DcsHandler(((e,t)=>this.requestStatusString(e,t))))}_preserveStack(e,t,i,s){this._parseStack.paused=!0,this._parseStack.cursorStartX=e,this._parseStack.cursorStartY=t,this._parseStack.decodedLength=i,this._parseStack.position=s}_logSlowResolvingAsync(e){this._logService.logLevel<=v.LogLevelEnum.WARN&&Promise.race([e,new Promise(((e,t)=>setTimeout((()=>t(\"#SLOW_TIMEOUT\")),5e3)))]).catch((e=>{if(\"#SLOW_TIMEOUT\"!==e)throw e;console.warn(\"async parser handler taking longer than 5000 ms\")}))}_getCurrentLinkId(){return this._curAttrData.extended.urlId}parse(e,t){let i,s=this._activeBuffer.x,r=this._activeBuffer.y,n=0;const o=this._parseStack.paused;if(o){if(i=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,t))return this._logSlowResolvingAsync(i),i;s=this._parseStack.cursorStartX,r=this._parseStack.cursorStartY,this._parseStack.paused=!1,e.length>b&&(n=this._parseStack.position+b)}if(this._logService.logLevel<=v.LogLevelEnum.DEBUG&&this._logService.debug(\"parsing data\"+(\"string\"==typeof e?` \"${e}\"`:` \"${Array.prototype.map.call(e,(e=>String.fromCharCode(e))).join(\"\")}\"`),\"string\"==typeof e?e.split(\"\").map((e=>e.charCodeAt(0))):e),this._parseBuffer.lengthb)for(let t=n;t0&&2===f.getWidth(this._activeBuffer.x-1)&&f.setCellFromCodepoint(this._activeBuffer.x-1,0,1,u);let v=this._parser.precedingJoinState;for(let g=t;ga)if(h){const e=f;let t=this._activeBuffer.x-m;for(this._activeBuffer.x=m,this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData(),!0)):(this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!0),f=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),m>0&&f instanceof l.BufferLine&&f.copyCellsFrom(e,t,0,m,!1);t=0;)f.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}else if(d&&(f.insertCells(this._activeBuffer.x,r-m,this._activeBuffer.getNullCell(u)),2===f.getWidth(a-1)&&f.setCellFromCodepoint(a-1,_.NULL_CELL_CODE,_.NULL_CELL_WIDTH,u)),f.setCellFromCodepoint(this._activeBuffer.x++,s,r,u),r>0)for(;--r;)f.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}this._parser.precedingJoinState=v,this._activeBuffer.x0&&0===f.getWidth(this._activeBuffer.x)&&!f.hasContent(this._activeBuffer.x)&&f.setCellFromCodepoint(this._activeBuffer.x,0,1,u),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}registerCsiHandler(e,t){return\"t\"!==e.final||e.prefix||e.intermediates?this._parser.registerCsiHandler(e,t):this._parser.registerCsiHandler(e,(e=>!w(e.params[0],this._optionsService.rawOptions.windowOptions)||t(e)))}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new m.DcsHandler(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new g.OscHandler(t))}bell(){return this._onRequestBell.fire(),!0}lineFeed(){return this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._optionsService.rawOptions.convertEol&&(this._activeBuffer.x=0),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows?this._activeBuffer.y=this._bufferService.rows-1:this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.x>=this._bufferService.cols&&this._activeBuffer.x--,this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._onLineFeed.fire(),!0}carriageReturn(){return this._activeBuffer.x=0,!0}backspace(){if(!this._coreService.decPrivateModes.reverseWraparound)return this._restrictCursor(),this._activeBuffer.x>0&&this._activeBuffer.x--,!0;if(this._restrictCursor(this._bufferService.cols),this._activeBuffer.x>0)this._activeBuffer.x--;else if(0===this._activeBuffer.x&&this._activeBuffer.y>this._activeBuffer.scrollTop&&this._activeBuffer.y<=this._activeBuffer.scrollBottom&&this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y)?.isWrapped){this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.y--,this._activeBuffer.x=this._bufferService.cols-1;const e=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);e.hasWidth(this._activeBuffer.x)&&!e.hasContent(this._activeBuffer.x)&&this._activeBuffer.x--}return this._restrictCursor(),!0}tab(){if(this._activeBuffer.x>=this._bufferService.cols)return!0;const e=this._activeBuffer.x;return this._activeBuffer.x=this._activeBuffer.nextStop(),this._optionsService.rawOptions.screenReaderMode&&this._onA11yTab.fire(this._activeBuffer.x-e),!0}shiftOut(){return this._charsetService.setgLevel(1),!0}shiftIn(){return this._charsetService.setgLevel(0),!0}_restrictCursor(e=this._bufferService.cols-1){this._activeBuffer.x=Math.min(e,Math.max(0,this._activeBuffer.x)),this._activeBuffer.y=this._coreService.decPrivateModes.origin?Math.min(this._activeBuffer.scrollBottom,Math.max(this._activeBuffer.scrollTop,this._activeBuffer.y)):Math.min(this._bufferService.rows-1,Math.max(0,this._activeBuffer.y)),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_setCursor(e,t){this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._coreService.decPrivateModes.origin?(this._activeBuffer.x=e,this._activeBuffer.y=this._activeBuffer.scrollTop+t):(this._activeBuffer.x=e,this._activeBuffer.y=t),this._restrictCursor(),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_moveCursor(e,t){this._restrictCursor(),this._setCursor(this._activeBuffer.x+e,this._activeBuffer.y+t)}cursorUp(e){const t=this._activeBuffer.y-this._activeBuffer.scrollTop;return t>=0?this._moveCursor(0,-Math.min(t,e.params[0]||1)):this._moveCursor(0,-(e.params[0]||1)),!0}cursorDown(e){const t=this._activeBuffer.scrollBottom-this._activeBuffer.y;return t>=0?this._moveCursor(0,Math.min(t,e.params[0]||1)):this._moveCursor(0,e.params[0]||1),!0}cursorForward(e){return this._moveCursor(e.params[0]||1,0),!0}cursorBackward(e){return this._moveCursor(-(e.params[0]||1),0),!0}cursorNextLine(e){return this.cursorDown(e),this._activeBuffer.x=0,!0}cursorPrecedingLine(e){return this.cursorUp(e),this._activeBuffer.x=0,!0}cursorCharAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}cursorPosition(e){return this._setCursor(e.length>=2?(e.params[1]||1)-1:0,(e.params[0]||1)-1),!0}charPosAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}hPositionRelative(e){return this._moveCursor(e.params[0]||1,0),!0}linePosAbsolute(e){return this._setCursor(this._activeBuffer.x,(e.params[0]||1)-1),!0}vPositionRelative(e){return this._moveCursor(0,e.params[0]||1),!0}hVPosition(e){return this.cursorPosition(e),!0}tabClear(e){const t=e.params[0];return 0===t?delete this._activeBuffer.tabs[this._activeBuffer.x]:3===t&&(this._activeBuffer.tabs={}),!0}cursorForwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.nextStop();return!0}cursorBackwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.prevStop();return!0}selectProtected(e){const t=e.params[0];return 1===t&&(this._curAttrData.bg|=536870912),2!==t&&0!==t||(this._curAttrData.bg&=-536870913),!0}_eraseInBufferLine(e,t,i,s=!1,r=!1){const n=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);n.replaceCells(t,i,this._activeBuffer.getNullCell(this._eraseAttrData()),r),s&&(n.isWrapped=!1)}_resetBufferLine(e,t=!1){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i&&(i.fill(this._activeBuffer.getNullCell(this._eraseAttrData()),t),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+e),i.isWrapped=!1)}eraseInDisplay(e,t=!1){let i;switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:for(i=this._activeBuffer.y,this._dirtyRowTracker.markDirty(i),this._eraseInBufferLine(i++,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);i=this._bufferService.cols&&(this._activeBuffer.lines.get(i+1).isWrapped=!1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 2:for(i=this._bufferService.rows,this._dirtyRowTracker.markDirty(i-1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 3:const e=this._activeBuffer.lines.length-this._bufferService.rows;e>0&&(this._activeBuffer.lines.trimStart(e),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-e,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-e,0),this._onScroll.fire(0))}return!0}eraseInLine(e,t=!1){switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:this._eraseInBufferLine(this._activeBuffer.y,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);break;case 1:this._eraseInBufferLine(this._activeBuffer.y,0,this._activeBuffer.x+1,!1,t);break;case 2:this._eraseInBufferLine(this._activeBuffer.y,0,this._bufferService.cols,!0,t)}return this._dirtyRowTracker.markDirty(this._activeBuffer.y),!0}insertLines(e){this._restrictCursor();let t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.y65535?2:1}let h=a;for(let e=1;e0||(this._is(\"xterm\")||this._is(\"rxvt-unicode\")||this._is(\"screen\")?this._coreService.triggerDataEvent(n.C0.ESC+\"[?1;2c\"):this._is(\"linux\")&&this._coreService.triggerDataEvent(n.C0.ESC+\"[?6c\")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is(\"xterm\")?this._coreService.triggerDataEvent(n.C0.ESC+\"[>0;276;0c\"):this._is(\"rxvt-unicode\")?this._coreService.triggerDataEvent(n.C0.ESC+\"[>85;95;0c\"):this._is(\"linux\")?this._coreService.triggerDataEvent(e.params[0]+\"c\"):this._is(\"screen\")&&this._coreService.triggerDataEvent(n.C0.ESC+\"[>83;40003;0c\")),!0}_is(e){return 0===(this._optionsService.rawOptions.termName+\"\").indexOf(e)}setMode(e){for(let t=0;te?1:2,u=e.params[0];return f=u,v=t?2===u?4:4===u?_(o.modes.insertMode):12===u?3:20===u?_(d.convertEol):0:1===u?_(i.applicationCursorKeys):3===u?d.windowOptions.setWinLines?80===h?2:132===h?1:0:0:6===u?_(i.origin):7===u?_(i.wraparound):8===u?3:9===u?_(\"X10\"===s):12===u?_(d.cursorBlink):25===u?_(!o.isCursorHidden):45===u?_(i.reverseWraparound):66===u?_(i.applicationKeypad):67===u?4:1e3===u?_(\"VT200\"===s):1002===u?_(\"DRAG\"===s):1003===u?_(\"ANY\"===s):1004===u?_(i.sendFocus):1005===u?4:1006===u?_(\"SGR\"===r):1015===u?4:1016===u?_(\"SGR_PIXELS\"===r):1048===u?1:47===u||1047===u||1049===u?_(c===l):2004===u?_(i.bracketedPasteMode):0,o.triggerDataEvent(`${n.C0.ESC}[${t?\"\":\"?\"}${f};${v}$y`),!0;// removed by dead control flow\n{ var f, v; }}_updateAttrColor(e,t,i,s,r){return 2===t?(e|=50331648,e&=-16777216,e|=f.AttributeData.fromColorRGB([i,s,r])):5===t&&(e&=-50331904,e|=33554432|255&i),e}_extractColor(e,t,i){const s=[0,0,-1,0,0,0];let r=0,n=0;do{if(s[n+r]=e.params[t+n],e.hasSubParams(t+n)){const i=e.getSubParams(t+n);let o=0;do{5===s[1]&&(r=1),s[n+o+1+r]=i[o]}while(++o=2||2===s[1]&&n+r>=5)break;s[1]&&(r=1)}while(++n+t5)&&(e=1),t.extended.underlineStyle=e,t.fg|=268435456,0===e&&(t.fg&=-268435457),t.updateExtended()}_processSGR0(e){e.fg=l.DEFAULT_ATTR_DATA.fg,e.bg=l.DEFAULT_ATTR_DATA.bg,e.extended=e.extended.clone(),e.extended.underlineStyle=0,e.extended.underlineColor&=-67108864,e.updateExtended()}charAttributes(e){if(1===e.length&&0===e.params[0])return this._processSGR0(this._curAttrData),!0;const t=e.length;let i;const s=this._curAttrData;for(let r=0;r=30&&i<=37?(s.fg&=-50331904,s.fg|=16777216|i-30):i>=40&&i<=47?(s.bg&=-50331904,s.bg|=16777216|i-40):i>=90&&i<=97?(s.fg&=-50331904,s.fg|=16777224|i-90):i>=100&&i<=107?(s.bg&=-50331904,s.bg|=16777224|i-100):0===i?this._processSGR0(s):1===i?s.fg|=134217728:3===i?s.bg|=67108864:4===i?(s.fg|=268435456,this._processUnderline(e.hasSubParams(r)?e.getSubParams(r)[0]:1,s)):5===i?s.fg|=536870912:7===i?s.fg|=67108864:8===i?s.fg|=1073741824:9===i?s.fg|=2147483648:2===i?s.bg|=134217728:21===i?this._processUnderline(2,s):22===i?(s.fg&=-134217729,s.bg&=-134217729):23===i?s.bg&=-67108865:24===i?(s.fg&=-268435457,this._processUnderline(0,s)):25===i?s.fg&=-536870913:27===i?s.fg&=-67108865:28===i?s.fg&=-1073741825:29===i?s.fg&=2147483647:39===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg):49===i?(s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):38===i||48===i||58===i?r+=this._extractColor(e,r,s):53===i?s.bg|=1073741824:55===i?s.bg&=-1073741825:59===i?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):100===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg,s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):this._logService.debug(\"Unknown SGR attribute: %d.\",i);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent(`${n.C0.ESC}[0n`);break;case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[${e};${t}R`)}return!0}deviceStatusPrivate(e){if(6===e.params[0]){const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[?${e};${t}R`)}return!0}softReset(e){return this._coreService.isCursorHidden=!1,this._onRequestSyncScrollBar.fire(),this._activeBuffer.scrollTop=0,this._activeBuffer.scrollBottom=this._bufferService.rows-1,this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._coreService.reset(),this._charsetService.reset(),this._activeBuffer.savedX=0,this._activeBuffer.savedY=this._activeBuffer.ybase,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,this._coreService.decPrivateModes.origin=!1,!0}setCursorStyle(e){const t=e.params[0]||1;switch(t){case 1:case 2:this._optionsService.options.cursorStyle=\"block\";break;case 3:case 4:this._optionsService.options.cursorStyle=\"underline\";break;case 5:case 6:this._optionsService.options.cursorStyle=\"bar\"}const i=t%2==1;return this._optionsService.options.cursorBlink=i,!0}setScrollRegion(e){const t=e.params[0]||1;let i;return(e.length<2||(i=e.params[1])>this._bufferService.rows||0===i)&&(i=this._bufferService.rows),i>t&&(this._activeBuffer.scrollTop=t-1,this._activeBuffer.scrollBottom=i-1,this._setCursor(0,0)),!0}windowOptions(e){if(!w(e.params[0],this._optionsService.rawOptions.windowOptions))return!0;const t=e.length>1?e.params[1]:0;switch(e.params[0]){case 14:2!==t&&this._onRequestWindowsOptionsReport.fire(y.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(y.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`${n.C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);break;case 22:0!==t&&2!==t||(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),0!==t&&1!==t||(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:0!==t&&2!==t||this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),0!==t&&1!==t||this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop())}return!0}saveCursor(e){return this._activeBuffer.savedX=this._activeBuffer.x,this._activeBuffer.savedY=this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,!0}restoreCursor(e){return this._activeBuffer.x=this._activeBuffer.savedX||0,this._activeBuffer.y=Math.max(this._activeBuffer.savedY-this._activeBuffer.ybase,0),this._curAttrData.fg=this._activeBuffer.savedCurAttrData.fg,this._curAttrData.bg=this._activeBuffer.savedCurAttrData.bg,this._charsetService.charset=this._savedCharset,this._activeBuffer.savedCharset&&(this._charsetService.charset=this._activeBuffer.savedCharset),this._restrictCursor(),!0}setTitle(e){return this._windowTitle=e,this._onTitleChange.fire(e),!0}setIconName(e){return this._iconName=e,!0}setOrReportIndexedColor(e){const t=[],i=e.split(\";\");for(;i.length>1;){const e=i.shift(),s=i.shift();if(/^\\d+$/.exec(e)){const i=parseInt(e);if(D(i))if(\"?\"===s)t.push({type:0,index:i});else{const e=(0,S.parseColor)(s);e&&t.push({type:1,index:i,color:e})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){const t=e.split(\";\");return!(t.length<2)&&(t[1]?this._createHyperlink(t[0],t[1]):!t[0]&&this._finishHyperlink())}_createHyperlink(e,t){this._getCurrentLinkId()&&this._finishHyperlink();const i=e.split(\":\");let s;const r=i.findIndex((e=>e.startsWith(\"id=\")));return-1!==r&&(s=i[r].slice(3)||void 0),this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=this._oscLinkService.registerLink({id:s,uri:t}),this._curAttrData.updateExtended(),!0}_finishHyperlink(){return this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=0,this._curAttrData.updateExtended(),!0}_setOrReportSpecialColor(e,t){const i=e.split(\";\");for(let e=0;e=this._specialColors.length);++e,++t)if(\"?\"===i[e])this._onColor.fire([{type:0,index:this._specialColors[t]}]);else{const s=(0,S.parseColor)(i[e]);s&&this._onColor.fire([{type:1,index:this._specialColors[t],color:s}])}return!0}setOrReportFgColor(e){return this._setOrReportSpecialColor(e,0)}setOrReportBgColor(e){return this._setOrReportSpecialColor(e,1)}setOrReportCursorColor(e){return this._setOrReportSpecialColor(e,2)}restoreIndexedColor(e){if(!e)return this._onColor.fire([{type:2}]),!0;const t=[],i=e.split(\";\");for(let e=0;e=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._restrictCursor(),!0}tabSet(){return this._activeBuffer.tabs[this._activeBuffer.x]=!0,!0}reverseIndex(){if(this._restrictCursor(),this._activeBuffer.y===this._activeBuffer.scrollTop){const e=this._activeBuffer.scrollBottom-this._activeBuffer.scrollTop;this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase+this._activeBuffer.y,e,1),this._activeBuffer.lines.set(this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.getBlankLine(this._eraseAttrData())),this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom)}else this._activeBuffer.y--,this._restrictCursor();return!0}fullReset(){return this._parser.reset(),this._onRequestReset.fire(),!0}reset(){this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone()}_eraseAttrData(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=67108863&this._curAttrData.bg,this._eraseAttrDataInternal}setgLevel(e){return this._charsetService.setgLevel(e),!0}screenAlignmentPattern(){const e=new u.CellData;e.content=1<<22|\"E\".charCodeAt(0),e.fg=this._curAttrData.fg,e.bg=this._curAttrData.bg,this._setCursor(0,0);for(let t=0;t(this._coreService.triggerDataEvent(`${n.C0.ESC}${e}${n.C0.ESC}\\\\`),!0))('\"q'===e?`P1$r${this._curAttrData.isProtected()?1:0}\"q`:'\"p'===e?'P1$r61;1\"p':\"r\"===e?`P1$r${i.scrollTop+1};${i.scrollBottom+1}r`:\"m\"===e?\"P1$r0m\":\" q\"===e?`P1$r${{block:2,underline:4,bar:6}[s.cursorStyle]-(s.cursorBlink?1:0)} q`:\"P0$r\")}markRangeDirty(e,t){this._dirtyRowTracker.markRangeDirty(e,t)}}t.InputHandler=k;let L=class{constructor(e){this._bufferService=e,this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(e){ethis.end&&(this.end=e)}markRangeDirty(e,t){e>t&&(E=e,e=t,t=E),ethis.end&&(this.end=t)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function D(e){return 0<=e&&e<256}L=s([r(0,v.IBufferService)],L)},844:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,\"__esModule\",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}}},1505:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,n){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,n)}get(e,t,i,s){return this._data.get(e,t)?.get(i,s)}clear(){this._data.clear()}}},6114:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isIphone=t.isIpad=t.isMac=t.getSafariVersion=t.isSafari=t.isLegacyEdge=t.isFirefox=t.isNode=void 0,t.isNode=\"undefined\"!=typeof process&&\"title\"in process;const i=t.isNode?\"node\":navigator.userAgent,s=t.isNode?\"node\":navigator.platform;t.isFirefox=i.includes(\"Firefox\"),t.isLegacyEdge=i.includes(\"Edge\"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\\/(\\d+)/);return null===e||e.length<2?0:parseInt(e[1])},t.isMac=[\"Macintosh\",\"MacIntel\",\"MacPPC\",\"Mac68K\"].includes(s),t.isIpad=\"iPad\"===s,t.isIphone=\"iPhone\"===s,t.isWindows=[\"Windows\",\"Win16\",\"Win32\",\"WinCE\"].includes(s),t.isLinux=s.indexOf(\"Linux\")>=0,t.isChromeOS=/\\bCrOS\\b/.test(i)},6106:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.SortedList=void 0;let i=0;t.SortedList=class{constructor(e){this._getKey=e,this._array=[]}clear(){this._array.length=0}insert(e){0!==this._array.length?(i=this._search(this._getKey(e)),this._array.splice(i,0,e)):this._array.push(e)}delete(e){if(0===this._array.length)return!1;const t=this._getKey(e);if(void 0===t)return!1;if(i=this._search(t),-1===i)return!1;if(this._getKey(this._array[i])!==t)return!1;do{if(this._array[i]===e)return this._array.splice(i,1),!0}while(++i=this._array.length)&&this._getKey(this._array[i])===e))do{yield this._array[i]}while(++i=this._array.length)&&this._getKey(this._array[i])===e))do{t(this._array[i])}while(++i=t;){let s=t+i>>1;const r=this._getKey(this._array[s]);if(r>e)i=s-1;else{if(!(r0&&this._getKey(this._array[s-1])===e;)s--;return s}t=s+1}}return t}}},7226:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;const s=i(6114);class r{constructor(){this._tasks=[],this._i=0}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._ir)return s-t<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),void this._start();s=r}this.clear()}}class n extends r{_requestCallback(e){return setTimeout((()=>e(this._createDeadline(16))))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=Date.now()+e;return{timeRemaining:()=>Math.max(0,t-Date.now())}}}t.PriorityTaskQueue=n,t.IdleTaskQueue=!s.isNode&&\"requestIdleCallback\"in window?class extends r{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:n,t.DebouncedIdleTask=class{constructor(){this._queue=new t.IdleTaskQueue}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}}},9282:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.updateWindowsModeWrappedState=void 0;const s=i(643);t.updateWindowsModeWrappedState=function(e){const t=e.buffer.lines.get(e.buffer.ybase+e.buffer.y-1),i=t?.get(e.cols-1),r=e.buffer.lines.get(e.buffer.ybase+e.buffer.y);r&&i&&(r.isWrapped=i[s.CHAR_DATA_CODE_INDEX]!==s.NULL_CELL_CODE&&i[s.CHAR_DATA_CODE_INDEX]!==s.WHITESPACE_CELL_CODE)}},3734:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.ExtendedAttrs=t.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(e){return[e>>>16&255,e>>>8&255,255&e]}static fromColorRGB(e){return(255&e[0])<<16|(255&e[1])<<8|255&e[2]}clone(){const e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return 67108864&this.fg}isBold(){return 134217728&this.fg}isUnderline(){return this.hasExtendedAttrs()&&0!==this.extended.underlineStyle?1:268435456&this.fg}isBlink(){return 536870912&this.fg}isInvisible(){return 1073741824&this.fg}isItalic(){return 67108864&this.bg}isDim(){return 134217728&this.bg}isStrikethrough(){return 2147483648&this.fg}isProtected(){return 536870912&this.bg}isOverline(){return 1073741824&this.bg}getFgColorMode(){return 50331648&this.fg}getBgColorMode(){return 50331648&this.bg}isFgRGB(){return 50331648==(50331648&this.fg)}isBgRGB(){return 50331648==(50331648&this.bg)}isFgPalette(){return 16777216==(50331648&this.fg)||33554432==(50331648&this.fg)}isBgPalette(){return 16777216==(50331648&this.bg)||33554432==(50331648&this.bg)}isFgDefault(){return 0==(50331648&this.fg)}isBgDefault(){return 0==(50331648&this.bg)}isAttributeDefault(){return 0===this.fg&&0===this.bg}getFgColor(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}}getBgColor(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}}hasExtendedAttrs(){return 268435456&this.bg}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()}isUnderlineColorRGB(){return 268435456&this.bg&&~this.extended.underlineColor?50331648==(50331648&this.extended.underlineColor):this.isFgRGB()}isUnderlineColorPalette(){return 268435456&this.bg&&~this.extended.underlineColor?16777216==(50331648&this.extended.underlineColor)||33554432==(50331648&this.extended.underlineColor):this.isFgPalette()}isUnderlineColorDefault(){return 268435456&this.bg&&~this.extended.underlineColor?0==(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}}t.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(e){this._ext&=-67108864,this._ext|=67108863&e}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){const e=(3758096384&this._ext)>>29;return e<0?4294967288^e:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}t.ExtendedAttrs=s},9092:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Buffer=t.MAX_BUFFER_SIZE=void 0;const s=i(6349),r=i(7226),n=i(3734),o=i(8437),a=i(4634),h=i(511),c=i(643),l=i(4863),d=i(7116);t.MAX_BUFFER_SIZE=4294967295,t.Buffer=class{constructor(e,t,i){this._hasScrollback=e,this._optionsService=t,this._bufferService=i,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.tabs={},this.savedY=0,this.savedX=0,this.savedCurAttrData=o.DEFAULT_ATTR_DATA.clone(),this.savedCharset=d.DEFAULT_CHARSET,this.markers=[],this._nullCell=h.CellData.fromCharData([0,c.NULL_CELL_CHAR,c.NULL_CELL_WIDTH,c.NULL_CELL_CODE]),this._whitespaceCell=h.CellData.fromCharData([0,c.WHITESPACE_CELL_CHAR,c.WHITESPACE_CELL_WIDTH,c.WHITESPACE_CELL_CODE]),this._isClearing=!1,this._memoryCleanupQueue=new r.IdleTaskQueue,this._memoryCleanupPosition=0,this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}getNullCell(e){return e?(this._nullCell.fg=e.fg,this._nullCell.bg=e.bg,this._nullCell.extended=e.extended):(this._nullCell.fg=0,this._nullCell.bg=0,this._nullCell.extended=new n.ExtendedAttrs),this._nullCell}getWhitespaceCell(e){return e?(this._whitespaceCell.fg=e.fg,this._whitespaceCell.bg=e.bg,this._whitespaceCell.extended=e.extended):(this._whitespaceCell.fg=0,this._whitespaceCell.bg=0,this._whitespaceCell.extended=new n.ExtendedAttrs),this._whitespaceCell}getBlankLine(e,t){return new o.BufferLine(this._bufferService.cols,this.getNullCell(e),t)}get hasScrollback(){return this._hasScrollback&&this.lines.maxLength>this._rows}get isCursorInViewport(){const e=this.ybase+this.y-this.ydisp;return e>=0&&et.MAX_BUFFER_SIZE?t.MAX_BUFFER_SIZE:i}fillViewportRows(e){if(0===this.lines.length){void 0===e&&(e=o.DEFAULT_ATTR_DATA);let t=this._rows;for(;t--;)this.lines.push(this.getBlankLine(e))}}clear(){this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}resize(e,t){const i=this.getNullCell(o.DEFAULT_ATTR_DATA);let s=0;const r=this._getCorrectBufferLength(t);if(r>this.lines.maxLength&&(this.lines.maxLength=r),this.lines.length>0){if(this._cols0&&this.lines.length<=this.ybase+this.y+n+1?(this.ybase--,n++,this.ydisp>0&&this.ydisp--):this.lines.push(new o.BufferLine(e,i)));else for(let e=this._rows;e>t;e--)this.lines.length>t+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(r0&&(this.lines.trimStart(e),this.ybase=Math.max(this.ybase-e,0),this.ydisp=Math.max(this.ydisp-e,0),this.savedY=Math.max(this.savedY-e,0)),this.lines.maxLength=r}this.x=Math.min(this.x,e-1),this.y=Math.min(this.y,t-1),n&&(this.y+=n),this.savedX=Math.min(this.savedX,e-1),this.scrollTop=0}if(this.scrollBottom=t-1,this._isReflowEnabled&&(this._reflow(e,t),this._cols>e))for(let t=0;t.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue((()=>this._batchedMemoryCleanup())))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._memoryCleanupPosition100)return!0;return e}get _isReflowEnabled(){const e=this._optionsService.rawOptions.windowsPty;return e&&e.buildNumber?this._hasScrollback&&\"conpty\"===e.backend&&e.buildNumber>=21376:this._hasScrollback&&!this._optionsService.rawOptions.windowsMode}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){const i=(0,a.reflowLargerGetLinesToRemove)(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(o.DEFAULT_ATTR_DATA));if(i.length>0){const s=(0,a.reflowLargerCreateNewLayout)(this.lines,i);(0,a.reflowLargerApplyNewLayout)(this.lines,s.layout),this._reflowLargerAdjustViewport(e,t,s.countRemoved)}}_reflowLargerAdjustViewport(e,t,i){const s=this.getNullCell(o.DEFAULT_ATTR_DATA);let r=i;for(;r-- >0;)0===this.ybase?(this.y>0&&this.y--,this.lines.length=0;n--){let h=this.lines.get(n);if(!h||!h.isWrapped&&h.getTrimmedLength()<=e)continue;const c=[h];for(;h.isWrapped&&n>0;)h=this.lines.get(--n),c.unshift(h);const l=this.ybase+this.y;if(l>=n&&l0&&(s.push({start:n+c.length+r,newLines:v}),r+=v.length),c.push(...v);let p=_.length-1,g=_[p];0===g&&(p--,g=_[p]);let m=c.length-u-1,S=d;for(;m>=0;){const e=Math.min(S,g);if(void 0===c[p])break;if(c[p].copyCellsFrom(c[m],S-e,g-e,e,!0),g-=e,0===g&&(p--,g=_[p]),S-=e,0===S){m--;const e=Math.max(m,0);S=(0,a.getWrappedLineTrimmedLength)(c,e,this._cols)}}for(let t=0;t0;)0===this.ybase?this.y0){const e=[],t=[];for(let e=0;e=0;c--)if(a&&a.start>n+h){for(let e=a.newLines.length-1;e>=0;e--)this.lines.set(c--,a.newLines[e]);c++,e.push({index:n+1,amount:a.newLines.length}),h+=a.newLines.length,a=s[++o]}else this.lines.set(c,t[n--]);let c=0;for(let t=e.length-1;t>=0;t--)e[t].index+=c,this.lines.onInsertEmitter.fire(e[t]),c+=e[t].amount;const l=Math.max(0,i+r-this.lines.maxLength);l>0&&this.lines.onTrimEmitter.fire(l)}}translateBufferLineToString(e,t,i=0,s){const r=this.lines.get(e);return r?r.translateToString(t,i,s):\"\"}getWrappedRangeForLine(e){let t=e,i=e;for(;t>0&&this.lines.get(t).isWrapped;)t--;for(;i+10;);return e>=this._cols?this._cols-1:e<0?0:e}nextStop(e){for(null==e&&(e=this.x);!this.tabs[++e]&&e=this._cols?this._cols-1:e<0?0:e}clearMarkers(e){this._isClearing=!0;for(let t=0;t{t.line-=e,t.line<0&&t.dispose()}))),t.register(this.lines.onInsert((e=>{t.line>=e.index&&(t.line+=e.amount)}))),t.register(this.lines.onDelete((e=>{t.line>=e.index&&t.linee.index&&(t.line-=e.amount)}))),t.register(t.onDispose((()=>this._removeMarker(t)))),t}_removeMarker(e){this._isClearing||this.markers.splice(this.markers.indexOf(e),1)}}},8437:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferLine=t.DEFAULT_ATTR_DATA=void 0;const s=i(3734),r=i(511),n=i(643),o=i(482);t.DEFAULT_ATTR_DATA=Object.freeze(new s.AttributeData);let a=0;class h{constructor(e,t,i=!1){this.isWrapped=i,this._combined={},this._extendedAttrs={},this._data=new Uint32Array(3*e);const s=t||r.CellData.fromCharData([0,n.NULL_CELL_CHAR,n.NULL_CELL_WIDTH,n.NULL_CELL_CODE]);for(let t=0;t>22,2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):i]}set(e,t){this._data[3*e+1]=t[n.CHAR_DATA_ATTR_INDEX],t[n.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[e]=t[1],this._data[3*e+0]=2097152|e|t[n.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*e+0]=t[n.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[n.CHAR_DATA_WIDTH_INDEX]<<22}getWidth(e){return this._data[3*e+0]>>22}hasWidth(e){return 12582912&this._data[3*e+0]}getFg(e){return this._data[3*e+1]}getBg(e){return this._data[3*e+2]}hasContent(e){return 4194303&this._data[3*e+0]}getCodePoint(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):2097151&t}isCombined(e){return 2097152&this._data[3*e+0]}getString(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e]:2097151&t?(0,o.stringFromCodePoint)(2097151&t):\"\"}isProtected(e){return 536870912&this._data[3*e+2]}loadCell(e,t){return a=3*e,t.content=this._data[a+0],t.fg=this._data[a+1],t.bg=this._data[a+2],2097152&t.content&&(t.combinedData=this._combined[e]),268435456&t.bg&&(t.extended=this._extendedAttrs[e]),t}setCell(e,t){2097152&t.content&&(this._combined[e]=t.combinedData),268435456&t.bg&&(this._extendedAttrs[e]=t.extended),this._data[3*e+0]=t.content,this._data[3*e+1]=t.fg,this._data[3*e+2]=t.bg}setCellFromCodepoint(e,t,i,s){268435456&s.bg&&(this._extendedAttrs[e]=s.extended),this._data[3*e+0]=t|i<<22,this._data[3*e+1]=s.fg,this._data[3*e+2]=s.bg}addCodepointToCell(e,t,i){let s=this._data[3*e+0];2097152&s?this._combined[e]+=(0,o.stringFromCodePoint)(t):2097151&s?(this._combined[e]=(0,o.stringFromCodePoint)(2097151&s)+(0,o.stringFromCodePoint)(t),s&=-2097152,s|=2097152):s=t|1<<22,i&&(s&=-12582913,s|=i<<22),this._data[3*e+0]=s}insertCells(e,t,i){if((e%=this.length)&&2===this.getWidth(e-1)&&this.setCellFromCodepoint(e-1,0,1,i),t=0;--i)this.setCell(e+t+i,this.loadCell(e+i,s));for(let s=0;sthis.length){if(this._data.buffer.byteLength>=4*i)this._data=new Uint32Array(this._data.buffer,0,i);else{const e=new Uint32Array(i);e.set(this._data),this._data=e}for(let i=this.length;i=e&&delete this._combined[s]}const s=Object.keys(this._extendedAttrs);for(let t=0;t=e&&delete this._extendedAttrs[i]}}return this.length=e,4*i*2=0;--e)if(4194303&this._data[3*e+0])return e+(this._data[3*e+0]>>22);return 0}getNoBgTrimmedLength(){for(let e=this.length-1;e>=0;--e)if(4194303&this._data[3*e+0]||50331648&this._data[3*e+2])return e+(this._data[3*e+0]>>22);return 0}copyCellsFrom(e,t,i,s,r){const n=e._data;if(r)for(let r=s-1;r>=0;r--){for(let e=0;e<3;e++)this._data[3*(i+r)+e]=n[3*(t+r)+e];268435456&n[3*(t+r)+2]&&(this._extendedAttrs[i+r]=e._extendedAttrs[t+r])}else for(let r=0;r=t&&(this._combined[r-t+i]=e._combined[r])}}translateToString(e,t,i,s){t=t??0,i=i??this.length,e&&(i=Math.min(i,this.getTrimmedLength())),s&&(s.length=0);let r=\"\";for(;t>22||1}return s&&s.push(t),r}}t.BufferLine=h},4841:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.getRangeLength=void 0,t.getRangeLength=function(e,t){if(e.start.y>e.end.y)throw new Error(`Buffer range end (${e.end.x}, ${e.end.y}) cannot be before start (${e.start.x}, ${e.start.y})`);return t*(e.end.y-e.start.y)+(e.end.x-e.start.x+1)}},4634:(e,t)=>{function i(e,t,i){if(t===e.length-1)return e[t].getTrimmedLength();const s=!e[t].hasContent(i-1)&&1===e[t].getWidth(i-1),r=2===e[t+1].getWidth(0);return s&&r?i-1:i}Object.defineProperty(t,\"__esModule\",{value:!0}),t.getWrappedLineTrimmedLength=t.reflowSmallerGetNewLineLengths=t.reflowLargerApplyNewLayout=t.reflowLargerCreateNewLayout=t.reflowLargerGetLinesToRemove=void 0,t.reflowLargerGetLinesToRemove=function(e,t,s,r,n){const o=[];for(let a=0;a=a&&r0&&(e>d||0===l[e].getTrimmedLength());e--)v++;v>0&&(o.push(a+l.length-v),o.push(v)),a+=l.length-1}return o},t.reflowLargerCreateNewLayout=function(e,t){const i=[];let s=0,r=t[s],n=0;for(let o=0;oi(e,r,t))).reduce(((e,t)=>e+t));let o=0,a=0,h=0;for(;hc&&(o-=c,a++);const l=2===e[a].getWidth(o-1);l&&o--;const d=l?s-1:s;r.push(d),h+=d}return r},t.getWrappedLineTrimmedLength=i},5295:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferSet=void 0;const s=i(8460),r=i(844),n=i(9092);class o extends r.Disposable{constructor(e,t){super(),this._optionsService=e,this._bufferService=t,this._onBufferActivate=this.register(new s.EventEmitter),this.onBufferActivate=this._onBufferActivate.event,this.reset(),this.register(this._optionsService.onSpecificOptionChange(\"scrollback\",(()=>this.resize(this._bufferService.cols,this._bufferService.rows)))),this.register(this._optionsService.onSpecificOptionChange(\"tabStopWidth\",(()=>this.setupTabStops())))}reset(){this._normal=new n.Buffer(!0,this._optionsService,this._bufferService),this._normal.fillViewportRows(),this._alt=new n.Buffer(!1,this._optionsService,this._bufferService),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}),this.setupTabStops()}get alt(){return this._alt}get active(){return this._activeBuffer}get normal(){return this._normal}activateNormalBuffer(){this._activeBuffer!==this._normal&&(this._normal.x=this._alt.x,this._normal.y=this._alt.y,this._alt.clearAllMarkers(),this._alt.clear(),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}))}activateAltBuffer(e){this._activeBuffer!==this._alt&&(this._alt.fillViewportRows(e),this._alt.x=this._normal.x,this._alt.y=this._normal.y,this._activeBuffer=this._alt,this._onBufferActivate.fire({activeBuffer:this._alt,inactiveBuffer:this._normal}))}resize(e,t){this._normal.resize(e,t),this._alt.resize(e,t),this.setupTabStops(e)}setupTabStops(e){this._normal.setupTabStops(e),this._alt.setupTabStops(e)}}t.BufferSet=o},511:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CellData=void 0;const s=i(482),r=i(643),n=i(3734);class o extends n.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new n.ExtendedAttrs,this.combinedData=\"\"}static fromCharData(e){const t=new o;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):\"\"}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.CellData=o},643:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.WHITESPACE_CELL_CODE=t.WHITESPACE_CELL_WIDTH=t.WHITESPACE_CELL_CHAR=t.NULL_CELL_CODE=t.NULL_CELL_WIDTH=t.NULL_CELL_CHAR=t.CHAR_DATA_CODE_INDEX=t.CHAR_DATA_WIDTH_INDEX=t.CHAR_DATA_CHAR_INDEX=t.CHAR_DATA_ATTR_INDEX=t.DEFAULT_EXT=t.DEFAULT_ATTR=t.DEFAULT_COLOR=void 0,t.DEFAULT_COLOR=0,t.DEFAULT_ATTR=256|t.DEFAULT_COLOR<<9,t.DEFAULT_EXT=0,t.CHAR_DATA_ATTR_INDEX=0,t.CHAR_DATA_CHAR_INDEX=1,t.CHAR_DATA_WIDTH_INDEX=2,t.CHAR_DATA_CODE_INDEX=3,t.NULL_CELL_CHAR=\"\",t.NULL_CELL_WIDTH=1,t.NULL_CELL_CODE=0,t.WHITESPACE_CELL_CHAR=\" \",t.WHITESPACE_CELL_WIDTH=1,t.WHITESPACE_CELL_CODE=32},4863:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Marker=void 0;const s=i(8460),r=i(844);class n{get id(){return this._id}constructor(e){this.line=e,this.isDisposed=!1,this._disposables=[],this._id=n._nextId++,this._onDispose=this.register(new s.EventEmitter),this.onDispose=this._onDispose.event}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),(0,r.disposeArray)(this._disposables),this._disposables.length=0)}register(e){return this._disposables.push(e),e}}t.Marker=n,n._nextId=1},7116:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.DEFAULT_CHARSET=t.CHARSETS=void 0,t.CHARSETS={},t.DEFAULT_CHARSET=t.CHARSETS.B,t.CHARSETS[0]={\"`\":\"◆\",a:\"▒\",b:\"␉\",c:\"␌\",d:\"␍\",e:\"␊\",f:\"°\",g:\"±\",h:\"␤\",i:\"␋\",j:\"┘\",k:\"┐\",l:\"┌\",m:\"└\",n:\"┼\",o:\"⎺\",p:\"⎻\",q:\"─\",r:\"⎼\",s:\"⎽\",t:\"├\",u:\"┤\",v:\"┴\",w:\"┬\",x:\"│\",y:\"≤\",z:\"≥\",\"{\":\"π\",\"|\":\"≠\",\"}\":\"£\",\"~\":\"·\"},t.CHARSETS.A={\"#\":\"£\"},t.CHARSETS.B=void 0,t.CHARSETS[4]={\"#\":\"£\",\"@\":\"¾\",\"[\":\"ij\",\"\\\\\":\"½\",\"]\":\"|\",\"{\":\"¨\",\"|\":\"f\",\"}\":\"¼\",\"~\":\"´\"},t.CHARSETS.C=t.CHARSETS[5]={\"[\":\"Ä\",\"\\\\\":\"Ö\",\"]\":\"Å\",\"^\":\"Ü\",\"`\":\"é\",\"{\":\"ä\",\"|\":\"ö\",\"}\":\"å\",\"~\":\"ü\"},t.CHARSETS.R={\"#\":\"£\",\"@\":\"à\",\"[\":\"°\",\"\\\\\":\"ç\",\"]\":\"§\",\"{\":\"é\",\"|\":\"ù\",\"}\":\"è\",\"~\":\"¨\"},t.CHARSETS.Q={\"@\":\"à\",\"[\":\"â\",\"\\\\\":\"ç\",\"]\":\"ê\",\"^\":\"î\",\"`\":\"ô\",\"{\":\"é\",\"|\":\"ù\",\"}\":\"è\",\"~\":\"û\"},t.CHARSETS.K={\"@\":\"§\",\"[\":\"Ä\",\"\\\\\":\"Ö\",\"]\":\"Ü\",\"{\":\"ä\",\"|\":\"ö\",\"}\":\"ü\",\"~\":\"ß\"},t.CHARSETS.Y={\"#\":\"£\",\"@\":\"§\",\"[\":\"°\",\"\\\\\":\"ç\",\"]\":\"é\",\"`\":\"ù\",\"{\":\"à\",\"|\":\"ò\",\"}\":\"è\",\"~\":\"ì\"},t.CHARSETS.E=t.CHARSETS[6]={\"@\":\"Ä\",\"[\":\"Æ\",\"\\\\\":\"Ø\",\"]\":\"Å\",\"^\":\"Ü\",\"`\":\"ä\",\"{\":\"æ\",\"|\":\"ø\",\"}\":\"å\",\"~\":\"ü\"},t.CHARSETS.Z={\"#\":\"£\",\"@\":\"§\",\"[\":\"¡\",\"\\\\\":\"Ñ\",\"]\":\"¿\",\"{\":\"°\",\"|\":\"ñ\",\"}\":\"ç\"},t.CHARSETS.H=t.CHARSETS[7]={\"@\":\"É\",\"[\":\"Ä\",\"\\\\\":\"Ö\",\"]\":\"Å\",\"^\":\"Ü\",\"`\":\"é\",\"{\":\"ä\",\"|\":\"ö\",\"}\":\"å\",\"~\":\"ü\"},t.CHARSETS[\"=\"]={\"#\":\"ù\",\"@\":\"à\",\"[\":\"é\",\"\\\\\":\"ç\",\"]\":\"ê\",\"^\":\"î\",_:\"è\",\"`\":\"ô\",\"{\":\"ä\",\"|\":\"ö\",\"}\":\"ü\",\"~\":\"û\"}},2584:(e,t)=>{var i,s,r;Object.defineProperty(t,\"__esModule\",{value:!0}),t.C1_ESCAPED=t.C1=t.C0=void 0,function(e){e.NUL=\"\\0\",e.SOH=\"\u0001\",e.STX=\"\u0002\",e.ETX=\"\u0003\",e.EOT=\"\u0004\",e.ENQ=\"\u0005\",e.ACK=\"\u0006\",e.BEL=\"\u0007\",e.BS=\"\\b\",e.HT=\"\\t\",e.LF=\"\\n\",e.VT=\"\\v\",e.FF=\"\\f\",e.CR=\"\\r\",e.SO=\"\u000e\",e.SI=\"\u000f\",e.DLE=\"\u0010\",e.DC1=\"\u0011\",e.DC2=\"\u0012\",e.DC3=\"\u0013\",e.DC4=\"\u0014\",e.NAK=\"\u0015\",e.SYN=\"\u0016\",e.ETB=\"\u0017\",e.CAN=\"\u0018\",e.EM=\"\u0019\",e.SUB=\"\u001a\",e.ESC=\"\u001b\",e.FS=\"\u001c\",e.GS=\"\u001d\",e.RS=\"\u001e\",e.US=\"\u001f\",e.SP=\" \",e.DEL=\"\"}(i||(t.C0=i={})),function(e){e.PAD=\"€\",e.HOP=\"\",e.BPH=\"‚\",e.NBH=\"ƒ\",e.IND=\"„\",e.NEL=\"…\",e.SSA=\"†\",e.ESA=\"‡\",e.HTS=\"ˆ\",e.HTJ=\"‰\",e.VTS=\"Š\",e.PLD=\"‹\",e.PLU=\"Œ\",e.RI=\"\",e.SS2=\"Ž\",e.SS3=\"\",e.DCS=\"\",e.PU1=\"‘\",e.PU2=\"’\",e.STS=\"“\",e.CCH=\"”\",e.MW=\"•\",e.SPA=\"–\",e.EPA=\"—\",e.SOS=\"˜\",e.SGCI=\"™\",e.SCI=\"š\",e.CSI=\"›\",e.ST=\"œ\",e.OSC=\"\",e.PM=\"ž\",e.APC=\"Ÿ\"}(s||(t.C1=s={})),function(e){e.ST=`${i.ESC}\\\\`}(r||(t.C1_ESCAPED=r={}))},7399:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.evaluateKeyboardEvent=void 0;const s=i(2584),r={48:[\"0\",\")\"],49:[\"1\",\"!\"],50:[\"2\",\"@\"],51:[\"3\",\"#\"],52:[\"4\",\"$\"],53:[\"5\",\"%\"],54:[\"6\",\"^\"],55:[\"7\",\"&\"],56:[\"8\",\"*\"],57:[\"9\",\"(\"],186:[\";\",\":\"],187:[\"=\",\"+\"],188:[\",\",\"<\"],189:[\"-\",\"_\"],190:[\".\",\">\"],191:[\"/\",\"?\"],192:[\"`\",\"~\"],219:[\"[\",\"{\"],220:[\"\\\\\",\"|\"],221:[\"]\",\"}\"],222:[\"'\",'\"']};t.evaluateKeyboardEvent=function(e,t,i,n){const o={type:0,cancel:!1,key:void 0},a=(e.shiftKey?1:0)|(e.altKey?2:0)|(e.ctrlKey?4:0)|(e.metaKey?8:0);switch(e.keyCode){case 0:\"UIKeyInputUpArrow\"===e.key?o.key=t?s.C0.ESC+\"OA\":s.C0.ESC+\"[A\":\"UIKeyInputLeftArrow\"===e.key?o.key=t?s.C0.ESC+\"OD\":s.C0.ESC+\"[D\":\"UIKeyInputRightArrow\"===e.key?o.key=t?s.C0.ESC+\"OC\":s.C0.ESC+\"[C\":\"UIKeyInputDownArrow\"===e.key&&(o.key=t?s.C0.ESC+\"OB\":s.C0.ESC+\"[B\");break;case 8:o.key=e.ctrlKey?\"\\b\":s.C0.DEL,e.altKey&&(o.key=s.C0.ESC+o.key);break;case 9:if(e.shiftKey){o.key=s.C0.ESC+\"[Z\";break}o.key=s.C0.HT,o.cancel=!0;break;case 13:o.key=e.altKey?s.C0.ESC+s.C0.CR:s.C0.CR,o.cancel=!0;break;case 27:o.key=s.C0.ESC,e.altKey&&(o.key=s.C0.ESC+s.C0.ESC),o.cancel=!0;break;case 37:if(e.metaKey)break;a?(o.key=s.C0.ESC+\"[1;\"+(a+1)+\"D\",o.key===s.C0.ESC+\"[1;3D\"&&(o.key=s.C0.ESC+(i?\"b\":\"[1;5D\"))):o.key=t?s.C0.ESC+\"OD\":s.C0.ESC+\"[D\";break;case 39:if(e.metaKey)break;a?(o.key=s.C0.ESC+\"[1;\"+(a+1)+\"C\",o.key===s.C0.ESC+\"[1;3C\"&&(o.key=s.C0.ESC+(i?\"f\":\"[1;5C\"))):o.key=t?s.C0.ESC+\"OC\":s.C0.ESC+\"[C\";break;case 38:if(e.metaKey)break;a?(o.key=s.C0.ESC+\"[1;\"+(a+1)+\"A\",i||o.key!==s.C0.ESC+\"[1;3A\"||(o.key=s.C0.ESC+\"[1;5A\")):o.key=t?s.C0.ESC+\"OA\":s.C0.ESC+\"[A\";break;case 40:if(e.metaKey)break;a?(o.key=s.C0.ESC+\"[1;\"+(a+1)+\"B\",i||o.key!==s.C0.ESC+\"[1;3B\"||(o.key=s.C0.ESC+\"[1;5B\")):o.key=t?s.C0.ESC+\"OB\":s.C0.ESC+\"[B\";break;case 45:e.shiftKey||e.ctrlKey||(o.key=s.C0.ESC+\"[2~\");break;case 46:o.key=a?s.C0.ESC+\"[3;\"+(a+1)+\"~\":s.C0.ESC+\"[3~\";break;case 36:o.key=a?s.C0.ESC+\"[1;\"+(a+1)+\"H\":t?s.C0.ESC+\"OH\":s.C0.ESC+\"[H\";break;case 35:o.key=a?s.C0.ESC+\"[1;\"+(a+1)+\"F\":t?s.C0.ESC+\"OF\":s.C0.ESC+\"[F\";break;case 33:e.shiftKey?o.type=2:e.ctrlKey?o.key=s.C0.ESC+\"[5;\"+(a+1)+\"~\":o.key=s.C0.ESC+\"[5~\";break;case 34:e.shiftKey?o.type=3:e.ctrlKey?o.key=s.C0.ESC+\"[6;\"+(a+1)+\"~\":o.key=s.C0.ESC+\"[6~\";break;case 112:o.key=a?s.C0.ESC+\"[1;\"+(a+1)+\"P\":s.C0.ESC+\"OP\";break;case 113:o.key=a?s.C0.ESC+\"[1;\"+(a+1)+\"Q\":s.C0.ESC+\"OQ\";break;case 114:o.key=a?s.C0.ESC+\"[1;\"+(a+1)+\"R\":s.C0.ESC+\"OR\";break;case 115:o.key=a?s.C0.ESC+\"[1;\"+(a+1)+\"S\":s.C0.ESC+\"OS\";break;case 116:o.key=a?s.C0.ESC+\"[15;\"+(a+1)+\"~\":s.C0.ESC+\"[15~\";break;case 117:o.key=a?s.C0.ESC+\"[17;\"+(a+1)+\"~\":s.C0.ESC+\"[17~\";break;case 118:o.key=a?s.C0.ESC+\"[18;\"+(a+1)+\"~\":s.C0.ESC+\"[18~\";break;case 119:o.key=a?s.C0.ESC+\"[19;\"+(a+1)+\"~\":s.C0.ESC+\"[19~\";break;case 120:o.key=a?s.C0.ESC+\"[20;\"+(a+1)+\"~\":s.C0.ESC+\"[20~\";break;case 121:o.key=a?s.C0.ESC+\"[21;\"+(a+1)+\"~\":s.C0.ESC+\"[21~\";break;case 122:o.key=a?s.C0.ESC+\"[23;\"+(a+1)+\"~\":s.C0.ESC+\"[23~\";break;case 123:o.key=a?s.C0.ESC+\"[24;\"+(a+1)+\"~\":s.C0.ESC+\"[24~\";break;default:if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)if(i&&!n||!e.altKey||e.metaKey)!i||e.altKey||e.ctrlKey||e.shiftKey||!e.metaKey?e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.keyCode>=48&&1===e.key.length?o.key=e.key:e.key&&e.ctrlKey&&(\"_\"===e.key&&(o.key=s.C0.US),\"@\"===e.key&&(o.key=s.C0.NUL)):65===e.keyCode&&(o.type=1);else{const t=r[e.keyCode],i=t?.[e.shiftKey?1:0];if(i)o.key=s.C0.ESC+i;else if(e.keyCode>=65&&e.keyCode<=90){const t=e.ctrlKey?e.keyCode-64:e.keyCode+32;let i=String.fromCharCode(t);e.shiftKey&&(i=i.toUpperCase()),o.key=s.C0.ESC+i}else if(32===e.keyCode)o.key=s.C0.ESC+(e.ctrlKey?s.C0.NUL:\" \");else if(\"Dead\"===e.key&&e.code.startsWith(\"Key\")){let t=e.code.slice(3,4);e.shiftKey||(t=t.toLowerCase()),o.key=s.C0.ESC+t,o.cancel=!0}}else e.keyCode>=65&&e.keyCode<=90?o.key=String.fromCharCode(e.keyCode-64):32===e.keyCode?o.key=s.C0.NUL:e.keyCode>=51&&e.keyCode<=55?o.key=String.fromCharCode(e.keyCode-51+27):56===e.keyCode?o.key=s.C0.DEL:219===e.keyCode?o.key=s.C0.ESC:220===e.keyCode?o.key=s.C0.FS:221===e.keyCode&&(o.key=s.C0.GS)}return o}},482:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=t.utf32ToString=t.stringFromCodePoint=void 0,t.stringFromCodePoint=function(e){return e>65535?(e-=65536,String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)},t.utf32ToString=function(e,t=0,i=e.length){let s=\"\";for(let r=t;r65535?(t-=65536,s+=String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):s+=String.fromCharCode(t)}return s},t.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){const i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=e.charCodeAt(r++);56320<=i&&i<=57343?t[s++]=1024*(this._interim-55296)+i-56320+65536:(t[s++]=this._interim,t[s++]=i),this._interim=0}for(let n=r;n=i)return this._interim=r,s;const o=e.charCodeAt(n);56320<=o&&o<=57343?t[s++]=1024*(r-55296)+o-56320+65536:(t[s++]=r,t[s++]=o)}else 65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,n,o,a=0,h=0,c=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let n,o=0;for(;(n=63&this.interim[++o])&&o<4;)r<<=6,r|=n;const h=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,l=h-o;for(;c=i)return 0;if(n=e[c++],128!=(192&n)){c--,s=!0;break}this.interim[o++]=n,r<<=6,r|=63&n}s||(2===h?r<128?c--:t[a++]=r:3===h?r<2048||r>=55296&&r<=57343||65279===r||(t[a++]=r):r<65536||r>1114111||(t[a++]=r)),this.interim.fill(0)}const l=i-4;let d=c;for(;d=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(h=(31&s)<<6|63&r,h<128){d--;continue}t[a++]=h}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(n=e[d++],128!=(192&n)){d--;continue}if(h=(15&s)<<12|(63&r)<<6|63&n,h<2048||h>=55296&&h<=57343||65279===h)continue;t[a++]=h}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(n=e[d++],128!=(192&n)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=n,a;if(o=e[d++],128!=(192&o)){d--;continue}if(h=(7&s)<<18|(63&r)<<12|(63&n)<<6|63&o,h<65536||h>1114111)continue;t[a++]=h}}return a}}},225:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.UnicodeV6=void 0;const s=i(1480),r=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531]],n=[[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]];let o;t.UnicodeV6=class{constructor(){if(this.version=\"6\",!o){o=new Uint8Array(65536),o.fill(1),o[0]=0,o.fill(0,1,32),o.fill(0,127,160),o.fill(2,4352,4448),o[9001]=2,o[9002]=2,o.fill(2,11904,42192),o[12351]=1,o.fill(2,44032,55204),o.fill(2,63744,64256),o.fill(2,65040,65050),o.fill(2,65072,65136),o.fill(2,65280,65377),o.fill(2,65504,65511);for(let e=0;et[r][1])return!1;for(;r>=s;)if(i=s+r>>1,e>t[i][1])s=i+1;else{if(!(e=131072&&e<=196605||e>=196608&&e<=262141?2:1}charProperties(e,t){let i=this.wcwidth(e),r=0===i&&0!==t;if(r){const e=s.UnicodeService.extractWidth(t);0===e?r=!1:e>i&&(i=e)}return s.UnicodeService.createPropertyValue(0,i,r)}}},5981:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.WriteBuffer=void 0;const s=i(8460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._action=e,this._writeBuffer=[],this._callbacks=[],this._pendingData=0,this._bufferOffset=0,this._isSyncWriting=!1,this._syncCalls=0,this._didUserInput=!1,this._onWriteParsed=this.register(new s.EventEmitter),this.onWriteParsed=this._onWriteParsed.event}handleUserInput(){this._didUserInput=!0}writeSync(e,t){if(void 0!==t&&this._syncCalls>t)return void(this._syncCalls=0);if(this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(void 0),this._syncCalls++,this._isSyncWriting)return;let i;for(this._isSyncWriting=!0;i=this._writeBuffer.shift();){this._action(i);const e=this._callbacks.shift();e&&e()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}write(e,t){if(this._pendingData>5e7)throw new Error(\"write data discarded, use flow control to avoid losing data\");if(!this._writeBuffer.length){if(this._bufferOffset=0,this._didUserInput)return this._didUserInput=!1,this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t),void this._innerWrite();setTimeout((()=>this._innerWrite()))}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}_innerWrite(e=0,t=!0){const i=e||Date.now();for(;this._writeBuffer.length>this._bufferOffset;){const e=this._writeBuffer[this._bufferOffset],s=this._action(e,t);if(s){const e=e=>Date.now()-i>=12?setTimeout((()=>this._innerWrite(0,e))):this._innerWrite(i,e);return void s.catch((e=>(queueMicrotask((()=>{throw e})),Promise.resolve(!1)))).then(e)}const r=this._callbacks[this._bufferOffset];if(r&&r(),this._bufferOffset++,this._pendingData-=e.length,Date.now()-i>=12)break}this._writeBuffer.length>this._bufferOffset?(this._bufferOffset>50&&(this._writeBuffer=this._writeBuffer.slice(this._bufferOffset),this._callbacks=this._callbacks.slice(this._bufferOffset),this._bufferOffset=0),setTimeout((()=>this._innerWrite()))):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}}t.WriteBuffer=n},5941:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.toRgbString=t.parseColor=void 0;const i=/^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/,s=/^[\\da-f]+$/;function r(e,t){const i=e.toString(16),s=i.length<2?\"0\"+i:i;switch(t){case 4:return i[0];case 8:return s;case 12:return(s+s).slice(0,3);default:return s+s}}t.parseColor=function(e){if(!e)return;let t=e.toLowerCase();if(0===t.indexOf(\"rgb:\")){t=t.slice(4);const e=i.exec(t);if(e){const t=e[1]?15:e[4]?255:e[7]?4095:65535;return[Math.round(parseInt(e[1]||e[4]||e[7]||e[10],16)/t*255),Math.round(parseInt(e[2]||e[5]||e[8]||e[11],16)/t*255),Math.round(parseInt(e[3]||e[6]||e[9]||e[12],16)/t*255)]}}else if(0===t.indexOf(\"#\")&&(t=t.slice(1),s.exec(t)&&[3,6,9,12].includes(t.length))){const e=t.length/3,i=[0,0,0];for(let s=0;s<3;++s){const r=parseInt(t.slice(e*s,e*s+e),16);i[s]=1===e?r<<4:2===e?r:3===e?r>>4:r>>8}return i}},t.toRgbString=function(e,t=16){const[i,s,n]=e;return`rgb:${r(i,t)}/${r(s,t)}/${r(n,t)}`}},5770:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.PAYLOAD_LIMIT=void 0,t.PAYLOAD_LIMIT=1e7},6351:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.DcsHandler=t.DcsParser=void 0;const s=i(482),r=i(8742),n=i(5770),o=[];t.DcsParser=class{constructor(){this._handlers=Object.create(null),this._active=o,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=o}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}reset(){if(this._active.length)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].unhook(!1);this._stack.paused=!1,this._active=o,this._ident=0}hook(e,t){if(this.reset(),this._ident=e,this._active=this._handlers[e]||o,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].hook(t);else this._handlerFb(this._ident,\"HOOK\",t)}put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._ident,\"PUT\",(0,s.utf32ToString)(e,t,i))}unhook(e,t=!0){if(this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].unhook(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].unhook(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._ident,\"UNHOOK\",e);this._active=o,this._ident=0}};const a=new r.Params;a.addParam(0),t.DcsHandler=class{constructor(e){this._handler=e,this._data=\"\",this._params=a,this._hitLimit=!1}hook(e){this._params=e.length>1||e.params[0]?e.clone():a,this._data=\"\",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,s.utf32ToString)(e,t,i),this._data.length>n.PAYLOAD_LIMIT&&(this._data=\"\",this._hitLimit=!0))}unhook(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data,this._params),t instanceof Promise))return t.then((e=>(this._params=a,this._data=\"\",this._hitLimit=!1,e)));return this._params=a,this._data=\"\",this._hitLimit=!1,t}}},2015:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.EscapeSequenceParser=t.VT500_TRANSITION_TABLE=t.TransitionTable=void 0;const s=i(844),r=i(8742),n=i(6242),o=i(6351);class a{constructor(e){this.table=new Uint8Array(e)}setDefault(e,t){this.table.fill(e<<4|t)}add(e,t,i,s){this.table[t<<8|e]=i<<4|s}addMany(e,t,i,s){for(let r=0;rt)),i=(e,i)=>t.slice(e,i),s=i(32,127),r=i(0,24);r.push(25),r.push.apply(r,i(28,32));const n=i(0,14);let o;for(o in e.setDefault(1,0),e.addMany(s,0,2,0),n)e.addMany([24,26,153,154],o,3,0),e.addMany(i(128,144),o,3,0),e.addMany(i(144,152),o,3,0),e.add(156,o,0,0),e.add(27,o,11,1),e.add(157,o,4,8),e.addMany([152,158,159],o,0,7),e.add(155,o,11,3),e.add(144,o,11,9);return e.addMany(r,0,3,0),e.addMany(r,1,3,1),e.add(127,1,0,1),e.addMany(r,8,0,8),e.addMany(r,3,3,3),e.add(127,3,0,3),e.addMany(r,4,3,4),e.add(127,4,0,4),e.addMany(r,6,3,6),e.addMany(r,5,3,5),e.add(127,5,0,5),e.addMany(r,2,3,2),e.add(127,2,0,2),e.add(93,1,4,8),e.addMany(s,8,5,8),e.add(127,8,5,8),e.addMany([156,27,24,26,7],8,6,0),e.addMany(i(28,32),8,0,8),e.addMany([88,94,95],1,0,7),e.addMany(s,7,0,7),e.addMany(r,7,0,7),e.add(156,7,0,0),e.add(127,7,0,7),e.add(91,1,11,3),e.addMany(i(64,127),3,7,0),e.addMany(i(48,60),3,8,4),e.addMany([60,61,62,63],3,9,4),e.addMany(i(48,60),4,8,4),e.addMany(i(64,127),4,7,0),e.addMany([60,61,62,63],4,0,6),e.addMany(i(32,64),6,0,6),e.add(127,6,0,6),e.addMany(i(64,127),6,0,0),e.addMany(i(32,48),3,9,5),e.addMany(i(32,48),5,9,5),e.addMany(i(48,64),5,0,6),e.addMany(i(64,127),5,7,0),e.addMany(i(32,48),4,9,5),e.addMany(i(32,48),1,9,2),e.addMany(i(32,48),2,9,2),e.addMany(i(48,127),2,10,0),e.addMany(i(48,80),1,10,0),e.addMany(i(81,88),1,10,0),e.addMany([89,90,92],1,10,0),e.addMany(i(96,127),1,10,0),e.add(80,1,11,9),e.addMany(r,9,0,9),e.add(127,9,0,9),e.addMany(i(28,32),9,0,9),e.addMany(i(32,48),9,9,12),e.addMany(i(48,60),9,8,10),e.addMany([60,61,62,63],9,9,10),e.addMany(r,11,0,11),e.addMany(i(32,128),11,0,11),e.addMany(i(28,32),11,0,11),e.addMany(r,10,0,10),e.add(127,10,0,10),e.addMany(i(28,32),10,0,10),e.addMany(i(48,60),10,8,10),e.addMany([60,61,62,63],10,0,11),e.addMany(i(32,48),10,9,12),e.addMany(r,12,0,12),e.add(127,12,0,12),e.addMany(i(28,32),12,0,12),e.addMany(i(32,48),12,9,12),e.addMany(i(48,64),12,0,11),e.addMany(i(64,127),12,12,13),e.addMany(i(64,127),10,12,13),e.addMany(i(64,127),9,12,13),e.addMany(r,13,13,13),e.addMany(s,13,13,13),e.add(127,13,0,13),e.addMany([27,156,24,26],13,14,0),e.add(h,0,2,0),e.add(h,8,5,8),e.add(h,6,0,6),e.add(h,11,0,11),e.add(h,13,13,13),e}();class c extends s.Disposable{constructor(e=t.VT500_TRANSITION_TABLE){super(),this._transitions=e,this._parseStack={state:0,handlers:[],handlerPos:0,transition:0,chunkPos:0},this.initialState=0,this.currentState=this.initialState,this._params=new r.Params,this._params.addParam(0),this._collect=0,this.precedingJoinState=0,this._printHandlerFb=(e,t,i)=>{},this._executeHandlerFb=e=>{},this._csiHandlerFb=(e,t)=>{},this._escHandlerFb=e=>{},this._errorHandlerFb=e=>e,this._printHandler=this._printHandlerFb,this._executeHandlers=Object.create(null),this._csiHandlers=Object.create(null),this._escHandlers=Object.create(null),this.register((0,s.toDisposable)((()=>{this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._escHandlers=Object.create(null)}))),this._oscParser=this.register(new n.OscParser),this._dcsParser=this.register(new o.DcsParser),this._errorHandler=this._errorHandlerFb,this.registerEscHandler({final:\"\\\\\"},(()=>!0))}_identifier(e,t=[64,126]){let i=0;if(e.prefix){if(e.prefix.length>1)throw new Error(\"only one byte as prefix supported\");if(i=e.prefix.charCodeAt(0),i&&60>i||i>63)throw new Error(\"prefix must be in range 0x3c .. 0x3f\")}if(e.intermediates){if(e.intermediates.length>2)throw new Error(\"only two bytes as intermediates are supported\");for(let t=0;ts||s>47)throw new Error(\"intermediate must be in range 0x20 .. 0x2f\");i<<=8,i|=s}}if(1!==e.final.length)throw new Error(\"final must be a single byte\");const s=e.final.charCodeAt(0);if(t[0]>s||s>t[1])throw new Error(`final must be in range ${t[0]} .. ${t[1]}`);return i<<=8,i|=s,i}identToString(e){const t=[];for(;e;)t.push(String.fromCharCode(255&e)),e>>=8;return t.reverse().join(\"\")}setPrintHandler(e){this._printHandler=e}clearPrintHandler(){this._printHandler=this._printHandlerFb}registerEscHandler(e,t){const i=this._identifier(e,[48,126]);void 0===this._escHandlers[i]&&(this._escHandlers[i]=[]);const s=this._escHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearEscHandler(e){this._escHandlers[this._identifier(e,[48,126])]&&delete this._escHandlers[this._identifier(e,[48,126])]}setEscHandlerFallback(e){this._escHandlerFb=e}setExecuteHandler(e,t){this._executeHandlers[e.charCodeAt(0)]=t}clearExecuteHandler(e){this._executeHandlers[e.charCodeAt(0)]&&delete this._executeHandlers[e.charCodeAt(0)]}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){const i=this._identifier(e);void 0===this._csiHandlers[i]&&(this._csiHandlers[i]=[]);const s=this._csiHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearCsiHandler(e){this._csiHandlers[this._identifier(e)]&&delete this._csiHandlers[this._identifier(e)]}setCsiHandlerFallback(e){this._csiHandlerFb=e}registerDcsHandler(e,t){return this._dcsParser.registerHandler(this._identifier(e),t)}clearDcsHandler(e){this._dcsParser.clearHandler(this._identifier(e))}setDcsHandlerFallback(e){this._dcsParser.setHandlerFallback(e)}registerOscHandler(e,t){return this._oscParser.registerHandler(e,t)}clearOscHandler(e){this._oscParser.clearHandler(e)}setOscHandlerFallback(e){this._oscParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingJoinState=0,0!==this._parseStack.state&&(this._parseStack.state=2,this._parseStack.handlers=[])}_preserveStack(e,t,i,s,r){this._parseStack.state=e,this._parseStack.handlers=t,this._parseStack.handlerPos=i,this._parseStack.transition=s,this._parseStack.chunkPos=r}parse(e,t,i){let s,r=0,n=0,o=0;if(this._parseStack.state)if(2===this._parseStack.state)this._parseStack.state=0,o=this._parseStack.chunkPos+1;else{if(void 0===i||1===this._parseStack.state)throw this._parseStack.state=1,new Error(\"improper continuation due to previous async handler, giving up parsing\");const t=this._parseStack.handlers;let n=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](this._params),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 4:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 6:if(r=e[this._parseStack.chunkPos],s=this._dcsParser.unhook(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0;break;case 5:if(r=e[this._parseStack.chunkPos],s=this._oscParser.end(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0}this._parseStack.state=0,o=this._parseStack.chunkPos+1,this.precedingJoinState=0,this.currentState=15&this._parseStack.transition}for(let i=o;i>4){case 2:for(let s=i+1;;++s){if(s>=t||(r=e[s])<32||r>126&&r=t||(r=e[s])<32||r>126&&r=t||(r=e[s])<32||r>126&&r=t||(r=e[s])<32||r>126&&r=0&&(s=o[a](this._params),!0!==s);a--)if(s instanceof Promise)return this._preserveStack(3,o,a,n,i),s;a<0&&this._csiHandlerFb(this._collect<<8|r,this._params),this.precedingJoinState=0;break;case 8:do{switch(r){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(r-48)}}while(++i47&&r<60);i--;break;case 9:this._collect<<=8,this._collect|=r;break;case 10:const c=this._escHandlers[this._collect<<8|r];let l=c?c.length-1:-1;for(;l>=0&&(s=c[l](),!0!==s);l--)if(s instanceof Promise)return this._preserveStack(4,c,l,n,i),s;l<0&&this._escHandlerFb(this._collect<<8|r),this.precedingJoinState=0;break;case 11:this._params.reset(),this._params.addParam(0),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|r,this._params);break;case 13:for(let s=i+1;;++s)if(s>=t||24===(r=e[s])||26===r||27===r||r>127&&r=t||(r=e[s])<32||r>127&&r{Object.defineProperty(t,\"__esModule\",{value:!0}),t.OscHandler=t.OscParser=void 0;const s=i(5770),r=i(482),n=[];t.OscParser=class{constructor(){this._state=0,this._active=n,this._id=-1,this._handlers=Object.create(null),this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=n}reset(){if(2===this._state)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].end(!1);this._stack.paused=!1,this._active=n,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||n,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].start();else this._handlerFb(this._id,\"START\")}_put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._id,\"PUT\",(0,r.utf32ToString)(e,t,i))}start(){this.reset(),this._state=1}put(e,t,i){if(3!==this._state){if(1===this._state)for(;t0&&this._put(e,t,i)}}end(e,t=!0){if(0!==this._state){if(3!==this._state)if(1===this._state&&this._start(),this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].end(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].end(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._id,\"END\",e);this._active=n,this._id=-1,this._state=0}}},t.OscHandler=class{constructor(e){this._handler=e,this._data=\"\",this._hitLimit=!1}start(){this._data=\"\",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,r.utf32ToString)(e,t,i),this._data.length>s.PAYLOAD_LIMIT&&(this._data=\"\",this._hitLimit=!0))}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data),t instanceof Promise))return t.then((e=>(this._data=\"\",this._hitLimit=!1,e)));return this._data=\"\",this._hitLimit=!1,t}}},8742:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Params=void 0;const i=2147483647;class s{static fromArray(e){const t=new s;if(!e.length)return t;for(let i=Array.isArray(e[0])?1:0;i256)throw new Error(\"maxSubParamsLength must not be greater than 256\");this.params=new Int32Array(e),this.length=0,this._subParams=new Int32Array(t),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(e),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}clone(){const e=new s(this.maxLength,this.maxSubParamsLength);return e.params.set(this.params),e.length=this.length,e._subParams.set(this._subParams),e._subParamsLength=this._subParamsLength,e._subParamsIdx.set(this._subParamsIdx),e._rejectDigits=this._rejectDigits,e._rejectSubDigits=this._rejectSubDigits,e._digitIsSub=this._digitIsSub,e}toArray(){const e=[];for(let t=0;t>8,s=255&this._subParamsIdx[t];s-i>0&&e.push(Array.prototype.slice.call(this._subParams,i,s))}return e}reset(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}addParam(e){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(e<-1)throw new Error(\"values lesser than -1 are not allowed\");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=e>i?i:e}}addSubParam(e){if(this._digitIsSub=!0,this.length)if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength)this._rejectSubDigits=!0;else{if(e<-1)throw new Error(\"values lesser than -1 are not allowed\");this._subParams[this._subParamsLength++]=e>i?i:e,this._subParamsIdx[this.length-1]++}}hasSubParams(e){return(255&this._subParamsIdx[e])-(this._subParamsIdx[e]>>8)>0}getSubParams(e){const t=this._subParamsIdx[e]>>8,i=255&this._subParamsIdx[e];return i-t>0?this._subParams.subarray(t,i):null}getSubParamsAll(){const e={};for(let t=0;t>8,s=255&this._subParamsIdx[t];s-i>0&&(e[t]=this._subParams.slice(i,s))}return e}addDigit(e){let t;if(this._rejectDigits||!(t=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)return;const s=this._digitIsSub?this._subParams:this.params,r=s[t-1];s[t-1]=~r?Math.min(10*r+e,i):e}}t.Params=s},5741:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.AddonManager=void 0,t.AddonManager=class{constructor(){this._addons=[]}dispose(){for(let e=this._addons.length-1;e>=0;e--)this._addons[e].instance.dispose()}loadAddon(e,t){const i={instance:t,dispose:t.dispose,isDisposed:!1};this._addons.push(i),t.dispose=()=>this._wrappedAddonDispose(i),t.activate(e)}_wrappedAddonDispose(e){if(e.isDisposed)return;let t=-1;for(let i=0;i{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferApiView=void 0;const s=i(3785),r=i(511);t.BufferApiView=class{constructor(e,t){this._buffer=e,this.type=t}init(e){return this._buffer=e,this}get cursorY(){return this._buffer.y}get cursorX(){return this._buffer.x}get viewportY(){return this._buffer.ydisp}get baseY(){return this._buffer.ybase}get length(){return this._buffer.lines.length}getLine(e){const t=this._buffer.lines.get(e);if(t)return new s.BufferLineApiView(t)}getNullCell(){return new r.CellData}}},3785:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferLineApiView=void 0;const s=i(511);t.BufferLineApiView=class{constructor(e){this._line=e}get isWrapped(){return this._line.isWrapped}get length(){return this._line.length}getCell(e,t){if(!(e<0||e>=this._line.length))return t?(this._line.loadCell(e,t),t):this._line.loadCell(e,new s.CellData)}translateToString(e,t,i){return this._line.translateToString(e,t,i)}}},8285:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferNamespaceApi=void 0;const s=i(8771),r=i(8460),n=i(844);class o extends n.Disposable{constructor(e){super(),this._core=e,this._onBufferChange=this.register(new r.EventEmitter),this.onBufferChange=this._onBufferChange.event,this._normal=new s.BufferApiView(this._core.buffers.normal,\"normal\"),this._alternate=new s.BufferApiView(this._core.buffers.alt,\"alternate\"),this._core.buffers.onBufferActivate((()=>this._onBufferChange.fire(this.active)))}get active(){if(this._core.buffers.active===this._core.buffers.normal)return this.normal;if(this._core.buffers.active===this._core.buffers.alt)return this.alternate;throw new Error(\"Active buffer is neither normal nor alternate\")}get normal(){return this._normal.init(this._core.buffers.normal)}get alternate(){return this._alternate.init(this._core.buffers.alt)}}t.BufferNamespaceApi=o},7975:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.ParserApi=void 0,t.ParserApi=class{constructor(e){this._core=e}registerCsiHandler(e,t){return this._core.registerCsiHandler(e,(e=>t(e.toArray())))}addCsiHandler(e,t){return this.registerCsiHandler(e,t)}registerDcsHandler(e,t){return this._core.registerDcsHandler(e,((e,i)=>t(e,i.toArray())))}addDcsHandler(e,t){return this.registerDcsHandler(e,t)}registerEscHandler(e,t){return this._core.registerEscHandler(e,t)}addEscHandler(e,t){return this.registerEscHandler(e,t)}registerOscHandler(e,t){return this._core.registerOscHandler(e,t)}addOscHandler(e,t){return this.registerOscHandler(e,t)}}},7090:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.UnicodeApi=void 0,t.UnicodeApi=class{constructor(e){this._core=e}register(e){this._core.unicodeService.register(e)}get versions(){return this._core.unicodeService.versions}get activeVersion(){return this._core.unicodeService.activeVersion}set activeVersion(e){this._core.unicodeService.activeVersion=e}}},744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferService=t.MINIMUM_ROWS=t.MINIMUM_COLS=void 0;const n=i(8460),o=i(844),a=i(5295),h=i(2585);t.MINIMUM_COLS=2,t.MINIMUM_ROWS=1;let c=t.BufferService=class extends o.Disposable{get buffer(){return this.buffers.active}constructor(e){super(),this.isUserScrolling=!1,this._onResize=this.register(new n.EventEmitter),this.onResize=this._onResize.event,this._onScroll=this.register(new n.EventEmitter),this.onScroll=this._onScroll.event,this.cols=Math.max(e.rawOptions.cols||0,t.MINIMUM_COLS),this.rows=Math.max(e.rawOptions.rows||0,t.MINIMUM_ROWS),this.buffers=this.register(new a.BufferSet(e,this))}resize(e,t){this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t})}reset(){this.buffers.reset(),this.isUserScrolling=!1}scroll(e,t=!1){const i=this.buffer;let s;s=this._cachedBlankLine,s&&s.length===this.cols&&s.getFg(0)===e.fg&&s.getBg(0)===e.bg||(s=i.getBlankLine(e,t),this._cachedBlankLine=s),s.isWrapped=t;const r=i.ybase+i.scrollTop,n=i.ybase+i.scrollBottom;if(0===i.scrollTop){const e=i.lines.isFull;n===i.lines.length-1?e?i.lines.recycle().copyFrom(s):i.lines.push(s.clone()):i.lines.splice(n+1,0,s.clone()),e?this.isUserScrolling&&(i.ydisp=Math.max(i.ydisp-1,0)):(i.ybase++,this.isUserScrolling||i.ydisp++)}else{const e=n-r+1;i.lines.shiftElements(r+1,e-1,-1),i.lines.set(n,s.clone())}this.isUserScrolling||(i.ydisp=i.ybase),this._onScroll.fire(i.ydisp)}scrollLines(e,t,i){const s=this.buffer;if(e<0){if(0===s.ydisp)return;this.isUserScrolling=!0}else e+s.ydisp>=s.ybase&&(this.isUserScrolling=!1);const r=s.ydisp;s.ydisp=Math.max(Math.min(s.ydisp+e,s.ybase),0),r!==s.ydisp&&(t||this._onScroll.fire(s.ydisp))}};t.BufferService=c=s([r(0,h.IOptionsService)],c)},7994:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CharsetService=void 0,t.CharsetService=class{constructor(){this.glevel=0,this._charsets=[]}reset(){this.charset=void 0,this._charsets=[],this.glevel=0}setgLevel(e){this.glevel=e,this.charset=this._charsets[e]}setgCharset(e,t){this._charsets[e]=t,this.glevel===e&&(this.charset=t)}}},1753:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CoreMouseService=void 0;const n=i(2585),o=i(8460),a=i(844),h={NONE:{events:0,restrict:()=>!1},X10:{events:1,restrict:e=>4!==e.button&&1===e.action&&(e.ctrl=!1,e.alt=!1,e.shift=!1,!0)},VT200:{events:19,restrict:e=>32!==e.action},DRAG:{events:23,restrict:e=>32!==e.action||3!==e.button},ANY:{events:31,restrict:e=>!0}};function c(e,t){let i=(e.ctrl?16:0)|(e.shift?4:0)|(e.alt?8:0);return 4===e.button?(i|=64,i|=e.action):(i|=3&e.button,4&e.button&&(i|=64),8&e.button&&(i|=128),32===e.action?i|=32:0!==e.action||t||(i|=3)),i}const l=String.fromCharCode,d={DEFAULT:e=>{const t=[c(e,!1)+32,e.col+32,e.row+32];return t[0]>255||t[1]>255||t[2]>255?\"\":`\u001b[M${l(t[0])}${l(t[1])}${l(t[2])}`},SGR:e=>{const t=0===e.action&&4!==e.button?\"m\":\"M\";return`\u001b[<${c(e,!0)};${e.col};${e.row}${t}`},SGR_PIXELS:e=>{const t=0===e.action&&4!==e.button?\"m\":\"M\";return`\u001b[<${c(e,!0)};${e.x};${e.y}${t}`}};let _=t.CoreMouseService=class extends a.Disposable{constructor(e,t){super(),this._bufferService=e,this._coreService=t,this._protocols={},this._encodings={},this._activeProtocol=\"\",this._activeEncoding=\"\",this._lastEvent=null,this._onProtocolChange=this.register(new o.EventEmitter),this.onProtocolChange=this._onProtocolChange.event;for(const e of Object.keys(h))this.addProtocol(e,h[e]);for(const e of Object.keys(d))this.addEncoding(e,d[e]);this.reset()}addProtocol(e,t){this._protocols[e]=t}addEncoding(e,t){this._encodings[e]=t}get activeProtocol(){return this._activeProtocol}get areMouseEventsActive(){return 0!==this._protocols[this._activeProtocol].events}set activeProtocol(e){if(!this._protocols[e])throw new Error(`unknown protocol \"${e}\"`);this._activeProtocol=e,this._onProtocolChange.fire(this._protocols[e].events)}get activeEncoding(){return this._activeEncoding}set activeEncoding(e){if(!this._encodings[e])throw new Error(`unknown encoding \"${e}\"`);this._activeEncoding=e}reset(){this.activeProtocol=\"NONE\",this.activeEncoding=\"DEFAULT\",this._lastEvent=null}triggerMouseEvent(e){if(e.col<0||e.col>=this._bufferService.cols||e.row<0||e.row>=this._bufferService.rows)return!1;if(4===e.button&&32===e.action)return!1;if(3===e.button&&32!==e.action)return!1;if(4!==e.button&&(2===e.action||3===e.action))return!1;if(e.col++,e.row++,32===e.action&&this._lastEvent&&this._equalEvents(this._lastEvent,e,\"SGR_PIXELS\"===this._activeEncoding))return!1;if(!this._protocols[this._activeProtocol].restrict(e))return!1;const t=this._encodings[this._activeEncoding](e);return t&&(\"DEFAULT\"===this._activeEncoding?this._coreService.triggerBinaryEvent(t):this._coreService.triggerDataEvent(t,!0)),this._lastEvent=e,!0}explainEvents(e){return{down:!!(1&e),up:!!(2&e),drag:!!(4&e),move:!!(8&e),wheel:!!(16&e)}}_equalEvents(e,t,i){if(i){if(e.x!==t.x)return!1;if(e.y!==t.y)return!1}else{if(e.col!==t.col)return!1;if(e.row!==t.row)return!1}return e.button===t.button&&e.action===t.action&&e.ctrl===t.ctrl&&e.alt===t.alt&&e.shift===t.shift}};t.CoreMouseService=_=s([r(0,n.IBufferService),r(1,n.ICoreService)],_)},6975:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CoreService=void 0;const n=i(1439),o=i(8460),a=i(844),h=i(2585),c=Object.freeze({insertMode:!1}),l=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,origin:!1,reverseWraparound:!1,sendFocus:!1,wraparound:!0});let d=t.CoreService=class extends a.Disposable{constructor(e,t,i){super(),this._bufferService=e,this._logService=t,this._optionsService=i,this.isCursorInitialized=!1,this.isCursorHidden=!1,this._onData=this.register(new o.EventEmitter),this.onData=this._onData.event,this._onUserInput=this.register(new o.EventEmitter),this.onUserInput=this._onUserInput.event,this._onBinary=this.register(new o.EventEmitter),this.onBinary=this._onBinary.event,this._onRequestScrollToBottom=this.register(new o.EventEmitter),this.onRequestScrollToBottom=this._onRequestScrollToBottom.event,this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}reset(){this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}triggerDataEvent(e,t=!1){if(this._optionsService.rawOptions.disableStdin)return;const i=this._bufferService.buffer;t&&this._optionsService.rawOptions.scrollOnUserInput&&i.ybase!==i.ydisp&&this._onRequestScrollToBottom.fire(),t&&this._onUserInput.fire(),this._logService.debug(`sending data \"${e}\"`,(()=>e.split(\"\").map((e=>e.charCodeAt(0))))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary \"${e}\"`,(()=>e.split(\"\").map((e=>e.charCodeAt(0))))),this._onBinary.fire(e))}};t.CoreService=d=s([r(0,h.IBufferService),r(1,h.ILogService),r(2,h.IOptionsService)],d)},9074:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.DecorationService=void 0;const s=i(8055),r=i(8460),n=i(844),o=i(6106);let a=0,h=0;class c extends n.Disposable{get decorations(){return this._decorations.values()}constructor(){super(),this._decorations=new o.SortedList((e=>e?.marker.line)),this._onDecorationRegistered=this.register(new r.EventEmitter),this.onDecorationRegistered=this._onDecorationRegistered.event,this._onDecorationRemoved=this.register(new r.EventEmitter),this.onDecorationRemoved=this._onDecorationRemoved.event,this.register((0,n.toDisposable)((()=>this.reset())))}registerDecoration(e){if(e.marker.isDisposed)return;const t=new l(e);if(t){const e=t.marker.onDispose((()=>t.dispose()));t.onDispose((()=>{t&&(this._decorations.delete(t)&&this._onDecorationRemoved.fire(t),e.dispose())})),this._decorations.insert(t),this._onDecorationRegistered.fire(t)}return t}reset(){for(const e of this._decorations.values())e.dispose();this._decorations.clear()}*getDecorationsAtCell(e,t,i){let s=0,r=0;for(const n of this._decorations.getKeyIterator(t))s=n.options.x??0,r=s+(n.options.width??1),e>=s&&e{a=t.options.x??0,h=a+(t.options.width??1),e>=a&&e{Object.defineProperty(t,\"__esModule\",{value:!0}),t.InstantiationService=t.ServiceCollection=void 0;const s=i(2585),r=i(8343);class n{constructor(...e){this._entries=new Map;for(const[t,i]of e)this.set(t,i)}set(e,t){const i=this._entries.get(e);return this._entries.set(e,t),i}forEach(e){for(const[t,i]of this._entries.entries())e(t,i)}has(e){return this._entries.has(e)}get(e){return this._entries.get(e)}}t.ServiceCollection=n,t.InstantiationService=class{constructor(){this._services=new n,this._services.set(s.IInstantiationService,this)}setService(e,t){this._services.set(e,t)}getService(e){return this._services.get(e)}createInstance(e,...t){const i=(0,r.getServiceDependencies)(e).sort(((e,t)=>e.index-t.index)),s=[];for(const t of i){const i=this._services.get(t.id);if(!i)throw new Error(`[createInstance] ${e.name} depends on UNKNOWN service ${t.id}.`);s.push(i)}const n=i.length>0?i[0].index:t.length;if(t.length!==n)throw new Error(`[createInstance] First service dependency of ${e.name} at position ${n+1} conflicts with ${t.length} static arguments`);return new e(...[...t,...s])}}},7866:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.traceCall=t.setTraceLogger=t.LogService=void 0;const n=i(844),o=i(2585),a={trace:o.LogLevelEnum.TRACE,debug:o.LogLevelEnum.DEBUG,info:o.LogLevelEnum.INFO,warn:o.LogLevelEnum.WARN,error:o.LogLevelEnum.ERROR,off:o.LogLevelEnum.OFF};let h,c=t.LogService=class extends n.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=o.LogLevelEnum.OFF,this._updateLogLevel(),this.register(this._optionsService.onSpecificOptionChange(\"logLevel\",(()=>this._updateLogLevel()))),h=this}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;tJSON.stringify(e))).join(\", \")})`);const t=s.apply(this,e);return h.trace(`GlyphRenderer#${s.name} return`,t),t}}},7302:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.OptionsService=t.DEFAULT_OPTIONS=void 0;const s=i(8460),r=i(844),n=i(6114);t.DEFAULT_OPTIONS={cols:80,rows:24,cursorBlink:!1,cursorStyle:\"block\",cursorWidth:1,cursorInactiveStyle:\"outline\",customGlyphs:!0,drawBoldTextInBrightColors:!0,documentOverride:null,fastScrollModifier:\"alt\",fastScrollSensitivity:5,fontFamily:\"courier-new, courier, monospace\",fontSize:15,fontWeight:\"normal\",fontWeightBold:\"bold\",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:\"info\",logger:null,scrollback:1e3,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},rescaleOverlappingGlyphs:!1,rightClickSelectsWord:n.isMac,windowOptions:{},windowsMode:!1,windowsPty:{},wordSeparator:\" ()[]{}',\\\"`\",altClickMovesCursor:!0,convertEol:!1,termName:\"xterm\",cancelEvents:!1,overviewRulerWidth:0};const o=[\"normal\",\"bold\",\"100\",\"200\",\"300\",\"400\",\"500\",\"600\",\"700\",\"800\",\"900\"];class a extends r.Disposable{constructor(e){super(),this._onOptionChange=this.register(new s.EventEmitter),this.onOptionChange=this._onOptionChange.event;const i={...t.DEFAULT_OPTIONS};for(const t in e)if(t in i)try{const s=e[t];i[t]=this._sanitizeAndValidateOption(t,s)}catch(e){console.error(e)}this.rawOptions=i,this.options={...i},this._setupOptions(),this.register((0,r.toDisposable)((()=>{this.rawOptions.linkHandler=null,this.rawOptions.documentOverride=null})))}onSpecificOptionChange(e,t){return this.onOptionChange((i=>{i===e&&t(this.rawOptions[e])}))}onMultipleOptionChange(e,t){return this.onOptionChange((i=>{-1!==e.indexOf(i)&&t()}))}_setupOptions(){const e=e=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key \"${e}\"`);return this.rawOptions[e]},i=(e,i)=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key \"${e}\"`);i=this._sanitizeAndValidateOption(e,i),this.rawOptions[e]!==i&&(this.rawOptions[e]=i,this._onOptionChange.fire(e))};for(const t in this.rawOptions){const s={get:e.bind(this,t),set:i.bind(this,t)};Object.defineProperty(this.options,t,s)}}_sanitizeAndValidateOption(e,i){switch(e){case\"cursorStyle\":if(i||(i=t.DEFAULT_OPTIONS[e]),!function(e){return\"block\"===e||\"underline\"===e||\"bar\"===e}(i))throw new Error(`\"${i}\" is not a valid value for ${e}`);break;case\"wordSeparator\":i||(i=t.DEFAULT_OPTIONS[e]);break;case\"fontWeight\":case\"fontWeightBold\":if(\"number\"==typeof i&&1<=i&&i<=1e3)break;i=o.includes(i)?i:t.DEFAULT_OPTIONS[e];break;case\"cursorWidth\":i=Math.floor(i);case\"lineHeight\":case\"tabStopWidth\":if(i<1)throw new Error(`${e} cannot be less than 1, value: ${i}`);break;case\"minimumContrastRatio\":i=Math.max(1,Math.min(21,Math.round(10*i)/10));break;case\"scrollback\":if((i=Math.min(i,4294967295))<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);break;case\"fastScrollSensitivity\":case\"scrollSensitivity\":if(i<=0)throw new Error(`${e} cannot be less than or equal to 0, value: ${i}`);break;case\"rows\":case\"cols\":if(!i&&0!==i)throw new Error(`${e} must be numeric, value: ${i}`);break;case\"windowsPty\":i=i??{}}return i}}t.OptionsService=a},2660:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.OscLinkService=void 0;const n=i(2585);let o=t.OscLinkService=class{constructor(e){this._bufferService=e,this._nextId=1,this._entriesWithId=new Map,this._dataByLinkId=new Map}registerLink(e){const t=this._bufferService.buffer;if(void 0===e.id){const i=t.addMarker(t.ybase+t.y),s={data:e,id:this._nextId++,lines:[i]};return i.onDispose((()=>this._removeMarkerFromLink(s,i))),this._dataByLinkId.set(s.id,s),s.id}const i=e,s=this._getEntryIdKey(i),r=this._entriesWithId.get(s);if(r)return this.addLineToLink(r.id,t.ybase+t.y),r.id;const n=t.addMarker(t.ybase+t.y),o={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[n]};return n.onDispose((()=>this._removeMarkerFromLink(o,n))),this._entriesWithId.set(o.key,o),this._dataByLinkId.set(o.id,o),o.id}addLineToLink(e,t){const i=this._dataByLinkId.get(e);if(i&&i.lines.every((e=>e.line!==t))){const e=this._bufferService.buffer.addMarker(t);i.lines.push(e),e.onDispose((()=>this._removeMarkerFromLink(i,e)))}}getLinkData(e){return this._dataByLinkId.get(e)?.data}_getEntryIdKey(e){return`${e.id};;${e.uri}`}_removeMarkerFromLink(e,t){const i=e.lines.indexOf(t);-1!==i&&(e.lines.splice(i,1),0===e.lines.length&&(void 0!==e.data.id&&this._entriesWithId.delete(e.key),this._dataByLinkId.delete(e.id)))}};t.OscLinkService=o=s([r(0,n.IBufferService)],o)},8343:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0;const i=\"di$target\",s=\"di$dependencies\";t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e[s]||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const r=function(e,t,n){if(3!==arguments.length)throw new Error(\"@IServiceName-decorator can only be used to decorate a parameter\");!function(e,t,r){t[i]===t?t[s].push({id:e,index:r}):(t[s]=[{id:e,index:r}],t[i]=t)}(r,e,n)};return r.toString=()=>e,t.serviceRegistry.set(e,r),r}},2585:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.IDecorationService=t.IUnicodeService=t.IOscLinkService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;const s=i(8343);var r;t.IBufferService=(0,s.createDecorator)(\"BufferService\"),t.ICoreMouseService=(0,s.createDecorator)(\"CoreMouseService\"),t.ICoreService=(0,s.createDecorator)(\"CoreService\"),t.ICharsetService=(0,s.createDecorator)(\"CharsetService\"),t.IInstantiationService=(0,s.createDecorator)(\"InstantiationService\"),function(e){e[e.TRACE=0]=\"TRACE\",e[e.DEBUG=1]=\"DEBUG\",e[e.INFO=2]=\"INFO\",e[e.WARN=3]=\"WARN\",e[e.ERROR=4]=\"ERROR\",e[e.OFF=5]=\"OFF\"}(r||(t.LogLevelEnum=r={})),t.ILogService=(0,s.createDecorator)(\"LogService\"),t.IOptionsService=(0,s.createDecorator)(\"OptionsService\"),t.IOscLinkService=(0,s.createDecorator)(\"OscLinkService\"),t.IUnicodeService=(0,s.createDecorator)(\"UnicodeService\"),t.IDecorationService=(0,s.createDecorator)(\"DecorationService\")},1480:(e,t,i)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.UnicodeService=void 0;const s=i(8460),r=i(225);class n{static extractShouldJoin(e){return 0!=(1&e)}static extractWidth(e){return e>>1&3}static extractCharKind(e){return e>>3}static createPropertyValue(e,t,i=!1){return(16777215&e)<<3|(3&t)<<1|(i?1:0)}constructor(){this._providers=Object.create(null),this._active=\"\",this._onChange=new s.EventEmitter,this.onChange=this._onChange.event;const e=new r.UnicodeV6;this.register(e),this._active=e.version,this._activeProvider=e}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(e){if(!this._providers[e])throw new Error(`unknown Unicode version \"${e}\"`);this._active=e,this._activeProvider=this._providers[e],this._onChange.fire(e)}register(e){this._providers[e.version]=e}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0,i=0;const s=e.length;for(let r=0;r=s)return t+this.wcwidth(o);const i=e.charCodeAt(r);56320<=i&&i<=57343?o=1024*(o-55296)+i-56320+65536:t+=this.wcwidth(i)}const a=this.charProperties(o,i);let h=n.extractWidth(a);n.extractShouldJoin(a)&&(h-=n.extractWidth(i)),t+=h,i=a}return t}charProperties(e,t){return this._activeProvider.charProperties(e,t)}}t.UnicodeService=n}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var n=t[s]={exports:{}};return e[s].call(n.exports,n,n.exports,i),n.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,\"__esModule\",{value:!0}),e.Terminal=void 0;const t=i(9042),r=i(3236),n=i(844),o=i(5741),a=i(8285),h=i(7975),c=i(7090),l=[\"cols\",\"rows\"];class d extends n.Disposable{constructor(e){super(),this._core=this.register(new r.Terminal(e)),this._addonManager=this.register(new o.AddonManager),this._publicOptions={...this._core.options};const t=e=>this._core.options[e],i=(e,t)=>{this._checkReadonlyOptions(e),this._core.options[e]=t};for(const e in this._core.options){const s={get:t.bind(this,e),set:i.bind(this,e)};Object.defineProperty(this._publicOptions,e,s)}}_checkReadonlyOptions(e){if(l.includes(e))throw new Error(`Option \"${e}\" can only be set in the constructor`)}_checkProposedApi(){if(!this._core.optionsService.rawOptions.allowProposedApi)throw new Error(\"You must set the allowProposedApi option to true to use proposed API\")}get onBell(){return this._core.onBell}get onBinary(){return this._core.onBinary}get onCursorMove(){return this._core.onCursorMove}get onData(){return this._core.onData}get onKey(){return this._core.onKey}get onLineFeed(){return this._core.onLineFeed}get onRender(){return this._core.onRender}get onResize(){return this._core.onResize}get onScroll(){return this._core.onScroll}get onSelectionChange(){return this._core.onSelectionChange}get onTitleChange(){return this._core.onTitleChange}get onWriteParsed(){return this._core.onWriteParsed}get element(){return this._core.element}get parser(){return this._parser||(this._parser=new h.ParserApi(this._core)),this._parser}get unicode(){return this._checkProposedApi(),new c.UnicodeApi(this._core)}get textarea(){return this._core.textarea}get rows(){return this._core.rows}get cols(){return this._core.cols}get buffer(){return this._buffer||(this._buffer=this.register(new a.BufferNamespaceApi(this._core))),this._buffer}get markers(){return this._checkProposedApi(),this._core.markers}get modes(){const e=this._core.coreService.decPrivateModes;let t=\"none\";switch(this._core.coreMouseService.activeProtocol){case\"X10\":t=\"x10\";break;case\"VT200\":t=\"vt200\";break;case\"DRAG\":t=\"drag\";break;case\"ANY\":t=\"any\"}return{applicationCursorKeysMode:e.applicationCursorKeys,applicationKeypadMode:e.applicationKeypad,bracketedPasteMode:e.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:t,originMode:e.origin,reverseWraparoundMode:e.reverseWraparound,sendFocusMode:e.sendFocus,wraparoundMode:e.wraparound}}get options(){return this._publicOptions}set options(e){for(const t in e)this._publicOptions[t]=e[t]}blur(){this._core.blur()}focus(){this._core.focus()}input(e,t=!0){this._core.input(e,t)}resize(e,t){this._verifyIntegers(e,t),this._core.resize(e,t)}open(e){this._core.open(e)}attachCustomKeyEventHandler(e){this._core.attachCustomKeyEventHandler(e)}attachCustomWheelEventHandler(e){this._core.attachCustomWheelEventHandler(e)}registerLinkProvider(e){return this._core.registerLinkProvider(e)}registerCharacterJoiner(e){return this._checkProposedApi(),this._core.registerCharacterJoiner(e)}deregisterCharacterJoiner(e){this._checkProposedApi(),this._core.deregisterCharacterJoiner(e)}registerMarker(e=0){return this._verifyIntegers(e),this._core.registerMarker(e)}registerDecoration(e){return this._checkProposedApi(),this._verifyPositiveIntegers(e.x??0,e.width??0,e.height??0),this._core.registerDecoration(e)}hasSelection(){return this._core.hasSelection()}select(e,t,i){this._verifyIntegers(e,t,i),this._core.select(e,t,i)}getSelection(){return this._core.getSelection()}getSelectionPosition(){return this._core.getSelectionPosition()}clearSelection(){this._core.clearSelection()}selectAll(){this._core.selectAll()}selectLines(e,t){this._verifyIntegers(e,t),this._core.selectLines(e,t)}dispose(){super.dispose()}scrollLines(e){this._verifyIntegers(e),this._core.scrollLines(e)}scrollPages(e){this._verifyIntegers(e),this._core.scrollPages(e)}scrollToTop(){this._core.scrollToTop()}scrollToBottom(){this._core.scrollToBottom()}scrollToLine(e){this._verifyIntegers(e),this._core.scrollToLine(e)}clear(){this._core.clear()}write(e,t){this._core.write(e,t)}writeln(e,t){this._core.write(e),this._core.write(\"\\r\\n\",t)}paste(e){this._core.paste(e)}refresh(e,t){this._verifyIntegers(e,t),this._core.refresh(e,t)}reset(){this._core.reset()}clearTextureAtlas(){this._core.clearTextureAtlas()}loadAddon(e){this._addonManager.loadAddon(this,e)}static get strings(){return t}_verifyIntegers(...e){for(const t of e)if(t===1/0||isNaN(t)||t%1!=0)throw new Error(\"This API only accepts integers\")}_verifyPositiveIntegers(...e){for(const t of e)if(t&&(t===1/0||isNaN(t)||t%1!=0||t<0))throw new Error(\"This API only accepts positive integers\")}}e.Terminal=d})(),s})()));\n//# sourceMappingURL=xterm.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RCxlQUFlLGlDQUFpQyx1QkFBdUIseUNBQXlDLGlCQUFpQiw0QkFBNEIsWUFBWSx1QkFBdUIsaUJBQWlCLHNEQUFzRCxVQUFVLGdCQUFnQixlQUFlLGtEQUFrRCxlQUFlLGtEQUFrRCxjQUFjLHlCQUF5QixpQkFBaUIsNEJBQTRCLGdCQUFnQixtREFBbUQsUUFBUSxtQkFBbUIsV0FBVyxzQkFBc0IsYUFBYSwrQ0FBK0MsU0FBUyxvQkFBb0IsYUFBYSxrREFBa0QsUUFBUSxtQkFBbUIsb0JBQW9CLCtCQUErQixhQUFhLHFDQUFxQyxxQkFBcUIsU0FBUyxzQkFBc0IsZ0dBQWdHLDhCQUE4QixvSEFBb0gsYUFBYSxNQUFNO0FBQy83MFIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ydHR5LXdlYnBhY2svLi9ub2RlX21vZHVsZXMvQHh0ZXJtL3h0ZXJtL2xpYi94dGVybS5qcz84MTIyIl0sInNvdXJjZXNDb250ZW50IjpbIiFmdW5jdGlvbihlLHQpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPXQoKTtlbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sdCk7ZWxzZXt2YXIgaT10KCk7Zm9yKHZhciBzIGluIGkpKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHM6ZSlbc109aVtzXX19KGdsb2JhbFRoaXMsKCgpPT4oKCk9PntcInVzZSBzdHJpY3RcIjt2YXIgZT17NDU2NzpmdW5jdGlvbihlLHQsaSl7dmFyIHM9dGhpcyYmdGhpcy5fX2RlY29yYXRlfHxmdW5jdGlvbihlLHQsaSxzKXt2YXIgcixuPWFyZ3VtZW50cy5sZW5ndGgsbz1uPDM/dDpudWxsPT09cz9zPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxpKTpzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBSZWZsZWN0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKW89UmVmbGVjdC5kZWNvcmF0ZShlLHQsaSxzKTtlbHNlIGZvcih2YXIgYT1lLmxlbmd0aC0xO2E+PTA7YS0tKShyPWVbYV0pJiYobz0objwzP3Iobyk6bj4zP3IodCxpLG8pOnIodCxpKSl8fG8pO3JldHVybiBuPjMmJm8mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGksbyksb30scj10aGlzJiZ0aGlzLl9fcGFyYW18fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGkscyl7dChpLHMsZSl9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkFjY2Vzc2liaWxpdHlNYW5hZ2VyPXZvaWQgMDtjb25zdCBuPWkoOTA0Miksbz1pKDk5MjQpLGE9aSg4NDQpLGg9aSg0NzI1KSxjPWkoMjU4NSksbD1pKDM2NTYpO2xldCBkPXQuQWNjZXNzaWJpbGl0eU1hbmFnZXI9Y2xhc3MgZXh0ZW5kcyBhLkRpc3Bvc2FibGV7Y29uc3RydWN0b3IoZSx0LGkscyl7c3VwZXIoKSx0aGlzLl90ZXJtaW5hbD1lLHRoaXMuX2NvcmVCcm93c2VyU2VydmljZT1pLHRoaXMuX3JlbmRlclNlcnZpY2U9cyx0aGlzLl9yb3dDb2x1bW5zPW5ldyBXZWFrTWFwLHRoaXMuX2xpdmVSZWdpb25MaW5lQ291bnQ9MCx0aGlzLl9jaGFyc1RvQ29uc3VtZT1bXSx0aGlzLl9jaGFyc1RvQW5ub3VuY2U9XCJcIix0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyPXRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5tYWluRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ4dGVybS1hY2Nlc3NpYmlsaXR5XCIpLHRoaXMuX3Jvd0NvbnRhaW5lcj10aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UubWFpbkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5fcm93Q29udGFpbmVyLnNldEF0dHJpYnV0ZShcInJvbGVcIixcImxpc3RcIiksdGhpcy5fcm93Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ4dGVybS1hY2Nlc3NpYmlsaXR5LXRyZWVcIiksdGhpcy5fcm93RWxlbWVudHM9W107Zm9yKGxldCBlPTA7ZTx0aGlzLl90ZXJtaW5hbC5yb3dzO2UrKyl0aGlzLl9yb3dFbGVtZW50c1tlXT10aGlzLl9jcmVhdGVBY2Nlc3NpYmlsaXR5VHJlZU5vZGUoKSx0aGlzLl9yb3dDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fcm93RWxlbWVudHNbZV0pO2lmKHRoaXMuX3RvcEJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcj1lPT50aGlzLl9oYW5kbGVCb3VuZGFyeUZvY3VzKGUsMCksdGhpcy5fYm90dG9tQm91bmRhcnlGb2N1c0xpc3RlbmVyPWU9PnRoaXMuX2hhbmRsZUJvdW5kYXJ5Rm9jdXMoZSwxKSx0aGlzLl9yb3dFbGVtZW50c1swXS5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIix0aGlzLl90b3BCb3VuZGFyeUZvY3VzTGlzdGVuZXIpLHRoaXMuX3Jvd0VsZW1lbnRzW3RoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aC0xXS5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIix0aGlzLl9ib3R0b21Cb3VuZGFyeUZvY3VzTGlzdGVuZXIpLHRoaXMuX3JlZnJlc2hSb3dzRGltZW5zaW9ucygpLHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fcm93Q29udGFpbmVyKSx0aGlzLl9saXZlUmVnaW9uPXRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5tYWluRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLl9saXZlUmVnaW9uLmNsYXNzTGlzdC5hZGQoXCJsaXZlLXJlZ2lvblwiKSx0aGlzLl9saXZlUmVnaW9uLnNldEF0dHJpYnV0ZShcImFyaWEtbGl2ZVwiLFwiYXNzZXJ0aXZlXCIpLHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fbGl2ZVJlZ2lvbiksdGhpcy5fbGl2ZVJlZ2lvbkRlYm91bmNlcj10aGlzLnJlZ2lzdGVyKG5ldyBvLlRpbWVCYXNlZERlYm91bmNlcih0aGlzLl9yZW5kZXJSb3dzLmJpbmQodGhpcykpKSwhdGhpcy5fdGVybWluYWwuZWxlbWVudCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZW5hYmxlIGFjY2Vzc2liaWxpdHkgYmVmb3JlIFRlcm1pbmFsLm9wZW5cIik7dGhpcy5fdGVybWluYWwuZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsdGhpcy5fYWNjZXNzaWJpbGl0eUNvbnRhaW5lciksdGhpcy5yZWdpc3Rlcih0aGlzLl90ZXJtaW5hbC5vblJlc2l6ZSgoZT0+dGhpcy5faGFuZGxlUmVzaXplKGUucm93cykpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl90ZXJtaW5hbC5vblJlbmRlcigoZT0+dGhpcy5fcmVmcmVzaFJvd3MoZS5zdGFydCxlLmVuZCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl90ZXJtaW5hbC5vblNjcm9sbCgoKCk9PnRoaXMuX3JlZnJlc2hSb3dzKCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl90ZXJtaW5hbC5vbkExMXlDaGFyKChlPT50aGlzLl9oYW5kbGVDaGFyKGUpKSkpLHRoaXMucmVnaXN0ZXIodGhpcy5fdGVybWluYWwub25MaW5lRmVlZCgoKCk9PnRoaXMuX2hhbmRsZUNoYXIoXCJcXG5cIikpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl90ZXJtaW5hbC5vbkExMXlUYWIoKGU9PnRoaXMuX2hhbmRsZVRhYihlKSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX3Rlcm1pbmFsLm9uS2V5KChlPT50aGlzLl9oYW5kbGVLZXkoZS5rZXkpKSkpLHRoaXMucmVnaXN0ZXIodGhpcy5fdGVybWluYWwub25CbHVyKCgoKT0+dGhpcy5fY2xlYXJMaXZlUmVnaW9uKCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uRGltZW5zaW9uc0NoYW5nZSgoKCk9PnRoaXMuX3JlZnJlc2hSb3dzRGltZW5zaW9ucygpKSkpLHRoaXMucmVnaXN0ZXIoKDAsbC5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKGRvY3VtZW50LFwic2VsZWN0aW9uY2hhbmdlXCIsKCgpPT50aGlzLl9oYW5kbGVTZWxlY3Rpb25DaGFuZ2UoKSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5vbkRwckNoYW5nZSgoKCk9PnRoaXMuX3JlZnJlc2hSb3dzRGltZW5zaW9ucygpKSkpLHRoaXMuX3JlZnJlc2hSb3dzKCksdGhpcy5yZWdpc3RlcigoMCxhLnRvRGlzcG9zYWJsZSkoKCgpPT57dGhpcy5fYWNjZXNzaWJpbGl0eUNvbnRhaW5lci5yZW1vdmUoKSx0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGg9MH0pKSl9X2hhbmRsZVRhYihlKXtmb3IobGV0IHQ9MDt0PGU7dCsrKXRoaXMuX2hhbmRsZUNoYXIoXCIgXCIpfV9oYW5kbGVDaGFyKGUpe3RoaXMuX2xpdmVSZWdpb25MaW5lQ291bnQ8MjEmJih0aGlzLl9jaGFyc1RvQ29uc3VtZS5sZW5ndGg+MD90aGlzLl9jaGFyc1RvQ29uc3VtZS5zaGlmdCgpIT09ZSYmKHRoaXMuX2NoYXJzVG9Bbm5vdW5jZSs9ZSk6dGhpcy5fY2hhcnNUb0Fubm91bmNlKz1lLFwiXFxuXCI9PT1lJiYodGhpcy5fbGl2ZVJlZ2lvbkxpbmVDb3VudCsrLDIxPT09dGhpcy5fbGl2ZVJlZ2lvbkxpbmVDb3VudCYmKHRoaXMuX2xpdmVSZWdpb24udGV4dENvbnRlbnQrPW4udG9vTXVjaE91dHB1dCkpKX1fY2xlYXJMaXZlUmVnaW9uKCl7dGhpcy5fbGl2ZVJlZ2lvbi50ZXh0Q29udGVudD1cIlwiLHRoaXMuX2xpdmVSZWdpb25MaW5lQ291bnQ9MH1faGFuZGxlS2V5KGUpe3RoaXMuX2NsZWFyTGl2ZVJlZ2lvbigpLC9cXHB7Q29udHJvbH0vdS50ZXN0KGUpfHx0aGlzLl9jaGFyc1RvQ29uc3VtZS5wdXNoKGUpfV9yZWZyZXNoUm93cyhlLHQpe3RoaXMuX2xpdmVSZWdpb25EZWJvdW5jZXIucmVmcmVzaChlLHQsdGhpcy5fdGVybWluYWwucm93cyl9X3JlbmRlclJvd3MoZSx0KXtjb25zdCBpPXRoaXMuX3Rlcm1pbmFsLmJ1ZmZlcixzPWkubGluZXMubGVuZ3RoLnRvU3RyaW5nKCk7Zm9yKGxldCByPWU7cjw9dDtyKyspe2NvbnN0IGU9aS5saW5lcy5nZXQoaS55ZGlzcCtyKSx0PVtdLG49ZT8udHJhbnNsYXRlVG9TdHJpbmcoITAsdm9pZCAwLHZvaWQgMCx0KXx8XCJcIixvPShpLnlkaXNwK3IrMSkudG9TdHJpbmcoKSxhPXRoaXMuX3Jvd0VsZW1lbnRzW3JdO2EmJigwPT09bi5sZW5ndGg/KGEuaW5uZXJUZXh0PVwiwqBcIix0aGlzLl9yb3dDb2x1bW5zLnNldChhLFswLDFdKSk6KGEudGV4dENvbnRlbnQ9bix0aGlzLl9yb3dDb2x1bW5zLnNldChhLHQpKSxhLnNldEF0dHJpYnV0ZShcImFyaWEtcG9zaW5zZXRcIixvKSxhLnNldEF0dHJpYnV0ZShcImFyaWEtc2V0c2l6ZVwiLHMpKX10aGlzLl9hbm5vdW5jZUNoYXJhY3RlcnMoKX1fYW5ub3VuY2VDaGFyYWN0ZXJzKCl7MCE9PXRoaXMuX2NoYXJzVG9Bbm5vdW5jZS5sZW5ndGgmJih0aGlzLl9saXZlUmVnaW9uLnRleHRDb250ZW50Kz10aGlzLl9jaGFyc1RvQW5ub3VuY2UsdGhpcy5fY2hhcnNUb0Fubm91bmNlPVwiXCIpfV9oYW5kbGVCb3VuZGFyeUZvY3VzKGUsdCl7Y29uc3QgaT1lLnRhcmdldCxzPXRoaXMuX3Jvd0VsZW1lbnRzWzA9PT10PzE6dGhpcy5fcm93RWxlbWVudHMubGVuZ3RoLTJdO2lmKGkuZ2V0QXR0cmlidXRlKFwiYXJpYS1wb3NpbnNldFwiKT09PSgwPT09dD9cIjFcIjpgJHt0aGlzLl90ZXJtaW5hbC5idWZmZXIubGluZXMubGVuZ3RofWApKXJldHVybjtpZihlLnJlbGF0ZWRUYXJnZXQhPT1zKXJldHVybjtsZXQgcixuO2lmKDA9PT10PyhyPWksbj10aGlzLl9yb3dFbGVtZW50cy5wb3AoKSx0aGlzLl9yb3dDb250YWluZXIucmVtb3ZlQ2hpbGQobikpOihyPXRoaXMuX3Jvd0VsZW1lbnRzLnNoaWZ0KCksbj1pLHRoaXMuX3Jvd0NvbnRhaW5lci5yZW1vdmVDaGlsZChyKSksci5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNcIix0aGlzLl90b3BCb3VuZGFyeUZvY3VzTGlzdGVuZXIpLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsdGhpcy5fYm90dG9tQm91bmRhcnlGb2N1c0xpc3RlbmVyKSwwPT09dCl7Y29uc3QgZT10aGlzLl9jcmVhdGVBY2Nlc3NpYmlsaXR5VHJlZU5vZGUoKTt0aGlzLl9yb3dFbGVtZW50cy51bnNoaWZ0KGUpLHRoaXMuX3Jvd0NvbnRhaW5lci5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsZSl9ZWxzZXtjb25zdCBlPXRoaXMuX2NyZWF0ZUFjY2Vzc2liaWxpdHlUcmVlTm9kZSgpO3RoaXMuX3Jvd0VsZW1lbnRzLnB1c2goZSksdGhpcy5fcm93Q29udGFpbmVyLmFwcGVuZENoaWxkKGUpfXRoaXMuX3Jvd0VsZW1lbnRzWzBdLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLHRoaXMuX3RvcEJvdW5kYXJ5Rm9jdXNMaXN0ZW5lciksdGhpcy5fcm93RWxlbWVudHNbdGhpcy5fcm93RWxlbWVudHMubGVuZ3RoLTFdLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLHRoaXMuX2JvdHRvbUJvdW5kYXJ5Rm9jdXNMaXN0ZW5lciksdGhpcy5fdGVybWluYWwuc2Nyb2xsTGluZXMoMD09PXQ/LTE6MSksdGhpcy5fcm93RWxlbWVudHNbMD09PXQ/MTp0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGgtMl0uZm9jdXMoKSxlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1faGFuZGxlU2VsZWN0aW9uQ2hhbmdlKCl7aWYoMD09PXRoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aClyZXR1cm47Y29uc3QgZT1kb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtpZighZSlyZXR1cm47aWYoZS5pc0NvbGxhcHNlZClyZXR1cm4gdm9pZCh0aGlzLl9yb3dDb250YWluZXIuY29udGFpbnMoZS5hbmNob3JOb2RlKSYmdGhpcy5fdGVybWluYWwuY2xlYXJTZWxlY3Rpb24oKSk7aWYoIWUuYW5jaG9yTm9kZXx8IWUuZm9jdXNOb2RlKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoXCJhbmNob3JOb2RlIGFuZC9vciBmb2N1c05vZGUgYXJlIG51bGxcIik7bGV0IHQ9e25vZGU6ZS5hbmNob3JOb2RlLG9mZnNldDplLmFuY2hvck9mZnNldH0saT17bm9kZTplLmZvY3VzTm9kZSxvZmZzZXQ6ZS5mb2N1c09mZnNldH07aWYoKHQubm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpLm5vZGUpJk5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HfHx0Lm5vZGU9PT1pLm5vZGUmJnQub2Zmc2V0Pmkub2Zmc2V0KSYmKFt0LGldPVtpLHRdKSx0Lm5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5fcm93RWxlbWVudHNbMF0pJihOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWXxOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykmJih0PXtub2RlOnRoaXMuX3Jvd0VsZW1lbnRzWzBdLmNoaWxkTm9kZXNbMF0sb2Zmc2V0OjB9KSwhdGhpcy5fcm93Q29udGFpbmVyLmNvbnRhaW5zKHQubm9kZSkpcmV0dXJuO2NvbnN0IHM9dGhpcy5fcm93RWxlbWVudHMuc2xpY2UoLTEpWzBdO2lmKGkubm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzKSYoTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQll8Tm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpJiYoaT17bm9kZTpzLG9mZnNldDpzLnRleHRDb250ZW50Py5sZW5ndGg/PzB9KSwhdGhpcy5fcm93Q29udGFpbmVyLmNvbnRhaW5zKGkubm9kZSkpcmV0dXJuO2NvbnN0IHI9KHtub2RlOmUsb2Zmc2V0OnR9KT0+e2NvbnN0IGk9ZSBpbnN0YW5jZW9mIFRleHQ/ZS5wYXJlbnROb2RlOmU7bGV0IHM9cGFyc2VJbnQoaT8uZ2V0QXR0cmlidXRlKFwiYXJpYS1wb3NpbnNldFwiKSwxMCktMTtpZihpc05hTihzKSlyZXR1cm4gY29uc29sZS53YXJuKFwicm93IGlzIGludmFsaWQuIFJhY2UgY29uZGl0aW9uP1wiKSxudWxsO2NvbnN0IHI9dGhpcy5fcm93Q29sdW1ucy5nZXQoaSk7aWYoIXIpcmV0dXJuIGNvbnNvbGUud2FybihcImNvbHVtbnMgaXMgbnVsbC4gUmFjZSBjb25kaXRpb24/XCIpLG51bGw7bGV0IG49dDxyLmxlbmd0aD9yW3RdOnIuc2xpY2UoLTEpWzBdKzE7cmV0dXJuIG4+PXRoaXMuX3Rlcm1pbmFsLmNvbHMmJigrK3Msbj0wKSx7cm93OnMsY29sdW1uOm59fSxuPXIodCksbz1yKGkpO2lmKG4mJm8pe2lmKG4ucm93Pm8ucm93fHxuLnJvdz09PW8ucm93JiZuLmNvbHVtbj49by5jb2x1bW4pdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCByYW5nZVwiKTt0aGlzLl90ZXJtaW5hbC5zZWxlY3Qobi5jb2x1bW4sbi5yb3csKG8ucm93LW4ucm93KSp0aGlzLl90ZXJtaW5hbC5jb2xzLW4uY29sdW1uK28uY29sdW1uKX19X2hhbmRsZVJlc2l6ZShlKXt0aGlzLl9yb3dFbGVtZW50c1t0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGgtMV0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsdGhpcy5fYm90dG9tQm91bmRhcnlGb2N1c0xpc3RlbmVyKTtmb3IobGV0IGU9dGhpcy5fcm93Q29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aDtlPHRoaXMuX3Rlcm1pbmFsLnJvd3M7ZSsrKXRoaXMuX3Jvd0VsZW1lbnRzW2VdPXRoaXMuX2NyZWF0ZUFjY2Vzc2liaWxpdHlUcmVlTm9kZSgpLHRoaXMuX3Jvd0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9yb3dFbGVtZW50c1tlXSk7Zm9yKDt0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGg+ZTspdGhpcy5fcm93Q29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuX3Jvd0VsZW1lbnRzLnBvcCgpKTt0aGlzLl9yb3dFbGVtZW50c1t0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGgtMV0uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsdGhpcy5fYm90dG9tQm91bmRhcnlGb2N1c0xpc3RlbmVyKSx0aGlzLl9yZWZyZXNoUm93c0RpbWVuc2lvbnMoKX1fY3JlYXRlQWNjZXNzaWJpbGl0eVRyZWVOb2RlKCl7Y29uc3QgZT10aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UubWFpbkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7cmV0dXJuIGUuc2V0QXR0cmlidXRlKFwicm9sZVwiLFwibGlzdGl0ZW1cIiksZS50YWJJbmRleD0tMSx0aGlzLl9yZWZyZXNoUm93RGltZW5zaW9ucyhlKSxlfV9yZWZyZXNoUm93c0RpbWVuc2lvbnMoKXtpZih0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0KXt0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyLnN0eWxlLndpZHRoPWAke3RoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRofXB4YCx0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGghPT10aGlzLl90ZXJtaW5hbC5yb3dzJiZ0aGlzLl9oYW5kbGVSZXNpemUodGhpcy5fdGVybWluYWwucm93cyk7Zm9yKGxldCBlPTA7ZTx0aGlzLl90ZXJtaW5hbC5yb3dzO2UrKyl0aGlzLl9yZWZyZXNoUm93RGltZW5zaW9ucyh0aGlzLl9yb3dFbGVtZW50c1tlXSl9fV9yZWZyZXNoUm93RGltZW5zaW9ucyhlKXtlLnN0eWxlLmhlaWdodD1gJHt0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0fXB4YH19O3QuQWNjZXNzaWJpbGl0eU1hbmFnZXI9ZD1zKFtyKDEsYy5JSW5zdGFudGlhdGlvblNlcnZpY2UpLHIoMixoLklDb3JlQnJvd3NlclNlcnZpY2UpLHIoMyxoLklSZW5kZXJTZXJ2aWNlKV0sZCl9LDM2MTQ6KGUsdCk9PntmdW5jdGlvbiBpKGUpe3JldHVybiBlLnJlcGxhY2UoL1xccj9cXG4vZyxcIlxcclwiKX1mdW5jdGlvbiBzKGUsdCl7cmV0dXJuIHQ/XCJcdTAwMWJbMjAwflwiK2UrXCJcdTAwMWJbMjAxflwiOmV9ZnVuY3Rpb24gcihlLHQscixuKXtlPXMoZT1pKGUpLHIuZGVjUHJpdmF0ZU1vZGVzLmJyYWNrZXRlZFBhc3RlTW9kZSYmITAhPT1uLnJhd09wdGlvbnMuaWdub3JlQnJhY2tldGVkUGFzdGVNb2RlKSxyLnRyaWdnZXJEYXRhRXZlbnQoZSwhMCksdC52YWx1ZT1cIlwifWZ1bmN0aW9uIG4oZSx0LGkpe2NvbnN0IHM9aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPWUuY2xpZW50WC1zLmxlZnQtMTAsbj1lLmNsaWVudFktcy50b3AtMTA7dC5zdHlsZS53aWR0aD1cIjIwcHhcIix0LnN0eWxlLmhlaWdodD1cIjIwcHhcIix0LnN0eWxlLmxlZnQ9YCR7cn1weGAsdC5zdHlsZS50b3A9YCR7bn1weGAsdC5zdHlsZS56SW5kZXg9XCIxMDAwXCIsdC5mb2N1cygpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQucmlnaHRDbGlja0hhbmRsZXI9dC5tb3ZlVGV4dEFyZWFVbmRlck1vdXNlQ3Vyc29yPXQucGFzdGU9dC5oYW5kbGVQYXN0ZUV2ZW50PXQuY29weUhhbmRsZXI9dC5icmFja2V0VGV4dEZvclBhc3RlPXQucHJlcGFyZVRleHRGb3JUZXJtaW5hbD12b2lkIDAsdC5wcmVwYXJlVGV4dEZvclRlcm1pbmFsPWksdC5icmFja2V0VGV4dEZvclBhc3RlPXMsdC5jb3B5SGFuZGxlcj1mdW5jdGlvbihlLHQpe2UuY2xpcGJvYXJkRGF0YSYmZS5jbGlwYm9hcmREYXRhLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsdC5zZWxlY3Rpb25UZXh0KSxlLnByZXZlbnREZWZhdWx0KCl9LHQuaGFuZGxlUGFzdGVFdmVudD1mdW5jdGlvbihlLHQsaSxzKXtlLnN0b3BQcm9wYWdhdGlvbigpLGUuY2xpcGJvYXJkRGF0YSYmcihlLmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIiksdCxpLHMpfSx0LnBhc3RlPXIsdC5tb3ZlVGV4dEFyZWFVbmRlck1vdXNlQ3Vyc29yPW4sdC5yaWdodENsaWNrSGFuZGxlcj1mdW5jdGlvbihlLHQsaSxzLHIpe24oZSx0LGkpLHImJnMucmlnaHRDbGlja1NlbGVjdChlKSx0LnZhbHVlPXMuc2VsZWN0aW9uVGV4dCx0LnNlbGVjdCgpfX0sNzIzOTooZSx0LGkpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5Db2xvckNvbnRyYXN0Q2FjaGU9dm9pZCAwO2NvbnN0IHM9aSgxNTA1KTt0LkNvbG9yQ29udHJhc3RDYWNoZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2NvbG9yPW5ldyBzLlR3b0tleU1hcCx0aGlzLl9jc3M9bmV3IHMuVHdvS2V5TWFwfXNldENzcyhlLHQsaSl7dGhpcy5fY3NzLnNldChlLHQsaSl9Z2V0Q3NzKGUsdCl7cmV0dXJuIHRoaXMuX2Nzcy5nZXQoZSx0KX1zZXRDb2xvcihlLHQsaSl7dGhpcy5fY29sb3Iuc2V0KGUsdCxpKX1nZXRDb2xvcihlLHQpe3JldHVybiB0aGlzLl9jb2xvci5nZXQoZSx0KX1jbGVhcigpe3RoaXMuX2NvbG9yLmNsZWFyKCksdGhpcy5fY3NzLmNsZWFyKCl9fX0sMzY1NjooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyPXZvaWQgMCx0LmFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcj1mdW5jdGlvbihlLHQsaSxzKXtlLmFkZEV2ZW50TGlzdGVuZXIodCxpLHMpO2xldCByPSExO3JldHVybntkaXNwb3NlOigpPT57cnx8KHI9ITAsZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsaSxzKSl9fX19LDM1NTE6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzPXRoaXMmJnRoaXMuX19kZWNvcmF0ZXx8ZnVuY3Rpb24oZSx0LGkscyl7dmFyIHIsbj1hcmd1bWVudHMubGVuZ3RoLG89bjwzP3Q6bnVsbD09PXM/cz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsaSk6cztpZihcIm9iamVjdFwiPT10eXBlb2YgUmVmbGVjdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlvPVJlZmxlY3QuZGVjb3JhdGUoZSx0LGkscyk7ZWxzZSBmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSkocj1lW2FdKSYmKG89KG48Mz9yKG8pOm4+Mz9yKHQsaSxvKTpyKHQsaSkpfHxvKTtyZXR1cm4gbj4zJiZvJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLG8pLG99LHI9dGhpcyYmdGhpcy5fX3BhcmFtfHxmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihpLHMpe3QoaSxzLGUpfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5MaW5raWZpZXI9dm9pZCAwO2NvbnN0IG49aSgzNjU2KSxvPWkoODQ2MCksYT1pKDg0NCksaD1pKDI1ODUpLGM9aSg0NzI1KTtsZXQgbD10LkxpbmtpZmllcj1jbGFzcyBleHRlbmRzIGEuRGlzcG9zYWJsZXtnZXQgY3VycmVudExpbmsoKXtyZXR1cm4gdGhpcy5fY3VycmVudExpbmt9Y29uc3RydWN0b3IoZSx0LGkscyxyKXtzdXBlcigpLHRoaXMuX2VsZW1lbnQ9ZSx0aGlzLl9tb3VzZVNlcnZpY2U9dCx0aGlzLl9yZW5kZXJTZXJ2aWNlPWksdGhpcy5fYnVmZmVyU2VydmljZT1zLHRoaXMuX2xpbmtQcm92aWRlclNlcnZpY2U9cix0aGlzLl9saW5rQ2FjaGVEaXNwb3NhYmxlcz1bXSx0aGlzLl9pc01vdXNlT3V0PSEwLHRoaXMuX3dhc1Jlc2l6ZWQ9ITEsdGhpcy5fYWN0aXZlTGluZT0tMSx0aGlzLl9vblNob3dMaW5rVW5kZXJsaW5lPXRoaXMucmVnaXN0ZXIobmV3IG8uRXZlbnRFbWl0dGVyKSx0aGlzLm9uU2hvd0xpbmtVbmRlcmxpbmU9dGhpcy5fb25TaG93TGlua1VuZGVybGluZS5ldmVudCx0aGlzLl9vbkhpZGVMaW5rVW5kZXJsaW5lPXRoaXMucmVnaXN0ZXIobmV3IG8uRXZlbnRFbWl0dGVyKSx0aGlzLm9uSGlkZUxpbmtVbmRlcmxpbmU9dGhpcy5fb25IaWRlTGlua1VuZGVybGluZS5ldmVudCx0aGlzLnJlZ2lzdGVyKCgwLGEuZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZSkodGhpcy5fbGlua0NhY2hlRGlzcG9zYWJsZXMpKSx0aGlzLnJlZ2lzdGVyKCgwLGEudG9EaXNwb3NhYmxlKSgoKCk9Pnt0aGlzLl9sYXN0TW91c2VFdmVudD12b2lkIDAsdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzPy5jbGVhcigpfSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2Uub25SZXNpemUoKCgpPT57dGhpcy5fY2xlYXJDdXJyZW50TGluaygpLHRoaXMuX3dhc1Jlc2l6ZWQ9ITB9KSkpLHRoaXMucmVnaXN0ZXIoKDAsbi5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHRoaXMuX2VsZW1lbnQsXCJtb3VzZWxlYXZlXCIsKCgpPT57dGhpcy5faXNNb3VzZU91dD0hMCx0aGlzLl9jbGVhckN1cnJlbnRMaW5rKCl9KSkpLHRoaXMucmVnaXN0ZXIoKDAsbi5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHRoaXMuX2VsZW1lbnQsXCJtb3VzZW1vdmVcIix0aGlzLl9oYW5kbGVNb3VzZU1vdmUuYmluZCh0aGlzKSkpLHRoaXMucmVnaXN0ZXIoKDAsbi5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHRoaXMuX2VsZW1lbnQsXCJtb3VzZWRvd25cIix0aGlzLl9oYW5kbGVNb3VzZURvd24uYmluZCh0aGlzKSkpLHRoaXMucmVnaXN0ZXIoKDAsbi5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHRoaXMuX2VsZW1lbnQsXCJtb3VzZXVwXCIsdGhpcy5faGFuZGxlTW91c2VVcC5iaW5kKHRoaXMpKSl9X2hhbmRsZU1vdXNlTW92ZShlKXt0aGlzLl9sYXN0TW91c2VFdmVudD1lO2NvbnN0IHQ9dGhpcy5fcG9zaXRpb25Gcm9tTW91c2VFdmVudChlLHRoaXMuX2VsZW1lbnQsdGhpcy5fbW91c2VTZXJ2aWNlKTtpZighdClyZXR1cm47dGhpcy5faXNNb3VzZU91dD0hMTtjb25zdCBpPWUuY29tcG9zZWRQYXRoKCk7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspe2NvbnN0IHQ9aVtlXTtpZih0LmNsYXNzTGlzdC5jb250YWlucyhcInh0ZXJtXCIpKWJyZWFrO2lmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKFwieHRlcm0taG92ZXJcIikpcmV0dXJufXRoaXMuX2xhc3RCdWZmZXJDZWxsJiZ0Lng9PT10aGlzLl9sYXN0QnVmZmVyQ2VsbC54JiZ0Lnk9PT10aGlzLl9sYXN0QnVmZmVyQ2VsbC55fHwodGhpcy5faGFuZGxlSG92ZXIodCksdGhpcy5fbGFzdEJ1ZmZlckNlbGw9dCl9X2hhbmRsZUhvdmVyKGUpe2lmKHRoaXMuX2FjdGl2ZUxpbmUhPT1lLnl8fHRoaXMuX3dhc1Jlc2l6ZWQpcmV0dXJuIHRoaXMuX2NsZWFyQ3VycmVudExpbmsoKSx0aGlzLl9hc2tGb3JMaW5rKGUsITEpLHZvaWQodGhpcy5fd2FzUmVzaXplZD0hMSk7dGhpcy5fY3VycmVudExpbmsmJnRoaXMuX2xpbmtBdFBvc2l0aW9uKHRoaXMuX2N1cnJlbnRMaW5rLmxpbmssZSl8fCh0aGlzLl9jbGVhckN1cnJlbnRMaW5rKCksdGhpcy5fYXNrRm9yTGluayhlLCEwKSl9X2Fza0ZvckxpbmsoZSx0KXt0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMmJnR8fCh0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXM/LmZvckVhY2goKGU9PntlPy5mb3JFYWNoKChlPT57ZS5saW5rLmRpc3Bvc2UmJmUubGluay5kaXNwb3NlKCl9KSl9KSksdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzPW5ldyBNYXAsdGhpcy5fYWN0aXZlTGluZT1lLnkpO2xldCBpPSExO2Zvcihjb25zdFtzLHJdb2YgdGhpcy5fbGlua1Byb3ZpZGVyU2VydmljZS5saW5rUHJvdmlkZXJzLmVudHJpZXMoKSlpZih0KXtjb25zdCB0PXRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcz8uZ2V0KHMpO3QmJihpPXRoaXMuX2NoZWNrTGlua1Byb3ZpZGVyUmVzdWx0KHMsZSxpKSl9ZWxzZSByLnByb3ZpZGVMaW5rcyhlLnksKHQ9PntpZih0aGlzLl9pc01vdXNlT3V0KXJldHVybjtjb25zdCByPXQ/Lm1hcCgoZT0+KHtsaW5rOmV9KSkpO3RoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcz8uc2V0KHMsciksaT10aGlzLl9jaGVja0xpbmtQcm92aWRlclJlc3VsdChzLGUsaSksdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzPy5zaXplPT09dGhpcy5fbGlua1Byb3ZpZGVyU2VydmljZS5saW5rUHJvdmlkZXJzLmxlbmd0aCYmdGhpcy5fcmVtb3ZlSW50ZXJzZWN0aW5nTGlua3MoZS55LHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcyl9KSl9X3JlbW92ZUludGVyc2VjdGluZ0xpbmtzKGUsdCl7Y29uc3QgaT1uZXcgU2V0O2ZvcihsZXQgcz0wO3M8dC5zaXplO3MrKyl7Y29uc3Qgcj10LmdldChzKTtpZihyKWZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXtjb25zdCBzPXJbdF0sbj1zLmxpbmsucmFuZ2Uuc3RhcnQueTxlPzA6cy5saW5rLnJhbmdlLnN0YXJ0Lngsbz1zLmxpbmsucmFuZ2UuZW5kLnk+ZT90aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM6cy5saW5rLnJhbmdlLmVuZC54O2ZvcihsZXQgZT1uO2U8PW87ZSsrKXtpZihpLmhhcyhlKSl7ci5zcGxpY2UodC0tLDEpO2JyZWFrfWkuYWRkKGUpfX19fV9jaGVja0xpbmtQcm92aWRlclJlc3VsdChlLHQsaSl7aWYoIXRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcylyZXR1cm4gaTtjb25zdCBzPXRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcy5nZXQoZSk7bGV0IHI9ITE7Zm9yKGxldCB0PTA7dDxlO3QrKyl0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMuaGFzKHQpJiYhdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzLmdldCh0KXx8KHI9ITApO2lmKCFyJiZzKXtjb25zdCBlPXMuZmluZCgoZT0+dGhpcy5fbGlua0F0UG9zaXRpb24oZS5saW5rLHQpKSk7ZSYmKGk9ITAsdGhpcy5faGFuZGxlTmV3TGluayhlKSl9aWYodGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzLnNpemU9PT10aGlzLl9saW5rUHJvdmlkZXJTZXJ2aWNlLmxpbmtQcm92aWRlcnMubGVuZ3RoJiYhaSlmb3IobGV0IGU9MDtlPHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcy5zaXplO2UrKyl7Y29uc3Qgcz10aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMuZ2V0KGUpPy5maW5kKChlPT50aGlzLl9saW5rQXRQb3NpdGlvbihlLmxpbmssdCkpKTtpZihzKXtpPSEwLHRoaXMuX2hhbmRsZU5ld0xpbmsocyk7YnJlYWt9fXJldHVybiBpfV9oYW5kbGVNb3VzZURvd24oKXt0aGlzLl9tb3VzZURvd25MaW5rPXRoaXMuX2N1cnJlbnRMaW5rfV9oYW5kbGVNb3VzZVVwKGUpe2lmKCF0aGlzLl9jdXJyZW50TGluaylyZXR1cm47Y29uc3QgdD10aGlzLl9wb3NpdGlvbkZyb21Nb3VzZUV2ZW50KGUsdGhpcy5fZWxlbWVudCx0aGlzLl9tb3VzZVNlcnZpY2UpO3QmJnRoaXMuX21vdXNlRG93bkxpbms9PT10aGlzLl9jdXJyZW50TGluayYmdGhpcy5fbGlua0F0UG9zaXRpb24odGhpcy5fY3VycmVudExpbmsubGluayx0KSYmdGhpcy5fY3VycmVudExpbmsubGluay5hY3RpdmF0ZShlLHRoaXMuX2N1cnJlbnRMaW5rLmxpbmsudGV4dCl9X2NsZWFyQ3VycmVudExpbmsoZSx0KXt0aGlzLl9jdXJyZW50TGluayYmdGhpcy5fbGFzdE1vdXNlRXZlbnQmJighZXx8IXR8fHRoaXMuX2N1cnJlbnRMaW5rLmxpbmsucmFuZ2Uuc3RhcnQueT49ZSYmdGhpcy5fY3VycmVudExpbmsubGluay5yYW5nZS5lbmQueTw9dCkmJih0aGlzLl9saW5rTGVhdmUodGhpcy5fZWxlbWVudCx0aGlzLl9jdXJyZW50TGluay5saW5rLHRoaXMuX2xhc3RNb3VzZUV2ZW50KSx0aGlzLl9jdXJyZW50TGluaz12b2lkIDAsKDAsYS5kaXNwb3NlQXJyYXkpKHRoaXMuX2xpbmtDYWNoZURpc3Bvc2FibGVzKSl9X2hhbmRsZU5ld0xpbmsoZSl7aWYoIXRoaXMuX2xhc3RNb3VzZUV2ZW50KXJldHVybjtjb25zdCB0PXRoaXMuX3Bvc2l0aW9uRnJvbU1vdXNlRXZlbnQodGhpcy5fbGFzdE1vdXNlRXZlbnQsdGhpcy5fZWxlbWVudCx0aGlzLl9tb3VzZVNlcnZpY2UpO3QmJnRoaXMuX2xpbmtBdFBvc2l0aW9uKGUubGluayx0KSYmKHRoaXMuX2N1cnJlbnRMaW5rPWUsdGhpcy5fY3VycmVudExpbmsuc3RhdGU9e2RlY29yYXRpb25zOnt1bmRlcmxpbmU6dm9pZCAwPT09ZS5saW5rLmRlY29yYXRpb25zfHxlLmxpbmsuZGVjb3JhdGlvbnMudW5kZXJsaW5lLHBvaW50ZXJDdXJzb3I6dm9pZCAwPT09ZS5saW5rLmRlY29yYXRpb25zfHxlLmxpbmsuZGVjb3JhdGlvbnMucG9pbnRlckN1cnNvcn0saXNIb3ZlcmVkOiEwfSx0aGlzLl9saW5rSG92ZXIodGhpcy5fZWxlbWVudCxlLmxpbmssdGhpcy5fbGFzdE1vdXNlRXZlbnQpLGUubGluay5kZWNvcmF0aW9ucz17fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLmxpbmsuZGVjb3JhdGlvbnMse3BvaW50ZXJDdXJzb3I6e2dldDooKT0+dGhpcy5fY3VycmVudExpbms/LnN0YXRlPy5kZWNvcmF0aW9ucy5wb2ludGVyQ3Vyc29yLHNldDplPT57dGhpcy5fY3VycmVudExpbms/LnN0YXRlJiZ0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5kZWNvcmF0aW9ucy5wb2ludGVyQ3Vyc29yIT09ZSYmKHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmRlY29yYXRpb25zLnBvaW50ZXJDdXJzb3I9ZSx0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5pc0hvdmVyZWQmJnRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShcInh0ZXJtLWN1cnNvci1wb2ludGVyXCIsZSkpfX0sdW5kZXJsaW5lOntnZXQ6KCk9PnRoaXMuX2N1cnJlbnRMaW5rPy5zdGF0ZT8uZGVjb3JhdGlvbnMudW5kZXJsaW5lLHNldDp0PT57dGhpcy5fY3VycmVudExpbms/LnN0YXRlJiZ0aGlzLl9jdXJyZW50TGluaz8uc3RhdGU/LmRlY29yYXRpb25zLnVuZGVybGluZSE9PXQmJih0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5kZWNvcmF0aW9ucy51bmRlcmxpbmU9dCx0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5pc0hvdmVyZWQmJnRoaXMuX2ZpcmVVbmRlcmxpbmVFdmVudChlLmxpbmssdCkpfX19KSx0aGlzLl9saW5rQ2FjaGVEaXNwb3NhYmxlcy5wdXNoKHRoaXMuX3JlbmRlclNlcnZpY2Uub25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlKChlPT57aWYoIXRoaXMuX2N1cnJlbnRMaW5rKXJldHVybjtjb25zdCB0PTA9PT1lLnN0YXJ0PzA6ZS5zdGFydCsxK3RoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwLGk9dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3ArMStlLmVuZDtpZih0aGlzLl9jdXJyZW50TGluay5saW5rLnJhbmdlLnN0YXJ0Lnk+PXQmJnRoaXMuX2N1cnJlbnRMaW5rLmxpbmsucmFuZ2UuZW5kLnk8PWkmJih0aGlzLl9jbGVhckN1cnJlbnRMaW5rKHQsaSksdGhpcy5fbGFzdE1vdXNlRXZlbnQpKXtjb25zdCBlPXRoaXMuX3Bvc2l0aW9uRnJvbU1vdXNlRXZlbnQodGhpcy5fbGFzdE1vdXNlRXZlbnQsdGhpcy5fZWxlbWVudCx0aGlzLl9tb3VzZVNlcnZpY2UpO2UmJnRoaXMuX2Fza0ZvckxpbmsoZSwhMSl9fSkpKSl9X2xpbmtIb3ZlcihlLHQsaSl7dGhpcy5fY3VycmVudExpbms/LnN0YXRlJiYodGhpcy5fY3VycmVudExpbmsuc3RhdGUuaXNIb3ZlcmVkPSEwLHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmRlY29yYXRpb25zLnVuZGVybGluZSYmdGhpcy5fZmlyZVVuZGVybGluZUV2ZW50KHQsITApLHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmRlY29yYXRpb25zLnBvaW50ZXJDdXJzb3ImJmUuY2xhc3NMaXN0LmFkZChcInh0ZXJtLWN1cnNvci1wb2ludGVyXCIpKSx0LmhvdmVyJiZ0LmhvdmVyKGksdC50ZXh0KX1fZmlyZVVuZGVybGluZUV2ZW50KGUsdCl7Y29uc3QgaT1lLnJhbmdlLHM9dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3Ascj10aGlzLl9jcmVhdGVMaW5rVW5kZXJsaW5lRXZlbnQoaS5zdGFydC54LTEsaS5zdGFydC55LXMtMSxpLmVuZC54LGkuZW5kLnktcy0xLHZvaWQgMCk7KHQ/dGhpcy5fb25TaG93TGlua1VuZGVybGluZTp0aGlzLl9vbkhpZGVMaW5rVW5kZXJsaW5lKS5maXJlKHIpfV9saW5rTGVhdmUoZSx0LGkpe3RoaXMuX2N1cnJlbnRMaW5rPy5zdGF0ZSYmKHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmlzSG92ZXJlZD0hMSx0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5kZWNvcmF0aW9ucy51bmRlcmxpbmUmJnRoaXMuX2ZpcmVVbmRlcmxpbmVFdmVudCh0LCExKSx0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5kZWNvcmF0aW9ucy5wb2ludGVyQ3Vyc29yJiZlLmNsYXNzTGlzdC5yZW1vdmUoXCJ4dGVybS1jdXJzb3ItcG9pbnRlclwiKSksdC5sZWF2ZSYmdC5sZWF2ZShpLHQudGV4dCl9X2xpbmtBdFBvc2l0aW9uKGUsdCl7Y29uc3QgaT1lLnJhbmdlLnN0YXJ0LnkqdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzK2UucmFuZ2Uuc3RhcnQueCxzPWUucmFuZ2UuZW5kLnkqdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzK2UucmFuZ2UuZW5kLngscj10LnkqdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzK3QueDtyZXR1cm4gaTw9ciYmcjw9c31fcG9zaXRpb25Gcm9tTW91c2VFdmVudChlLHQsaSl7Y29uc3Qgcz1pLmdldENvb3JkcyhlLHQsdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyk7aWYocylyZXR1cm57eDpzWzBdLHk6c1sxXSt0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcH19X2NyZWF0ZUxpbmtVbmRlcmxpbmVFdmVudChlLHQsaSxzLHIpe3JldHVybnt4MTplLHkxOnQseDI6aSx5MjpzLGNvbHM6dGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLGZnOnJ9fX07dC5MaW5raWZpZXI9bD1zKFtyKDEsYy5JTW91c2VTZXJ2aWNlKSxyKDIsYy5JUmVuZGVyU2VydmljZSkscigzLGguSUJ1ZmZlclNlcnZpY2UpLHIoNCxjLklMaW5rUHJvdmlkZXJTZXJ2aWNlKV0sbCl9LDkwNDI6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LnRvb011Y2hPdXRwdXQ9dC5wcm9tcHRMYWJlbD12b2lkIDAsdC5wcm9tcHRMYWJlbD1cIlRlcm1pbmFsIGlucHV0XCIsdC50b29NdWNoT3V0cHV0PVwiVG9vIG11Y2ggb3V0cHV0IHRvIGFubm91bmNlLCBuYXZpZ2F0ZSB0byByb3dzIG1hbnVhbGx5IHRvIHJlYWRcIn0sMzczMDpmdW5jdGlvbihlLHQsaSl7dmFyIHM9dGhpcyYmdGhpcy5fX2RlY29yYXRlfHxmdW5jdGlvbihlLHQsaSxzKXt2YXIgcixuPWFyZ3VtZW50cy5sZW5ndGgsbz1uPDM/dDpudWxsPT09cz9zPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxpKTpzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBSZWZsZWN0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKW89UmVmbGVjdC5kZWNvcmF0ZShlLHQsaSxzKTtlbHNlIGZvcih2YXIgYT1lLmxlbmd0aC0xO2E+PTA7YS0tKShyPWVbYV0pJiYobz0objwzP3Iobyk6bj4zP3IodCxpLG8pOnIodCxpKSl8fG8pO3JldHVybiBuPjMmJm8mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGksbyksb30scj10aGlzJiZ0aGlzLl9fcGFyYW18fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGkscyl7dChpLHMsZSl9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0Lk9zY0xpbmtQcm92aWRlcj12b2lkIDA7Y29uc3Qgbj1pKDUxMSksbz1pKDI1ODUpO2xldCBhPXQuT3NjTGlua1Byb3ZpZGVyPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxpKXt0aGlzLl9idWZmZXJTZXJ2aWNlPWUsdGhpcy5fb3B0aW9uc1NlcnZpY2U9dCx0aGlzLl9vc2NMaW5rU2VydmljZT1pfXByb3ZpZGVMaW5rcyhlLHQpe2NvbnN0IGk9dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMuZ2V0KGUtMSk7aWYoIWkpcmV0dXJuIHZvaWQgdCh2b2lkIDApO2NvbnN0IHM9W10scj10aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxpbmtIYW5kbGVyLG89bmV3IG4uQ2VsbERhdGEsYT1pLmdldFRyaW1tZWRMZW5ndGgoKTtsZXQgYz0tMSxsPS0xLGQ9ITE7Zm9yKGxldCB0PTA7dDxhO3QrKylpZigtMSE9PWx8fGkuaGFzQ29udGVudCh0KSl7aWYoaS5sb2FkQ2VsbCh0LG8pLG8uaGFzRXh0ZW5kZWRBdHRycygpJiZvLmV4dGVuZGVkLnVybElkKXtpZigtMT09PWwpe2w9dCxjPW8uZXh0ZW5kZWQudXJsSWQ7Y29udGludWV9ZD1vLmV4dGVuZGVkLnVybElkIT09Y31lbHNlLTEhPT1sJiYoZD0hMCk7aWYoZHx8LTEhPT1sJiZ0PT09YS0xKXtjb25zdCBpPXRoaXMuX29zY0xpbmtTZXJ2aWNlLmdldExpbmtEYXRhKGMpPy51cmk7aWYoaSl7Y29uc3Qgbj17c3RhcnQ6e3g6bCsxLHk6ZX0sZW5kOnt4OnQrKGR8fHQhPT1hLTE/MDoxKSx5OmV9fTtsZXQgbz0hMTtpZighcj8uYWxsb3dOb25IdHRwUHJvdG9jb2xzKXRyeXtjb25zdCBlPW5ldyBVUkwoaSk7W1wiaHR0cDpcIixcImh0dHBzOlwiXS5pbmNsdWRlcyhlLnByb3RvY29sKXx8KG89ITApfWNhdGNoKGUpe289ITB9b3x8cy5wdXNoKHt0ZXh0OmkscmFuZ2U6bixhY3RpdmF0ZTooZSx0KT0+cj9yLmFjdGl2YXRlKGUsdCxuKTpoKDAsdCksaG92ZXI6KGUsdCk9PnI/LmhvdmVyPy4oZSx0LG4pLGxlYXZlOihlLHQpPT5yPy5sZWF2ZT8uKGUsdCxuKX0pfWQ9ITEsby5oYXNFeHRlbmRlZEF0dHJzKCkmJm8uZXh0ZW5kZWQudXJsSWQ/KGw9dCxjPW8uZXh0ZW5kZWQudXJsSWQpOihsPS0xLGM9LTEpfX10KHMpfX07ZnVuY3Rpb24gaChlLHQpe2lmKGNvbmZpcm0oYERvIHlvdSB3YW50IHRvIG5hdmlnYXRlIHRvICR7dH0/XFxuXFxuV0FSTklORzogVGhpcyBsaW5rIGNvdWxkIHBvdGVudGlhbGx5IGJlIGRhbmdlcm91c2ApKXtjb25zdCBlPXdpbmRvdy5vcGVuKCk7aWYoZSl7dHJ5e2Uub3BlbmVyPW51bGx9Y2F0Y2h7fWUubG9jYXRpb24uaHJlZj10fWVsc2UgY29uc29sZS53YXJuKFwiT3BlbmluZyBsaW5rIGJsb2NrZWQgYXMgb3BlbmVyIGNvdWxkIG5vdCBiZSBjbGVhcmVkXCIpfX10Lk9zY0xpbmtQcm92aWRlcj1hPXMoW3IoMCxvLklCdWZmZXJTZXJ2aWNlKSxyKDEsby5JT3B0aW9uc1NlcnZpY2UpLHIoMixvLklPc2NMaW5rU2VydmljZSldLGEpfSw2MTkzOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5SZW5kZXJEZWJvdW5jZXI9dm9pZCAwLHQuUmVuZGVyRGVib3VuY2VyPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fcmVuZGVyQ2FsbGJhY2s9ZSx0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2U9dCx0aGlzLl9yZWZyZXNoQ2FsbGJhY2tzPVtdfWRpc3Bvc2UoKXt0aGlzLl9hbmltYXRpb25GcmFtZSYmKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uRnJhbWUpLHRoaXMuX2FuaW1hdGlvbkZyYW1lPXZvaWQgMCl9YWRkUmVmcmVzaENhbGxiYWNrKGUpe3JldHVybiB0aGlzLl9yZWZyZXNoQ2FsbGJhY2tzLnB1c2goZSksdGhpcy5fYW5pbWF0aW9uRnJhbWV8fCh0aGlzLl9hbmltYXRpb25GcmFtZT10aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9PnRoaXMuX2lubmVyUmVmcmVzaCgpKSkpLHRoaXMuX2FuaW1hdGlvbkZyYW1lfXJlZnJlc2goZSx0LGkpe3RoaXMuX3Jvd0NvdW50PWksZT12b2lkIDAhPT1lP2U6MCx0PXZvaWQgMCE9PXQ/dDp0aGlzLl9yb3dDb3VudC0xLHRoaXMuX3Jvd1N0YXJ0PXZvaWQgMCE9PXRoaXMuX3Jvd1N0YXJ0P01hdGgubWluKHRoaXMuX3Jvd1N0YXJ0LGUpOmUsdGhpcy5fcm93RW5kPXZvaWQgMCE9PXRoaXMuX3Jvd0VuZD9NYXRoLm1heCh0aGlzLl9yb3dFbmQsdCk6dCx0aGlzLl9hbmltYXRpb25GcmFtZXx8KHRoaXMuX2FuaW1hdGlvbkZyYW1lPXRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+dGhpcy5faW5uZXJSZWZyZXNoKCkpKSl9X2lubmVyUmVmcmVzaCgpe2lmKHRoaXMuX2FuaW1hdGlvbkZyYW1lPXZvaWQgMCx2b2lkIDA9PT10aGlzLl9yb3dTdGFydHx8dm9pZCAwPT09dGhpcy5fcm93RW5kfHx2b2lkIDA9PT10aGlzLl9yb3dDb3VudClyZXR1cm4gdm9pZCB0aGlzLl9ydW5SZWZyZXNoQ2FsbGJhY2tzKCk7Y29uc3QgZT1NYXRoLm1heCh0aGlzLl9yb3dTdGFydCwwKSx0PU1hdGgubWluKHRoaXMuX3Jvd0VuZCx0aGlzLl9yb3dDb3VudC0xKTt0aGlzLl9yb3dTdGFydD12b2lkIDAsdGhpcy5fcm93RW5kPXZvaWQgMCx0aGlzLl9yZW5kZXJDYWxsYmFjayhlLHQpLHRoaXMuX3J1blJlZnJlc2hDYWxsYmFja3MoKX1fcnVuUmVmcmVzaENhbGxiYWNrcygpe2Zvcihjb25zdCBlIG9mIHRoaXMuX3JlZnJlc2hDYWxsYmFja3MpZSgwKTt0aGlzLl9yZWZyZXNoQ2FsbGJhY2tzPVtdfX19LDMyMzY6KGUsdCxpKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuVGVybWluYWw9dm9pZCAwO2NvbnN0IHM9aSgzNjE0KSxyPWkoMzY1Niksbj1pKDM1NTEpLG89aSg5MDQyKSxhPWkoMzczMCksaD1pKDE2ODApLGM9aSgzMTA3KSxsPWkoNTc0NCksZD1pKDI5NTApLF89aSgxMjk2KSx1PWkoNDI4KSxmPWkoNDI2OSksdj1pKDUxMTQpLHA9aSg4OTM0KSxnPWkoMzIzMCksbT1pKDkzMTIpLFM9aSg0NzI1KSxDPWkoNjczMSksYj1pKDgwNTUpLHc9aSg4OTY5KSx5PWkoODQ2MCksRT1pKDg0NCksaz1pKDYxMTQpLEw9aSg4NDM3KSxEPWkoMjU4NCksUj1pKDczOTkpLHg9aSg1OTQxKSxBPWkoOTA3NCksQj1pKDI1ODUpLFQ9aSg1NDM1KSxNPWkoNDU2NyksTz1pKDc3OSk7Y2xhc3MgUCBleHRlbmRzIHcuQ29yZVRlcm1pbmFse2dldCBvbkZvY3VzKCl7cmV0dXJuIHRoaXMuX29uRm9jdXMuZXZlbnR9Z2V0IG9uQmx1cigpe3JldHVybiB0aGlzLl9vbkJsdXIuZXZlbnR9Z2V0IG9uQTExeUNoYXIoKXtyZXR1cm4gdGhpcy5fb25BMTF5Q2hhckVtaXR0ZXIuZXZlbnR9Z2V0IG9uQTExeVRhYigpe3JldHVybiB0aGlzLl9vbkExMXlUYWJFbWl0dGVyLmV2ZW50fWdldCBvbldpbGxPcGVuKCl7cmV0dXJuIHRoaXMuX29uV2lsbE9wZW4uZXZlbnR9Y29uc3RydWN0b3IoZT17fSl7c3VwZXIoZSksdGhpcy5icm93c2VyPWssdGhpcy5fa2V5RG93bkhhbmRsZWQ9ITEsdGhpcy5fa2V5RG93blNlZW49ITEsdGhpcy5fa2V5UHJlc3NIYW5kbGVkPSExLHRoaXMuX3VucHJvY2Vzc2VkRGVhZEtleT0hMSx0aGlzLl9hY2Nlc3NpYmlsaXR5TWFuYWdlcj10aGlzLnJlZ2lzdGVyKG5ldyBFLk11dGFibGVEaXNwb3NhYmxlKSx0aGlzLl9vbkN1cnNvck1vdmU9dGhpcy5yZWdpc3RlcihuZXcgeS5FdmVudEVtaXR0ZXIpLHRoaXMub25DdXJzb3JNb3ZlPXRoaXMuX29uQ3Vyc29yTW92ZS5ldmVudCx0aGlzLl9vbktleT10aGlzLnJlZ2lzdGVyKG5ldyB5LkV2ZW50RW1pdHRlciksdGhpcy5vbktleT10aGlzLl9vbktleS5ldmVudCx0aGlzLl9vblJlbmRlcj10aGlzLnJlZ2lzdGVyKG5ldyB5LkV2ZW50RW1pdHRlciksdGhpcy5vblJlbmRlcj10aGlzLl9vblJlbmRlci5ldmVudCx0aGlzLl9vblNlbGVjdGlvbkNoYW5nZT10aGlzLnJlZ2lzdGVyKG5ldyB5LkV2ZW50RW1pdHRlciksdGhpcy5vblNlbGVjdGlvbkNoYW5nZT10aGlzLl9vblNlbGVjdGlvbkNoYW5nZS5ldmVudCx0aGlzLl9vblRpdGxlQ2hhbmdlPXRoaXMucmVnaXN0ZXIobmV3IHkuRXZlbnRFbWl0dGVyKSx0aGlzLm9uVGl0bGVDaGFuZ2U9dGhpcy5fb25UaXRsZUNoYW5nZS5ldmVudCx0aGlzLl9vbkJlbGw9dGhpcy5yZWdpc3RlcihuZXcgeS5FdmVudEVtaXR0ZXIpLHRoaXMub25CZWxsPXRoaXMuX29uQmVsbC5ldmVudCx0aGlzLl9vbkZvY3VzPXRoaXMucmVnaXN0ZXIobmV3IHkuRXZlbnRFbWl0dGVyKSx0aGlzLl9vbkJsdXI9dGhpcy5yZWdpc3RlcihuZXcgeS5FdmVudEVtaXR0ZXIpLHRoaXMuX29uQTExeUNoYXJFbWl0dGVyPXRoaXMucmVnaXN0ZXIobmV3IHkuRXZlbnRFbWl0dGVyKSx0aGlzLl9vbkExMXlUYWJFbWl0dGVyPXRoaXMucmVnaXN0ZXIobmV3IHkuRXZlbnRFbWl0dGVyKSx0aGlzLl9vbldpbGxPcGVuPXRoaXMucmVnaXN0ZXIobmV3IHkuRXZlbnRFbWl0dGVyKSx0aGlzLl9zZXR1cCgpLHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlPXRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKEEuRGVjb3JhdGlvblNlcnZpY2UpLHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoQi5JRGVjb3JhdGlvblNlcnZpY2UsdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UpLHRoaXMuX2xpbmtQcm92aWRlclNlcnZpY2U9dGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoTy5MaW5rUHJvdmlkZXJTZXJ2aWNlKSx0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKFMuSUxpbmtQcm92aWRlclNlcnZpY2UsdGhpcy5fbGlua1Byb3ZpZGVyU2VydmljZSksdGhpcy5fbGlua1Byb3ZpZGVyU2VydmljZS5yZWdpc3RlckxpbmtQcm92aWRlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShhLk9zY0xpbmtQcm92aWRlcikpLHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uUmVxdWVzdEJlbGwoKCgpPT50aGlzLl9vbkJlbGwuZmlyZSgpKSkpLHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uUmVxdWVzdFJlZnJlc2hSb3dzKCgoZSx0KT0+dGhpcy5yZWZyZXNoKGUsdCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25SZXF1ZXN0U2VuZEZvY3VzKCgoKT0+dGhpcy5fcmVwb3J0Rm9jdXMoKSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX2lucHV0SGFuZGxlci5vblJlcXVlc3RSZXNldCgoKCk9PnRoaXMucmVzZXQoKSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX2lucHV0SGFuZGxlci5vblJlcXVlc3RXaW5kb3dzT3B0aW9uc1JlcG9ydCgoZT0+dGhpcy5fcmVwb3J0V2luZG93c09wdGlvbnMoZSkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25Db2xvcigoZT0+dGhpcy5faGFuZGxlQ29sb3JFdmVudChlKSkpKSx0aGlzLnJlZ2lzdGVyKCgwLHkuZm9yd2FyZEV2ZW50KSh0aGlzLl9pbnB1dEhhbmRsZXIub25DdXJzb3JNb3ZlLHRoaXMuX29uQ3Vyc29yTW92ZSkpLHRoaXMucmVnaXN0ZXIoKDAseS5mb3J3YXJkRXZlbnQpKHRoaXMuX2lucHV0SGFuZGxlci5vblRpdGxlQ2hhbmdlLHRoaXMuX29uVGl0bGVDaGFuZ2UpKSx0aGlzLnJlZ2lzdGVyKCgwLHkuZm9yd2FyZEV2ZW50KSh0aGlzLl9pbnB1dEhhbmRsZXIub25BMTF5Q2hhcix0aGlzLl9vbkExMXlDaGFyRW1pdHRlcikpLHRoaXMucmVnaXN0ZXIoKDAseS5mb3J3YXJkRXZlbnQpKHRoaXMuX2lucHV0SGFuZGxlci5vbkExMXlUYWIsdGhpcy5fb25BMTF5VGFiRW1pdHRlcikpLHRoaXMucmVnaXN0ZXIodGhpcy5fYnVmZmVyU2VydmljZS5vblJlc2l6ZSgoZT0+dGhpcy5fYWZ0ZXJSZXNpemUoZS5jb2xzLGUucm93cykpKSksdGhpcy5yZWdpc3RlcigoMCxFLnRvRGlzcG9zYWJsZSkoKCgpPT57dGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyPXZvaWQgMCx0aGlzLmVsZW1lbnQ/LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCl9KSkpfV9oYW5kbGVDb2xvckV2ZW50KGUpe2lmKHRoaXMuX3RoZW1lU2VydmljZSlmb3IoY29uc3QgdCBvZiBlKXtsZXQgZSxpPVwiXCI7c3dpdGNoKHQuaW5kZXgpe2Nhc2UgMjU2OmU9XCJmb3JlZ3JvdW5kXCIsaT1cIjEwXCI7YnJlYWs7Y2FzZSAyNTc6ZT1cImJhY2tncm91bmRcIixpPVwiMTFcIjticmVhaztjYXNlIDI1ODplPVwiY3Vyc29yXCIsaT1cIjEyXCI7YnJlYWs7ZGVmYXVsdDplPVwiYW5zaVwiLGk9XCI0O1wiK3QuaW5kZXh9c3dpdGNoKHQudHlwZSl7Y2FzZSAwOmNvbnN0IHM9Yi5jb2xvci50b0NvbG9yUkdCKFwiYW5zaVwiPT09ZT90aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmFuc2lbdC5pbmRleF06dGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9yc1tlXSk7dGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGAke0QuQzAuRVNDfV0ke2l9OyR7KDAseC50b1JnYlN0cmluZykocyl9JHtELkMxX0VTQ0FQRUQuU1R9YCk7YnJlYWs7Y2FzZSAxOmlmKFwiYW5zaVwiPT09ZSl0aGlzLl90aGVtZVNlcnZpY2UubW9kaWZ5Q29sb3JzKChlPT5lLmFuc2lbdC5pbmRleF09Yi5jaGFubmVscy50b0NvbG9yKC4uLnQuY29sb3IpKSk7ZWxzZXtjb25zdCBpPWU7dGhpcy5fdGhlbWVTZXJ2aWNlLm1vZGlmeUNvbG9ycygoZT0+ZVtpXT1iLmNoYW5uZWxzLnRvQ29sb3IoLi4udC5jb2xvcikpKX1icmVhaztjYXNlIDI6dGhpcy5fdGhlbWVTZXJ2aWNlLnJlc3RvcmVDb2xvcih0LmluZGV4KX19fV9zZXR1cCgpe3N1cGVyLl9zZXR1cCgpLHRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlcj12b2lkIDB9Z2V0IGJ1ZmZlcigpe3JldHVybiB0aGlzLmJ1ZmZlcnMuYWN0aXZlfWZvY3VzKCl7dGhpcy50ZXh0YXJlYSYmdGhpcy50ZXh0YXJlYS5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pfV9oYW5kbGVTY3JlZW5SZWFkZXJNb2RlT3B0aW9uQ2hhbmdlKGUpe2U/IXRoaXMuX2FjY2Vzc2liaWxpdHlNYW5hZ2VyLnZhbHVlJiZ0aGlzLl9yZW5kZXJTZXJ2aWNlJiYodGhpcy5fYWNjZXNzaWJpbGl0eU1hbmFnZXIudmFsdWU9dGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoTS5BY2Nlc3NpYmlsaXR5TWFuYWdlcix0aGlzKSk6dGhpcy5fYWNjZXNzaWJpbGl0eU1hbmFnZXIuY2xlYXIoKX1faGFuZGxlVGV4dEFyZWFGb2N1cyhlKXt0aGlzLmNvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5zZW5kRm9jdXMmJnRoaXMuY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChELkMwLkVTQytcIltJXCIpLHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZm9jdXNcIiksdGhpcy5fc2hvd0N1cnNvcigpLHRoaXMuX29uRm9jdXMuZmlyZSgpfWJsdXIoKXtyZXR1cm4gdGhpcy50ZXh0YXJlYT8uYmx1cigpfV9oYW5kbGVUZXh0QXJlYUJsdXIoKXt0aGlzLnRleHRhcmVhLnZhbHVlPVwiXCIsdGhpcy5yZWZyZXNoKHRoaXMuYnVmZmVyLnksdGhpcy5idWZmZXIueSksdGhpcy5jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuc2VuZEZvY3VzJiZ0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoRC5DMC5FU0MrXCJbT1wiKSx0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImZvY3VzXCIpLHRoaXMuX29uQmx1ci5maXJlKCl9X3N5bmNUZXh0QXJlYSgpe2lmKCF0aGlzLnRleHRhcmVhfHwhdGhpcy5idWZmZXIuaXNDdXJzb3JJblZpZXdwb3J0fHx0aGlzLl9jb21wb3NpdGlvbkhlbHBlci5pc0NvbXBvc2luZ3x8IXRoaXMuX3JlbmRlclNlcnZpY2UpcmV0dXJuO2NvbnN0IGU9dGhpcy5idWZmZXIueWJhc2UrdGhpcy5idWZmZXIueSx0PXRoaXMuYnVmZmVyLmxpbmVzLmdldChlKTtpZighdClyZXR1cm47Y29uc3QgaT1NYXRoLm1pbih0aGlzLmJ1ZmZlci54LHRoaXMuY29scy0xKSxzPXRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQscj10LmdldFdpZHRoKGkpLG49dGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoKnIsbz10aGlzLmJ1ZmZlci55KnRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQsYT1pKnRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aDt0aGlzLnRleHRhcmVhLnN0eWxlLmxlZnQ9YStcInB4XCIsdGhpcy50ZXh0YXJlYS5zdHlsZS50b3A9bytcInB4XCIsdGhpcy50ZXh0YXJlYS5zdHlsZS53aWR0aD1uK1wicHhcIix0aGlzLnRleHRhcmVhLnN0eWxlLmhlaWdodD1zK1wicHhcIix0aGlzLnRleHRhcmVhLnN0eWxlLmxpbmVIZWlnaHQ9cytcInB4XCIsdGhpcy50ZXh0YXJlYS5zdHlsZS56SW5kZXg9XCItNVwifV9pbml0R2xvYmFsKCl7dGhpcy5fYmluZEtleXMoKSx0aGlzLnJlZ2lzdGVyKCgwLHIuYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKSh0aGlzLmVsZW1lbnQsXCJjb3B5XCIsKGU9Pnt0aGlzLmhhc1NlbGVjdGlvbigpJiYoMCxzLmNvcHlIYW5kbGVyKShlLHRoaXMuX3NlbGVjdGlvblNlcnZpY2UpfSkpKTtjb25zdCBlPWU9PigwLHMuaGFuZGxlUGFzdGVFdmVudCkoZSx0aGlzLnRleHRhcmVhLHRoaXMuY29yZVNlcnZpY2UsdGhpcy5vcHRpb25zU2VydmljZSk7dGhpcy5yZWdpc3RlcigoMCxyLmFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcikodGhpcy50ZXh0YXJlYSxcInBhc3RlXCIsZSkpLHRoaXMucmVnaXN0ZXIoKDAsci5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHRoaXMuZWxlbWVudCxcInBhc3RlXCIsZSkpLGsuaXNGaXJlZm94P3RoaXMucmVnaXN0ZXIoKDAsci5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHRoaXMuZWxlbWVudCxcIm1vdXNlZG93blwiLChlPT57Mj09PWUuYnV0dG9uJiYoMCxzLnJpZ2h0Q2xpY2tIYW5kbGVyKShlLHRoaXMudGV4dGFyZWEsdGhpcy5zY3JlZW5FbGVtZW50LHRoaXMuX3NlbGVjdGlvblNlcnZpY2UsdGhpcy5vcHRpb25zLnJpZ2h0Q2xpY2tTZWxlY3RzV29yZCl9KSkpOnRoaXMucmVnaXN0ZXIoKDAsci5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHRoaXMuZWxlbWVudCxcImNvbnRleHRtZW51XCIsKGU9PnsoMCxzLnJpZ2h0Q2xpY2tIYW5kbGVyKShlLHRoaXMudGV4dGFyZWEsdGhpcy5zY3JlZW5FbGVtZW50LHRoaXMuX3NlbGVjdGlvblNlcnZpY2UsdGhpcy5vcHRpb25zLnJpZ2h0Q2xpY2tTZWxlY3RzV29yZCl9KSkpLGsuaXNMaW51eCYmdGhpcy5yZWdpc3RlcigoMCxyLmFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcikodGhpcy5lbGVtZW50LFwiYXV4Y2xpY2tcIiwoZT0+ezE9PT1lLmJ1dHRvbiYmKDAscy5tb3ZlVGV4dEFyZWFVbmRlck1vdXNlQ3Vyc29yKShlLHRoaXMudGV4dGFyZWEsdGhpcy5zY3JlZW5FbGVtZW50KX0pKSl9X2JpbmRLZXlzKCl7dGhpcy5yZWdpc3RlcigoMCxyLmFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcikodGhpcy50ZXh0YXJlYSxcImtleXVwXCIsKGU9PnRoaXMuX2tleVVwKGUpKSwhMCkpLHRoaXMucmVnaXN0ZXIoKDAsci5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHRoaXMudGV4dGFyZWEsXCJrZXlkb3duXCIsKGU9PnRoaXMuX2tleURvd24oZSkpLCEwKSksdGhpcy5yZWdpc3RlcigoMCxyLmFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcikodGhpcy50ZXh0YXJlYSxcImtleXByZXNzXCIsKGU9PnRoaXMuX2tleVByZXNzKGUpKSwhMCkpLHRoaXMucmVnaXN0ZXIoKDAsci5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHRoaXMudGV4dGFyZWEsXCJjb21wb3NpdGlvbnN0YXJ0XCIsKCgpPT50aGlzLl9jb21wb3NpdGlvbkhlbHBlci5jb21wb3NpdGlvbnN0YXJ0KCkpKSksdGhpcy5yZWdpc3RlcigoMCxyLmFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcikodGhpcy50ZXh0YXJlYSxcImNvbXBvc2l0aW9udXBkYXRlXCIsKGU9PnRoaXMuX2NvbXBvc2l0aW9uSGVscGVyLmNvbXBvc2l0aW9udXBkYXRlKGUpKSkpLHRoaXMucmVnaXN0ZXIoKDAsci5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHRoaXMudGV4dGFyZWEsXCJjb21wb3NpdGlvbmVuZFwiLCgoKT0+dGhpcy5fY29tcG9zaXRpb25IZWxwZXIuY29tcG9zaXRpb25lbmQoKSkpKSx0aGlzLnJlZ2lzdGVyKCgwLHIuYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKSh0aGlzLnRleHRhcmVhLFwiaW5wdXRcIiwoZT0+dGhpcy5faW5wdXRFdmVudChlKSksITApKSx0aGlzLnJlZ2lzdGVyKHRoaXMub25SZW5kZXIoKCgpPT50aGlzLl9jb21wb3NpdGlvbkhlbHBlci51cGRhdGVDb21wb3NpdGlvbkVsZW1lbnRzKCkpKSl9b3BlbihlKXtpZighZSl0aHJvdyBuZXcgRXJyb3IoXCJUZXJtaW5hbCByZXF1aXJlcyBhIHBhcmVudCBlbGVtZW50LlwiKTtpZihlLmlzQ29ubmVjdGVkfHx0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKFwiVGVybWluYWwub3BlbiB3YXMgY2FsbGVkIG9uIGFuIGVsZW1lbnQgdGhhdCB3YXMgbm90IGF0dGFjaGVkIHRvIHRoZSBET01cIiksdGhpcy5lbGVtZW50Py5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3JiZ0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UpcmV0dXJuIHZvaWQodGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXchPT10aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93JiYodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdz10aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykpO3RoaXMuX2RvY3VtZW50PWUub3duZXJEb2N1bWVudCx0aGlzLm9wdGlvbnMuZG9jdW1lbnRPdmVycmlkZSYmdGhpcy5vcHRpb25zLmRvY3VtZW50T3ZlcnJpZGUgaW5zdGFuY2VvZiBEb2N1bWVudCYmKHRoaXMuX2RvY3VtZW50PXRoaXMub3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5kb2N1bWVudE92ZXJyaWRlKSx0aGlzLmVsZW1lbnQ9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmVsZW1lbnQuZGlyPVwibHRyXCIsdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0ZXJtaW5hbFwiKSx0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInh0ZXJtXCIpLGUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtjb25zdCB0PXRoaXMuX2RvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTt0aGlzLl92aWV3cG9ydEVsZW1lbnQ9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLl92aWV3cG9ydEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInh0ZXJtLXZpZXdwb3J0XCIpLHQuYXBwZW5kQ2hpbGQodGhpcy5fdmlld3BvcnRFbGVtZW50KSx0aGlzLl92aWV3cG9ydFNjcm9sbEFyZWE9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLl92aWV3cG9ydFNjcm9sbEFyZWEuY2xhc3NMaXN0LmFkZChcInh0ZXJtLXNjcm9sbC1hcmVhXCIpLHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl92aWV3cG9ydFNjcm9sbEFyZWEpLHRoaXMuc2NyZWVuRWxlbWVudD10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuc2NyZWVuRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwieHRlcm0tc2NyZWVuXCIpLHRoaXMucmVnaXN0ZXIoKDAsci5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHRoaXMuc2NyZWVuRWxlbWVudCxcIm1vdXNlbW92ZVwiLChlPT50aGlzLnVwZGF0ZUN1cnNvclN0eWxlKGUpKSkpLHRoaXMuX2hlbHBlckNvbnRhaW5lcj10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuX2hlbHBlckNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwieHRlcm0taGVscGVyc1wiKSx0aGlzLnNjcmVlbkVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faGVscGVyQ29udGFpbmVyKSx0LmFwcGVuZENoaWxkKHRoaXMuc2NyZWVuRWxlbWVudCksdGhpcy50ZXh0YXJlYT10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIiksdGhpcy50ZXh0YXJlYS5jbGFzc0xpc3QuYWRkKFwieHRlcm0taGVscGVyLXRleHRhcmVhXCIpLHRoaXMudGV4dGFyZWEuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLG8ucHJvbXB0TGFiZWwpLGsuaXNDaHJvbWVPU3x8dGhpcy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoXCJhcmlhLW11bHRpbGluZVwiLFwiZmFsc2VcIiksdGhpcy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoXCJhdXRvY29ycmVjdFwiLFwib2ZmXCIpLHRoaXMudGV4dGFyZWEuc2V0QXR0cmlidXRlKFwiYXV0b2NhcGl0YWxpemVcIixcIm9mZlwiKSx0aGlzLnRleHRhcmVhLnNldEF0dHJpYnV0ZShcInNwZWxsY2hlY2tcIixcImZhbHNlXCIpLHRoaXMudGV4dGFyZWEudGFiSW5kZXg9MCx0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2U9dGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZSh2LkNvcmVCcm93c2VyU2VydmljZSx0aGlzLnRleHRhcmVhLGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldz8/d2luZG93LHRoaXMuX2RvY3VtZW50Pz9cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdy5kb2N1bWVudDpudWxsKSksdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShTLklDb3JlQnJvd3NlclNlcnZpY2UsdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlKSx0aGlzLnJlZ2lzdGVyKCgwLHIuYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKSh0aGlzLnRleHRhcmVhLFwiZm9jdXNcIiwoZT0+dGhpcy5faGFuZGxlVGV4dEFyZWFGb2N1cyhlKSkpKSx0aGlzLnJlZ2lzdGVyKCgwLHIuYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKSh0aGlzLnRleHRhcmVhLFwiYmx1clwiLCgoKT0+dGhpcy5faGFuZGxlVGV4dEFyZWFCbHVyKCkpKSksdGhpcy5faGVscGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudGV4dGFyZWEpLHRoaXMuX2NoYXJTaXplU2VydmljZT10aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZSh1LkNoYXJTaXplU2VydmljZSx0aGlzLl9kb2N1bWVudCx0aGlzLl9oZWxwZXJDb250YWluZXIpLHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoUy5JQ2hhclNpemVTZXJ2aWNlLHRoaXMuX2NoYXJTaXplU2VydmljZSksdGhpcy5fdGhlbWVTZXJ2aWNlPXRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKEMuVGhlbWVTZXJ2aWNlKSx0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKFMuSVRoZW1lU2VydmljZSx0aGlzLl90aGVtZVNlcnZpY2UpLHRoaXMuX2NoYXJhY3RlckpvaW5lclNlcnZpY2U9dGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoZi5DaGFyYWN0ZXJKb2luZXJTZXJ2aWNlKSx0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKFMuSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZSksdGhpcy5fcmVuZGVyU2VydmljZT10aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKGcuUmVuZGVyU2VydmljZSx0aGlzLnJvd3MsdGhpcy5zY3JlZW5FbGVtZW50KSksdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShTLklSZW5kZXJTZXJ2aWNlLHRoaXMuX3JlbmRlclNlcnZpY2UpLHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyU2VydmljZS5vblJlbmRlcmVkVmlld3BvcnRDaGFuZ2UoKGU9PnRoaXMuX29uUmVuZGVyLmZpcmUoZSkpKSksdGhpcy5vblJlc2l6ZSgoZT0+dGhpcy5fcmVuZGVyU2VydmljZS5yZXNpemUoZS5jb2xzLGUucm93cykpKSx0aGlzLl9jb21wb3NpdGlvblZpZXc9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLl9jb21wb3NpdGlvblZpZXcuY2xhc3NMaXN0LmFkZChcImNvbXBvc2l0aW9uLXZpZXdcIiksdGhpcy5fY29tcG9zaXRpb25IZWxwZXI9dGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoZC5Db21wb3NpdGlvbkhlbHBlcix0aGlzLnRleHRhcmVhLHRoaXMuX2NvbXBvc2l0aW9uVmlldyksdGhpcy5faGVscGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2NvbXBvc2l0aW9uVmlldyksdGhpcy5fbW91c2VTZXJ2aWNlPXRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKHAuTW91c2VTZXJ2aWNlKSx0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKFMuSU1vdXNlU2VydmljZSx0aGlzLl9tb3VzZVNlcnZpY2UpLHRoaXMubGlua2lmaWVyPXRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2Uobi5MaW5raWZpZXIsdGhpcy5zY3JlZW5FbGVtZW50KSksdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHQpO3RyeXt0aGlzLl9vbldpbGxPcGVuLmZpcmUodGhpcy5lbGVtZW50KX1jYXRjaHt9dGhpcy5fcmVuZGVyU2VydmljZS5oYXNSZW5kZXJlcigpfHx0aGlzLl9yZW5kZXJTZXJ2aWNlLnNldFJlbmRlcmVyKHRoaXMuX2NyZWF0ZVJlbmRlcmVyKCkpLHRoaXMudmlld3BvcnQ9dGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoaC5WaWV3cG9ydCx0aGlzLl92aWV3cG9ydEVsZW1lbnQsdGhpcy5fdmlld3BvcnRTY3JvbGxBcmVhKSx0aGlzLnZpZXdwb3J0Lm9uUmVxdWVzdFNjcm9sbExpbmVzKChlPT50aGlzLnNjcm9sbExpbmVzKGUuYW1vdW50LGUuc3VwcHJlc3NTY3JvbGxFdmVudCwxKSkpLHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uUmVxdWVzdFN5bmNTY3JvbGxCYXIoKCgpPT50aGlzLnZpZXdwb3J0LnN5bmNTY3JvbGxBcmVhKCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLnZpZXdwb3J0KSx0aGlzLnJlZ2lzdGVyKHRoaXMub25DdXJzb3JNb3ZlKCgoKT0+e3RoaXMuX3JlbmRlclNlcnZpY2UuaGFuZGxlQ3Vyc29yTW92ZSgpLHRoaXMuX3N5bmNUZXh0QXJlYSgpfSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMub25SZXNpemUoKCgpPT50aGlzLl9yZW5kZXJTZXJ2aWNlLmhhbmRsZVJlc2l6ZSh0aGlzLmNvbHMsdGhpcy5yb3dzKSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMub25CbHVyKCgoKT0+dGhpcy5fcmVuZGVyU2VydmljZS5oYW5kbGVCbHVyKCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLm9uRm9jdXMoKCgpPT50aGlzLl9yZW5kZXJTZXJ2aWNlLmhhbmRsZUZvY3VzKCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uRGltZW5zaW9uc0NoYW5nZSgoKCk9PnRoaXMudmlld3BvcnQuc3luY1Njcm9sbEFyZWEoKSkpKSx0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlPXRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UobS5TZWxlY3Rpb25TZXJ2aWNlLHRoaXMuZWxlbWVudCx0aGlzLnNjcmVlbkVsZW1lbnQsdGhpcy5saW5raWZpZXIpKSx0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKFMuSVNlbGVjdGlvblNlcnZpY2UsdGhpcy5fc2VsZWN0aW9uU2VydmljZSksdGhpcy5yZWdpc3Rlcih0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLm9uUmVxdWVzdFNjcm9sbExpbmVzKChlPT50aGlzLnNjcm9sbExpbmVzKGUuYW1vdW50LGUuc3VwcHJlc3NTY3JvbGxFdmVudCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLm9uU2VsZWN0aW9uQ2hhbmdlKCgoKT0+dGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UuZmlyZSgpKSkpLHRoaXMucmVnaXN0ZXIodGhpcy5fc2VsZWN0aW9uU2VydmljZS5vblJlcXVlc3RSZWRyYXcoKGU9PnRoaXMuX3JlbmRlclNlcnZpY2UuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChlLnN0YXJ0LGUuZW5kLGUuY29sdW1uU2VsZWN0TW9kZSkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLm9uTGludXhNb3VzZVNlbGVjdGlvbigoZT0+e3RoaXMudGV4dGFyZWEudmFsdWU9ZSx0aGlzLnRleHRhcmVhLmZvY3VzKCksdGhpcy50ZXh0YXJlYS5zZWxlY3QoKX0pKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9vblNjcm9sbC5ldmVudCgoZT0+e3RoaXMudmlld3BvcnQuc3luY1Njcm9sbEFyZWEoKSx0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLnJlZnJlc2goKX0pKSksdGhpcy5yZWdpc3RlcigoMCxyLmFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcikodGhpcy5fdmlld3BvcnRFbGVtZW50LFwic2Nyb2xsXCIsKCgpPT50aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLnJlZnJlc2goKSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKGMuQnVmZmVyRGVjb3JhdGlvblJlbmRlcmVyLHRoaXMuc2NyZWVuRWxlbWVudCkpLHRoaXMucmVnaXN0ZXIoKDAsci5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHRoaXMuZWxlbWVudCxcIm1vdXNlZG93blwiLChlPT50aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLmhhbmRsZU1vdXNlRG93bihlKSkpKSx0aGlzLmNvcmVNb3VzZVNlcnZpY2UuYXJlTW91c2VFdmVudHNBY3RpdmU/KHRoaXMuX3NlbGVjdGlvblNlcnZpY2UuZGlzYWJsZSgpLHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZW5hYmxlLW1vdXNlLWV2ZW50c1wiKSk6dGhpcy5fc2VsZWN0aW9uU2VydmljZS5lbmFibGUoKSx0aGlzLm9wdGlvbnMuc2NyZWVuUmVhZGVyTW9kZSYmKHRoaXMuX2FjY2Vzc2liaWxpdHlNYW5hZ2VyLnZhbHVlPXRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKE0uQWNjZXNzaWJpbGl0eU1hbmFnZXIsdGhpcykpLHRoaXMucmVnaXN0ZXIodGhpcy5vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKFwic2NyZWVuUmVhZGVyTW9kZVwiLChlPT50aGlzLl9oYW5kbGVTY3JlZW5SZWFkZXJNb2RlT3B0aW9uQ2hhbmdlKGUpKSkpLHRoaXMub3B0aW9ucy5vdmVydmlld1J1bGVyV2lkdGgmJih0aGlzLl9vdmVydmlld1J1bGVyUmVuZGVyZXI9dGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShsLk92ZXJ2aWV3UnVsZXJSZW5kZXJlcix0aGlzLl92aWV3cG9ydEVsZW1lbnQsdGhpcy5zY3JlZW5FbGVtZW50KSkpLHRoaXMub3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZShcIm92ZXJ2aWV3UnVsZXJXaWR0aFwiLChlPT57IXRoaXMuX292ZXJ2aWV3UnVsZXJSZW5kZXJlciYmZSYmdGhpcy5fdmlld3BvcnRFbGVtZW50JiZ0aGlzLnNjcmVlbkVsZW1lbnQmJih0aGlzLl9vdmVydmlld1J1bGVyUmVuZGVyZXI9dGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShsLk92ZXJ2aWV3UnVsZXJSZW5kZXJlcix0aGlzLl92aWV3cG9ydEVsZW1lbnQsdGhpcy5zY3JlZW5FbGVtZW50KSkpfSkpLHRoaXMuX2NoYXJTaXplU2VydmljZS5tZWFzdXJlKCksdGhpcy5yZWZyZXNoKDAsdGhpcy5yb3dzLTEpLHRoaXMuX2luaXRHbG9iYWwoKSx0aGlzLmJpbmRNb3VzZSgpfV9jcmVhdGVSZW5kZXJlcigpe3JldHVybiB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShfLkRvbVJlbmRlcmVyLHRoaXMsdGhpcy5fZG9jdW1lbnQsdGhpcy5lbGVtZW50LHRoaXMuc2NyZWVuRWxlbWVudCx0aGlzLl92aWV3cG9ydEVsZW1lbnQsdGhpcy5faGVscGVyQ29udGFpbmVyLHRoaXMubGlua2lmaWVyKX1iaW5kTW91c2UoKXtjb25zdCBlPXRoaXMsdD10aGlzLmVsZW1lbnQ7ZnVuY3Rpb24gaSh0KXtjb25zdCBpPWUuX21vdXNlU2VydmljZS5nZXRNb3VzZVJlcG9ydENvb3Jkcyh0LGUuc2NyZWVuRWxlbWVudCk7aWYoIWkpcmV0dXJuITE7bGV0IHMscjtzd2l0Y2godC5vdmVycmlkZVR5cGV8fHQudHlwZSl7Y2FzZVwibW91c2Vtb3ZlXCI6cj0zMix2b2lkIDA9PT10LmJ1dHRvbnM/KHM9Myx2b2lkIDAhPT10LmJ1dHRvbiYmKHM9dC5idXR0b248Mz90LmJ1dHRvbjozKSk6cz0xJnQuYnV0dG9ucz8wOjQmdC5idXR0b25zPzE6MiZ0LmJ1dHRvbnM/MjozO2JyZWFrO2Nhc2VcIm1vdXNldXBcIjpyPTAscz10LmJ1dHRvbjwzP3QuYnV0dG9uOjM7YnJlYWs7Y2FzZVwibW91c2Vkb3duXCI6cj0xLHM9dC5idXR0b248Mz90LmJ1dHRvbjozO2JyZWFrO2Nhc2VcIndoZWVsXCI6aWYoZS5fY3VzdG9tV2hlZWxFdmVudEhhbmRsZXImJiExPT09ZS5fY3VzdG9tV2hlZWxFdmVudEhhbmRsZXIodCkpcmV0dXJuITE7aWYoMD09PWUudmlld3BvcnQuZ2V0TGluZXNTY3JvbGxlZCh0KSlyZXR1cm4hMTtyPXQuZGVsdGFZPDA/MDoxLHM9NDticmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiEodm9pZCAwPT09cnx8dm9pZCAwPT09c3x8cz40KSYmZS5jb3JlTW91c2VTZXJ2aWNlLnRyaWdnZXJNb3VzZUV2ZW50KHtjb2w6aS5jb2wscm93Omkucm93LHg6aS54LHk6aS55LGJ1dHRvbjpzLGFjdGlvbjpyLGN0cmw6dC5jdHJsS2V5LGFsdDp0LmFsdEtleSxzaGlmdDp0LnNoaWZ0S2V5fSl9Y29uc3Qgcz17bW91c2V1cDpudWxsLHdoZWVsOm51bGwsbW91c2VkcmFnOm51bGwsbW91c2Vtb3ZlOm51bGx9LG49e21vdXNldXA6ZT0+KGkoZSksZS5idXR0b25zfHwodGhpcy5fZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIixzLm1vdXNldXApLHMubW91c2VkcmFnJiZ0aGlzLl9kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIscy5tb3VzZWRyYWcpKSx0aGlzLmNhbmNlbChlKSksd2hlZWw6ZT0+KGkoZSksdGhpcy5jYW5jZWwoZSwhMCkpLG1vdXNlZHJhZzplPT57ZS5idXR0b25zJiZpKGUpfSxtb3VzZW1vdmU6ZT0+e2UuYnV0dG9uc3x8aShlKX19O3RoaXMucmVnaXN0ZXIodGhpcy5jb3JlTW91c2VTZXJ2aWNlLm9uUHJvdG9jb2xDaGFuZ2UoKGU9PntlPyhcImRlYnVnXCI9PT10aGlzLm9wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubG9nTGV2ZWwmJnRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoXCJCaW5kaW5nIHRvIG1vdXNlIGV2ZW50czpcIix0aGlzLmNvcmVNb3VzZVNlcnZpY2UuZXhwbGFpbkV2ZW50cyhlKSksdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJlbmFibGUtbW91c2UtZXZlbnRzXCIpLHRoaXMuX3NlbGVjdGlvblNlcnZpY2UuZGlzYWJsZSgpKToodGhpcy5fbG9nU2VydmljZS5kZWJ1ZyhcIlVuYmluZGluZyBmcm9tIG1vdXNlIGV2ZW50cy5cIiksdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJlbmFibGUtbW91c2UtZXZlbnRzXCIpLHRoaXMuX3NlbGVjdGlvblNlcnZpY2UuZW5hYmxlKCkpLDgmZT9zLm1vdXNlbW92ZXx8KHQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLG4ubW91c2Vtb3ZlKSxzLm1vdXNlbW92ZT1uLm1vdXNlbW92ZSk6KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHMubW91c2Vtb3ZlKSxzLm1vdXNlbW92ZT1udWxsKSwxNiZlP3Mud2hlZWx8fCh0LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLG4ud2hlZWwse3Bhc3NpdmU6ITF9KSxzLndoZWVsPW4ud2hlZWwpOih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLHMud2hlZWwpLHMud2hlZWw9bnVsbCksMiZlP3MubW91c2V1cHx8KHMubW91c2V1cD1uLm1vdXNldXApOih0aGlzLl9kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHMubW91c2V1cCkscy5tb3VzZXVwPW51bGwpLDQmZT9zLm1vdXNlZHJhZ3x8KHMubW91c2VkcmFnPW4ubW91c2VkcmFnKToodGhpcy5fZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHMubW91c2VkcmFnKSxzLm1vdXNlZHJhZz1udWxsKX0pKSksdGhpcy5jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZVByb3RvY29sPXRoaXMuY29yZU1vdXNlU2VydmljZS5hY3RpdmVQcm90b2NvbCx0aGlzLnJlZ2lzdGVyKCgwLHIuYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKSh0LFwibW91c2Vkb3duXCIsKGU9PntpZihlLnByZXZlbnREZWZhdWx0KCksdGhpcy5mb2N1cygpLHRoaXMuY29yZU1vdXNlU2VydmljZS5hcmVNb3VzZUV2ZW50c0FjdGl2ZSYmIXRoaXMuX3NlbGVjdGlvblNlcnZpY2Uuc2hvdWxkRm9yY2VTZWxlY3Rpb24oZSkpcmV0dXJuIGkoZSkscy5tb3VzZXVwJiZ0aGlzLl9kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHMubW91c2V1cCkscy5tb3VzZWRyYWcmJnRoaXMuX2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIixzLm1vdXNlZHJhZyksdGhpcy5jYW5jZWwoZSl9KSkpLHRoaXMucmVnaXN0ZXIoKDAsci5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHQsXCJ3aGVlbFwiLChlPT57aWYoIXMud2hlZWwpe2lmKHRoaXMuX2N1c3RvbVdoZWVsRXZlbnRIYW5kbGVyJiYhMT09PXRoaXMuX2N1c3RvbVdoZWVsRXZlbnRIYW5kbGVyKGUpKXJldHVybiExO2lmKCF0aGlzLmJ1ZmZlci5oYXNTY3JvbGxiYWNrKXtjb25zdCB0PXRoaXMudmlld3BvcnQuZ2V0TGluZXNTY3JvbGxlZChlKTtpZigwPT09dClyZXR1cm47Y29uc3QgaT1ELkMwLkVTQysodGhpcy5jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuYXBwbGljYXRpb25DdXJzb3JLZXlzP1wiT1wiOlwiW1wiKSsoZS5kZWx0YVk8MD9cIkFcIjpcIkJcIik7bGV0IHM9XCJcIjtmb3IobGV0IGU9MDtlPE1hdGguYWJzKHQpO2UrKylzKz1pO3JldHVybiB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQocywhMCksdGhpcy5jYW5jZWwoZSwhMCl9cmV0dXJuIHRoaXMudmlld3BvcnQuaGFuZGxlV2hlZWwoZSk/dGhpcy5jYW5jZWwoZSk6dm9pZCAwfX0pLHtwYXNzaXZlOiExfSkpLHRoaXMucmVnaXN0ZXIoKDAsci5hZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIpKHQsXCJ0b3VjaHN0YXJ0XCIsKGU9PntpZighdGhpcy5jb3JlTW91c2VTZXJ2aWNlLmFyZU1vdXNlRXZlbnRzQWN0aXZlKXJldHVybiB0aGlzLnZpZXdwb3J0LmhhbmRsZVRvdWNoU3RhcnQoZSksdGhpcy5jYW5jZWwoZSl9KSx7cGFzc2l2ZTohMH0pKSx0aGlzLnJlZ2lzdGVyKCgwLHIuYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKSh0LFwidG91Y2htb3ZlXCIsKGU9PntpZighdGhpcy5jb3JlTW91c2VTZXJ2aWNlLmFyZU1vdXNlRXZlbnRzQWN0aXZlKXJldHVybiB0aGlzLnZpZXdwb3J0LmhhbmRsZVRvdWNoTW92ZShlKT92b2lkIDA6dGhpcy5jYW5jZWwoZSl9KSx7cGFzc2l2ZTohMX0pKX1yZWZyZXNoKGUsdCl7dGhpcy5fcmVuZGVyU2VydmljZT8ucmVmcmVzaFJvd3MoZSx0KX11cGRhdGVDdXJzb3JTdHlsZShlKXt0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlPy5zaG91bGRDb2x1bW5TZWxlY3QoZSk/dGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJjb2x1bW4tc2VsZWN0XCIpOnRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwiY29sdW1uLXNlbGVjdFwiKX1fc2hvd0N1cnNvcigpe3RoaXMuY29yZVNlcnZpY2UuaXNDdXJzb3JJbml0aWFsaXplZHx8KHRoaXMuY29yZVNlcnZpY2UuaXNDdXJzb3JJbml0aWFsaXplZD0hMCx0aGlzLnJlZnJlc2godGhpcy5idWZmZXIueSx0aGlzLmJ1ZmZlci55KSl9c2Nyb2xsTGluZXMoZSx0LGk9MCl7MT09PWk/KHN1cGVyLnNjcm9sbExpbmVzKGUsdCxpKSx0aGlzLnJlZnJlc2goMCx0aGlzLnJvd3MtMSkpOnRoaXMudmlld3BvcnQ/LnNjcm9sbExpbmVzKGUpfXBhc3RlKGUpeygwLHMucGFzdGUpKGUsdGhpcy50ZXh0YXJlYSx0aGlzLmNvcmVTZXJ2aWNlLHRoaXMub3B0aW9uc1NlcnZpY2UpfWF0dGFjaEN1c3RvbUtleUV2ZW50SGFuZGxlcihlKXt0aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXI9ZX1hdHRhY2hDdXN0b21XaGVlbEV2ZW50SGFuZGxlcihlKXt0aGlzLl9jdXN0b21XaGVlbEV2ZW50SGFuZGxlcj1lfXJlZ2lzdGVyTGlua1Byb3ZpZGVyKGUpe3JldHVybiB0aGlzLl9saW5rUHJvdmlkZXJTZXJ2aWNlLnJlZ2lzdGVyTGlua1Byb3ZpZGVyKGUpfXJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyKGUpe2lmKCF0aGlzLl9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlKXRocm93IG5ldyBFcnJvcihcIlRlcm1pbmFsIG11c3QgYmUgb3BlbmVkIGZpcnN0XCIpO2NvbnN0IHQ9dGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZS5yZWdpc3RlcihlKTtyZXR1cm4gdGhpcy5yZWZyZXNoKDAsdGhpcy5yb3dzLTEpLHR9ZGVyZWdpc3RlckNoYXJhY3RlckpvaW5lcihlKXtpZighdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZSl0aHJvdyBuZXcgRXJyb3IoXCJUZXJtaW5hbCBtdXN0IGJlIG9wZW5lZCBmaXJzdFwiKTt0aGlzLl9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLmRlcmVnaXN0ZXIoZSkmJnRoaXMucmVmcmVzaCgwLHRoaXMucm93cy0xKX1nZXQgbWFya2Vycygpe3JldHVybiB0aGlzLmJ1ZmZlci5tYXJrZXJzfXJlZ2lzdGVyTWFya2VyKGUpe3JldHVybiB0aGlzLmJ1ZmZlci5hZGRNYXJrZXIodGhpcy5idWZmZXIueWJhc2UrdGhpcy5idWZmZXIueStlKX1yZWdpc3RlckRlY29yYXRpb24oZSl7cmV0dXJuIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLnJlZ2lzdGVyRGVjb3JhdGlvbihlKX1oYXNTZWxlY3Rpb24oKXtyZXR1cm4hIXRoaXMuX3NlbGVjdGlvblNlcnZpY2UmJnRoaXMuX3NlbGVjdGlvblNlcnZpY2UuaGFzU2VsZWN0aW9ufXNlbGVjdChlLHQsaSl7dGhpcy5fc2VsZWN0aW9uU2VydmljZS5zZXRTZWxlY3Rpb24oZSx0LGkpfWdldFNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlP3RoaXMuX3NlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uVGV4dDpcIlwifWdldFNlbGVjdGlvblBvc2l0aW9uKCl7aWYodGhpcy5fc2VsZWN0aW9uU2VydmljZSYmdGhpcy5fc2VsZWN0aW9uU2VydmljZS5oYXNTZWxlY3Rpb24pcmV0dXJue3N0YXJ0Ont4OnRoaXMuX3NlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uU3RhcnRbMF0seTp0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvblN0YXJ0WzFdfSxlbmQ6e3g6dGhpcy5fc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb25FbmRbMF0seTp0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvbkVuZFsxXX19fWNsZWFyU2VsZWN0aW9uKCl7dGhpcy5fc2VsZWN0aW9uU2VydmljZT8uY2xlYXJTZWxlY3Rpb24oKX1zZWxlY3RBbGwoKXt0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlPy5zZWxlY3RBbGwoKX1zZWxlY3RMaW5lcyhlLHQpe3RoaXMuX3NlbGVjdGlvblNlcnZpY2U/LnNlbGVjdExpbmVzKGUsdCl9X2tleURvd24oZSl7aWYodGhpcy5fa2V5RG93bkhhbmRsZWQ9ITEsdGhpcy5fa2V5RG93blNlZW49ITAsdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyJiYhMT09PXRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlcihlKSlyZXR1cm4hMTtjb25zdCB0PXRoaXMuYnJvd3Nlci5pc01hYyYmdGhpcy5vcHRpb25zLm1hY09wdGlvbklzTWV0YSYmZS5hbHRLZXk7aWYoIXQmJiF0aGlzLl9jb21wb3NpdGlvbkhlbHBlci5rZXlkb3duKGUpKXJldHVybiB0aGlzLm9wdGlvbnMuc2Nyb2xsT25Vc2VySW5wdXQmJnRoaXMuYnVmZmVyLnliYXNlIT09dGhpcy5idWZmZXIueWRpc3AmJnRoaXMuc2Nyb2xsVG9Cb3R0b20oKSwhMTt0fHxcIkRlYWRcIiE9PWUua2V5JiZcIkFsdEdyYXBoXCIhPT1lLmtleXx8KHRoaXMuX3VucHJvY2Vzc2VkRGVhZEtleT0hMCk7Y29uc3QgaT0oMCxSLmV2YWx1YXRlS2V5Ym9hcmRFdmVudCkoZSx0aGlzLmNvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbkN1cnNvcktleXMsdGhpcy5icm93c2VyLmlzTWFjLHRoaXMub3B0aW9ucy5tYWNPcHRpb25Jc01ldGEpO2lmKHRoaXMudXBkYXRlQ3Vyc29yU3R5bGUoZSksMz09PWkudHlwZXx8Mj09PWkudHlwZSl7Y29uc3QgdD10aGlzLnJvd3MtMTtyZXR1cm4gdGhpcy5zY3JvbGxMaW5lcygyPT09aS50eXBlPy10OnQpLHRoaXMuY2FuY2VsKGUsITApfXJldHVybiAxPT09aS50eXBlJiZ0aGlzLnNlbGVjdEFsbCgpLCEhdGhpcy5faXNUaGlyZExldmVsU2hpZnQodGhpcy5icm93c2VyLGUpfHwoaS5jYW5jZWwmJnRoaXMuY2FuY2VsKGUsITApLCFpLmtleXx8ISEoZS5rZXkmJiFlLmN0cmxLZXkmJiFlLmFsdEtleSYmIWUubWV0YUtleSYmMT09PWUua2V5Lmxlbmd0aCYmZS5rZXkuY2hhckNvZGVBdCgwKT49NjUmJmUua2V5LmNoYXJDb2RlQXQoMCk8PTkwKXx8KHRoaXMuX3VucHJvY2Vzc2VkRGVhZEtleT8odGhpcy5fdW5wcm9jZXNzZWREZWFkS2V5PSExLCEwKTooaS5rZXkhPT1ELkMwLkVUWCYmaS5rZXkhPT1ELkMwLkNSfHwodGhpcy50ZXh0YXJlYS52YWx1ZT1cIlwiKSx0aGlzLl9vbktleS5maXJlKHtrZXk6aS5rZXksZG9tRXZlbnQ6ZX0pLHRoaXMuX3Nob3dDdXJzb3IoKSx0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoaS5rZXksITApLCF0aGlzLm9wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuc2NyZWVuUmVhZGVyTW9kZXx8ZS5hbHRLZXl8fGUuY3RybEtleT90aGlzLmNhbmNlbChlLCEwKTp2b2lkKHRoaXMuX2tleURvd25IYW5kbGVkPSEwKSkpKX1faXNUaGlyZExldmVsU2hpZnQoZSx0KXtjb25zdCBpPWUuaXNNYWMmJiF0aGlzLm9wdGlvbnMubWFjT3B0aW9uSXNNZXRhJiZ0LmFsdEtleSYmIXQuY3RybEtleSYmIXQubWV0YUtleXx8ZS5pc1dpbmRvd3MmJnQuYWx0S2V5JiZ0LmN0cmxLZXkmJiF0Lm1ldGFLZXl8fGUuaXNXaW5kb3dzJiZ0LmdldE1vZGlmaWVyU3RhdGUoXCJBbHRHcmFwaFwiKTtyZXR1cm5cImtleXByZXNzXCI9PT10LnR5cGU/aTppJiYoIXQua2V5Q29kZXx8dC5rZXlDb2RlPjQ3KX1fa2V5VXAoZSl7dGhpcy5fa2V5RG93blNlZW49ITEsdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyJiYhMT09PXRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlcihlKXx8KGZ1bmN0aW9uKGUpe3JldHVybiAxNj09PWUua2V5Q29kZXx8MTc9PT1lLmtleUNvZGV8fDE4PT09ZS5rZXlDb2RlfShlKXx8dGhpcy5mb2N1cygpLHRoaXMudXBkYXRlQ3Vyc29yU3R5bGUoZSksdGhpcy5fa2V5UHJlc3NIYW5kbGVkPSExKX1fa2V5UHJlc3MoZSl7bGV0IHQ7aWYodGhpcy5fa2V5UHJlc3NIYW5kbGVkPSExLHRoaXMuX2tleURvd25IYW5kbGVkKXJldHVybiExO2lmKHRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlciYmITE9PT10aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXIoZSkpcmV0dXJuITE7aWYodGhpcy5jYW5jZWwoZSksZS5jaGFyQ29kZSl0PWUuY2hhckNvZGU7ZWxzZSBpZihudWxsPT09ZS53aGljaHx8dm9pZCAwPT09ZS53aGljaCl0PWUua2V5Q29kZTtlbHNle2lmKDA9PT1lLndoaWNofHwwPT09ZS5jaGFyQ29kZSlyZXR1cm4hMTt0PWUud2hpY2h9cmV0dXJuISghdHx8KGUuYWx0S2V5fHxlLmN0cmxLZXl8fGUubWV0YUtleSkmJiF0aGlzLl9pc1RoaXJkTGV2ZWxTaGlmdCh0aGlzLmJyb3dzZXIsZSl8fCh0PVN0cmluZy5mcm9tQ2hhckNvZGUodCksdGhpcy5fb25LZXkuZmlyZSh7a2V5OnQsZG9tRXZlbnQ6ZX0pLHRoaXMuX3Nob3dDdXJzb3IoKSx0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQodCwhMCksdGhpcy5fa2V5UHJlc3NIYW5kbGVkPSEwLHRoaXMuX3VucHJvY2Vzc2VkRGVhZEtleT0hMSwwKSl9X2lucHV0RXZlbnQoZSl7aWYoZS5kYXRhJiZcImluc2VydFRleHRcIj09PWUuaW5wdXRUeXBlJiYoIWUuY29tcG9zZWR8fCF0aGlzLl9rZXlEb3duU2VlbikmJiF0aGlzLm9wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuc2NyZWVuUmVhZGVyTW9kZSl7aWYodGhpcy5fa2V5UHJlc3NIYW5kbGVkKXJldHVybiExO3RoaXMuX3VucHJvY2Vzc2VkRGVhZEtleT0hMTtjb25zdCB0PWUuZGF0YTtyZXR1cm4gdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KHQsITApLHRoaXMuY2FuY2VsKGUpLCEwfXJldHVybiExfXJlc2l6ZShlLHQpe2UhPT10aGlzLmNvbHN8fHQhPT10aGlzLnJvd3M/c3VwZXIucmVzaXplKGUsdCk6dGhpcy5fY2hhclNpemVTZXJ2aWNlJiYhdGhpcy5fY2hhclNpemVTZXJ2aWNlLmhhc1ZhbGlkU2l6ZSYmdGhpcy5fY2hhclNpemVTZXJ2aWNlLm1lYXN1cmUoKX1fYWZ0ZXJSZXNpemUoZSx0KXt0aGlzLl9jaGFyU2l6ZVNlcnZpY2U/Lm1lYXN1cmUoKSx0aGlzLnZpZXdwb3J0Py5zeW5jU2Nyb2xsQXJlYSghMCl9Y2xlYXIoKXtpZigwIT09dGhpcy5idWZmZXIueWJhc2V8fDAhPT10aGlzLmJ1ZmZlci55KXt0aGlzLmJ1ZmZlci5jbGVhckFsbE1hcmtlcnMoKSx0aGlzLmJ1ZmZlci5saW5lcy5zZXQoMCx0aGlzLmJ1ZmZlci5saW5lcy5nZXQodGhpcy5idWZmZXIueWJhc2UrdGhpcy5idWZmZXIueSkpLHRoaXMuYnVmZmVyLmxpbmVzLmxlbmd0aD0xLHRoaXMuYnVmZmVyLnlkaXNwPTAsdGhpcy5idWZmZXIueWJhc2U9MCx0aGlzLmJ1ZmZlci55PTA7Zm9yKGxldCBlPTE7ZTx0aGlzLnJvd3M7ZSsrKXRoaXMuYnVmZmVyLmxpbmVzLnB1c2godGhpcy5idWZmZXIuZ2V0QmxhbmtMaW5lKEwuREVGQVVMVF9BVFRSX0RBVEEpKTt0aGlzLl9vblNjcm9sbC5maXJlKHtwb3NpdGlvbjp0aGlzLmJ1ZmZlci55ZGlzcCxzb3VyY2U6MH0pLHRoaXMudmlld3BvcnQ/LnJlc2V0KCksdGhpcy5yZWZyZXNoKDAsdGhpcy5yb3dzLTEpfX1yZXNldCgpe3RoaXMub3B0aW9ucy5yb3dzPXRoaXMucm93cyx0aGlzLm9wdGlvbnMuY29scz10aGlzLmNvbHM7Y29uc3QgZT10aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXI7dGhpcy5fc2V0dXAoKSxzdXBlci5yZXNldCgpLHRoaXMuX3NlbGVjdGlvblNlcnZpY2U/LnJlc2V0KCksdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UucmVzZXQoKSx0aGlzLnZpZXdwb3J0Py5yZXNldCgpLHRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlcj1lLHRoaXMucmVmcmVzaCgwLHRoaXMucm93cy0xKX1jbGVhclRleHR1cmVBdGxhcygpe3RoaXMuX3JlbmRlclNlcnZpY2U/LmNsZWFyVGV4dHVyZUF0bGFzKCl9X3JlcG9ydEZvY3VzKCl7dGhpcy5lbGVtZW50Py5jbGFzc0xpc3QuY29udGFpbnMoXCJmb2N1c1wiKT90aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoRC5DMC5FU0MrXCJbSVwiKTp0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoRC5DMC5FU0MrXCJbT1wiKX1fcmVwb3J0V2luZG93c09wdGlvbnMoZSl7aWYodGhpcy5fcmVuZGVyU2VydmljZSlzd2l0Y2goZSl7Y2FzZSBULldpbmRvd3NPcHRpb25zUmVwb3J0VHlwZS5HRVRfV0lOX1NJWkVfUElYRUxTOmNvbnN0IGU9dGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGgudG9GaXhlZCgwKSx0PXRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodC50b0ZpeGVkKDApO3RoaXMuY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChgJHtELkMwLkVTQ31bNDske3R9OyR7ZX10YCk7YnJlYWs7Y2FzZSBULldpbmRvd3NPcHRpb25zUmVwb3J0VHlwZS5HRVRfQ0VMTF9TSVpFX1BJWEVMUzpjb25zdCBpPXRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aC50b0ZpeGVkKDApLHM9dGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodC50b0ZpeGVkKDApO3RoaXMuY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChgJHtELkMwLkVTQ31bNjske3N9OyR7aX10YCl9fWNhbmNlbChlLHQpe2lmKHRoaXMub3B0aW9ucy5jYW5jZWxFdmVudHN8fHQpcmV0dXJuIGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLCExfX10LlRlcm1pbmFsPVB9LDk5MjQ6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LlRpbWVCYXNlZERlYm91bmNlcj12b2lkIDAsdC5UaW1lQmFzZWREZWJvdW5jZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0PTFlMyl7dGhpcy5fcmVuZGVyQ2FsbGJhY2s9ZSx0aGlzLl9kZWJvdW5jZVRocmVzaG9sZE1TPXQsdGhpcy5fbGFzdFJlZnJlc2hNcz0wLHRoaXMuX2FkZGl0aW9uYWxSZWZyZXNoUmVxdWVzdGVkPSExfWRpc3Bvc2UoKXt0aGlzLl9yZWZyZXNoVGltZW91dElEJiZjbGVhclRpbWVvdXQodGhpcy5fcmVmcmVzaFRpbWVvdXRJRCl9cmVmcmVzaChlLHQsaSl7dGhpcy5fcm93Q291bnQ9aSxlPXZvaWQgMCE9PWU/ZTowLHQ9dm9pZCAwIT09dD90OnRoaXMuX3Jvd0NvdW50LTEsdGhpcy5fcm93U3RhcnQ9dm9pZCAwIT09dGhpcy5fcm93U3RhcnQ/TWF0aC5taW4odGhpcy5fcm93U3RhcnQsZSk6ZSx0aGlzLl9yb3dFbmQ9dm9pZCAwIT09dGhpcy5fcm93RW5kP01hdGgubWF4KHRoaXMuX3Jvd0VuZCx0KTp0O2NvbnN0IHM9RGF0ZS5ub3coKTtpZihzLXRoaXMuX2xhc3RSZWZyZXNoTXM+PXRoaXMuX2RlYm91bmNlVGhyZXNob2xkTVMpdGhpcy5fbGFzdFJlZnJlc2hNcz1zLHRoaXMuX2lubmVyUmVmcmVzaCgpO2Vsc2UgaWYoIXRoaXMuX2FkZGl0aW9uYWxSZWZyZXNoUmVxdWVzdGVkKXtjb25zdCBlPXMtdGhpcy5fbGFzdFJlZnJlc2hNcyx0PXRoaXMuX2RlYm91bmNlVGhyZXNob2xkTVMtZTt0aGlzLl9hZGRpdGlvbmFsUmVmcmVzaFJlcXVlc3RlZD0hMCx0aGlzLl9yZWZyZXNoVGltZW91dElEPXdpbmRvdy5zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX2xhc3RSZWZyZXNoTXM9RGF0ZS5ub3coKSx0aGlzLl9pbm5lclJlZnJlc2goKSx0aGlzLl9hZGRpdGlvbmFsUmVmcmVzaFJlcXVlc3RlZD0hMSx0aGlzLl9yZWZyZXNoVGltZW91dElEPXZvaWQgMH0pLHQpfX1faW5uZXJSZWZyZXNoKCl7aWYodm9pZCAwPT09dGhpcy5fcm93U3RhcnR8fHZvaWQgMD09PXRoaXMuX3Jvd0VuZHx8dm9pZCAwPT09dGhpcy5fcm93Q291bnQpcmV0dXJuO2NvbnN0IGU9TWF0aC5tYXgodGhpcy5fcm93U3RhcnQsMCksdD1NYXRoLm1pbih0aGlzLl9yb3dFbmQsdGhpcy5fcm93Q291bnQtMSk7dGhpcy5fcm93U3RhcnQ9dm9pZCAwLHRoaXMuX3Jvd0VuZD12b2lkIDAsdGhpcy5fcmVuZGVyQ2FsbGJhY2soZSx0KX19fSwxNjgwOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz10aGlzJiZ0aGlzLl9fZGVjb3JhdGV8fGZ1bmN0aW9uKGUsdCxpLHMpe3ZhciByLG49YXJndW1lbnRzLmxlbmd0aCxvPW48Mz90Om51bGw9PT1zP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpOnM7aWYoXCJvYmplY3RcIj09dHlwZW9mIFJlZmxlY3QmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpbz1SZWZsZWN0LmRlY29yYXRlKGUsdCxpLHMpO2Vsc2UgZm9yKHZhciBhPWUubGVuZ3RoLTE7YT49MDthLS0pKHI9ZVthXSkmJihvPShuPDM/cihvKTpuPjM/cih0LGksbyk6cih0LGkpKXx8byk7cmV0dXJuIG4+MyYmbyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSxvKSxvfSxyPXRoaXMmJnRoaXMuX19wYXJhbXx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oaSxzKXt0KGkscyxlKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuVmlld3BvcnQ9dm9pZCAwO2NvbnN0IG49aSgzNjU2KSxvPWkoNDcyNSksYT1pKDg0NjApLGg9aSg4NDQpLGM9aSgyNTg1KTtsZXQgbD10LlZpZXdwb3J0PWNsYXNzIGV4dGVuZHMgaC5EaXNwb3NhYmxle2NvbnN0cnVjdG9yKGUsdCxpLHMscixvLGgsYyl7c3VwZXIoKSx0aGlzLl92aWV3cG9ydEVsZW1lbnQ9ZSx0aGlzLl9zY3JvbGxBcmVhPXQsdGhpcy5fYnVmZmVyU2VydmljZT1pLHRoaXMuX29wdGlvbnNTZXJ2aWNlPXMsdGhpcy5fY2hhclNpemVTZXJ2aWNlPXIsdGhpcy5fcmVuZGVyU2VydmljZT1vLHRoaXMuX2NvcmVCcm93c2VyU2VydmljZT1oLHRoaXMuc2Nyb2xsQmFyV2lkdGg9MCx0aGlzLl9jdXJyZW50Um93SGVpZ2h0PTAsdGhpcy5fY3VycmVudERldmljZUNlbGxIZWlnaHQ9MCx0aGlzLl9sYXN0UmVjb3JkZWRCdWZmZXJMZW5ndGg9MCx0aGlzLl9sYXN0UmVjb3JkZWRWaWV3cG9ydEhlaWdodD0wLHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckhlaWdodD0wLHRoaXMuX2xhc3RUb3VjaFk9MCx0aGlzLl9sYXN0U2Nyb2xsVG9wPTAsdGhpcy5fd2hlZWxQYXJ0aWFsU2Nyb2xsPTAsdGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lPW51bGwsdGhpcy5faWdub3JlTmV4dFNjcm9sbEV2ZW50PSExLHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlPXtzdGFydFRpbWU6MCxvcmlnaW46LTEsdGFyZ2V0Oi0xfSx0aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcz10aGlzLnJlZ2lzdGVyKG5ldyBhLkV2ZW50RW1pdHRlciksdGhpcy5vblJlcXVlc3RTY3JvbGxMaW5lcz10aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcy5ldmVudCx0aGlzLnNjcm9sbEJhcldpZHRoPXRoaXMuX3ZpZXdwb3J0RWxlbWVudC5vZmZzZXRXaWR0aC10aGlzLl9zY3JvbGxBcmVhLm9mZnNldFdpZHRofHwxNSx0aGlzLnJlZ2lzdGVyKCgwLG4uYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKSh0aGlzLl92aWV3cG9ydEVsZW1lbnQsXCJzY3JvbGxcIix0aGlzLl9oYW5kbGVTY3JvbGwuYmluZCh0aGlzKSkpLHRoaXMuX2FjdGl2ZUJ1ZmZlcj10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcix0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5vbkJ1ZmZlckFjdGl2YXRlKChlPT50aGlzLl9hY3RpdmVCdWZmZXI9ZS5hY3RpdmVCdWZmZXIpKSksdGhpcy5fcmVuZGVyRGltZW5zaW9ucz10aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMsdGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uRGltZW5zaW9uc0NoYW5nZSgoZT0+dGhpcy5fcmVuZGVyRGltZW5zaW9ucz1lKSkpLHRoaXMuX2hhbmRsZVRoZW1lQ2hhbmdlKGMuY29sb3JzKSx0aGlzLnJlZ2lzdGVyKGMub25DaGFuZ2VDb2xvcnMoKGU9PnRoaXMuX2hhbmRsZVRoZW1lQ2hhbmdlKGUpKSkpLHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZShcInNjcm9sbGJhY2tcIiwoKCk9PnRoaXMuc3luY1Njcm9sbEFyZWEoKSkpKSxzZXRUaW1lb3V0KCgoKT0+dGhpcy5zeW5jU2Nyb2xsQXJlYSgpKSl9X2hhbmRsZVRoZW1lQ2hhbmdlKGUpe3RoaXMuX3ZpZXdwb3J0RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9ZS5iYWNrZ3JvdW5kLmNzc31yZXNldCgpe3RoaXMuX2N1cnJlbnRSb3dIZWlnaHQ9MCx0aGlzLl9jdXJyZW50RGV2aWNlQ2VsbEhlaWdodD0wLHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckxlbmd0aD0wLHRoaXMuX2xhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0PTAsdGhpcy5fbGFzdFJlY29yZGVkQnVmZmVySGVpZ2h0PTAsdGhpcy5fbGFzdFRvdWNoWT0wLHRoaXMuX2xhc3RTY3JvbGxUb3A9MCx0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9PnRoaXMuc3luY1Njcm9sbEFyZWEoKSkpfV9yZWZyZXNoKGUpe2lmKGUpcmV0dXJuIHRoaXMuX2lubmVyUmVmcmVzaCgpLHZvaWQobnVsbCE9PXRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSYmdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWZyZXNoQW5pbWF0aW9uRnJhbWUpKTtudWxsPT09dGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lJiYodGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lPXRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+dGhpcy5faW5uZXJSZWZyZXNoKCkpKSl9X2lubmVyUmVmcmVzaCgpe2lmKHRoaXMuX2NoYXJTaXplU2VydmljZS5oZWlnaHQ+MCl7dGhpcy5fY3VycmVudFJvd0hlaWdodD10aGlzLl9yZW5kZXJEaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodC90aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByLHRoaXMuX2N1cnJlbnREZXZpY2VDZWxsSGVpZ2h0PXRoaXMuX3JlbmRlckRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0LHRoaXMuX2xhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0PXRoaXMuX3ZpZXdwb3J0RWxlbWVudC5vZmZzZXRIZWlnaHQ7Y29uc3QgZT1NYXRoLnJvdW5kKHRoaXMuX2N1cnJlbnRSb3dIZWlnaHQqdGhpcy5fbGFzdFJlY29yZGVkQnVmZmVyTGVuZ3RoKSsodGhpcy5fbGFzdFJlY29yZGVkVmlld3BvcnRIZWlnaHQtdGhpcy5fcmVuZGVyRGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodCk7dGhpcy5fbGFzdFJlY29yZGVkQnVmZmVySGVpZ2h0IT09ZSYmKHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckhlaWdodD1lLHRoaXMuX3Njcm9sbEFyZWEuc3R5bGUuaGVpZ2h0PXRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckhlaWdodCtcInB4XCIpfWNvbnN0IGU9dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3AqdGhpcy5fY3VycmVudFJvd0hlaWdodDt0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wIT09ZSYmKHRoaXMuX2lnbm9yZU5leHRTY3JvbGxFdmVudD0hMCx0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wPWUpLHRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZT1udWxsfXN5bmNTY3JvbGxBcmVhKGU9ITEpe2lmKHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckxlbmd0aCE9PXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmxlbmd0aClyZXR1cm4gdGhpcy5fbGFzdFJlY29yZGVkQnVmZmVyTGVuZ3RoPXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmxlbmd0aCx2b2lkIHRoaXMuX3JlZnJlc2goZSk7dGhpcy5fbGFzdFJlY29yZGVkVmlld3BvcnRIZWlnaHQ9PT10aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQmJnRoaXMuX2xhc3RTY3JvbGxUb3A9PT10aGlzLl9hY3RpdmVCdWZmZXIueWRpc3AqdGhpcy5fY3VycmVudFJvd0hlaWdodCYmdGhpcy5fcmVuZGVyRGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQ9PT10aGlzLl9jdXJyZW50RGV2aWNlQ2VsbEhlaWdodHx8dGhpcy5fcmVmcmVzaChlKX1faGFuZGxlU2Nyb2xsKGUpe2lmKHRoaXMuX2xhc3RTY3JvbGxUb3A9dGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCwhdGhpcy5fdmlld3BvcnRFbGVtZW50Lm9mZnNldFBhcmVudClyZXR1cm47aWYodGhpcy5faWdub3JlTmV4dFNjcm9sbEV2ZW50KXJldHVybiB0aGlzLl9pZ25vcmVOZXh0U2Nyb2xsRXZlbnQ9ITEsdm9pZCB0aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcy5maXJlKHthbW91bnQ6MCxzdXBwcmVzc1Njcm9sbEV2ZW50OiEwfSk7Y29uc3QgdD1NYXRoLnJvdW5kKHRoaXMuX2xhc3RTY3JvbGxUb3AvdGhpcy5fY3VycmVudFJvd0hlaWdodCktdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3A7dGhpcy5fb25SZXF1ZXN0U2Nyb2xsTGluZXMuZmlyZSh7YW1vdW50OnQsc3VwcHJlc3NTY3JvbGxFdmVudDohMH0pfV9zbW9vdGhTY3JvbGwoKXtpZih0aGlzLl9pc0Rpc3Bvc2VkfHwtMT09PXRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLm9yaWdpbnx8LTE9PT10aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQpcmV0dXJuO2NvbnN0IGU9dGhpcy5fc21vb3RoU2Nyb2xsUGVyY2VudCgpO3RoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3A9dGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUub3JpZ2luK01hdGgucm91bmQoZSoodGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0LXRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLm9yaWdpbikpLGU8MT90aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9PnRoaXMuX3Ntb290aFNjcm9sbCgpKSk6dGhpcy5fY2xlYXJTbW9vdGhTY3JvbGxTdGF0ZSgpfV9zbW9vdGhTY3JvbGxQZXJjZW50KCl7cmV0dXJuIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuc21vb3RoU2Nyb2xsRHVyYXRpb24mJnRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnN0YXJ0VGltZT9NYXRoLm1heChNYXRoLm1pbigoRGF0ZS5ub3coKS10aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5zdGFydFRpbWUpL3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuc21vb3RoU2Nyb2xsRHVyYXRpb24sMSksMCk6MX1fY2xlYXJTbW9vdGhTY3JvbGxTdGF0ZSgpe3RoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnN0YXJ0VGltZT0wLHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLm9yaWdpbj0tMSx0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQ9LTF9X2J1YmJsZVNjcm9sbChlLHQpe2NvbnN0IGk9dGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCt0aGlzLl9sYXN0UmVjb3JkZWRWaWV3cG9ydEhlaWdodDtyZXR1cm4hKHQ8MCYmMCE9PXRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3B8fHQ+MCYmaTx0aGlzLl9sYXN0UmVjb3JkZWRCdWZmZXJIZWlnaHQpfHwoZS5jYW5jZWxhYmxlJiZlLnByZXZlbnREZWZhdWx0KCksITEpfWhhbmRsZVdoZWVsKGUpe2NvbnN0IHQ9dGhpcy5fZ2V0UGl4ZWxzU2Nyb2xsZWQoZSk7cmV0dXJuIDAhPT10JiYodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zbW9vdGhTY3JvbGxEdXJhdGlvbj8odGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUuc3RhcnRUaW1lPURhdGUubm93KCksdGhpcy5fc21vb3RoU2Nyb2xsUGVyY2VudCgpPDE/KHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLm9yaWdpbj10aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wLC0xPT09dGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0P3RoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldD10aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wK3Q6dGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0Kz10LHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldD1NYXRoLm1heChNYXRoLm1pbih0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQsdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbEhlaWdodCksMCksdGhpcy5fc21vb3RoU2Nyb2xsKCkpOnRoaXMuX2NsZWFyU21vb3RoU2Nyb2xsU3RhdGUoKSk6dGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCs9dCx0aGlzLl9idWJibGVTY3JvbGwoZSx0KSl9c2Nyb2xsTGluZXMoZSl7aWYoMCE9PWUpaWYodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zbW9vdGhTY3JvbGxEdXJhdGlvbil7Y29uc3QgdD1lKnRoaXMuX2N1cnJlbnRSb3dIZWlnaHQ7dGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUuc3RhcnRUaW1lPURhdGUubm93KCksdGhpcy5fc21vb3RoU2Nyb2xsUGVyY2VudCgpPDE/KHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLm9yaWdpbj10aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wLHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldD10aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5vcmlnaW4rdCx0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQ9TWF0aC5tYXgoTWF0aC5taW4odGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0LHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxIZWlnaHQpLDApLHRoaXMuX3Ntb290aFNjcm9sbCgpKTp0aGlzLl9jbGVhclNtb290aFNjcm9sbFN0YXRlKCl9ZWxzZSB0aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcy5maXJlKHthbW91bnQ6ZSxzdXBwcmVzc1Njcm9sbEV2ZW50OiExfSl9X2dldFBpeGVsc1Njcm9sbGVkKGUpe2lmKDA9PT1lLmRlbHRhWXx8ZS5zaGlmdEtleSlyZXR1cm4gMDtsZXQgdD10aGlzLl9hcHBseVNjcm9sbE1vZGlmaWVyKGUuZGVsdGFZLGUpO3JldHVybiBlLmRlbHRhTW9kZT09PVdoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkU/dCo9dGhpcy5fY3VycmVudFJvd0hlaWdodDplLmRlbHRhTW9kZT09PVdoZWVsRXZlbnQuRE9NX0RFTFRBX1BBR0UmJih0Kj10aGlzLl9jdXJyZW50Um93SGVpZ2h0KnRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyksdH1nZXRCdWZmZXJFbGVtZW50cyhlLHQpe2xldCBpLHM9XCJcIjtjb25zdCByPVtdLG49dD8/dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMubGVuZ3RoLG89dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXM7Zm9yKGxldCB0PWU7dDxuO3QrKyl7Y29uc3QgZT1vLmdldCh0KTtpZighZSljb250aW51ZTtjb25zdCBuPW8uZ2V0KHQrMSk/LmlzV3JhcHBlZDtpZihzKz1lLnRyYW5zbGF0ZVRvU3RyaW5nKCFuKSwhbnx8dD09PW8ubGVuZ3RoLTEpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtlLnRleHRDb250ZW50PXMsci5wdXNoKGUpLHMubGVuZ3RoPjAmJihpPWUpLHM9XCJcIn19cmV0dXJue2J1ZmZlckVsZW1lbnRzOnIsY3Vyc29yRWxlbWVudDppfX1nZXRMaW5lc1Njcm9sbGVkKGUpe2lmKDA9PT1lLmRlbHRhWXx8ZS5zaGlmdEtleSlyZXR1cm4gMDtsZXQgdD10aGlzLl9hcHBseVNjcm9sbE1vZGlmaWVyKGUuZGVsdGFZLGUpO3JldHVybiBlLmRlbHRhTW9kZT09PVdoZWVsRXZlbnQuRE9NX0RFTFRBX1BJWEVMPyh0Lz10aGlzLl9jdXJyZW50Um93SGVpZ2h0KzAsdGhpcy5fd2hlZWxQYXJ0aWFsU2Nyb2xsKz10LHQ9TWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLl93aGVlbFBhcnRpYWxTY3JvbGwpKSoodGhpcy5fd2hlZWxQYXJ0aWFsU2Nyb2xsPjA/MTotMSksdGhpcy5fd2hlZWxQYXJ0aWFsU2Nyb2xsJT0xKTplLmRlbHRhTW9kZT09PVdoZWVsRXZlbnQuRE9NX0RFTFRBX1BBR0UmJih0Kj10aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpLHR9X2FwcGx5U2Nyb2xsTW9kaWZpZXIoZSx0KXtjb25zdCBpPXRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZmFzdFNjcm9sbE1vZGlmaWVyO3JldHVyblwiYWx0XCI9PT1pJiZ0LmFsdEtleXx8XCJjdHJsXCI9PT1pJiZ0LmN0cmxLZXl8fFwic2hpZnRcIj09PWkmJnQuc2hpZnRLZXk/ZSp0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZhc3RTY3JvbGxTZW5zaXRpdml0eSp0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5OmUqdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zY3JvbGxTZW5zaXRpdml0eX1oYW5kbGVUb3VjaFN0YXJ0KGUpe3RoaXMuX2xhc3RUb3VjaFk9ZS50b3VjaGVzWzBdLnBhZ2VZfWhhbmRsZVRvdWNoTW92ZShlKXtjb25zdCB0PXRoaXMuX2xhc3RUb3VjaFktZS50b3VjaGVzWzBdLnBhZ2VZO3JldHVybiB0aGlzLl9sYXN0VG91Y2hZPWUudG91Y2hlc1swXS5wYWdlWSwwIT09dCYmKHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3ArPXQsdGhpcy5fYnViYmxlU2Nyb2xsKGUsdCkpfX07dC5WaWV3cG9ydD1sPXMoW3IoMixjLklCdWZmZXJTZXJ2aWNlKSxyKDMsYy5JT3B0aW9uc1NlcnZpY2UpLHIoNCxvLklDaGFyU2l6ZVNlcnZpY2UpLHIoNSxvLklSZW5kZXJTZXJ2aWNlKSxyKDYsby5JQ29yZUJyb3dzZXJTZXJ2aWNlKSxyKDcsby5JVGhlbWVTZXJ2aWNlKV0sbCl9LDMxMDc6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzPXRoaXMmJnRoaXMuX19kZWNvcmF0ZXx8ZnVuY3Rpb24oZSx0LGkscyl7dmFyIHIsbj1hcmd1bWVudHMubGVuZ3RoLG89bjwzP3Q6bnVsbD09PXM/cz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsaSk6cztpZihcIm9iamVjdFwiPT10eXBlb2YgUmVmbGVjdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlvPVJlZmxlY3QuZGVjb3JhdGUoZSx0LGkscyk7ZWxzZSBmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSkocj1lW2FdKSYmKG89KG48Mz9yKG8pOm4+Mz9yKHQsaSxvKTpyKHQsaSkpfHxvKTtyZXR1cm4gbj4zJiZvJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLG8pLG99LHI9dGhpcyYmdGhpcy5fX3BhcmFtfHxmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihpLHMpe3QoaSxzLGUpfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5CdWZmZXJEZWNvcmF0aW9uUmVuZGVyZXI9dm9pZCAwO2NvbnN0IG49aSg0NzI1KSxvPWkoODQ0KSxhPWkoMjU4NSk7bGV0IGg9dC5CdWZmZXJEZWNvcmF0aW9uUmVuZGVyZXI9Y2xhc3MgZXh0ZW5kcyBvLkRpc3Bvc2FibGV7Y29uc3RydWN0b3IoZSx0LGkscyxyKXtzdXBlcigpLHRoaXMuX3NjcmVlbkVsZW1lbnQ9ZSx0aGlzLl9idWZmZXJTZXJ2aWNlPXQsdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlPWksdGhpcy5fZGVjb3JhdGlvblNlcnZpY2U9cyx0aGlzLl9yZW5kZXJTZXJ2aWNlPXIsdGhpcy5fZGVjb3JhdGlvbkVsZW1lbnRzPW5ldyBNYXAsdGhpcy5fYWx0QnVmZmVySXNBY3RpdmU9ITEsdGhpcy5fZGltZW5zaW9uc0NoYW5nZWQ9ITEsdGhpcy5fY29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ4dGVybS1kZWNvcmF0aW9uLWNvbnRhaW5lclwiKSx0aGlzLl9zY3JlZW5FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lciksdGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uUmVuZGVyZWRWaWV3cG9ydENoYW5nZSgoKCk9PnRoaXMuX2RvUmVmcmVzaERlY29yYXRpb25zKCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uRGltZW5zaW9uc0NoYW5nZSgoKCk9Pnt0aGlzLl9kaW1lbnNpb25zQ2hhbmdlZD0hMCx0aGlzLl9xdWV1ZVJlZnJlc2goKX0pKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uub25EcHJDaGFuZ2UoKCgpPT50aGlzLl9xdWV1ZVJlZnJlc2goKSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5vbkJ1ZmZlckFjdGl2YXRlKCgoKT0+e3RoaXMuX2FsdEJ1ZmZlcklzQWN0aXZlPXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyPT09dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFsdH0pKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5vbkRlY29yYXRpb25SZWdpc3RlcmVkKCgoKT0+dGhpcy5fcXVldWVSZWZyZXNoKCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5vbkRlY29yYXRpb25SZW1vdmVkKChlPT50aGlzLl9yZW1vdmVEZWNvcmF0aW9uKGUpKSkpLHRoaXMucmVnaXN0ZXIoKDAsby50b0Rpc3Bvc2FibGUpKCgoKT0+e3RoaXMuX2NvbnRhaW5lci5yZW1vdmUoKSx0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuY2xlYXIoKX0pKSl9X3F1ZXVlUmVmcmVzaCgpe3ZvaWQgMD09PXRoaXMuX2FuaW1hdGlvbkZyYW1lJiYodGhpcy5fYW5pbWF0aW9uRnJhbWU9dGhpcy5fcmVuZGVyU2VydmljZS5hZGRSZWZyZXNoQ2FsbGJhY2soKCgpPT57dGhpcy5fZG9SZWZyZXNoRGVjb3JhdGlvbnMoKSx0aGlzLl9hbmltYXRpb25GcmFtZT12b2lkIDB9KSkpfV9kb1JlZnJlc2hEZWNvcmF0aW9ucygpe2Zvcihjb25zdCBlIG9mIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLmRlY29yYXRpb25zKXRoaXMuX3JlbmRlckRlY29yYXRpb24oZSk7dGhpcy5fZGltZW5zaW9uc0NoYW5nZWQ9ITF9X3JlbmRlckRlY29yYXRpb24oZSl7dGhpcy5fcmVmcmVzaFN0eWxlKGUpLHRoaXMuX2RpbWVuc2lvbnNDaGFuZ2VkJiZ0aGlzLl9yZWZyZXNoWFBvc2l0aW9uKGUpfV9jcmVhdGVFbGVtZW50KGUpe2NvbnN0IHQ9dGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3QuY2xhc3NMaXN0LmFkZChcInh0ZXJtLWRlY29yYXRpb25cIiksdC5jbGFzc0xpc3QudG9nZ2xlKFwieHRlcm0tZGVjb3JhdGlvbi10b3AtbGF5ZXJcIixcInRvcFwiPT09ZT8ub3B0aW9ucz8ubGF5ZXIpLHQuc3R5bGUud2lkdGg9YCR7TWF0aC5yb3VuZCgoZS5vcHRpb25zLndpZHRofHwxKSp0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwud2lkdGgpfXB4YCx0LnN0eWxlLmhlaWdodD0oZS5vcHRpb25zLmhlaWdodHx8MSkqdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodCtcInB4XCIsdC5zdHlsZS50b3A9KGUubWFya2VyLmxpbmUtdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS55ZGlzcCkqdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodCtcInB4XCIsdC5zdHlsZS5saW5lSGVpZ2h0PWAke3RoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO2NvbnN0IGk9ZS5vcHRpb25zLng/PzA7cmV0dXJuIGkmJmk+dGhpcy5fYnVmZmVyU2VydmljZS5jb2xzJiYodC5zdHlsZS5kaXNwbGF5PVwibm9uZVwiKSx0aGlzLl9yZWZyZXNoWFBvc2l0aW9uKGUsdCksdH1fcmVmcmVzaFN0eWxlKGUpe2NvbnN0IHQ9ZS5tYXJrZXIubGluZS10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWN0aXZlLnlkaXNwO2lmKHQ8MHx8dD49dGhpcy5fYnVmZmVyU2VydmljZS5yb3dzKWUuZWxlbWVudCYmKGUuZWxlbWVudC5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLGUub25SZW5kZXJFbWl0dGVyLmZpcmUoZS5lbGVtZW50KSk7ZWxzZXtsZXQgaT10aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuZ2V0KGUpO2l8fChpPXRoaXMuX2NyZWF0ZUVsZW1lbnQoZSksZS5lbGVtZW50PWksdGhpcy5fZGVjb3JhdGlvbkVsZW1lbnRzLnNldChlLGkpLHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChpKSxlLm9uRGlzcG9zZSgoKCk9Pnt0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuZGVsZXRlKGUpLGkucmVtb3ZlKCl9KSkpLGkuc3R5bGUudG9wPXQqdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodCtcInB4XCIsaS5zdHlsZS5kaXNwbGF5PXRoaXMuX2FsdEJ1ZmZlcklzQWN0aXZlP1wibm9uZVwiOlwiYmxvY2tcIixlLm9uUmVuZGVyRW1pdHRlci5maXJlKGkpfX1fcmVmcmVzaFhQb3NpdGlvbihlLHQ9ZS5lbGVtZW50KXtpZighdClyZXR1cm47Y29uc3QgaT1lLm9wdGlvbnMueD8/MDtcInJpZ2h0XCI9PT0oZS5vcHRpb25zLmFuY2hvcnx8XCJsZWZ0XCIpP3Quc3R5bGUucmlnaHQ9aT9pKnRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCtcInB4XCI6XCJcIjp0LnN0eWxlLmxlZnQ9aT9pKnRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCtcInB4XCI6XCJcIn1fcmVtb3ZlRGVjb3JhdGlvbihlKXt0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuZ2V0KGUpPy5yZW1vdmUoKSx0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuZGVsZXRlKGUpLGUuZGlzcG9zZSgpfX07dC5CdWZmZXJEZWNvcmF0aW9uUmVuZGVyZXI9aD1zKFtyKDEsYS5JQnVmZmVyU2VydmljZSkscigyLG4uSUNvcmVCcm93c2VyU2VydmljZSkscigzLGEuSURlY29yYXRpb25TZXJ2aWNlKSxyKDQsbi5JUmVuZGVyU2VydmljZSldLGgpfSw1ODcxOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5Db2xvclpvbmVTdG9yZT12b2lkIDAsdC5Db2xvclpvbmVTdG9yZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3pvbmVzPVtdLHRoaXMuX3pvbmVQb29sPVtdLHRoaXMuX3pvbmVQb29sSW5kZXg9MCx0aGlzLl9saW5lUGFkZGluZz17ZnVsbDowLGxlZnQ6MCxjZW50ZXI6MCxyaWdodDowfX1nZXQgem9uZXMoKXtyZXR1cm4gdGhpcy5fem9uZVBvb2wubGVuZ3RoPU1hdGgubWluKHRoaXMuX3pvbmVQb29sLmxlbmd0aCx0aGlzLl96b25lcy5sZW5ndGgpLHRoaXMuX3pvbmVzfWNsZWFyKCl7dGhpcy5fem9uZXMubGVuZ3RoPTAsdGhpcy5fem9uZVBvb2xJbmRleD0wfWFkZERlY29yYXRpb24oZSl7aWYoZS5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zKXtmb3IoY29uc3QgdCBvZiB0aGlzLl96b25lcylpZih0LmNvbG9yPT09ZS5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLmNvbG9yJiZ0LnBvc2l0aW9uPT09ZS5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLnBvc2l0aW9uKXtpZih0aGlzLl9saW5lSW50ZXJzZWN0c1pvbmUodCxlLm1hcmtlci5saW5lKSlyZXR1cm47aWYodGhpcy5fbGluZUFkamFjZW50VG9ab25lKHQsZS5tYXJrZXIubGluZSxlLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMucG9zaXRpb24pKXJldHVybiB2b2lkIHRoaXMuX2FkZExpbmVUb1pvbmUodCxlLm1hcmtlci5saW5lKX1pZih0aGlzLl96b25lUG9vbEluZGV4PHRoaXMuX3pvbmVQb29sLmxlbmd0aClyZXR1cm4gdGhpcy5fem9uZVBvb2xbdGhpcy5fem9uZVBvb2xJbmRleF0uY29sb3I9ZS5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLmNvbG9yLHRoaXMuX3pvbmVQb29sW3RoaXMuX3pvbmVQb29sSW5kZXhdLnBvc2l0aW9uPWUub3B0aW9ucy5vdmVydmlld1J1bGVyT3B0aW9ucy5wb3NpdGlvbix0aGlzLl96b25lUG9vbFt0aGlzLl96b25lUG9vbEluZGV4XS5zdGFydEJ1ZmZlckxpbmU9ZS5tYXJrZXIubGluZSx0aGlzLl96b25lUG9vbFt0aGlzLl96b25lUG9vbEluZGV4XS5lbmRCdWZmZXJMaW5lPWUubWFya2VyLmxpbmUsdm9pZCB0aGlzLl96b25lcy5wdXNoKHRoaXMuX3pvbmVQb29sW3RoaXMuX3pvbmVQb29sSW5kZXgrK10pO3RoaXMuX3pvbmVzLnB1c2goe2NvbG9yOmUub3B0aW9ucy5vdmVydmlld1J1bGVyT3B0aW9ucy5jb2xvcixwb3NpdGlvbjplLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMucG9zaXRpb24sc3RhcnRCdWZmZXJMaW5lOmUubWFya2VyLmxpbmUsZW5kQnVmZmVyTGluZTplLm1hcmtlci5saW5lfSksdGhpcy5fem9uZVBvb2wucHVzaCh0aGlzLl96b25lc1t0aGlzLl96b25lcy5sZW5ndGgtMV0pLHRoaXMuX3pvbmVQb29sSW5kZXgrK319c2V0UGFkZGluZyhlKXt0aGlzLl9saW5lUGFkZGluZz1lfV9saW5lSW50ZXJzZWN0c1pvbmUoZSx0KXtyZXR1cm4gdD49ZS5zdGFydEJ1ZmZlckxpbmUmJnQ8PWUuZW5kQnVmZmVyTGluZX1fbGluZUFkamFjZW50VG9ab25lKGUsdCxpKXtyZXR1cm4gdD49ZS5zdGFydEJ1ZmZlckxpbmUtdGhpcy5fbGluZVBhZGRpbmdbaXx8XCJmdWxsXCJdJiZ0PD1lLmVuZEJ1ZmZlckxpbmUrdGhpcy5fbGluZVBhZGRpbmdbaXx8XCJmdWxsXCJdfV9hZGRMaW5lVG9ab25lKGUsdCl7ZS5zdGFydEJ1ZmZlckxpbmU9TWF0aC5taW4oZS5zdGFydEJ1ZmZlckxpbmUsdCksZS5lbmRCdWZmZXJMaW5lPU1hdGgubWF4KGUuZW5kQnVmZmVyTGluZSx0KX19fSw1NzQ0OmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz10aGlzJiZ0aGlzLl9fZGVjb3JhdGV8fGZ1bmN0aW9uKGUsdCxpLHMpe3ZhciByLG49YXJndW1lbnRzLmxlbmd0aCxvPW48Mz90Om51bGw9PT1zP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpOnM7aWYoXCJvYmplY3RcIj09dHlwZW9mIFJlZmxlY3QmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpbz1SZWZsZWN0LmRlY29yYXRlKGUsdCxpLHMpO2Vsc2UgZm9yKHZhciBhPWUubGVuZ3RoLTE7YT49MDthLS0pKHI9ZVthXSkmJihvPShuPDM/cihvKTpuPjM/cih0LGksbyk6cih0LGkpKXx8byk7cmV0dXJuIG4+MyYmbyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSxvKSxvfSxyPXRoaXMmJnRoaXMuX19wYXJhbXx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oaSxzKXt0KGkscyxlKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuT3ZlcnZpZXdSdWxlclJlbmRlcmVyPXZvaWQgMDtjb25zdCBuPWkoNTg3MSksbz1pKDQ3MjUpLGE9aSg4NDQpLGg9aSgyNTg1KSxjPXtmdWxsOjAsbGVmdDowLGNlbnRlcjowLHJpZ2h0OjB9LGw9e2Z1bGw6MCxsZWZ0OjAsY2VudGVyOjAscmlnaHQ6MH0sZD17ZnVsbDowLGxlZnQ6MCxjZW50ZXI6MCxyaWdodDowfTtsZXQgXz10Lk92ZXJ2aWV3UnVsZXJSZW5kZXJlcj1jbGFzcyBleHRlbmRzIGEuRGlzcG9zYWJsZXtnZXQgX3dpZHRoKCl7cmV0dXJuIHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMub3ZlcnZpZXdSdWxlcldpZHRofHwwfWNvbnN0cnVjdG9yKGUsdCxpLHMscixvLGgpe3N1cGVyKCksdGhpcy5fdmlld3BvcnRFbGVtZW50PWUsdGhpcy5fc2NyZWVuRWxlbWVudD10LHRoaXMuX2J1ZmZlclNlcnZpY2U9aSx0aGlzLl9kZWNvcmF0aW9uU2VydmljZT1zLHRoaXMuX3JlbmRlclNlcnZpY2U9cix0aGlzLl9vcHRpb25zU2VydmljZT1vLHRoaXMuX2NvcmVCcm93c2VyU2VydmljZT1oLHRoaXMuX2NvbG9yWm9uZVN0b3JlPW5ldyBuLkNvbG9yWm9uZVN0b3JlLHRoaXMuX3Nob3VsZFVwZGF0ZURpbWVuc2lvbnM9ITAsdGhpcy5fc2hvdWxkVXBkYXRlQW5jaG9yPSEwLHRoaXMuX2xhc3RLbm93bkJ1ZmZlckxlbmd0aD0wLHRoaXMuX2NhbnZhcz10aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UubWFpbkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIiksdGhpcy5fY2FudmFzLmNsYXNzTGlzdC5hZGQoXCJ4dGVybS1kZWNvcmF0aW9uLW92ZXJ2aWV3LXJ1bGVyXCIpLHRoaXMuX3JlZnJlc2hDYW52YXNEaW1lbnNpb25zKCksdGhpcy5fdmlld3BvcnRFbGVtZW50LnBhcmVudEVsZW1lbnQ/Lmluc2VydEJlZm9yZSh0aGlzLl9jYW52YXMsdGhpcy5fdmlld3BvcnRFbGVtZW50KTtjb25zdCBjPXRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7aWYoIWMpdGhyb3cgbmV3IEVycm9yKFwiQ3R4IGNhbm5vdCBiZSBudWxsXCIpO3RoaXMuX2N0eD1jLHRoaXMuX3JlZ2lzdGVyRGVjb3JhdGlvbkxpc3RlbmVycygpLHRoaXMuX3JlZ2lzdGVyQnVmZmVyQ2hhbmdlTGlzdGVuZXJzKCksdGhpcy5fcmVnaXN0ZXJEaW1lbnNpb25DaGFuZ2VMaXN0ZW5lcnMoKSx0aGlzLnJlZ2lzdGVyKCgwLGEudG9EaXNwb3NhYmxlKSgoKCk9Pnt0aGlzLl9jYW52YXM/LnJlbW92ZSgpfSkpKX1fcmVnaXN0ZXJEZWNvcmF0aW9uTGlzdGVuZXJzKCl7dGhpcy5yZWdpc3Rlcih0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5vbkRlY29yYXRpb25SZWdpc3RlcmVkKCgoKT0+dGhpcy5fcXVldWVSZWZyZXNoKHZvaWQgMCwhMCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5vbkRlY29yYXRpb25SZW1vdmVkKCgoKT0+dGhpcy5fcXVldWVSZWZyZXNoKHZvaWQgMCwhMCkpKSl9X3JlZ2lzdGVyQnVmZmVyQ2hhbmdlTGlzdGVuZXJzKCl7dGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uUmVuZGVyZWRWaWV3cG9ydENoYW5nZSgoKCk9PnRoaXMuX3F1ZXVlUmVmcmVzaCgpKSkpLHRoaXMucmVnaXN0ZXIodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLm9uQnVmZmVyQWN0aXZhdGUoKCgpPT57dGhpcy5fY2FudmFzLnN0eWxlLmRpc3BsYXk9dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI9PT10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWx0P1wibm9uZVwiOlwiYmxvY2tcIn0pKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLm9uU2Nyb2xsKCgoKT0+e3RoaXMuX2xhc3RLbm93bkJ1ZmZlckxlbmd0aCE9PXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5ub3JtYWwubGluZXMubGVuZ3RoJiYodGhpcy5fcmVmcmVzaERyYXdIZWlnaHRDb25zdGFudHMoKSx0aGlzLl9yZWZyZXNoQ29sb3Jab25lUGFkZGluZygpKX0pKSl9X3JlZ2lzdGVyRGltZW5zaW9uQ2hhbmdlTGlzdGVuZXJzKCl7dGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uUmVuZGVyKCgoKT0+e3RoaXMuX2NvbnRhaW5lckhlaWdodCYmdGhpcy5fY29udGFpbmVySGVpZ2h0PT09dGhpcy5fc2NyZWVuRWxlbWVudC5jbGllbnRIZWlnaHR8fCh0aGlzLl9xdWV1ZVJlZnJlc2goITApLHRoaXMuX2NvbnRhaW5lckhlaWdodD10aGlzLl9zY3JlZW5FbGVtZW50LmNsaWVudEhlaWdodCl9KSkpLHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZShcIm92ZXJ2aWV3UnVsZXJXaWR0aFwiLCgoKT0+dGhpcy5fcXVldWVSZWZyZXNoKCEwKSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5vbkRwckNoYW5nZSgoKCk9PnRoaXMuX3F1ZXVlUmVmcmVzaCghMCkpKSksdGhpcy5fcXVldWVSZWZyZXNoKCEwKX1fcmVmcmVzaERyYXdDb25zdGFudHMoKXtjb25zdCBlPU1hdGguZmxvb3IodGhpcy5fY2FudmFzLndpZHRoLzMpLHQ9TWF0aC5jZWlsKHRoaXMuX2NhbnZhcy53aWR0aC8zKTtsLmZ1bGw9dGhpcy5fY2FudmFzLndpZHRoLGwubGVmdD1lLGwuY2VudGVyPXQsbC5yaWdodD1lLHRoaXMuX3JlZnJlc2hEcmF3SGVpZ2h0Q29uc3RhbnRzKCksZC5mdWxsPTAsZC5sZWZ0PTAsZC5jZW50ZXI9bC5sZWZ0LGQucmlnaHQ9bC5sZWZ0K2wuY2VudGVyfV9yZWZyZXNoRHJhd0hlaWdodENvbnN0YW50cygpe2MuZnVsbD1NYXRoLnJvdW5kKDIqdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcik7Y29uc3QgZT10aGlzLl9jYW52YXMuaGVpZ2h0L3RoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmxlbmd0aCx0PU1hdGgucm91bmQoTWF0aC5tYXgoTWF0aC5taW4oZSwxMiksNikqdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcik7Yy5sZWZ0PXQsYy5jZW50ZXI9dCxjLnJpZ2h0PXR9X3JlZnJlc2hDb2xvclpvbmVQYWRkaW5nKCl7dGhpcy5fY29sb3Jab25lU3RvcmUuc2V0UGFkZGluZyh7ZnVsbDpNYXRoLmZsb29yKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hY3RpdmUubGluZXMubGVuZ3RoLyh0aGlzLl9jYW52YXMuaGVpZ2h0LTEpKmMuZnVsbCksbGVmdDpNYXRoLmZsb29yKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hY3RpdmUubGluZXMubGVuZ3RoLyh0aGlzLl9jYW52YXMuaGVpZ2h0LTEpKmMubGVmdCksY2VudGVyOk1hdGguZmxvb3IodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS5saW5lcy5sZW5ndGgvKHRoaXMuX2NhbnZhcy5oZWlnaHQtMSkqYy5jZW50ZXIpLHJpZ2h0Ok1hdGguZmxvb3IodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS5saW5lcy5sZW5ndGgvKHRoaXMuX2NhbnZhcy5oZWlnaHQtMSkqYy5yaWdodCl9KSx0aGlzLl9sYXN0S25vd25CdWZmZXJMZW5ndGg9dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLm5vcm1hbC5saW5lcy5sZW5ndGh9X3JlZnJlc2hDYW52YXNEaW1lbnNpb25zKCl7dGhpcy5fY2FudmFzLnN0eWxlLndpZHRoPWAke3RoaXMuX3dpZHRofXB4YCx0aGlzLl9jYW52YXMud2lkdGg9TWF0aC5yb3VuZCh0aGlzLl93aWR0aCp0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByKSx0aGlzLl9jYW52YXMuc3R5bGUuaGVpZ2h0PWAke3RoaXMuX3NjcmVlbkVsZW1lbnQuY2xpZW50SGVpZ2h0fXB4YCx0aGlzLl9jYW52YXMuaGVpZ2h0PU1hdGgucm91bmQodGhpcy5fc2NyZWVuRWxlbWVudC5jbGllbnRIZWlnaHQqdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwciksdGhpcy5fcmVmcmVzaERyYXdDb25zdGFudHMoKSx0aGlzLl9yZWZyZXNoQ29sb3Jab25lUGFkZGluZygpfV9yZWZyZXNoRGVjb3JhdGlvbnMoKXt0aGlzLl9zaG91bGRVcGRhdGVEaW1lbnNpb25zJiZ0aGlzLl9yZWZyZXNoQ2FudmFzRGltZW5zaW9ucygpLHRoaXMuX2N0eC5jbGVhclJlY3QoMCwwLHRoaXMuX2NhbnZhcy53aWR0aCx0aGlzLl9jYW52YXMuaGVpZ2h0KSx0aGlzLl9jb2xvclpvbmVTdG9yZS5jbGVhcigpO2Zvcihjb25zdCBlIG9mIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLmRlY29yYXRpb25zKXRoaXMuX2NvbG9yWm9uZVN0b3JlLmFkZERlY29yYXRpb24oZSk7dGhpcy5fY3R4LmxpbmVXaWR0aD0xO2NvbnN0IGU9dGhpcy5fY29sb3Jab25lU3RvcmUuem9uZXM7Zm9yKGNvbnN0IHQgb2YgZSlcImZ1bGxcIiE9PXQucG9zaXRpb24mJnRoaXMuX3JlbmRlckNvbG9yWm9uZSh0KTtmb3IoY29uc3QgdCBvZiBlKVwiZnVsbFwiPT09dC5wb3NpdGlvbiYmdGhpcy5fcmVuZGVyQ29sb3Jab25lKHQpO3RoaXMuX3Nob3VsZFVwZGF0ZURpbWVuc2lvbnM9ITEsdGhpcy5fc2hvdWxkVXBkYXRlQW5jaG9yPSExfV9yZW5kZXJDb2xvclpvbmUoZSl7dGhpcy5fY3R4LmZpbGxTdHlsZT1lLmNvbG9yLHRoaXMuX2N0eC5maWxsUmVjdChkW2UucG9zaXRpb258fFwiZnVsbFwiXSxNYXRoLnJvdW5kKCh0aGlzLl9jYW52YXMuaGVpZ2h0LTEpKihlLnN0YXJ0QnVmZmVyTGluZS90aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWN0aXZlLmxpbmVzLmxlbmd0aCktY1tlLnBvc2l0aW9ufHxcImZ1bGxcIl0vMiksbFtlLnBvc2l0aW9ufHxcImZ1bGxcIl0sTWF0aC5yb3VuZCgodGhpcy5fY2FudmFzLmhlaWdodC0xKSooKGUuZW5kQnVmZmVyTGluZS1lLnN0YXJ0QnVmZmVyTGluZSkvdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS5saW5lcy5sZW5ndGgpK2NbZS5wb3NpdGlvbnx8XCJmdWxsXCJdKSl9X3F1ZXVlUmVmcmVzaChlLHQpe3RoaXMuX3Nob3VsZFVwZGF0ZURpbWVuc2lvbnM9ZXx8dGhpcy5fc2hvdWxkVXBkYXRlRGltZW5zaW9ucyx0aGlzLl9zaG91bGRVcGRhdGVBbmNob3I9dHx8dGhpcy5fc2hvdWxkVXBkYXRlQW5jaG9yLHZvaWQgMD09PXRoaXMuX2FuaW1hdGlvbkZyYW1lJiYodGhpcy5fYW5pbWF0aW9uRnJhbWU9dGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5fcmVmcmVzaERlY29yYXRpb25zKCksdGhpcy5fYW5pbWF0aW9uRnJhbWU9dm9pZCAwfSkpKX19O3QuT3ZlcnZpZXdSdWxlclJlbmRlcmVyPV89cyhbcigyLGguSUJ1ZmZlclNlcnZpY2UpLHIoMyxoLklEZWNvcmF0aW9uU2VydmljZSkscig0LG8uSVJlbmRlclNlcnZpY2UpLHIoNSxoLklPcHRpb25zU2VydmljZSkscig2LG8uSUNvcmVCcm93c2VyU2VydmljZSldLF8pfSwyOTUwOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz10aGlzJiZ0aGlzLl9fZGVjb3JhdGV8fGZ1bmN0aW9uKGUsdCxpLHMpe3ZhciByLG49YXJndW1lbnRzLmxlbmd0aCxvPW48Mz90Om51bGw9PT1zP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpOnM7aWYoXCJvYmplY3RcIj09dHlwZW9mIFJlZmxlY3QmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpbz1SZWZsZWN0LmRlY29yYXRlKGUsdCxpLHMpO2Vsc2UgZm9yKHZhciBhPWUubGVuZ3RoLTE7YT49MDthLS0pKHI9ZVthXSkmJihvPShuPDM/cihvKTpuPjM/cih0LGksbyk6cih0LGkpKXx8byk7cmV0dXJuIG4+MyYmbyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSxvKSxvfSxyPXRoaXMmJnRoaXMuX19wYXJhbXx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oaSxzKXt0KGkscyxlKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuQ29tcG9zaXRpb25IZWxwZXI9dm9pZCAwO2NvbnN0IG49aSg0NzI1KSxvPWkoMjU4NSksYT1pKDI1ODQpO2xldCBoPXQuQ29tcG9zaXRpb25IZWxwZXI9Y2xhc3N7Z2V0IGlzQ29tcG9zaW5nKCl7cmV0dXJuIHRoaXMuX2lzQ29tcG9zaW5nfWNvbnN0cnVjdG9yKGUsdCxpLHMscixuKXt0aGlzLl90ZXh0YXJlYT1lLHRoaXMuX2NvbXBvc2l0aW9uVmlldz10LHRoaXMuX2J1ZmZlclNlcnZpY2U9aSx0aGlzLl9vcHRpb25zU2VydmljZT1zLHRoaXMuX2NvcmVTZXJ2aWNlPXIsdGhpcy5fcmVuZGVyU2VydmljZT1uLHRoaXMuX2lzQ29tcG9zaW5nPSExLHRoaXMuX2lzU2VuZGluZ0NvbXBvc2l0aW9uPSExLHRoaXMuX2NvbXBvc2l0aW9uUG9zaXRpb249e3N0YXJ0OjAsZW5kOjB9LHRoaXMuX2RhdGFBbHJlYWR5U2VudD1cIlwifWNvbXBvc2l0aW9uc3RhcnQoKXt0aGlzLl9pc0NvbXBvc2luZz0hMCx0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uLnN0YXJ0PXRoaXMuX3RleHRhcmVhLnZhbHVlLmxlbmd0aCx0aGlzLl9jb21wb3NpdGlvblZpZXcudGV4dENvbnRlbnQ9XCJcIix0aGlzLl9kYXRhQWxyZWFkeVNlbnQ9XCJcIix0aGlzLl9jb21wb3NpdGlvblZpZXcuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKX1jb21wb3NpdGlvbnVwZGF0ZShlKXt0aGlzLl9jb21wb3NpdGlvblZpZXcudGV4dENvbnRlbnQ9ZS5kYXRhLHRoaXMudXBkYXRlQ29tcG9zaXRpb25FbGVtZW50cygpLHNldFRpbWVvdXQoKCgpPT57dGhpcy5fY29tcG9zaXRpb25Qb3NpdGlvbi5lbmQ9dGhpcy5fdGV4dGFyZWEudmFsdWUubGVuZ3RofSksMCl9Y29tcG9zaXRpb25lbmQoKXt0aGlzLl9maW5hbGl6ZUNvbXBvc2l0aW9uKCEwKX1rZXlkb3duKGUpe2lmKHRoaXMuX2lzQ29tcG9zaW5nfHx0aGlzLl9pc1NlbmRpbmdDb21wb3NpdGlvbil7aWYoMjI5PT09ZS5rZXlDb2RlKXJldHVybiExO2lmKDE2PT09ZS5rZXlDb2RlfHwxNz09PWUua2V5Q29kZXx8MTg9PT1lLmtleUNvZGUpcmV0dXJuITE7dGhpcy5fZmluYWxpemVDb21wb3NpdGlvbighMSl9cmV0dXJuIDIyOSE9PWUua2V5Q29kZXx8KHRoaXMuX2hhbmRsZUFueVRleHRhcmVhQ2hhbmdlcygpLCExKX1fZmluYWxpemVDb21wb3NpdGlvbihlKXtpZih0aGlzLl9jb21wb3NpdGlvblZpZXcuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKSx0aGlzLl9pc0NvbXBvc2luZz0hMSxlKXtjb25zdCBlPXtzdGFydDp0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uLnN0YXJ0LGVuZDp0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uLmVuZH07dGhpcy5faXNTZW5kaW5nQ29tcG9zaXRpb249ITAsc2V0VGltZW91dCgoKCk9PntpZih0aGlzLl9pc1NlbmRpbmdDb21wb3NpdGlvbil7bGV0IHQ7dGhpcy5faXNTZW5kaW5nQ29tcG9zaXRpb249ITEsZS5zdGFydCs9dGhpcy5fZGF0YUFscmVhZHlTZW50Lmxlbmd0aCx0PXRoaXMuX2lzQ29tcG9zaW5nP3RoaXMuX3RleHRhcmVhLnZhbHVlLnN1YnN0cmluZyhlLnN0YXJ0LGUuZW5kKTp0aGlzLl90ZXh0YXJlYS52YWx1ZS5zdWJzdHJpbmcoZS5zdGFydCksdC5sZW5ndGg+MCYmdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudCh0LCEwKX19KSwwKX1lbHNle3RoaXMuX2lzU2VuZGluZ0NvbXBvc2l0aW9uPSExO2NvbnN0IGU9dGhpcy5fdGV4dGFyZWEudmFsdWUuc3Vic3RyaW5nKHRoaXMuX2NvbXBvc2l0aW9uUG9zaXRpb24uc3RhcnQsdGhpcy5fY29tcG9zaXRpb25Qb3NpdGlvbi5lbmQpO3RoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoZSwhMCl9fV9oYW5kbGVBbnlUZXh0YXJlYUNoYW5nZXMoKXtjb25zdCBlPXRoaXMuX3RleHRhcmVhLnZhbHVlO3NldFRpbWVvdXQoKCgpPT57aWYoIXRoaXMuX2lzQ29tcG9zaW5nKXtjb25zdCB0PXRoaXMuX3RleHRhcmVhLnZhbHVlLGk9dC5yZXBsYWNlKGUsXCJcIik7dGhpcy5fZGF0YUFscmVhZHlTZW50PWksdC5sZW5ndGg+ZS5sZW5ndGg/dGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChpLCEwKTp0Lmxlbmd0aDxlLmxlbmd0aD90aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGAke2EuQzAuREVMfWAsITApOnQubGVuZ3RoPT09ZS5sZW5ndGgmJnQhPT1lJiZ0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KHQsITApfX0pLDApfXVwZGF0ZUNvbXBvc2l0aW9uRWxlbWVudHMoZSl7aWYodGhpcy5faXNDb21wb3Npbmcpe2lmKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmlzQ3Vyc29ySW5WaWV3cG9ydCl7Y29uc3QgZT1NYXRoLm1pbih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci54LHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scy0xKSx0PXRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQsaT10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55KnRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQscz1lKnRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aDt0aGlzLl9jb21wb3NpdGlvblZpZXcuc3R5bGUubGVmdD1zK1wicHhcIix0aGlzLl9jb21wb3NpdGlvblZpZXcuc3R5bGUudG9wPWkrXCJweFwiLHRoaXMuX2NvbXBvc2l0aW9uVmlldy5zdHlsZS5oZWlnaHQ9dCtcInB4XCIsdGhpcy5fY29tcG9zaXRpb25WaWV3LnN0eWxlLmxpbmVIZWlnaHQ9dCtcInB4XCIsdGhpcy5fY29tcG9zaXRpb25WaWV3LnN0eWxlLmZvbnRGYW1pbHk9dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250RmFtaWx5LHRoaXMuX2NvbXBvc2l0aW9uVmlldy5zdHlsZS5mb250U2l6ZT10aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRTaXplK1wicHhcIjtjb25zdCByPXRoaXMuX2NvbXBvc2l0aW9uVmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLl90ZXh0YXJlYS5zdHlsZS5sZWZ0PXMrXCJweFwiLHRoaXMuX3RleHRhcmVhLnN0eWxlLnRvcD1pK1wicHhcIix0aGlzLl90ZXh0YXJlYS5zdHlsZS53aWR0aD1NYXRoLm1heChyLndpZHRoLDEpK1wicHhcIix0aGlzLl90ZXh0YXJlYS5zdHlsZS5oZWlnaHQ9TWF0aC5tYXgoci5oZWlnaHQsMSkrXCJweFwiLHRoaXMuX3RleHRhcmVhLnN0eWxlLmxpbmVIZWlnaHQ9ci5oZWlnaHQrXCJweFwifWV8fHNldFRpbWVvdXQoKCgpPT50aGlzLnVwZGF0ZUNvbXBvc2l0aW9uRWxlbWVudHMoITApKSwwKX19fTt0LkNvbXBvc2l0aW9uSGVscGVyPWg9cyhbcigyLG8uSUJ1ZmZlclNlcnZpY2UpLHIoMyxvLklPcHRpb25zU2VydmljZSkscig0LG8uSUNvcmVTZXJ2aWNlKSxyKDUsbi5JUmVuZGVyU2VydmljZSldLGgpfSw5ODA2OihlLHQpPT57ZnVuY3Rpb24gaShlLHQsaSl7Y29uc3Qgcz1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9ZS5nZXRDb21wdXRlZFN0eWxlKGkpLG49cGFyc2VJbnQoci5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1sZWZ0XCIpKSxvPXBhcnNlSW50KHIuZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmctdG9wXCIpKTtyZXR1cm5bdC5jbGllbnRYLXMubGVmdC1uLHQuY2xpZW50WS1zLnRvcC1vXX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LmdldENvb3Jkcz10LmdldENvb3Jkc1JlbGF0aXZlVG9FbGVtZW50PXZvaWQgMCx0LmdldENvb3Jkc1JlbGF0aXZlVG9FbGVtZW50PWksdC5nZXRDb29yZHM9ZnVuY3Rpb24oZSx0LHMscixuLG8sYSxoLGMpe2lmKCFvKXJldHVybjtjb25zdCBsPWkoZSx0LHMpO3JldHVybiBsPyhsWzBdPU1hdGguY2VpbCgobFswXSsoYz9hLzI6MCkpL2EpLGxbMV09TWF0aC5jZWlsKGxbMV0vaCksbFswXT1NYXRoLm1pbihNYXRoLm1heChsWzBdLDEpLHIrKGM/MTowKSksbFsxXT1NYXRoLm1pbihNYXRoLm1heChsWzFdLDEpLG4pLGwpOnZvaWQgMH19LDk1MDQ6KGUsdCxpKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQubW92ZVRvQ2VsbFNlcXVlbmNlPXZvaWQgMDtjb25zdCBzPWkoMjU4NCk7ZnVuY3Rpb24gcihlLHQsaSxzKXtjb25zdCByPWUtbihlLGkpLGE9dC1uKHQsaSksbD1NYXRoLmFicyhyLWEpLWZ1bmN0aW9uKGUsdCxpKXtsZXQgcz0wO2NvbnN0IHI9ZS1uKGUsaSksYT10LW4odCxpKTtmb3IobGV0IG49MDtuPE1hdGguYWJzKHItYSk7bisrKXtjb25zdCBhPVwiQVwiPT09byhlLHQpPy0xOjEsaD1pLmJ1ZmZlci5saW5lcy5nZXQocithKm4pO2g/LmlzV3JhcHBlZCYmcysrfXJldHVybiBzfShlLHQsaSk7cmV0dXJuIGMobCxoKG8oZSx0KSxzKSl9ZnVuY3Rpb24gbihlLHQpe2xldCBpPTAscz10LmJ1ZmZlci5saW5lcy5nZXQoZSkscj1zPy5pc1dyYXBwZWQ7Zm9yKDtyJiZlPj0wJiZlPHQucm93czspaSsrLHM9dC5idWZmZXIubGluZXMuZ2V0KC0tZSkscj1zPy5pc1dyYXBwZWQ7cmV0dXJuIGl9ZnVuY3Rpb24gbyhlLHQpe3JldHVybiBlPnQ/XCJBXCI6XCJCXCJ9ZnVuY3Rpb24gYShlLHQsaSxzLHIsbil7bGV0IG89ZSxhPXQsaD1cIlwiO2Zvcig7byE9PWl8fGEhPT1zOylvKz1yPzE6LTEsciYmbz5uLmNvbHMtMT8oaCs9bi5idWZmZXIudHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nKGEsITEsZSxvKSxvPTAsZT0wLGErKyk6IXImJm88MCYmKGgrPW4uYnVmZmVyLnRyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZyhhLCExLDAsZSsxKSxvPW4uY29scy0xLGU9byxhLS0pO3JldHVybiBoK24uYnVmZmVyLnRyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZyhhLCExLGUsbyl9ZnVuY3Rpb24gaChlLHQpe2NvbnN0IGk9dD9cIk9cIjpcIltcIjtyZXR1cm4gcy5DMC5FU0MraStlfWZ1bmN0aW9uIGMoZSx0KXtlPU1hdGguZmxvb3IoZSk7bGV0IGk9XCJcIjtmb3IobGV0IHM9MDtzPGU7cysrKWkrPXQ7cmV0dXJuIGl9dC5tb3ZlVG9DZWxsU2VxdWVuY2U9ZnVuY3Rpb24oZSx0LGkscyl7Y29uc3Qgbz1pLmJ1ZmZlci54LGw9aS5idWZmZXIueTtpZighaS5idWZmZXIuaGFzU2Nyb2xsYmFjaylyZXR1cm4gZnVuY3Rpb24oZSx0LGkscyxvLGwpe3JldHVybiAwPT09cih0LHMsbyxsKS5sZW5ndGg/XCJcIjpjKGEoZSx0LGUsdC1uKHQsbyksITEsbykubGVuZ3RoLGgoXCJEXCIsbCkpfShvLGwsMCx0LGkscykrcihsLHQsaSxzKStmdW5jdGlvbihlLHQsaSxzLG8sbCl7bGV0IGQ7ZD1yKHQscyxvLGwpLmxlbmd0aD4wP3MtbihzLG8pOnQ7Y29uc3QgXz1zLHU9ZnVuY3Rpb24oZSx0LGkscyxvLGEpe2xldCBoO3JldHVybiBoPXIoaSxzLG8sYSkubGVuZ3RoPjA/cy1uKHMsbyk6dCxlPGkmJmg8PXN8fGU+PWkmJmg8cz9cIkNcIjpcIkRcIn0oZSx0LGkscyxvLGwpO3JldHVybiBjKGEoZSxkLGksXyxcIkNcIj09PXUsbykubGVuZ3RoLGgodSxsKSl9KG8sbCxlLHQsaSxzKTtsZXQgZDtpZihsPT09dClyZXR1cm4gZD1vPmU/XCJEXCI6XCJDXCIsYyhNYXRoLmFicyhvLWUpLGgoZCxzKSk7ZD1sPnQ/XCJEXCI6XCJDXCI7Y29uc3QgXz1NYXRoLmFicyhsLXQpO3JldHVybiBjKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuY29scy1lfShsPnQ/ZTpvLGkpKyhfLTEpKmkuY29scysxKygobD50P286ZSktMSksaChkLHMpKX19LDEyOTY6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzPXRoaXMmJnRoaXMuX19kZWNvcmF0ZXx8ZnVuY3Rpb24oZSx0LGkscyl7dmFyIHIsbj1hcmd1bWVudHMubGVuZ3RoLG89bjwzP3Q6bnVsbD09PXM/cz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsaSk6cztpZihcIm9iamVjdFwiPT10eXBlb2YgUmVmbGVjdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlvPVJlZmxlY3QuZGVjb3JhdGUoZSx0LGkscyk7ZWxzZSBmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSkocj1lW2FdKSYmKG89KG48Mz9yKG8pOm4+Mz9yKHQsaSxvKTpyKHQsaSkpfHxvKTtyZXR1cm4gbj4zJiZvJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLG8pLG99LHI9dGhpcyYmdGhpcy5fX3BhcmFtfHxmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihpLHMpe3QoaSxzLGUpfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5Eb21SZW5kZXJlcj12b2lkIDA7Y29uc3Qgbj1pKDM3ODcpLG89aSgyNTUwKSxhPWkoMjIyMyksaD1pKDYxNzEpLGM9aSg2MDUyKSxsPWkoNDcyNSksZD1pKDgwNTUpLF89aSg4NDYwKSx1PWkoODQ0KSxmPWkoMjU4NSksdj1cInh0ZXJtLWRvbS1yZW5kZXJlci1vd25lci1cIixwPVwieHRlcm0tcm93c1wiLGc9XCJ4dGVybS1mZy1cIixtPVwieHRlcm0tYmctXCIsUz1cInh0ZXJtLWZvY3VzXCIsQz1cInh0ZXJtLXNlbGVjdGlvblwiO2xldCBiPTEsdz10LkRvbVJlbmRlcmVyPWNsYXNzIGV4dGVuZHMgdS5EaXNwb3NhYmxle2NvbnN0cnVjdG9yKGUsdCxpLHMscixhLGwsZCxmLGcsbSxTLHcpe3N1cGVyKCksdGhpcy5fdGVybWluYWw9ZSx0aGlzLl9kb2N1bWVudD10LHRoaXMuX2VsZW1lbnQ9aSx0aGlzLl9zY3JlZW5FbGVtZW50PXMsdGhpcy5fdmlld3BvcnRFbGVtZW50PXIsdGhpcy5faGVscGVyQ29udGFpbmVyPWEsdGhpcy5fbGlua2lmaWVyMj1sLHRoaXMuX2NoYXJTaXplU2VydmljZT1mLHRoaXMuX29wdGlvbnNTZXJ2aWNlPWcsdGhpcy5fYnVmZmVyU2VydmljZT1tLHRoaXMuX2NvcmVCcm93c2VyU2VydmljZT1TLHRoaXMuX3RoZW1lU2VydmljZT13LHRoaXMuX3Rlcm1pbmFsQ2xhc3M9YisrLHRoaXMuX3Jvd0VsZW1lbnRzPVtdLHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsPSgwLGMuY3JlYXRlU2VsZWN0aW9uUmVuZGVyTW9kZWwpKCksdGhpcy5vblJlcXVlc3RSZWRyYXc9dGhpcy5yZWdpc3RlcihuZXcgXy5FdmVudEVtaXR0ZXIpLmV2ZW50LHRoaXMuX3Jvd0NvbnRhaW5lcj10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuX3Jvd0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHApLHRoaXMuX3Jvd0NvbnRhaW5lci5zdHlsZS5saW5lSGVpZ2h0PVwibm9ybWFsXCIsdGhpcy5fcm93Q29udGFpbmVyLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpLHRoaXMuX3JlZnJlc2hSb3dFbGVtZW50cyh0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzKSx0aGlzLl9zZWxlY3Rpb25Db250YWluZXI9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLl9zZWxlY3Rpb25Db250YWluZXIuY2xhc3NMaXN0LmFkZChDKSx0aGlzLl9zZWxlY3Rpb25Db250YWluZXIuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIiksdGhpcy5kaW1lbnNpb25zPSgwLGguY3JlYXRlUmVuZGVyRGltZW5zaW9ucykoKSx0aGlzLl91cGRhdGVEaW1lbnNpb25zKCksdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vbk9wdGlvbkNoYW5nZSgoKCk9PnRoaXMuX2hhbmRsZU9wdGlvbnNDaGFuZ2VkKCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl90aGVtZVNlcnZpY2Uub25DaGFuZ2VDb2xvcnMoKGU9PnRoaXMuX2luamVjdENzcyhlKSkpKSx0aGlzLl9pbmplY3RDc3ModGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycyksdGhpcy5fcm93RmFjdG9yeT1kLmNyZWF0ZUluc3RhbmNlKG4uRG9tUmVuZGVyZXJSb3dGYWN0b3J5LGRvY3VtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQodit0aGlzLl90ZXJtaW5hbENsYXNzKSx0aGlzLl9zY3JlZW5FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3Jvd0NvbnRhaW5lciksdGhpcy5fc2NyZWVuRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9zZWxlY3Rpb25Db250YWluZXIpLHRoaXMucmVnaXN0ZXIodGhpcy5fbGlua2lmaWVyMi5vblNob3dMaW5rVW5kZXJsaW5lKChlPT50aGlzLl9oYW5kbGVMaW5rSG92ZXIoZSkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9saW5raWZpZXIyLm9uSGlkZUxpbmtVbmRlcmxpbmUoKGU9PnRoaXMuX2hhbmRsZUxpbmtMZWF2ZShlKSkpKSx0aGlzLnJlZ2lzdGVyKCgwLHUudG9EaXNwb3NhYmxlKSgoKCk9Pnt0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodit0aGlzLl90ZXJtaW5hbENsYXNzKSx0aGlzLl9yb3dDb250YWluZXIucmVtb3ZlKCksdGhpcy5fc2VsZWN0aW9uQ29udGFpbmVyLnJlbW92ZSgpLHRoaXMuX3dpZHRoQ2FjaGUuZGlzcG9zZSgpLHRoaXMuX3RoZW1lU3R5bGVFbGVtZW50LnJlbW92ZSgpLHRoaXMuX2RpbWVuc2lvbnNTdHlsZUVsZW1lbnQucmVtb3ZlKCl9KSkpLHRoaXMuX3dpZHRoQ2FjaGU9bmV3IG8uV2lkdGhDYWNoZSh0aGlzLl9kb2N1bWVudCx0aGlzLl9oZWxwZXJDb250YWluZXIpLHRoaXMuX3dpZHRoQ2FjaGUuc2V0Rm9udCh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRGYW1pbHksdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZSx0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRXZWlnaHQsdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250V2VpZ2h0Qm9sZCksdGhpcy5fc2V0RGVmYXVsdFNwYWNpbmcoKX1fdXBkYXRlRGltZW5zaW9ucygpe2NvbnN0IGU9dGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcjt0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIud2lkdGg9dGhpcy5fY2hhclNpemVTZXJ2aWNlLndpZHRoKmUsdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodD1NYXRoLmNlaWwodGhpcy5fY2hhclNpemVTZXJ2aWNlLmhlaWdodCplKSx0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGg9dGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLndpZHRoK01hdGgucm91bmQodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5sZXR0ZXJTcGFjaW5nKSx0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0PU1hdGguZmxvb3IodGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCp0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxpbmVIZWlnaHQpLHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci5sZWZ0PTAsdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLnRvcD0wLHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoPXRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC53aWR0aCp0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsdGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0PXRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQqdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLHRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoPU1hdGgucm91bmQodGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMud2lkdGgvZSksdGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0PU1hdGgucm91bmQodGhpcy5kaW1lbnNpb25zLmRldmljZS5jYW52YXMuaGVpZ2h0L2UpLHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aD10aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aC90aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodD10aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQvdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzO2Zvcihjb25zdCBlIG9mIHRoaXMuX3Jvd0VsZW1lbnRzKWUuc3R5bGUud2lkdGg9YCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGh9cHhgLGUuc3R5bGUuaGVpZ2h0PWAke3RoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgLGUuc3R5bGUubGluZUhlaWdodD1gJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0fXB4YCxlLnN0eWxlLm92ZXJmbG93PVwiaGlkZGVuXCI7dGhpcy5fZGltZW5zaW9uc1N0eWxlRWxlbWVudHx8KHRoaXMuX2RpbWVuc2lvbnNTdHlsZUVsZW1lbnQ9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpLHRoaXMuX3NjcmVlbkVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZGltZW5zaW9uc1N0eWxlRWxlbWVudCkpO2NvbnN0IHQ9YCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7cH0gc3BhbiB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgaGVpZ2h0OiAxMDAlOyB2ZXJ0aWNhbC1hbGlnbjogdG9wO31gO3RoaXMuX2RpbWVuc2lvbnNTdHlsZUVsZW1lbnQudGV4dENvbnRlbnQ9dCx0aGlzLl9zZWxlY3Rpb25Db250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zdHlsZS5oZWlnaHQsdGhpcy5fc2NyZWVuRWxlbWVudC5zdHlsZS53aWR0aD1gJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aH1weGAsdGhpcy5fc2NyZWVuRWxlbWVudC5zdHlsZS5oZWlnaHQ9YCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0fXB4YH1faW5qZWN0Q3NzKGUpe3RoaXMuX3RoZW1lU3R5bGVFbGVtZW50fHwodGhpcy5fdGhlbWVTdHlsZUVsZW1lbnQ9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpLHRoaXMuX3NjcmVlbkVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdGhlbWVTdHlsZUVsZW1lbnQpKTtsZXQgdD1gJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtwfSB7IGNvbG9yOiAke2UuZm9yZWdyb3VuZC5jc3N9OyBmb250LWZhbWlseTogJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRGYW1pbHl9OyBmb250LXNpemU6ICR7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZX1weDsgZm9udC1rZXJuaW5nOiBub25lOyB3aGl0ZS1zcGFjZTogcHJlfWA7dCs9YCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7cH0gLnh0ZXJtLWRpbSB7IGNvbG9yOiAke2QuY29sb3IubXVsdGlwbHlPcGFjaXR5KGUuZm9yZWdyb3VuZCwuNSkuY3NzfTt9YCx0Kz1gJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSBzcGFuOm5vdCgueHRlcm0tYm9sZCkgeyBmb250LXdlaWdodDogJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRXZWlnaHR9O30ke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IHNwYW4ueHRlcm0tYm9sZCB7IGZvbnQtd2VpZ2h0OiAke3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFdlaWdodEJvbGR9O30ke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IHNwYW4ueHRlcm0taXRhbGljIHsgZm9udC1zdHlsZTogaXRhbGljO31gO2NvbnN0IGk9YGJsaW5rX3VuZGVybGluZV8ke3RoaXMuX3Rlcm1pbmFsQ2xhc3N9YCxzPWBibGlua19iYXJfJHt0aGlzLl90ZXJtaW5hbENsYXNzfWAscj1gYmxpbmtfYmxvY2tfJHt0aGlzLl90ZXJtaW5hbENsYXNzfWA7dCs9YEBrZXlmcmFtZXMgJHtpfSB7IDUwJSB7ICBib3JkZXItYm90dG9tLXN0eWxlOiBoaWRkZW47IH19YCx0Kz1gQGtleWZyYW1lcyAke3N9IHsgNTAlIHsgIGJveC1zaGFkb3c6IG5vbmU7IH19YCx0Kz1gQGtleWZyYW1lcyAke3J9IHsgMCUgeyAgYmFja2dyb3VuZC1jb2xvcjogJHtlLmN1cnNvci5jc3N9OyAgY29sb3I6ICR7ZS5jdXJzb3JBY2NlbnQuY3NzfTsgfSA1MCUgeyAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsgIGNvbG9yOiAke2UuY3Vyc29yLmNzc307IH19YCx0Kz1gJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtwfS4ke1N9IC54dGVybS1jdXJzb3IueHRlcm0tY3Vyc29yLWJsaW5rLnh0ZXJtLWN1cnNvci11bmRlcmxpbmUgeyBhbmltYXRpb246ICR7aX0gMXMgc3RlcC1lbmQgaW5maW5pdGU7fSR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7cH0uJHtTfSAueHRlcm0tY3Vyc29yLnh0ZXJtLWN1cnNvci1ibGluay54dGVybS1jdXJzb3ItYmFyIHsgYW5pbWF0aW9uOiAke3N9IDFzIHN0ZXAtZW5kIGluZmluaXRlO30ke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke3B9LiR7U30gLnh0ZXJtLWN1cnNvci54dGVybS1jdXJzb3ItYmxpbmsueHRlcm0tY3Vyc29yLWJsb2NrIHsgYW5pbWF0aW9uOiAke3J9IDFzIHN0ZXAtZW5kIGluZmluaXRlO30ke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke3B9IC54dGVybS1jdXJzb3IueHRlcm0tY3Vyc29yLWJsb2NrIHsgYmFja2dyb3VuZC1jb2xvcjogJHtlLmN1cnNvci5jc3N9OyBjb2xvcjogJHtlLmN1cnNvckFjY2VudC5jc3N9O30ke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke3B9IC54dGVybS1jdXJzb3IueHRlcm0tY3Vyc29yLWJsb2NrOm5vdCgueHRlcm0tY3Vyc29yLWJsaW5rKSB7IGJhY2tncm91bmQtY29sb3I6ICR7ZS5jdXJzb3IuY3NzfSAhaW1wb3J0YW50OyBjb2xvcjogJHtlLmN1cnNvckFjY2VudC5jc3N9ICFpbXBvcnRhbnQ7fSR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7cH0gLnh0ZXJtLWN1cnNvci54dGVybS1jdXJzb3Itb3V0bGluZSB7IG91dGxpbmU6IDFweCBzb2xpZCAke2UuY3Vyc29yLmNzc307IG91dGxpbmUtb2Zmc2V0OiAtMXB4O30ke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke3B9IC54dGVybS1jdXJzb3IueHRlcm0tY3Vyc29yLWJhciB7IGJveC1zaGFkb3c6ICR7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JXaWR0aH1weCAwIDAgJHtlLmN1cnNvci5jc3N9IGluc2V0O30ke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke3B9IC54dGVybS1jdXJzb3IueHRlcm0tY3Vyc29yLXVuZGVybGluZSB7IGJvcmRlci1ib3R0b206IDFweCAke2UuY3Vyc29yLmNzc307IGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkOyBoZWlnaHQ6IGNhbGMoMTAwJSAtIDFweCk7fWAsdCs9YCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Q30geyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgei1pbmRleDogMTsgcG9pbnRlci1ldmVudHM6IG5vbmU7fSR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0uZm9jdXMgLiR7Q30gZGl2IHsgcG9zaXRpb246IGFic29sdXRlOyBiYWNrZ3JvdW5kLWNvbG9yOiAke2Uuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZS5jc3N9O30ke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke0N9IGRpdiB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgYmFja2dyb3VuZC1jb2xvcjogJHtlLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZS5jc3N9O31gO2Zvcihjb25zdFtpLHNdb2YgZS5hbnNpLmVudHJpZXMoKSl0Kz1gJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtnfSR7aX0geyBjb2xvcjogJHtzLmNzc307IH0ke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke2d9JHtpfS54dGVybS1kaW0geyBjb2xvcjogJHtkLmNvbG9yLm11bHRpcGx5T3BhY2l0eShzLC41KS5jc3N9OyB9JHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHttfSR7aX0geyBiYWNrZ3JvdW5kLWNvbG9yOiAke3MuY3NzfTsgfWA7dCs9YCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Z30ke2EuSU5WRVJURURfREVGQVVMVF9DT0xPUn0geyBjb2xvcjogJHtkLmNvbG9yLm9wYXF1ZShlLmJhY2tncm91bmQpLmNzc307IH0ke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke2d9JHthLklOVkVSVEVEX0RFRkFVTFRfQ09MT1J9Lnh0ZXJtLWRpbSB7IGNvbG9yOiAke2QuY29sb3IubXVsdGlwbHlPcGFjaXR5KGQuY29sb3Iub3BhcXVlKGUuYmFja2dyb3VuZCksLjUpLmNzc307IH0ke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke219JHthLklOVkVSVEVEX0RFRkFVTFRfQ09MT1J9IHsgYmFja2dyb3VuZC1jb2xvcjogJHtlLmZvcmVncm91bmQuY3NzfTsgfWAsdGhpcy5fdGhlbWVTdHlsZUVsZW1lbnQudGV4dENvbnRlbnQ9dH1fc2V0RGVmYXVsdFNwYWNpbmcoKXtjb25zdCBlPXRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aC10aGlzLl93aWR0aENhY2hlLmdldChcIldcIiwhMSwhMSk7dGhpcy5fcm93Q29udGFpbmVyLnN0eWxlLmxldHRlclNwYWNpbmc9YCR7ZX1weGAsdGhpcy5fcm93RmFjdG9yeS5kZWZhdWx0U3BhY2luZz1lfWhhbmRsZURldmljZVBpeGVsUmF0aW9DaGFuZ2UoKXt0aGlzLl91cGRhdGVEaW1lbnNpb25zKCksdGhpcy5fd2lkdGhDYWNoZS5jbGVhcigpLHRoaXMuX3NldERlZmF1bHRTcGFjaW5nKCl9X3JlZnJlc2hSb3dFbGVtZW50cyhlLHQpe2ZvcihsZXQgZT10aGlzLl9yb3dFbGVtZW50cy5sZW5ndGg7ZTw9dDtlKyspe2NvbnN0IGU9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0aGlzLl9yb3dDb250YWluZXIuYXBwZW5kQ2hpbGQoZSksdGhpcy5fcm93RWxlbWVudHMucHVzaChlKX1mb3IoO3RoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aD50Oyl0aGlzLl9yb3dDb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fcm93RWxlbWVudHMucG9wKCkpfWhhbmRsZVJlc2l6ZShlLHQpe3RoaXMuX3JlZnJlc2hSb3dFbGVtZW50cyhlLHQpLHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKSx0aGlzLmhhbmRsZVNlbGVjdGlvbkNoYW5nZWQodGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwuc2VsZWN0aW9uU3RhcnQsdGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwuc2VsZWN0aW9uRW5kLHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLmNvbHVtblNlbGVjdE1vZGUpfWhhbmRsZUNoYXJTaXplQ2hhbmdlZCgpe3RoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKSx0aGlzLl93aWR0aENhY2hlLmNsZWFyKCksdGhpcy5fc2V0RGVmYXVsdFNwYWNpbmcoKX1oYW5kbGVCbHVyKCl7dGhpcy5fcm93Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoUyksdGhpcy5yZW5kZXJSb3dzKDAsdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLTEpfWhhbmRsZUZvY3VzKCl7dGhpcy5fcm93Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoUyksdGhpcy5yZW5kZXJSb3dzKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnksdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueSl9aGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChlLHQsaSl7aWYodGhpcy5fc2VsZWN0aW9uQ29udGFpbmVyLnJlcGxhY2VDaGlsZHJlbigpLHRoaXMuX3Jvd0ZhY3RvcnkuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChlLHQsaSksdGhpcy5yZW5kZXJSb3dzKDAsdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLTEpLCFlfHwhdClyZXR1cm47dGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwudXBkYXRlKHRoaXMuX3Rlcm1pbmFsLGUsdCxpKTtjb25zdCBzPXRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLnZpZXdwb3J0U3RhcnRSb3cscj10aGlzLl9zZWxlY3Rpb25SZW5kZXJNb2RlbC52aWV3cG9ydEVuZFJvdyxuPXRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLnZpZXdwb3J0Q2FwcGVkU3RhcnRSb3csbz10aGlzLl9zZWxlY3Rpb25SZW5kZXJNb2RlbC52aWV3cG9ydENhcHBlZEVuZFJvdztpZihuPj10aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3N8fG88MClyZXR1cm47Y29uc3QgYT10aGlzLl9kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYoaSl7Y29uc3QgaT1lWzBdPnRbMF07YS5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVTZWxlY3Rpb25FbGVtZW50KG4saT90WzBdOmVbMF0saT9lWzBdOnRbMF0sby1uKzEpKX1lbHNle2NvbnN0IGk9cz09PW4/ZVswXTowLGg9bj09PXI/dFswXTp0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7YS5hcHBlbmRDaGlsZCh0aGlzLl9jcmVhdGVTZWxlY3Rpb25FbGVtZW50KG4saSxoKSk7Y29uc3QgYz1vLW4tMTtpZihhLmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVNlbGVjdGlvbkVsZW1lbnQobisxLDAsdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLGMpKSxuIT09byl7Y29uc3QgZT1yPT09bz90WzBdOnRoaXMuX2J1ZmZlclNlcnZpY2UuY29sczthLmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVNlbGVjdGlvbkVsZW1lbnQobywwLGUpKX19dGhpcy5fc2VsZWN0aW9uQ29udGFpbmVyLmFwcGVuZENoaWxkKGEpfV9jcmVhdGVTZWxlY3Rpb25FbGVtZW50KGUsdCxpLHM9MSl7Y29uc3Qgcj10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLG49dCp0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwud2lkdGg7bGV0IG89dGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoKihpLXQpO3JldHVybiBuK28+dGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGgmJihvPXRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoLW4pLHIuc3R5bGUuaGVpZ2h0PXMqdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodCtcInB4XCIsci5zdHlsZS50b3A9ZSp0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0K1wicHhcIixyLnN0eWxlLmxlZnQ9YCR7bn1weGAsci5zdHlsZS53aWR0aD1gJHtvfXB4YCxyfWhhbmRsZUN1cnNvck1vdmUoKXt9X2hhbmRsZU9wdGlvbnNDaGFuZ2VkKCl7dGhpcy5fdXBkYXRlRGltZW5zaW9ucygpLHRoaXMuX2luamVjdENzcyh0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzKSx0aGlzLl93aWR0aENhY2hlLnNldEZvbnQodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250RmFtaWx5LHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFNpemUsdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250V2VpZ2h0LHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFdlaWdodEJvbGQpLHRoaXMuX3NldERlZmF1bHRTcGFjaW5nKCl9Y2xlYXIoKXtmb3IoY29uc3QgZSBvZiB0aGlzLl9yb3dFbGVtZW50cyllLnJlcGxhY2VDaGlsZHJlbigpfXJlbmRlclJvd3MoZSx0KXtjb25zdCBpPXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLHM9aS55YmFzZStpLnkscj1NYXRoLm1pbihpLngsdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLTEpLG49dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JCbGluayxvPXRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuY3Vyc29yU3R5bGUsYT10aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmN1cnNvckluYWN0aXZlU3R5bGU7Zm9yKGxldCBoPWU7aDw9dDtoKyspe2NvbnN0IGU9aCtpLnlkaXNwLHQ9dGhpcy5fcm93RWxlbWVudHNbaF0sYz1pLmxpbmVzLmdldChlKTtpZighdHx8IWMpYnJlYWs7dC5yZXBsYWNlQ2hpbGRyZW4oLi4udGhpcy5fcm93RmFjdG9yeS5jcmVhdGVSb3coYyxlLGU9PT1zLG8sYSxyLG4sdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoLHRoaXMuX3dpZHRoQ2FjaGUsLTEsLTEpKX19Z2V0IF90ZXJtaW5hbFNlbGVjdG9yKCl7cmV0dXJuYC4ke3Z9JHt0aGlzLl90ZXJtaW5hbENsYXNzfWB9X2hhbmRsZUxpbmtIb3ZlcihlKXt0aGlzLl9zZXRDZWxsVW5kZXJsaW5lKGUueDEsZS54MixlLnkxLGUueTIsZS5jb2xzLCEwKX1faGFuZGxlTGlua0xlYXZlKGUpe3RoaXMuX3NldENlbGxVbmRlcmxpbmUoZS54MSxlLngyLGUueTEsZS55MixlLmNvbHMsITEpfV9zZXRDZWxsVW5kZXJsaW5lKGUsdCxpLHMscixuKXtpPDAmJihlPTApLHM8MCYmKHQ9MCk7Y29uc3Qgbz10aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MtMTtpPU1hdGgubWF4KE1hdGgubWluKGksbyksMCkscz1NYXRoLm1heChNYXRoLm1pbihzLG8pLDApLHI9TWF0aC5taW4ocix0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpO2NvbnN0IGE9dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIsaD1hLnliYXNlK2EueSxjPU1hdGgubWluKGEueCxyLTEpLGw9dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JCbGluayxkPXRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuY3Vyc29yU3R5bGUsXz10aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmN1cnNvckluYWN0aXZlU3R5bGU7Zm9yKGxldCBvPWk7bzw9czsrK28pe2NvbnN0IHU9bythLnlkaXNwLGY9dGhpcy5fcm93RWxlbWVudHNbb10sdj1hLmxpbmVzLmdldCh1KTtpZighZnx8IXYpYnJlYWs7Zi5yZXBsYWNlQ2hpbGRyZW4oLi4udGhpcy5fcm93RmFjdG9yeS5jcmVhdGVSb3codix1LHU9PT1oLGQsXyxjLGwsdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoLHRoaXMuX3dpZHRoQ2FjaGUsbj9vPT09aT9lOjA6LTEsbj8obz09PXM/dDpyKS0xOi0xKSl9fX07dC5Eb21SZW5kZXJlcj13PXMoW3IoNyxmLklJbnN0YW50aWF0aW9uU2VydmljZSkscig4LGwuSUNoYXJTaXplU2VydmljZSkscig5LGYuSU9wdGlvbnNTZXJ2aWNlKSxyKDEwLGYuSUJ1ZmZlclNlcnZpY2UpLHIoMTEsbC5JQ29yZUJyb3dzZXJTZXJ2aWNlKSxyKDEyLGwuSVRoZW1lU2VydmljZSldLHcpfSwzNzg3OmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz10aGlzJiZ0aGlzLl9fZGVjb3JhdGV8fGZ1bmN0aW9uKGUsdCxpLHMpe3ZhciByLG49YXJndW1lbnRzLmxlbmd0aCxvPW48Mz90Om51bGw9PT1zP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpOnM7aWYoXCJvYmplY3RcIj09dHlwZW9mIFJlZmxlY3QmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpbz1SZWZsZWN0LmRlY29yYXRlKGUsdCxpLHMpO2Vsc2UgZm9yKHZhciBhPWUubGVuZ3RoLTE7YT49MDthLS0pKHI9ZVthXSkmJihvPShuPDM/cihvKTpuPjM/cih0LGksbyk6cih0LGkpKXx8byk7cmV0dXJuIG4+MyYmbyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSxvKSxvfSxyPXRoaXMmJnRoaXMuX19wYXJhbXx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oaSxzKXt0KGkscyxlKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuRG9tUmVuZGVyZXJSb3dGYWN0b3J5PXZvaWQgMDtjb25zdCBuPWkoMjIyMyksbz1pKDY0MyksYT1pKDUxMSksaD1pKDI1ODUpLGM9aSg4MDU1KSxsPWkoNDcyNSksZD1pKDQyNjkpLF89aSg2MTcxKSx1PWkoMzczNCk7bGV0IGY9dC5Eb21SZW5kZXJlclJvd0ZhY3Rvcnk9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LGkscyxyLG4sbyl7dGhpcy5fZG9jdW1lbnQ9ZSx0aGlzLl9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlPXQsdGhpcy5fb3B0aW9uc1NlcnZpY2U9aSx0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2U9cyx0aGlzLl9jb3JlU2VydmljZT1yLHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlPW4sdGhpcy5fdGhlbWVTZXJ2aWNlPW8sdGhpcy5fd29ya0NlbGw9bmV3IGEuQ2VsbERhdGEsdGhpcy5fY29sdW1uU2VsZWN0TW9kZT0hMSx0aGlzLmRlZmF1bHRTcGFjaW5nPTB9aGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChlLHQsaSl7dGhpcy5fc2VsZWN0aW9uU3RhcnQ9ZSx0aGlzLl9zZWxlY3Rpb25FbmQ9dCx0aGlzLl9jb2x1bW5TZWxlY3RNb2RlPWl9Y3JlYXRlUm93KGUsdCxpLHMscixhLGgsbCxfLGYscCl7Y29uc3QgZz1bXSxtPXRoaXMuX2NoYXJhY3RlckpvaW5lclNlcnZpY2UuZ2V0Sm9pbmVkQ2hhcmFjdGVycyh0KSxTPXRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnM7bGV0IEMsYj1lLmdldE5vQmdUcmltbWVkTGVuZ3RoKCk7aSYmYjxhKzEmJihiPWErMSk7bGV0IHc9MCx5PVwiXCIsRT0wLGs9MCxMPTAsRD0hMSxSPTAseD0hMSxBPTA7Y29uc3QgQj1bXSxUPS0xIT09ZiYmLTEhPT1wO2ZvcihsZXQgTT0wO008YjtNKyspe2UubG9hZENlbGwoTSx0aGlzLl93b3JrQ2VsbCk7bGV0IGI9dGhpcy5fd29ya0NlbGwuZ2V0V2lkdGgoKTtpZigwPT09Yiljb250aW51ZTtsZXQgTz0hMSxQPU0sST10aGlzLl93b3JrQ2VsbDtpZihtLmxlbmd0aD4wJiZNPT09bVswXVswXSl7Tz0hMDtjb25zdCB0PW0uc2hpZnQoKTtJPW5ldyBkLkpvaW5lZENlbGxEYXRhKHRoaXMuX3dvcmtDZWxsLGUudHJhbnNsYXRlVG9TdHJpbmcoITAsdFswXSx0WzFdKSx0WzFdLXRbMF0pLFA9dFsxXS0xLGI9SS5nZXRXaWR0aCgpfWNvbnN0IEg9dGhpcy5faXNDZWxsSW5TZWxlY3Rpb24oTSx0KSxGPWkmJk09PT1hLFc9VCYmTT49ZiYmTTw9cDtsZXQgVT0hMTt0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5mb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbChNLHQsdm9pZCAwLChlPT57VT0hMH0pKTtsZXQgTj1JLmdldENoYXJzKCl8fG8uV0hJVEVTUEFDRV9DRUxMX0NIQVI7aWYoXCIgXCI9PT1OJiYoSS5pc1VuZGVybGluZSgpfHxJLmlzT3ZlcmxpbmUoKSkmJihOPVwiwqBcIiksQT1iKmwtXy5nZXQoTixJLmlzQm9sZCgpLEkuaXNJdGFsaWMoKSksQyl7aWYodyYmKEgmJnh8fCFIJiYheCYmSS5iZz09PUUpJiYoSCYmeCYmUy5zZWxlY3Rpb25Gb3JlZ3JvdW5kfHxJLmZnPT09aykmJkkuZXh0ZW5kZWQuZXh0PT09TCYmVz09PUQmJkE9PT1SJiYhRiYmIU8mJiFVKXtJLmlzSW52aXNpYmxlKCk/eSs9by5XSElURVNQQUNFX0NFTExfQ0hBUjp5Kz1OLHcrKztjb250aW51ZX13JiYoQy50ZXh0Q29udGVudD15KSxDPXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpLHc9MCx5PVwiXCJ9ZWxzZSBDPXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO2lmKEU9SS5iZyxrPUkuZmcsTD1JLmV4dGVuZGVkLmV4dCxEPVcsUj1BLHg9SCxPJiZhPj1NJiZhPD1QJiYoYT1NKSwhdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JIaWRkZW4mJkYmJnRoaXMuX2NvcmVTZXJ2aWNlLmlzQ3Vyc29ySW5pdGlhbGl6ZWQpaWYoQi5wdXNoKFwieHRlcm0tY3Vyc29yXCIpLHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQpaCYmQi5wdXNoKFwieHRlcm0tY3Vyc29yLWJsaW5rXCIpLEIucHVzaChcImJhclwiPT09cz9cInh0ZXJtLWN1cnNvci1iYXJcIjpcInVuZGVybGluZVwiPT09cz9cInh0ZXJtLWN1cnNvci11bmRlcmxpbmVcIjpcInh0ZXJtLWN1cnNvci1ibG9ja1wiKTtlbHNlIGlmKHIpc3dpdGNoKHIpe2Nhc2VcIm91dGxpbmVcIjpCLnB1c2goXCJ4dGVybS1jdXJzb3Itb3V0bGluZVwiKTticmVhaztjYXNlXCJibG9ja1wiOkIucHVzaChcInh0ZXJtLWN1cnNvci1ibG9ja1wiKTticmVhaztjYXNlXCJiYXJcIjpCLnB1c2goXCJ4dGVybS1jdXJzb3ItYmFyXCIpO2JyZWFrO2Nhc2VcInVuZGVybGluZVwiOkIucHVzaChcInh0ZXJtLWN1cnNvci11bmRlcmxpbmVcIil9aWYoSS5pc0JvbGQoKSYmQi5wdXNoKFwieHRlcm0tYm9sZFwiKSxJLmlzSXRhbGljKCkmJkIucHVzaChcInh0ZXJtLWl0YWxpY1wiKSxJLmlzRGltKCkmJkIucHVzaChcInh0ZXJtLWRpbVwiKSx5PUkuaXNJbnZpc2libGUoKT9vLldISVRFU1BBQ0VfQ0VMTF9DSEFSOkkuZ2V0Q2hhcnMoKXx8by5XSElURVNQQUNFX0NFTExfQ0hBUixJLmlzVW5kZXJsaW5lKCkmJihCLnB1c2goYHh0ZXJtLXVuZGVybGluZS0ke0kuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGV9YCksXCIgXCI9PT15JiYoeT1cIsKgXCIpLCFJLmlzVW5kZXJsaW5lQ29sb3JEZWZhdWx0KCkpKWlmKEkuaXNVbmRlcmxpbmVDb2xvclJHQigpKUMuc3R5bGUudGV4dERlY29yYXRpb25Db2xvcj1gcmdiKCR7dS5BdHRyaWJ1dGVEYXRhLnRvQ29sb3JSR0IoSS5nZXRVbmRlcmxpbmVDb2xvcigpKS5qb2luKFwiLFwiKX0pYDtlbHNle2xldCBlPUkuZ2V0VW5kZXJsaW5lQ29sb3IoKTt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzJiZJLmlzQm9sZCgpJiZlPDgmJihlKz04KSxDLnN0eWxlLnRleHREZWNvcmF0aW9uQ29sb3I9Uy5hbnNpW2VdLmNzc31JLmlzT3ZlcmxpbmUoKSYmKEIucHVzaChcInh0ZXJtLW92ZXJsaW5lXCIpLFwiIFwiPT09eSYmKHk9XCLCoFwiKSksSS5pc1N0cmlrZXRocm91Z2goKSYmQi5wdXNoKFwieHRlcm0tc3RyaWtldGhyb3VnaFwiKSxXJiYoQy5zdHlsZS50ZXh0RGVjb3JhdGlvbj1cInVuZGVybGluZVwiKTtsZXQgJD1JLmdldEZnQ29sb3IoKSxqPUkuZ2V0RmdDb2xvck1vZGUoKSx6PUkuZ2V0QmdDb2xvcigpLEs9SS5nZXRCZ0NvbG9yTW9kZSgpO2NvbnN0IHE9ISFJLmlzSW52ZXJzZSgpO2lmKHEpe2NvbnN0IGU9JDskPXosej1lO2NvbnN0IHQ9ajtqPUssSz10fWxldCBWLEcsWCxKPSExO3N3aXRjaCh0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5mb3JFYWNoRGVjb3JhdGlvbkF0Q2VsbChNLHQsdm9pZCAwLChlPT57XCJ0b3BcIiE9PWUub3B0aW9ucy5sYXllciYmSnx8KGUuYmFja2dyb3VuZENvbG9yUkdCJiYoSz01MDMzMTY0OCx6PWUuYmFja2dyb3VuZENvbG9yUkdCLnJnYmE+PjgmMTY3NzcyMTUsVj1lLmJhY2tncm91bmRDb2xvclJHQiksZS5mb3JlZ3JvdW5kQ29sb3JSR0ImJihqPTUwMzMxNjQ4LCQ9ZS5mb3JlZ3JvdW5kQ29sb3JSR0IucmdiYT4+OCYxNjc3NzIxNSxHPWUuZm9yZWdyb3VuZENvbG9yUkdCKSxKPVwidG9wXCI9PT1lLm9wdGlvbnMubGF5ZXIpfSkpLCFKJiZIJiYoVj10aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuaXNGb2N1c2VkP1Muc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZTpTLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSx6PVYucmdiYT4+OCYxNjc3NzIxNSxLPTUwMzMxNjQ4LEo9ITAsUy5zZWxlY3Rpb25Gb3JlZ3JvdW5kJiYoaj01MDMzMTY0OCwkPVMuc2VsZWN0aW9uRm9yZWdyb3VuZC5yZ2JhPj44JjE2Nzc3MjE1LEc9Uy5zZWxlY3Rpb25Gb3JlZ3JvdW5kKSksSiYmQi5wdXNoKFwieHRlcm0tZGVjb3JhdGlvbi10b3BcIiksSyl7Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOlg9Uy5hbnNpW3pdLEIucHVzaChgeHRlcm0tYmctJHt6fWApO2JyZWFrO2Nhc2UgNTAzMzE2NDg6WD1jLmNoYW5uZWxzLnRvQ29sb3Ioej4+MTYsej4+OCYyNTUsMjU1JnopLHRoaXMuX2FkZFN0eWxlKEMsYGJhY2tncm91bmQtY29sb3I6IyR7digoej4+PjApLnRvU3RyaW5nKDE2KSxcIjBcIiw2KX1gKTticmVhaztkZWZhdWx0OnE/KFg9Uy5mb3JlZ3JvdW5kLEIucHVzaChgeHRlcm0tYmctJHtuLklOVkVSVEVEX0RFRkFVTFRfQ09MT1J9YCkpOlg9Uy5iYWNrZ3JvdW5kfXN3aXRjaChWfHxJLmlzRGltKCkmJihWPWMuY29sb3IubXVsdGlwbHlPcGFjaXR5KFgsLjUpKSxqKXtjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6SS5pc0JvbGQoKSYmJDw4JiZ0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzJiYoJCs9OCksdGhpcy5fYXBwbHlNaW5pbXVtQ29udHJhc3QoQyxYLFMuYW5zaVskXSxJLFYsdm9pZCAwKXx8Qi5wdXNoKGB4dGVybS1mZy0keyR9YCk7YnJlYWs7Y2FzZSA1MDMzMTY0ODpjb25zdCBlPWMuY2hhbm5lbHMudG9Db2xvcigkPj4xNiYyNTUsJD4+OCYyNTUsMjU1JiQpO3RoaXMuX2FwcGx5TWluaW11bUNvbnRyYXN0KEMsWCxlLEksVixHKXx8dGhpcy5fYWRkU3R5bGUoQyxgY29sb3I6IyR7digkLnRvU3RyaW5nKDE2KSxcIjBcIiw2KX1gKTticmVhaztkZWZhdWx0OnRoaXMuX2FwcGx5TWluaW11bUNvbnRyYXN0KEMsWCxTLmZvcmVncm91bmQsSSxWLEcpfHxxJiZCLnB1c2goYHh0ZXJtLWZnLSR7bi5JTlZFUlRFRF9ERUZBVUxUX0NPTE9SfWApfUIubGVuZ3RoJiYoQy5jbGFzc05hbWU9Qi5qb2luKFwiIFwiKSxCLmxlbmd0aD0wKSxGfHxPfHxVP0MudGV4dENvbnRlbnQ9eTp3KyssQSE9PXRoaXMuZGVmYXVsdFNwYWNpbmcmJihDLnN0eWxlLmxldHRlclNwYWNpbmc9YCR7QX1weGApLGcucHVzaChDKSxNPVB9cmV0dXJuIEMmJncmJihDLnRleHRDb250ZW50PXkpLGd9X2FwcGx5TWluaW11bUNvbnRyYXN0KGUsdCxpLHMscixuKXtpZigxPT09dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5taW5pbXVtQ29udHJhc3RSYXRpb3x8KDAsXy50cmVhdEdseXBoQXNCYWNrZ3JvdW5kQ29sb3IpKHMuZ2V0Q29kZSgpKSlyZXR1cm4hMTtjb25zdCBvPXRoaXMuX2dldENvbnRyYXN0Q2FjaGUocyk7bGV0IGE7aWYocnx8bnx8KGE9by5nZXRDb2xvcih0LnJnYmEsaS5yZ2JhKSksdm9pZCAwPT09YSl7Y29uc3QgZT10aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLm1pbmltdW1Db250cmFzdFJhdGlvLyhzLmlzRGltKCk/MjoxKTthPWMuY29sb3IuZW5zdXJlQ29udHJhc3RSYXRpbyhyfHx0LG58fGksZSksby5zZXRDb2xvcigocnx8dCkucmdiYSwobnx8aSkucmdiYSxhPz9udWxsKX1yZXR1cm4hIWEmJih0aGlzLl9hZGRTdHlsZShlLGBjb2xvcjoke2EuY3NzfWApLCEwKX1fZ2V0Q29udHJhc3RDYWNoZShlKXtyZXR1cm4gZS5pc0RpbSgpP3RoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuaGFsZkNvbnRyYXN0Q2FjaGU6dGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5jb250cmFzdENhY2hlfV9hZGRTdHlsZShlLHQpe2Uuc2V0QXR0cmlidXRlKFwic3R5bGVcIixgJHtlLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpfHxcIlwifSR7dH07YCl9X2lzQ2VsbEluU2VsZWN0aW9uKGUsdCl7Y29uc3QgaT10aGlzLl9zZWxlY3Rpb25TdGFydCxzPXRoaXMuX3NlbGVjdGlvbkVuZDtyZXR1cm4hKCFpfHwhcykmJih0aGlzLl9jb2x1bW5TZWxlY3RNb2RlP2lbMF08PXNbMF0/ZT49aVswXSYmdD49aVsxXSYmZTxzWzBdJiZ0PD1zWzFdOmU8aVswXSYmdD49aVsxXSYmZT49c1swXSYmdDw9c1sxXTp0PmlbMV0mJnQ8c1sxXXx8aVsxXT09PXNbMV0mJnQ9PT1pWzFdJiZlPj1pWzBdJiZlPHNbMF18fGlbMV08c1sxXSYmdD09PXNbMV0mJmU8c1swXXx8aVsxXTxzWzFdJiZ0PT09aVsxXSYmZT49aVswXSl9fTtmdW5jdGlvbiB2KGUsdCxpKXtmb3IoO2UubGVuZ3RoPGk7KWU9dCtlO3JldHVybiBlfXQuRG9tUmVuZGVyZXJSb3dGYWN0b3J5PWY9cyhbcigxLGwuSUNoYXJhY3RlckpvaW5lclNlcnZpY2UpLHIoMixoLklPcHRpb25zU2VydmljZSkscigzLGwuSUNvcmVCcm93c2VyU2VydmljZSkscig0LGguSUNvcmVTZXJ2aWNlKSxyKDUsaC5JRGVjb3JhdGlvblNlcnZpY2UpLHIoNixsLklUaGVtZVNlcnZpY2UpXSxmKX0sMjU1MDooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuV2lkdGhDYWNoZT12b2lkIDAsdC5XaWR0aENhY2hlPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fZmxhdD1uZXcgRmxvYXQzMkFycmF5KDI1NiksdGhpcy5fZm9udD1cIlwiLHRoaXMuX2ZvbnRTaXplPTAsdGhpcy5fd2VpZ2h0PVwibm9ybWFsXCIsdGhpcy5fd2VpZ2h0Qm9sZD1cImJvbGRcIix0aGlzLl9tZWFzdXJlRWxlbWVudHM9W10sdGhpcy5fY29udGFpbmVyPWUuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInh0ZXJtLXdpZHRoLWNhY2hlLW1lYXN1cmUtY29udGFpbmVyXCIpLHRoaXMuX2NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSx0aGlzLl9jb250YWluZXIuc3R5bGUud2hpdGVTcGFjZT1cInByZVwiLHRoaXMuX2NvbnRhaW5lci5zdHlsZS5mb250S2VybmluZz1cIm5vbmVcIjtjb25zdCBpPWUuY3JlYXRlRWxlbWVudChcInNwYW5cIik7aS5jbGFzc0xpc3QuYWRkKFwieHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnRcIik7Y29uc3Qgcz1lLmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3MuY2xhc3NMaXN0LmFkZChcInh0ZXJtLWNoYXItbWVhc3VyZS1lbGVtZW50XCIpLHMuc3R5bGUuZm9udFdlaWdodD1cImJvbGRcIjtjb25zdCByPWUuY3JlYXRlRWxlbWVudChcInNwYW5cIik7ci5jbGFzc0xpc3QuYWRkKFwieHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnRcIiksci5zdHlsZS5mb250U3R5bGU9XCJpdGFsaWNcIjtjb25zdCBuPWUuY3JlYXRlRWxlbWVudChcInNwYW5cIik7bi5jbGFzc0xpc3QuYWRkKFwieHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnRcIiksbi5zdHlsZS5mb250V2VpZ2h0PVwiYm9sZFwiLG4uc3R5bGUuZm9udFN0eWxlPVwiaXRhbGljXCIsdGhpcy5fbWVhc3VyZUVsZW1lbnRzPVtpLHMscixuXSx0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQoaSksdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKHMpLHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChyKSx0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQobiksdC5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMuY2xlYXIoKX1kaXNwb3NlKCl7dGhpcy5fY29udGFpbmVyLnJlbW92ZSgpLHRoaXMuX21lYXN1cmVFbGVtZW50cy5sZW5ndGg9MCx0aGlzLl9ob2xleT12b2lkIDB9Y2xlYXIoKXt0aGlzLl9mbGF0LmZpbGwoLTk5OTkpLHRoaXMuX2hvbGV5PW5ldyBNYXB9c2V0Rm9udChlLHQsaSxzKXtlPT09dGhpcy5fZm9udCYmdD09PXRoaXMuX2ZvbnRTaXplJiZpPT09dGhpcy5fd2VpZ2h0JiZzPT09dGhpcy5fd2VpZ2h0Qm9sZHx8KHRoaXMuX2ZvbnQ9ZSx0aGlzLl9mb250U2l6ZT10LHRoaXMuX3dlaWdodD1pLHRoaXMuX3dlaWdodEJvbGQ9cyx0aGlzLl9jb250YWluZXIuc3R5bGUuZm9udEZhbWlseT10aGlzLl9mb250LHRoaXMuX2NvbnRhaW5lci5zdHlsZS5mb250U2l6ZT1gJHt0aGlzLl9mb250U2l6ZX1weGAsdGhpcy5fbWVhc3VyZUVsZW1lbnRzWzBdLnN0eWxlLmZvbnRXZWlnaHQ9YCR7aX1gLHRoaXMuX21lYXN1cmVFbGVtZW50c1sxXS5zdHlsZS5mb250V2VpZ2h0PWAke3N9YCx0aGlzLl9tZWFzdXJlRWxlbWVudHNbMl0uc3R5bGUuZm9udFdlaWdodD1gJHtpfWAsdGhpcy5fbWVhc3VyZUVsZW1lbnRzWzNdLnN0eWxlLmZvbnRXZWlnaHQ9YCR7c31gLHRoaXMuY2xlYXIoKSl9Z2V0KGUsdCxpKXtsZXQgcz0wO2lmKCF0JiYhaSYmMT09PWUubGVuZ3RoJiYocz1lLmNoYXJDb2RlQXQoMCkpPDI1Nil7aWYoLTk5OTkhPT10aGlzLl9mbGF0W3NdKXJldHVybiB0aGlzLl9mbGF0W3NdO2NvbnN0IHQ9dGhpcy5fbWVhc3VyZShlLDApO3JldHVybiB0PjAmJih0aGlzLl9mbGF0W3NdPXQpLHR9bGV0IHI9ZTt0JiYocis9XCJCXCIpLGkmJihyKz1cIklcIik7bGV0IG49dGhpcy5faG9sZXkuZ2V0KHIpO2lmKHZvaWQgMD09PW4pe2xldCBzPTA7dCYmKHN8PTEpLGkmJihzfD0yKSxuPXRoaXMuX21lYXN1cmUoZSxzKSxuPjAmJnRoaXMuX2hvbGV5LnNldChyLG4pfXJldHVybiBufV9tZWFzdXJlKGUsdCl7Y29uc3QgaT10aGlzLl9tZWFzdXJlRWxlbWVudHNbdF07cmV0dXJuIGkudGV4dENvbnRlbnQ9ZS5yZXBlYXQoMzIpLGkub2Zmc2V0V2lkdGgvMzJ9fX0sMjIyMzooZSx0LGkpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5URVhUX0JBU0VMSU5FPXQuRElNX09QQUNJVFk9dC5JTlZFUlRFRF9ERUZBVUxUX0NPTE9SPXZvaWQgMDtjb25zdCBzPWkoNjExNCk7dC5JTlZFUlRFRF9ERUZBVUxUX0NPTE9SPTI1Nyx0LkRJTV9PUEFDSVRZPS41LHQuVEVYVF9CQVNFTElORT1zLmlzRmlyZWZveHx8cy5pc0xlZ2FjeUVkZ2U/XCJib3R0b21cIjpcImlkZW9ncmFwaGljXCJ9LDYxNzE6KGUsdCk9PntmdW5jdGlvbiBpKGUpe3JldHVybiA1NzUwODw9ZSYmZTw9NTc1NTh9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gZT49MTI4NTEyJiZlPD0xMjg1OTF8fGU+PTEyNzc0NCYmZTw9MTI4NTExfHxlPj0xMjg2NDAmJmU8PTEyODc2N3x8ZT49OTcyOCYmZTw9OTk4M3x8ZT49OTk4NCYmZTw9MTAxNzV8fGU+PTY1MDI0JiZlPD02NTAzOXx8ZT49MTI5MjgwJiZlPD0xMjk1MzV8fGU+PTEyNzQ2MiYmZTw9MTI3NDg3fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuY29tcHV0ZU5leHRWYXJpYW50T2Zmc2V0PXQuY3JlYXRlUmVuZGVyRGltZW5zaW9ucz10LnRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvcj10LmFsbG93UmVzY2FsaW5nPXQuaXNFbW9qaT10LmlzUmVzdHJpY3RlZFBvd2VybGluZUdseXBoPXQuaXNQb3dlcmxpbmVHbHlwaD10LnRocm93SWZGYWxzeT12b2lkIDAsdC50aHJvd0lmRmFsc3k9ZnVuY3Rpb24oZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKFwidmFsdWUgbXVzdCBub3QgYmUgZmFsc3lcIik7cmV0dXJuIGV9LHQuaXNQb3dlcmxpbmVHbHlwaD1pLHQuaXNSZXN0cmljdGVkUG93ZXJsaW5lR2x5cGg9ZnVuY3Rpb24oZSl7cmV0dXJuIDU3NTIwPD1lJiZlPD01NzUyN30sdC5pc0Vtb2ppPXMsdC5hbGxvd1Jlc2NhbGluZz1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gMT09PXQmJnI+TWF0aC5jZWlsKDEuNSpuKSYmdm9pZCAwIT09ZSYmZT4yNTUmJiFzKGUpJiYhaShlKSYmIWZ1bmN0aW9uKGUpe3JldHVybiA1NzM0NDw9ZSYmZTw9NjM3NDN9KGUpfSx0LnRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvcj1mdW5jdGlvbihlKXtyZXR1cm4gaShlKXx8ZnVuY3Rpb24oZSl7cmV0dXJuIDk0NzI8PWUmJmU8PTk2MzF9KGUpfSx0LmNyZWF0ZVJlbmRlckRpbWVuc2lvbnM9ZnVuY3Rpb24oKXtyZXR1cm57Y3NzOntjYW52YXM6e3dpZHRoOjAsaGVpZ2h0OjB9LGNlbGw6e3dpZHRoOjAsaGVpZ2h0OjB9fSxkZXZpY2U6e2NhbnZhczp7d2lkdGg6MCxoZWlnaHQ6MH0sY2VsbDp7d2lkdGg6MCxoZWlnaHQ6MH0sY2hhcjp7d2lkdGg6MCxoZWlnaHQ6MCxsZWZ0OjAsdG9wOjB9fX19LHQuY29tcHV0ZU5leHRWYXJpYW50T2Zmc2V0PWZ1bmN0aW9uKGUsdCxpPTApe3JldHVybihlLSgyKk1hdGgucm91bmQodCktaSkpJSgyKk1hdGgucm91bmQodCkpfX0sNjA1MjooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuY3JlYXRlU2VsZWN0aW9uUmVuZGVyTW9kZWw9dm9pZCAwO2NsYXNzIGl7Y29uc3RydWN0b3IoKXt0aGlzLmNsZWFyKCl9Y2xlYXIoKXt0aGlzLmhhc1NlbGVjdGlvbj0hMSx0aGlzLmNvbHVtblNlbGVjdE1vZGU9ITEsdGhpcy52aWV3cG9ydFN0YXJ0Um93PTAsdGhpcy52aWV3cG9ydEVuZFJvdz0wLHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdz0wLHRoaXMudmlld3BvcnRDYXBwZWRFbmRSb3c9MCx0aGlzLnN0YXJ0Q29sPTAsdGhpcy5lbmRDb2w9MCx0aGlzLnNlbGVjdGlvblN0YXJ0PXZvaWQgMCx0aGlzLnNlbGVjdGlvbkVuZD12b2lkIDB9dXBkYXRlKGUsdCxpLHM9ITEpe2lmKHRoaXMuc2VsZWN0aW9uU3RhcnQ9dCx0aGlzLnNlbGVjdGlvbkVuZD1pLCF0fHwhaXx8dFswXT09PWlbMF0mJnRbMV09PT1pWzFdKXJldHVybiB2b2lkIHRoaXMuY2xlYXIoKTtjb25zdCByPWUuYnVmZmVycy5hY3RpdmUueWRpc3Asbj10WzFdLXIsbz1pWzFdLXIsYT1NYXRoLm1heChuLDApLGg9TWF0aC5taW4obyxlLnJvd3MtMSk7YT49ZS5yb3dzfHxoPDA/dGhpcy5jbGVhcigpOih0aGlzLmhhc1NlbGVjdGlvbj0hMCx0aGlzLmNvbHVtblNlbGVjdE1vZGU9cyx0aGlzLnZpZXdwb3J0U3RhcnRSb3c9bix0aGlzLnZpZXdwb3J0RW5kUm93PW8sdGhpcy52aWV3cG9ydENhcHBlZFN0YXJ0Um93PWEsdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdz1oLHRoaXMuc3RhcnRDb2w9dFswXSx0aGlzLmVuZENvbD1pWzBdKX1pc0NlbGxTZWxlY3RlZChlLHQsaSl7cmV0dXJuISF0aGlzLmhhc1NlbGVjdGlvbiYmKGktPWUuYnVmZmVyLmFjdGl2ZS52aWV3cG9ydFksdGhpcy5jb2x1bW5TZWxlY3RNb2RlP3RoaXMuc3RhcnRDb2w8PXRoaXMuZW5kQ29sP3Q+PXRoaXMuc3RhcnRDb2wmJmk+PXRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyYmdDx0aGlzLmVuZENvbCYmaTw9dGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdzp0PHRoaXMuc3RhcnRDb2wmJmk+PXRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyYmdD49dGhpcy5lbmRDb2wmJmk8PXRoaXMudmlld3BvcnRDYXBwZWRFbmRSb3c6aT50aGlzLnZpZXdwb3J0U3RhcnRSb3cmJmk8dGhpcy52aWV3cG9ydEVuZFJvd3x8dGhpcy52aWV3cG9ydFN0YXJ0Um93PT09dGhpcy52aWV3cG9ydEVuZFJvdyYmaT09PXRoaXMudmlld3BvcnRTdGFydFJvdyYmdD49dGhpcy5zdGFydENvbCYmdDx0aGlzLmVuZENvbHx8dGhpcy52aWV3cG9ydFN0YXJ0Um93PHRoaXMudmlld3BvcnRFbmRSb3cmJmk9PT10aGlzLnZpZXdwb3J0RW5kUm93JiZ0PHRoaXMuZW5kQ29sfHx0aGlzLnZpZXdwb3J0U3RhcnRSb3c8dGhpcy52aWV3cG9ydEVuZFJvdyYmaT09PXRoaXMudmlld3BvcnRTdGFydFJvdyYmdD49dGhpcy5zdGFydENvbCl9fXQuY3JlYXRlU2VsZWN0aW9uUmVuZGVyTW9kZWw9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGl9fSw0NTY6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LlNlbGVjdGlvbk1vZGVsPXZvaWQgMCx0LlNlbGVjdGlvbk1vZGVsPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX2J1ZmZlclNlcnZpY2U9ZSx0aGlzLmlzU2VsZWN0QWxsQWN0aXZlPSExLHRoaXMuc2VsZWN0aW9uU3RhcnRMZW5ndGg9MH1jbGVhclNlbGVjdGlvbigpe3RoaXMuc2VsZWN0aW9uU3RhcnQ9dm9pZCAwLHRoaXMuc2VsZWN0aW9uRW5kPXZvaWQgMCx0aGlzLmlzU2VsZWN0QWxsQWN0aXZlPSExLHRoaXMuc2VsZWN0aW9uU3RhcnRMZW5ndGg9MH1nZXQgZmluYWxTZWxlY3Rpb25TdGFydCgpe3JldHVybiB0aGlzLmlzU2VsZWN0QWxsQWN0aXZlP1swLDBdOnRoaXMuc2VsZWN0aW9uRW5kJiZ0aGlzLnNlbGVjdGlvblN0YXJ0JiZ0aGlzLmFyZVNlbGVjdGlvblZhbHVlc1JldmVyc2VkKCk/dGhpcy5zZWxlY3Rpb25FbmQ6dGhpcy5zZWxlY3Rpb25TdGFydH1nZXQgZmluYWxTZWxlY3Rpb25FbmQoKXtpZih0aGlzLmlzU2VsZWN0QWxsQWN0aXZlKXJldHVyblt0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2UrdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLTFdO2lmKHRoaXMuc2VsZWN0aW9uU3RhcnQpe2lmKCF0aGlzLnNlbGVjdGlvbkVuZHx8dGhpcy5hcmVTZWxlY3Rpb25WYWx1ZXNSZXZlcnNlZCgpKXtjb25zdCBlPXRoaXMuc2VsZWN0aW9uU3RhcnRbMF0rdGhpcy5zZWxlY3Rpb25TdGFydExlbmd0aDtyZXR1cm4gZT50aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM/ZSV0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM9PTA/W3RoaXMuX2J1ZmZlclNlcnZpY2UuY29scyx0aGlzLnNlbGVjdGlvblN0YXJ0WzFdK01hdGguZmxvb3IoZS90aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpLTFdOltlJXRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyx0aGlzLnNlbGVjdGlvblN0YXJ0WzFdK01hdGguZmxvb3IoZS90aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpXTpbZSx0aGlzLnNlbGVjdGlvblN0YXJ0WzFdXX1pZih0aGlzLnNlbGVjdGlvblN0YXJ0TGVuZ3RoJiZ0aGlzLnNlbGVjdGlvbkVuZFsxXT09PXRoaXMuc2VsZWN0aW9uU3RhcnRbMV0pe2NvbnN0IGU9dGhpcy5zZWxlY3Rpb25TdGFydFswXSt0aGlzLnNlbGVjdGlvblN0YXJ0TGVuZ3RoO3JldHVybiBlPnRoaXMuX2J1ZmZlclNlcnZpY2UuY29scz9bZSV0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsdGhpcy5zZWxlY3Rpb25TdGFydFsxXStNYXRoLmZsb29yKGUvdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKV06W01hdGgubWF4KGUsdGhpcy5zZWxlY3Rpb25FbmRbMF0pLHRoaXMuc2VsZWN0aW9uRW5kWzFdXX1yZXR1cm4gdGhpcy5zZWxlY3Rpb25FbmR9fWFyZVNlbGVjdGlvblZhbHVlc1JldmVyc2VkKCl7Y29uc3QgZT10aGlzLnNlbGVjdGlvblN0YXJ0LHQ9dGhpcy5zZWxlY3Rpb25FbmQ7cmV0dXJuISghZXx8IXQpJiYoZVsxXT50WzFdfHxlWzFdPT09dFsxXSYmZVswXT50WzBdKX1oYW5kbGVUcmltKGUpe3JldHVybiB0aGlzLnNlbGVjdGlvblN0YXJ0JiYodGhpcy5zZWxlY3Rpb25TdGFydFsxXS09ZSksdGhpcy5zZWxlY3Rpb25FbmQmJih0aGlzLnNlbGVjdGlvbkVuZFsxXS09ZSksdGhpcy5zZWxlY3Rpb25FbmQmJnRoaXMuc2VsZWN0aW9uRW5kWzFdPDA/KHRoaXMuY2xlYXJTZWxlY3Rpb24oKSwhMCk6KHRoaXMuc2VsZWN0aW9uU3RhcnQmJnRoaXMuc2VsZWN0aW9uU3RhcnRbMV08MCYmKHRoaXMuc2VsZWN0aW9uU3RhcnRbMV09MCksITEpfX19LDQyODpmdW5jdGlvbihlLHQsaSl7dmFyIHM9dGhpcyYmdGhpcy5fX2RlY29yYXRlfHxmdW5jdGlvbihlLHQsaSxzKXt2YXIgcixuPWFyZ3VtZW50cy5sZW5ndGgsbz1uPDM/dDpudWxsPT09cz9zPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxpKTpzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBSZWZsZWN0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKW89UmVmbGVjdC5kZWNvcmF0ZShlLHQsaSxzKTtlbHNlIGZvcih2YXIgYT1lLmxlbmd0aC0xO2E+PTA7YS0tKShyPWVbYV0pJiYobz0objwzP3Iobyk6bj4zP3IodCxpLG8pOnIodCxpKSl8fG8pO3JldHVybiBuPjMmJm8mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGksbyksb30scj10aGlzJiZ0aGlzLl9fcGFyYW18fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGkscyl7dChpLHMsZSl9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkNoYXJTaXplU2VydmljZT12b2lkIDA7Y29uc3Qgbj1pKDI1ODUpLG89aSg4NDYwKSxhPWkoODQ0KTtsZXQgaD10LkNoYXJTaXplU2VydmljZT1jbGFzcyBleHRlbmRzIGEuRGlzcG9zYWJsZXtnZXQgaGFzVmFsaWRTaXplKCl7cmV0dXJuIHRoaXMud2lkdGg+MCYmdGhpcy5oZWlnaHQ+MH1jb25zdHJ1Y3RvcihlLHQsaSl7c3VwZXIoKSx0aGlzLl9vcHRpb25zU2VydmljZT1pLHRoaXMud2lkdGg9MCx0aGlzLmhlaWdodD0wLHRoaXMuX29uQ2hhclNpemVDaGFuZ2U9dGhpcy5yZWdpc3RlcihuZXcgby5FdmVudEVtaXR0ZXIpLHRoaXMub25DaGFyU2l6ZUNoYW5nZT10aGlzLl9vbkNoYXJTaXplQ2hhbmdlLmV2ZW50O3RyeXt0aGlzLl9tZWFzdXJlU3RyYXRlZ3k9dGhpcy5yZWdpc3RlcihuZXcgZCh0aGlzLl9vcHRpb25zU2VydmljZSkpfWNhdGNoe3RoaXMuX21lYXN1cmVTdHJhdGVneT10aGlzLnJlZ2lzdGVyKG5ldyBsKGUsdCx0aGlzLl9vcHRpb25zU2VydmljZSkpfXRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25NdWx0aXBsZU9wdGlvbkNoYW5nZShbXCJmb250RmFtaWx5XCIsXCJmb250U2l6ZVwiXSwoKCk9PnRoaXMubWVhc3VyZSgpKSkpfW1lYXN1cmUoKXtjb25zdCBlPXRoaXMuX21lYXN1cmVTdHJhdGVneS5tZWFzdXJlKCk7ZS53aWR0aD09PXRoaXMud2lkdGgmJmUuaGVpZ2h0PT09dGhpcy5oZWlnaHR8fCh0aGlzLndpZHRoPWUud2lkdGgsdGhpcy5oZWlnaHQ9ZS5oZWlnaHQsdGhpcy5fb25DaGFyU2l6ZUNoYW5nZS5maXJlKCkpfX07dC5DaGFyU2l6ZVNlcnZpY2U9aD1zKFtyKDIsbi5JT3B0aW9uc1NlcnZpY2UpXSxoKTtjbGFzcyBjIGV4dGVuZHMgYS5EaXNwb3NhYmxle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9yZXN1bHQ9e3dpZHRoOjAsaGVpZ2h0OjB9fV92YWxpZGF0ZUFuZFNldChlLHQpe3ZvaWQgMCE9PWUmJmU+MCYmdm9pZCAwIT09dCYmdD4wJiYodGhpcy5fcmVzdWx0LndpZHRoPWUsdGhpcy5fcmVzdWx0LmhlaWdodD10KX19Y2xhc3MgbCBleHRlbmRzIGN7Y29uc3RydWN0b3IoZSx0LGkpe3N1cGVyKCksdGhpcy5fZG9jdW1lbnQ9ZSx0aGlzLl9wYXJlbnRFbGVtZW50PXQsdGhpcy5fb3B0aW9uc1NlcnZpY2U9aSx0aGlzLl9tZWFzdXJlRWxlbWVudD10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSx0aGlzLl9tZWFzdXJlRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwieHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnRcIiksdGhpcy5fbWVhc3VyZUVsZW1lbnQudGV4dENvbnRlbnQ9XCJXXCIucmVwZWF0KDMyKSx0aGlzLl9tZWFzdXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSx0aGlzLl9tZWFzdXJlRWxlbWVudC5zdHlsZS53aGl0ZVNwYWNlPVwicHJlXCIsdGhpcy5fbWVhc3VyZUVsZW1lbnQuc3R5bGUuZm9udEtlcm5pbmc9XCJub25lXCIsdGhpcy5fcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9tZWFzdXJlRWxlbWVudCl9bWVhc3VyZSgpe3JldHVybiB0aGlzLl9tZWFzdXJlRWxlbWVudC5zdHlsZS5mb250RmFtaWx5PXRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udEZhbWlseSx0aGlzLl9tZWFzdXJlRWxlbWVudC5zdHlsZS5mb250U2l6ZT1gJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRTaXplfXB4YCx0aGlzLl92YWxpZGF0ZUFuZFNldChOdW1iZXIodGhpcy5fbWVhc3VyZUVsZW1lbnQub2Zmc2V0V2lkdGgpLzMyLE51bWJlcih0aGlzLl9tZWFzdXJlRWxlbWVudC5vZmZzZXRIZWlnaHQpKSx0aGlzLl9yZXN1bHR9fWNsYXNzIGQgZXh0ZW5kcyBje2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5fb3B0aW9uc1NlcnZpY2U9ZSx0aGlzLl9jYW52YXM9bmV3IE9mZnNjcmVlbkNhbnZhcygxMDAsMTAwKSx0aGlzLl9jdHg9dGhpcy5fY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtjb25zdCB0PXRoaXMuX2N0eC5tZWFzdXJlVGV4dChcIldcIik7aWYoIShcIndpZHRoXCJpbiB0JiZcImZvbnRCb3VuZGluZ0JveEFzY2VudFwiaW4gdCYmXCJmb250Qm91bmRpbmdCb3hEZXNjZW50XCJpbiB0KSl0aHJvdyBuZXcgRXJyb3IoXCJSZXF1aXJlZCBmb250IG1ldHJpY3Mgbm90IHN1cHBvcnRlZFwiKX1tZWFzdXJlKCl7dGhpcy5fY3R4LmZvbnQ9YCR7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZX1weCAke3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udEZhbWlseX1gO2NvbnN0IGU9dGhpcy5fY3R4Lm1lYXN1cmVUZXh0KFwiV1wiKTtyZXR1cm4gdGhpcy5fdmFsaWRhdGVBbmRTZXQoZS53aWR0aCxlLmZvbnRCb3VuZGluZ0JveEFzY2VudCtlLmZvbnRCb3VuZGluZ0JveERlc2NlbnQpLHRoaXMuX3Jlc3VsdH19fSw0MjY5OmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz10aGlzJiZ0aGlzLl9fZGVjb3JhdGV8fGZ1bmN0aW9uKGUsdCxpLHMpe3ZhciByLG49YXJndW1lbnRzLmxlbmd0aCxvPW48Mz90Om51bGw9PT1zP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpOnM7aWYoXCJvYmplY3RcIj09dHlwZW9mIFJlZmxlY3QmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpbz1SZWZsZWN0LmRlY29yYXRlKGUsdCxpLHMpO2Vsc2UgZm9yKHZhciBhPWUubGVuZ3RoLTE7YT49MDthLS0pKHI9ZVthXSkmJihvPShuPDM/cihvKTpuPjM/cih0LGksbyk6cih0LGkpKXx8byk7cmV0dXJuIG4+MyYmbyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSxvKSxvfSxyPXRoaXMmJnRoaXMuX19wYXJhbXx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oaSxzKXt0KGkscyxlKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuQ2hhcmFjdGVySm9pbmVyU2VydmljZT10LkpvaW5lZENlbGxEYXRhPXZvaWQgMDtjb25zdCBuPWkoMzczNCksbz1pKDY0MyksYT1pKDUxMSksaD1pKDI1ODUpO2NsYXNzIGMgZXh0ZW5kcyBuLkF0dHJpYnV0ZURhdGF7Y29uc3RydWN0b3IoZSx0LGkpe3N1cGVyKCksdGhpcy5jb250ZW50PTAsdGhpcy5jb21iaW5lZERhdGE9XCJcIix0aGlzLmZnPWUuZmcsdGhpcy5iZz1lLmJnLHRoaXMuY29tYmluZWREYXRhPXQsdGhpcy5fd2lkdGg9aX1pc0NvbWJpbmVkKCl7cmV0dXJuIDIwOTcxNTJ9Z2V0V2lkdGgoKXtyZXR1cm4gdGhpcy5fd2lkdGh9Z2V0Q2hhcnMoKXtyZXR1cm4gdGhpcy5jb21iaW5lZERhdGF9Z2V0Q29kZSgpe3JldHVybiAyMDk3MTUxfXNldEZyb21DaGFyRGF0YShlKXt0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIil9Z2V0QXNDaGFyRGF0YSgpe3JldHVyblt0aGlzLmZnLHRoaXMuZ2V0Q2hhcnMoKSx0aGlzLmdldFdpZHRoKCksdGhpcy5nZXRDb2RlKCldfX10LkpvaW5lZENlbGxEYXRhPWM7bGV0IGw9dC5DaGFyYWN0ZXJKb2luZXJTZXJ2aWNlPWNsYXNzIGV7Y29uc3RydWN0b3IoZSl7dGhpcy5fYnVmZmVyU2VydmljZT1lLHRoaXMuX2NoYXJhY3RlckpvaW5lcnM9W10sdGhpcy5fbmV4dENoYXJhY3RlckpvaW5lcklkPTAsdGhpcy5fd29ya0NlbGw9bmV3IGEuQ2VsbERhdGF9cmVnaXN0ZXIoZSl7Y29uc3QgdD17aWQ6dGhpcy5fbmV4dENoYXJhY3RlckpvaW5lcklkKyssaGFuZGxlcjplfTtyZXR1cm4gdGhpcy5fY2hhcmFjdGVySm9pbmVycy5wdXNoKHQpLHQuaWR9ZGVyZWdpc3RlcihlKXtmb3IobGV0IHQ9MDt0PHRoaXMuX2NoYXJhY3RlckpvaW5lcnMubGVuZ3RoO3QrKylpZih0aGlzLl9jaGFyYWN0ZXJKb2luZXJzW3RdLmlkPT09ZSlyZXR1cm4gdGhpcy5fY2hhcmFjdGVySm9pbmVycy5zcGxpY2UodCwxKSwhMDtyZXR1cm4hMX1nZXRKb2luZWRDaGFyYWN0ZXJzKGUpe2lmKDA9PT10aGlzLl9jaGFyYWN0ZXJKb2luZXJzLmxlbmd0aClyZXR1cm5bXTtjb25zdCB0PXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmdldChlKTtpZighdHx8MD09PXQubGVuZ3RoKXJldHVybltdO2NvbnN0IGk9W10scz10LnRyYW5zbGF0ZVRvU3RyaW5nKCEwKTtsZXQgcj0wLG49MCxhPTAsaD10LmdldEZnKDApLGM9dC5nZXRCZygwKTtmb3IobGV0IGU9MDtlPHQuZ2V0VHJpbW1lZExlbmd0aCgpO2UrKylpZih0LmxvYWRDZWxsKGUsdGhpcy5fd29ya0NlbGwpLDAhPT10aGlzLl93b3JrQ2VsbC5nZXRXaWR0aCgpKXtpZih0aGlzLl93b3JrQ2VsbC5mZyE9PWh8fHRoaXMuX3dvcmtDZWxsLmJnIT09Yyl7aWYoZS1yPjEpe2NvbnN0IGU9dGhpcy5fZ2V0Sm9pbmVkUmFuZ2VzKHMsYSxuLHQscik7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspaS5wdXNoKGVbdF0pfXI9ZSxhPW4saD10aGlzLl93b3JrQ2VsbC5mZyxjPXRoaXMuX3dvcmtDZWxsLmJnfW4rPXRoaXMuX3dvcmtDZWxsLmdldENoYXJzKCkubGVuZ3RofHxvLldISVRFU1BBQ0VfQ0VMTF9DSEFSLmxlbmd0aH1pZih0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMtcj4xKXtjb25zdCBlPXRoaXMuX2dldEpvaW5lZFJhbmdlcyhzLGEsbix0LHIpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWkucHVzaChlW3RdKX1yZXR1cm4gaX1fZ2V0Sm9pbmVkUmFuZ2VzKHQsaSxzLHIsbil7Y29uc3Qgbz10LnN1YnN0cmluZyhpLHMpO2xldCBhPVtdO3RyeXthPXRoaXMuX2NoYXJhY3RlckpvaW5lcnNbMF0uaGFuZGxlcihvKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfWZvcihsZXQgdD0xO3Q8dGhpcy5fY2hhcmFjdGVySm9pbmVycy5sZW5ndGg7dCsrKXRyeXtjb25zdCBpPXRoaXMuX2NoYXJhY3RlckpvaW5lcnNbdF0uaGFuZGxlcihvKTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyllLl9tZXJnZVJhbmdlcyhhLGlbdF0pfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9cmV0dXJuIHRoaXMuX3N0cmluZ1Jhbmdlc1RvQ2VsbFJhbmdlcyhhLHIsbiksYX1fc3RyaW5nUmFuZ2VzVG9DZWxsUmFuZ2VzKGUsdCxpKXtsZXQgcz0wLHI9ITEsbj0wLGE9ZVtzXTtpZihhKXtmb3IobGV0IGg9aTtoPHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scztoKyspe2NvbnN0IGk9dC5nZXRXaWR0aChoKSxjPXQuZ2V0U3RyaW5nKGgpLmxlbmd0aHx8by5XSElURVNQQUNFX0NFTExfQ0hBUi5sZW5ndGg7aWYoMCE9PWkpe2lmKCFyJiZhWzBdPD1uJiYoYVswXT1oLHI9ITApLGFbMV08PW4pe2lmKGFbMV09aCxhPWVbKytzXSwhYSlicmVhazthWzBdPD1uPyhhWzBdPWgscj0hMCk6cj0hMX1uKz1jfX1hJiYoYVsxXT10aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpfX1zdGF0aWMgX21lcmdlUmFuZ2VzKGUsdCl7bGV0IGk9ITE7Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspe2NvbnN0IHI9ZVtzXTtpZihpKXtpZih0WzFdPD1yWzBdKXJldHVybiBlW3MtMV1bMV09dFsxXSxlO2lmKHRbMV08PXJbMV0pcmV0dXJuIGVbcy0xXVsxXT1NYXRoLm1heCh0WzFdLHJbMV0pLGUuc3BsaWNlKHMsMSksZTtlLnNwbGljZShzLDEpLHMtLX1lbHNle2lmKHRbMV08PXJbMF0pcmV0dXJuIGUuc3BsaWNlKHMsMCx0KSxlO2lmKHRbMV08PXJbMV0pcmV0dXJuIHJbMF09TWF0aC5taW4odFswXSxyWzBdKSxlO3RbMF08clsxXSYmKHJbMF09TWF0aC5taW4odFswXSxyWzBdKSxpPSEwKX19cmV0dXJuIGk/ZVtlLmxlbmd0aC0xXVsxXT10WzFdOmUucHVzaCh0KSxlfX07dC5DaGFyYWN0ZXJKb2luZXJTZXJ2aWNlPWw9cyhbcigwLGguSUJ1ZmZlclNlcnZpY2UpXSxsKX0sNTExNDooZSx0LGkpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5Db3JlQnJvd3NlclNlcnZpY2U9dm9pZCAwO2NvbnN0IHM9aSg4NDQpLHI9aSg4NDYwKSxuPWkoMzY1Nik7Y2xhc3MgbyBleHRlbmRzIHMuRGlzcG9zYWJsZXtjb25zdHJ1Y3RvcihlLHQsaSl7c3VwZXIoKSx0aGlzLl90ZXh0YXJlYT1lLHRoaXMuX3dpbmRvdz10LHRoaXMubWFpbkRvY3VtZW50PWksdGhpcy5faXNGb2N1c2VkPSExLHRoaXMuX2NhY2hlZElzRm9jdXNlZD12b2lkIDAsdGhpcy5fc2NyZWVuRHByTW9uaXRvcj1uZXcgYSh0aGlzLl93aW5kb3cpLHRoaXMuX29uRHByQ2hhbmdlPXRoaXMucmVnaXN0ZXIobmV3IHIuRXZlbnRFbWl0dGVyKSx0aGlzLm9uRHByQ2hhbmdlPXRoaXMuX29uRHByQ2hhbmdlLmV2ZW50LHRoaXMuX29uV2luZG93Q2hhbmdlPXRoaXMucmVnaXN0ZXIobmV3IHIuRXZlbnRFbWl0dGVyKSx0aGlzLm9uV2luZG93Q2hhbmdlPXRoaXMuX29uV2luZG93Q2hhbmdlLmV2ZW50LHRoaXMucmVnaXN0ZXIodGhpcy5vbldpbmRvd0NoYW5nZSgoZT0+dGhpcy5fc2NyZWVuRHByTW9uaXRvci5zZXRXaW5kb3coZSkpKSksdGhpcy5yZWdpc3RlcigoMCxyLmZvcndhcmRFdmVudCkodGhpcy5fc2NyZWVuRHByTW9uaXRvci5vbkRwckNoYW5nZSx0aGlzLl9vbkRwckNoYW5nZSkpLHRoaXMuX3RleHRhcmVhLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCgoKT0+dGhpcy5faXNGb2N1c2VkPSEwKSksdGhpcy5fdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwoKCk9PnRoaXMuX2lzRm9jdXNlZD0hMSkpfWdldCB3aW5kb3coKXtyZXR1cm4gdGhpcy5fd2luZG93fXNldCB3aW5kb3coZSl7dGhpcy5fd2luZG93IT09ZSYmKHRoaXMuX3dpbmRvdz1lLHRoaXMuX29uV2luZG93Q2hhbmdlLmZpcmUodGhpcy5fd2luZG93KSl9Z2V0IGRwcigpe3JldHVybiB0aGlzLndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfWdldCBpc0ZvY3VzZWQoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5fY2FjaGVkSXNGb2N1c2VkJiYodGhpcy5fY2FjaGVkSXNGb2N1c2VkPXRoaXMuX2lzRm9jdXNlZCYmdGhpcy5fdGV4dGFyZWEub3duZXJEb2N1bWVudC5oYXNGb2N1cygpLHF1ZXVlTWljcm90YXNrKCgoKT0+dGhpcy5fY2FjaGVkSXNGb2N1c2VkPXZvaWQgMCkpKSx0aGlzLl9jYWNoZWRJc0ZvY3VzZWR9fXQuQ29yZUJyb3dzZXJTZXJ2aWNlPW87Y2xhc3MgYSBleHRlbmRzIHMuRGlzcG9zYWJsZXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuX3BhcmVudFdpbmRvdz1lLHRoaXMuX3dpbmRvd1Jlc2l6ZUxpc3RlbmVyPXRoaXMucmVnaXN0ZXIobmV3IHMuTXV0YWJsZURpc3Bvc2FibGUpLHRoaXMuX29uRHByQ2hhbmdlPXRoaXMucmVnaXN0ZXIobmV3IHIuRXZlbnRFbWl0dGVyKSx0aGlzLm9uRHByQ2hhbmdlPXRoaXMuX29uRHByQ2hhbmdlLmV2ZW50LHRoaXMuX291dGVyTGlzdGVuZXI9KCk9PnRoaXMuX3NldERwckFuZEZpcmVJZkRpZmZlcnMoKSx0aGlzLl9jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbz10aGlzLl9wYXJlbnRXaW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyx0aGlzLl91cGRhdGVEcHIoKSx0aGlzLl9zZXRXaW5kb3dSZXNpemVMaXN0ZW5lcigpLHRoaXMucmVnaXN0ZXIoKDAscy50b0Rpc3Bvc2FibGUpKCgoKT0+dGhpcy5jbGVhckxpc3RlbmVyKCkpKSl9c2V0V2luZG93KGUpe3RoaXMuX3BhcmVudFdpbmRvdz1lLHRoaXMuX3NldFdpbmRvd1Jlc2l6ZUxpc3RlbmVyKCksdGhpcy5fc2V0RHByQW5kRmlyZUlmRGlmZmVycygpfV9zZXRXaW5kb3dSZXNpemVMaXN0ZW5lcigpe3RoaXMuX3dpbmRvd1Jlc2l6ZUxpc3RlbmVyLnZhbHVlPSgwLG4uYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKSh0aGlzLl9wYXJlbnRXaW5kb3csXCJyZXNpemVcIiwoKCk9PnRoaXMuX3NldERwckFuZEZpcmVJZkRpZmZlcnMoKSkpfV9zZXREcHJBbmRGaXJlSWZEaWZmZXJzKCl7dGhpcy5fcGFyZW50V2luZG93LmRldmljZVBpeGVsUmF0aW8hPT10aGlzLl9jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyYmdGhpcy5fb25EcHJDaGFuZ2UuZmlyZSh0aGlzLl9wYXJlbnRXaW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyksdGhpcy5fdXBkYXRlRHByKCl9X3VwZGF0ZURwcigpe3RoaXMuX291dGVyTGlzdGVuZXImJih0aGlzLl9yZXNvbHV0aW9uTWVkaWFNYXRjaExpc3Q/LnJlbW92ZUxpc3RlbmVyKHRoaXMuX291dGVyTGlzdGVuZXIpLHRoaXMuX2N1cnJlbnREZXZpY2VQaXhlbFJhdGlvPXRoaXMuX3BhcmVudFdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLHRoaXMuX3Jlc29sdXRpb25NZWRpYU1hdGNoTGlzdD10aGlzLl9wYXJlbnRXaW5kb3cubWF0Y2hNZWRpYShgc2NyZWVuIGFuZCAocmVzb2x1dGlvbjogJHt0aGlzLl9wYXJlbnRXaW5kb3cuZGV2aWNlUGl4ZWxSYXRpb31kcHB4KWApLHRoaXMuX3Jlc29sdXRpb25NZWRpYU1hdGNoTGlzdC5hZGRMaXN0ZW5lcih0aGlzLl9vdXRlckxpc3RlbmVyKSl9Y2xlYXJMaXN0ZW5lcigpe3RoaXMuX3Jlc29sdXRpb25NZWRpYU1hdGNoTGlzdCYmdGhpcy5fb3V0ZXJMaXN0ZW5lciYmKHRoaXMuX3Jlc29sdXRpb25NZWRpYU1hdGNoTGlzdC5yZW1vdmVMaXN0ZW5lcih0aGlzLl9vdXRlckxpc3RlbmVyKSx0aGlzLl9yZXNvbHV0aW9uTWVkaWFNYXRjaExpc3Q9dm9pZCAwLHRoaXMuX291dGVyTGlzdGVuZXI9dm9pZCAwKX19fSw3Nzk6KGUsdCxpKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuTGlua1Byb3ZpZGVyU2VydmljZT12b2lkIDA7Y29uc3Qgcz1pKDg0NCk7Y2xhc3MgciBleHRlbmRzIHMuRGlzcG9zYWJsZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5saW5rUHJvdmlkZXJzPVtdLHRoaXMucmVnaXN0ZXIoKDAscy50b0Rpc3Bvc2FibGUpKCgoKT0+dGhpcy5saW5rUHJvdmlkZXJzLmxlbmd0aD0wKSkpfXJlZ2lzdGVyTGlua1Byb3ZpZGVyKGUpe3JldHVybiB0aGlzLmxpbmtQcm92aWRlcnMucHVzaChlKSx7ZGlzcG9zZTooKT0+e2NvbnN0IHQ9dGhpcy5saW5rUHJvdmlkZXJzLmluZGV4T2YoZSk7LTEhPT10JiZ0aGlzLmxpbmtQcm92aWRlcnMuc3BsaWNlKHQsMSl9fX19dC5MaW5rUHJvdmlkZXJTZXJ2aWNlPXJ9LDg5MzQ6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzPXRoaXMmJnRoaXMuX19kZWNvcmF0ZXx8ZnVuY3Rpb24oZSx0LGkscyl7dmFyIHIsbj1hcmd1bWVudHMubGVuZ3RoLG89bjwzP3Q6bnVsbD09PXM/cz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsaSk6cztpZihcIm9iamVjdFwiPT10eXBlb2YgUmVmbGVjdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlvPVJlZmxlY3QuZGVjb3JhdGUoZSx0LGkscyk7ZWxzZSBmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSkocj1lW2FdKSYmKG89KG48Mz9yKG8pOm4+Mz9yKHQsaSxvKTpyKHQsaSkpfHxvKTtyZXR1cm4gbj4zJiZvJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLG8pLG99LHI9dGhpcyYmdGhpcy5fX3BhcmFtfHxmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihpLHMpe3QoaSxzLGUpfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5Nb3VzZVNlcnZpY2U9dm9pZCAwO2NvbnN0IG49aSg0NzI1KSxvPWkoOTgwNik7bGV0IGE9dC5Nb3VzZVNlcnZpY2U9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl9yZW5kZXJTZXJ2aWNlPWUsdGhpcy5fY2hhclNpemVTZXJ2aWNlPXR9Z2V0Q29vcmRzKGUsdCxpLHMscil7cmV0dXJuKDAsby5nZXRDb29yZHMpKHdpbmRvdyxlLHQsaSxzLHRoaXMuX2NoYXJTaXplU2VydmljZS5oYXNWYWxpZFNpemUsdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoLHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQscil9Z2V0TW91c2VSZXBvcnRDb29yZHMoZSx0KXtjb25zdCBpPSgwLG8uZ2V0Q29vcmRzUmVsYXRpdmVUb0VsZW1lbnQpKHdpbmRvdyxlLHQpO2lmKHRoaXMuX2NoYXJTaXplU2VydmljZS5oYXNWYWxpZFNpemUpcmV0dXJuIGlbMF09TWF0aC5taW4oTWF0aC5tYXgoaVswXSwwKSx0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aC0xKSxpWzFdPU1hdGgubWluKE1hdGgubWF4KGlbMV0sMCksdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0LTEpLHtjb2w6TWF0aC5mbG9vcihpWzBdL3RoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCkscm93Ok1hdGguZmxvb3IoaVsxXS90aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0KSx4Ok1hdGguZmxvb3IoaVswXSkseTpNYXRoLmZsb29yKGlbMV0pfX19O3QuTW91c2VTZXJ2aWNlPWE9cyhbcigwLG4uSVJlbmRlclNlcnZpY2UpLHIoMSxuLklDaGFyU2l6ZVNlcnZpY2UpXSxhKX0sMzIzMDpmdW5jdGlvbihlLHQsaSl7dmFyIHM9dGhpcyYmdGhpcy5fX2RlY29yYXRlfHxmdW5jdGlvbihlLHQsaSxzKXt2YXIgcixuPWFyZ3VtZW50cy5sZW5ndGgsbz1uPDM/dDpudWxsPT09cz9zPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxpKTpzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBSZWZsZWN0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKW89UmVmbGVjdC5kZWNvcmF0ZShlLHQsaSxzKTtlbHNlIGZvcih2YXIgYT1lLmxlbmd0aC0xO2E+PTA7YS0tKShyPWVbYV0pJiYobz0objwzP3Iobyk6bj4zP3IodCxpLG8pOnIodCxpKSl8fG8pO3JldHVybiBuPjMmJm8mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGksbyksb30scj10aGlzJiZ0aGlzLl9fcGFyYW18fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGkscyl7dChpLHMsZSl9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LlJlbmRlclNlcnZpY2U9dm9pZCAwO2NvbnN0IG49aSg2MTkzKSxvPWkoNDcyNSksYT1pKDg0NjApLGg9aSg4NDQpLGM9aSg3MjI2KSxsPWkoMjU4NSk7bGV0IGQ9dC5SZW5kZXJTZXJ2aWNlPWNsYXNzIGV4dGVuZHMgaC5EaXNwb3NhYmxle2dldCBkaW1lbnNpb25zKCl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyLnZhbHVlLmRpbWVuc2lvbnN9Y29uc3RydWN0b3IoZSx0LGkscyxyLG8sbCxkKXtzdXBlcigpLHRoaXMuX3Jvd0NvdW50PWUsdGhpcy5fY2hhclNpemVTZXJ2aWNlPXMsdGhpcy5fcmVuZGVyZXI9dGhpcy5yZWdpc3RlcihuZXcgaC5NdXRhYmxlRGlzcG9zYWJsZSksdGhpcy5fcGF1c2VkUmVzaXplVGFzaz1uZXcgYy5EZWJvdW5jZWRJZGxlVGFzayx0aGlzLl9vYnNlcnZlckRpc3Bvc2FibGU9dGhpcy5yZWdpc3RlcihuZXcgaC5NdXRhYmxlRGlzcG9zYWJsZSksdGhpcy5faXNQYXVzZWQ9ITEsdGhpcy5fbmVlZHNGdWxsUmVmcmVzaD0hMSx0aGlzLl9pc05leHRSZW5kZXJSZWRyYXdPbmx5PSEwLHRoaXMuX25lZWRzU2VsZWN0aW9uUmVmcmVzaD0hMSx0aGlzLl9jYW52YXNXaWR0aD0wLHRoaXMuX2NhbnZhc0hlaWdodD0wLHRoaXMuX3NlbGVjdGlvblN0YXRlPXtzdGFydDp2b2lkIDAsZW5kOnZvaWQgMCxjb2x1bW5TZWxlY3RNb2RlOiExfSx0aGlzLl9vbkRpbWVuc2lvbnNDaGFuZ2U9dGhpcy5yZWdpc3RlcihuZXcgYS5FdmVudEVtaXR0ZXIpLHRoaXMub25EaW1lbnNpb25zQ2hhbmdlPXRoaXMuX29uRGltZW5zaW9uc0NoYW5nZS5ldmVudCx0aGlzLl9vblJlbmRlcmVkVmlld3BvcnRDaGFuZ2U9dGhpcy5yZWdpc3RlcihuZXcgYS5FdmVudEVtaXR0ZXIpLHRoaXMub25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlPXRoaXMuX29uUmVuZGVyZWRWaWV3cG9ydENoYW5nZS5ldmVudCx0aGlzLl9vblJlbmRlcj10aGlzLnJlZ2lzdGVyKG5ldyBhLkV2ZW50RW1pdHRlciksdGhpcy5vblJlbmRlcj10aGlzLl9vblJlbmRlci5ldmVudCx0aGlzLl9vblJlZnJlc2hSZXF1ZXN0PXRoaXMucmVnaXN0ZXIobmV3IGEuRXZlbnRFbWl0dGVyKSx0aGlzLm9uUmVmcmVzaFJlcXVlc3Q9dGhpcy5fb25SZWZyZXNoUmVxdWVzdC5ldmVudCx0aGlzLl9yZW5kZXJEZWJvdW5jZXI9bmV3IG4uUmVuZGVyRGVib3VuY2VyKCgoZSx0KT0+dGhpcy5fcmVuZGVyUm93cyhlLHQpKSxsKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX3JlbmRlckRlYm91bmNlciksdGhpcy5yZWdpc3RlcihsLm9uRHByQ2hhbmdlKCgoKT0+dGhpcy5oYW5kbGVEZXZpY2VQaXhlbFJhdGlvQ2hhbmdlKCkpKSksdGhpcy5yZWdpc3RlcihvLm9uUmVzaXplKCgoKT0+dGhpcy5fZnVsbFJlZnJlc2goKSkpKSx0aGlzLnJlZ2lzdGVyKG8uYnVmZmVycy5vbkJ1ZmZlckFjdGl2YXRlKCgoKT0+dGhpcy5fcmVuZGVyZXIudmFsdWU/LmNsZWFyKCkpKSksdGhpcy5yZWdpc3RlcihpLm9uT3B0aW9uQ2hhbmdlKCgoKT0+dGhpcy5faGFuZGxlT3B0aW9uc0NoYW5nZWQoKSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX2NoYXJTaXplU2VydmljZS5vbkNoYXJTaXplQ2hhbmdlKCgoKT0+dGhpcy5oYW5kbGVDaGFyU2l6ZUNoYW5nZWQoKSkpKSx0aGlzLnJlZ2lzdGVyKHIub25EZWNvcmF0aW9uUmVnaXN0ZXJlZCgoKCk9PnRoaXMuX2Z1bGxSZWZyZXNoKCkpKSksdGhpcy5yZWdpc3RlcihyLm9uRGVjb3JhdGlvblJlbW92ZWQoKCgpPT50aGlzLl9mdWxsUmVmcmVzaCgpKSkpLHRoaXMucmVnaXN0ZXIoaS5vbk11bHRpcGxlT3B0aW9uQ2hhbmdlKFtcImN1c3RvbUdseXBoc1wiLFwiZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnNcIixcImxldHRlclNwYWNpbmdcIixcImxpbmVIZWlnaHRcIixcImZvbnRGYW1pbHlcIixcImZvbnRTaXplXCIsXCJmb250V2VpZ2h0XCIsXCJmb250V2VpZ2h0Qm9sZFwiLFwibWluaW11bUNvbnRyYXN0UmF0aW9cIixcInJlc2NhbGVPdmVybGFwcGluZ0dseXBoc1wiXSwoKCk9Pnt0aGlzLmNsZWFyKCksdGhpcy5oYW5kbGVSZXNpemUoby5jb2xzLG8ucm93cyksdGhpcy5fZnVsbFJlZnJlc2goKX0pKSksdGhpcy5yZWdpc3RlcihpLm9uTXVsdGlwbGVPcHRpb25DaGFuZ2UoW1wiY3Vyc29yQmxpbmtcIixcImN1cnNvclN0eWxlXCJdLCgoKT0+dGhpcy5yZWZyZXNoUm93cyhvLmJ1ZmZlci55LG8uYnVmZmVyLnksITApKSkpLHRoaXMucmVnaXN0ZXIoZC5vbkNoYW5nZUNvbG9ycygoKCk9PnRoaXMuX2Z1bGxSZWZyZXNoKCkpKSksdGhpcy5fcmVnaXN0ZXJJbnRlcnNlY3Rpb25PYnNlcnZlcihsLndpbmRvdyx0KSx0aGlzLnJlZ2lzdGVyKGwub25XaW5kb3dDaGFuZ2UoKGU9PnRoaXMuX3JlZ2lzdGVySW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZSx0KSkpKX1fcmVnaXN0ZXJJbnRlcnNlY3Rpb25PYnNlcnZlcihlLHQpe2lmKFwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXJcImluIGUpe2NvbnN0IGk9bmV3IGUuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGU9PnRoaXMuX2hhbmRsZUludGVyc2VjdGlvbkNoYW5nZShlW2UubGVuZ3RoLTFdKSkse3RocmVzaG9sZDowfSk7aS5vYnNlcnZlKHQpLHRoaXMuX29ic2VydmVyRGlzcG9zYWJsZS52YWx1ZT0oMCxoLnRvRGlzcG9zYWJsZSkoKCgpPT5pLmRpc2Nvbm5lY3QoKSkpfX1faGFuZGxlSW50ZXJzZWN0aW9uQ2hhbmdlKGUpe3RoaXMuX2lzUGF1c2VkPXZvaWQgMD09PWUuaXNJbnRlcnNlY3Rpbmc/MD09PWUuaW50ZXJzZWN0aW9uUmF0aW86IWUuaXNJbnRlcnNlY3RpbmcsdGhpcy5faXNQYXVzZWR8fHRoaXMuX2NoYXJTaXplU2VydmljZS5oYXNWYWxpZFNpemV8fHRoaXMuX2NoYXJTaXplU2VydmljZS5tZWFzdXJlKCksIXRoaXMuX2lzUGF1c2VkJiZ0aGlzLl9uZWVkc0Z1bGxSZWZyZXNoJiYodGhpcy5fcGF1c2VkUmVzaXplVGFzay5mbHVzaCgpLHRoaXMucmVmcmVzaFJvd3MoMCx0aGlzLl9yb3dDb3VudC0xKSx0aGlzLl9uZWVkc0Z1bGxSZWZyZXNoPSExKX1yZWZyZXNoUm93cyhlLHQsaT0hMSl7dGhpcy5faXNQYXVzZWQ/dGhpcy5fbmVlZHNGdWxsUmVmcmVzaD0hMDooaXx8KHRoaXMuX2lzTmV4dFJlbmRlclJlZHJhd09ubHk9ITEpLHRoaXMuX3JlbmRlckRlYm91bmNlci5yZWZyZXNoKGUsdCx0aGlzLl9yb3dDb3VudCkpfV9yZW5kZXJSb3dzKGUsdCl7dGhpcy5fcmVuZGVyZXIudmFsdWUmJihlPU1hdGgubWluKGUsdGhpcy5fcm93Q291bnQtMSksdD1NYXRoLm1pbih0LHRoaXMuX3Jvd0NvdW50LTEpLHRoaXMuX3JlbmRlcmVyLnZhbHVlLnJlbmRlclJvd3MoZSx0KSx0aGlzLl9uZWVkc1NlbGVjdGlvblJlZnJlc2gmJih0aGlzLl9yZW5kZXJlci52YWx1ZS5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHRoaXMuX3NlbGVjdGlvblN0YXRlLnN0YXJ0LHRoaXMuX3NlbGVjdGlvblN0YXRlLmVuZCx0aGlzLl9zZWxlY3Rpb25TdGF0ZS5jb2x1bW5TZWxlY3RNb2RlKSx0aGlzLl9uZWVkc1NlbGVjdGlvblJlZnJlc2g9ITEpLHRoaXMuX2lzTmV4dFJlbmRlclJlZHJhd09ubHl8fHRoaXMuX29uUmVuZGVyZWRWaWV3cG9ydENoYW5nZS5maXJlKHtzdGFydDplLGVuZDp0fSksdGhpcy5fb25SZW5kZXIuZmlyZSh7c3RhcnQ6ZSxlbmQ6dH0pLHRoaXMuX2lzTmV4dFJlbmRlclJlZHJhd09ubHk9ITApfXJlc2l6ZShlLHQpe3RoaXMuX3Jvd0NvdW50PXQsdGhpcy5fZmlyZU9uQ2FudmFzUmVzaXplKCl9X2hhbmRsZU9wdGlvbnNDaGFuZ2VkKCl7dGhpcy5fcmVuZGVyZXIudmFsdWUmJih0aGlzLnJlZnJlc2hSb3dzKDAsdGhpcy5fcm93Q291bnQtMSksdGhpcy5fZmlyZU9uQ2FudmFzUmVzaXplKCkpfV9maXJlT25DYW52YXNSZXNpemUoKXt0aGlzLl9yZW5kZXJlci52YWx1ZSYmKHRoaXMuX3JlbmRlcmVyLnZhbHVlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aD09PXRoaXMuX2NhbnZhc1dpZHRoJiZ0aGlzLl9yZW5kZXJlci52YWx1ZS5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0PT09dGhpcy5fY2FudmFzSGVpZ2h0fHx0aGlzLl9vbkRpbWVuc2lvbnNDaGFuZ2UuZmlyZSh0aGlzLl9yZW5kZXJlci52YWx1ZS5kaW1lbnNpb25zKSl9aGFzUmVuZGVyZXIoKXtyZXR1cm4hIXRoaXMuX3JlbmRlcmVyLnZhbHVlfXNldFJlbmRlcmVyKGUpe3RoaXMuX3JlbmRlcmVyLnZhbHVlPWUsdGhpcy5fcmVuZGVyZXIudmFsdWUmJih0aGlzLl9yZW5kZXJlci52YWx1ZS5vblJlcXVlc3RSZWRyYXcoKGU9PnRoaXMucmVmcmVzaFJvd3MoZS5zdGFydCxlLmVuZCwhMCkpKSx0aGlzLl9uZWVkc1NlbGVjdGlvblJlZnJlc2g9ITAsdGhpcy5fZnVsbFJlZnJlc2goKSl9YWRkUmVmcmVzaENhbGxiYWNrKGUpe3JldHVybiB0aGlzLl9yZW5kZXJEZWJvdW5jZXIuYWRkUmVmcmVzaENhbGxiYWNrKGUpfV9mdWxsUmVmcmVzaCgpe3RoaXMuX2lzUGF1c2VkP3RoaXMuX25lZWRzRnVsbFJlZnJlc2g9ITA6dGhpcy5yZWZyZXNoUm93cygwLHRoaXMuX3Jvd0NvdW50LTEpfWNsZWFyVGV4dHVyZUF0bGFzKCl7dGhpcy5fcmVuZGVyZXIudmFsdWUmJih0aGlzLl9yZW5kZXJlci52YWx1ZS5jbGVhclRleHR1cmVBdGxhcz8uKCksdGhpcy5fZnVsbFJlZnJlc2goKSl9aGFuZGxlRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZSgpe3RoaXMuX2NoYXJTaXplU2VydmljZS5tZWFzdXJlKCksdGhpcy5fcmVuZGVyZXIudmFsdWUmJih0aGlzLl9yZW5kZXJlci52YWx1ZS5oYW5kbGVEZXZpY2VQaXhlbFJhdGlvQ2hhbmdlKCksdGhpcy5yZWZyZXNoUm93cygwLHRoaXMuX3Jvd0NvdW50LTEpKX1oYW5kbGVSZXNpemUoZSx0KXt0aGlzLl9yZW5kZXJlci52YWx1ZSYmKHRoaXMuX2lzUGF1c2VkP3RoaXMuX3BhdXNlZFJlc2l6ZVRhc2suc2V0KCgoKT0+dGhpcy5fcmVuZGVyZXIudmFsdWU/LmhhbmRsZVJlc2l6ZShlLHQpKSk6dGhpcy5fcmVuZGVyZXIudmFsdWUuaGFuZGxlUmVzaXplKGUsdCksdGhpcy5fZnVsbFJlZnJlc2goKSl9aGFuZGxlQ2hhclNpemVDaGFuZ2VkKCl7dGhpcy5fcmVuZGVyZXIudmFsdWU/LmhhbmRsZUNoYXJTaXplQ2hhbmdlZCgpfWhhbmRsZUJsdXIoKXt0aGlzLl9yZW5kZXJlci52YWx1ZT8uaGFuZGxlQmx1cigpfWhhbmRsZUZvY3VzKCl7dGhpcy5fcmVuZGVyZXIudmFsdWU/LmhhbmRsZUZvY3VzKCl9aGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChlLHQsaSl7dGhpcy5fc2VsZWN0aW9uU3RhdGUuc3RhcnQ9ZSx0aGlzLl9zZWxlY3Rpb25TdGF0ZS5lbmQ9dCx0aGlzLl9zZWxlY3Rpb25TdGF0ZS5jb2x1bW5TZWxlY3RNb2RlPWksdGhpcy5fcmVuZGVyZXIudmFsdWU/LmhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoZSx0LGkpfWhhbmRsZUN1cnNvck1vdmUoKXt0aGlzLl9yZW5kZXJlci52YWx1ZT8uaGFuZGxlQ3Vyc29yTW92ZSgpfWNsZWFyKCl7dGhpcy5fcmVuZGVyZXIudmFsdWU/LmNsZWFyKCl9fTt0LlJlbmRlclNlcnZpY2U9ZD1zKFtyKDIsbC5JT3B0aW9uc1NlcnZpY2UpLHIoMyxvLklDaGFyU2l6ZVNlcnZpY2UpLHIoNCxsLklEZWNvcmF0aW9uU2VydmljZSkscig1LGwuSUJ1ZmZlclNlcnZpY2UpLHIoNixvLklDb3JlQnJvd3NlclNlcnZpY2UpLHIoNyxvLklUaGVtZVNlcnZpY2UpXSxkKX0sOTMxMjpmdW5jdGlvbihlLHQsaSl7dmFyIHM9dGhpcyYmdGhpcy5fX2RlY29yYXRlfHxmdW5jdGlvbihlLHQsaSxzKXt2YXIgcixuPWFyZ3VtZW50cy5sZW5ndGgsbz1uPDM/dDpudWxsPT09cz9zPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxpKTpzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBSZWZsZWN0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKW89UmVmbGVjdC5kZWNvcmF0ZShlLHQsaSxzKTtlbHNlIGZvcih2YXIgYT1lLmxlbmd0aC0xO2E+PTA7YS0tKShyPWVbYV0pJiYobz0objwzP3Iobyk6bj4zP3IodCxpLG8pOnIodCxpKSl8fG8pO3JldHVybiBuPjMmJm8mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGksbyksb30scj10aGlzJiZ0aGlzLl9fcGFyYW18fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGkscyl7dChpLHMsZSl9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LlNlbGVjdGlvblNlcnZpY2U9dm9pZCAwO2NvbnN0IG49aSg5ODA2KSxvPWkoOTUwNCksYT1pKDQ1NiksaD1pKDQ3MjUpLGM9aSg4NDYwKSxsPWkoODQ0KSxkPWkoNjExNCksXz1pKDQ4NDEpLHU9aSg1MTEpLGY9aSgyNTg1KSx2PVN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSxwPW5ldyBSZWdFeHAodixcImdcIik7bGV0IGc9dC5TZWxlY3Rpb25TZXJ2aWNlPWNsYXNzIGV4dGVuZHMgbC5EaXNwb3NhYmxle2NvbnN0cnVjdG9yKGUsdCxpLHMscixuLG8saCxkKXtzdXBlcigpLHRoaXMuX2VsZW1lbnQ9ZSx0aGlzLl9zY3JlZW5FbGVtZW50PXQsdGhpcy5fbGlua2lmaWVyPWksdGhpcy5fYnVmZmVyU2VydmljZT1zLHRoaXMuX2NvcmVTZXJ2aWNlPXIsdGhpcy5fbW91c2VTZXJ2aWNlPW4sdGhpcy5fb3B0aW9uc1NlcnZpY2U9byx0aGlzLl9yZW5kZXJTZXJ2aWNlPWgsdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlPWQsdGhpcy5fZHJhZ1Njcm9sbEFtb3VudD0wLHRoaXMuX2VuYWJsZWQ9ITAsdGhpcy5fd29ya0NlbGw9bmV3IHUuQ2VsbERhdGEsdGhpcy5fbW91c2VEb3duVGltZVN0YW1wPTAsdGhpcy5fb2xkSGFzU2VsZWN0aW9uPSExLHRoaXMuX29sZFNlbGVjdGlvblN0YXJ0PXZvaWQgMCx0aGlzLl9vbGRTZWxlY3Rpb25FbmQ9dm9pZCAwLHRoaXMuX29uTGludXhNb3VzZVNlbGVjdGlvbj10aGlzLnJlZ2lzdGVyKG5ldyBjLkV2ZW50RW1pdHRlciksdGhpcy5vbkxpbnV4TW91c2VTZWxlY3Rpb249dGhpcy5fb25MaW51eE1vdXNlU2VsZWN0aW9uLmV2ZW50LHRoaXMuX29uUmVkcmF3UmVxdWVzdD10aGlzLnJlZ2lzdGVyKG5ldyBjLkV2ZW50RW1pdHRlciksdGhpcy5vblJlcXVlc3RSZWRyYXc9dGhpcy5fb25SZWRyYXdSZXF1ZXN0LmV2ZW50LHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlPXRoaXMucmVnaXN0ZXIobmV3IGMuRXZlbnRFbWl0dGVyKSx0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlPXRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlLmV2ZW50LHRoaXMuX29uUmVxdWVzdFNjcm9sbExpbmVzPXRoaXMucmVnaXN0ZXIobmV3IGMuRXZlbnRFbWl0dGVyKSx0aGlzLm9uUmVxdWVzdFNjcm9sbExpbmVzPXRoaXMuX29uUmVxdWVzdFNjcm9sbExpbmVzLmV2ZW50LHRoaXMuX21vdXNlTW92ZUxpc3RlbmVyPWU9PnRoaXMuX2hhbmRsZU1vdXNlTW92ZShlKSx0aGlzLl9tb3VzZVVwTGlzdGVuZXI9ZT0+dGhpcy5faGFuZGxlTW91c2VVcChlKSx0aGlzLl9jb3JlU2VydmljZS5vblVzZXJJbnB1dCgoKCk9Pnt0aGlzLmhhc1NlbGVjdGlvbiYmdGhpcy5jbGVhclNlbGVjdGlvbigpfSkpLHRoaXMuX3RyaW1MaXN0ZW5lcj10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5vblRyaW0oKGU9PnRoaXMuX2hhbmRsZVRyaW0oZSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5vbkJ1ZmZlckFjdGl2YXRlKChlPT50aGlzLl9oYW5kbGVCdWZmZXJBY3RpdmF0ZShlKSkpKSx0aGlzLmVuYWJsZSgpLHRoaXMuX21vZGVsPW5ldyBhLlNlbGVjdGlvbk1vZGVsKHRoaXMuX2J1ZmZlclNlcnZpY2UpLHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGU9MCx0aGlzLnJlZ2lzdGVyKCgwLGwudG9EaXNwb3NhYmxlKSgoKCk9Pnt0aGlzLl9yZW1vdmVNb3VzZURvd25MaXN0ZW5lcnMoKX0pKSl9cmVzZXQoKXt0aGlzLmNsZWFyU2VsZWN0aW9uKCl9ZGlzYWJsZSgpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLl9lbmFibGVkPSExfWVuYWJsZSgpe3RoaXMuX2VuYWJsZWQ9ITB9Z2V0IHNlbGVjdGlvblN0YXJ0KCl7cmV0dXJuIHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uU3RhcnR9Z2V0IHNlbGVjdGlvbkVuZCgpe3JldHVybiB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvbkVuZH1nZXQgaGFzU2VsZWN0aW9uKCl7Y29uc3QgZT10aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvblN0YXJ0LHQ9dGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25FbmQ7cmV0dXJuISghZXx8IXR8fGVbMF09PT10WzBdJiZlWzFdPT09dFsxXSl9Z2V0IHNlbGVjdGlvblRleHQoKXtjb25zdCBlPXRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uU3RhcnQsdD10aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvbkVuZDtpZighZXx8IXQpcmV0dXJuXCJcIjtjb25zdCBpPXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLHM9W107aWYoMz09PXRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUpe2lmKGVbMF09PT10WzBdKXJldHVyblwiXCI7Y29uc3Qgcj1lWzBdPHRbMF0/ZVswXTp0WzBdLG49ZVswXTx0WzBdP3RbMF06ZVswXTtmb3IobGV0IG89ZVsxXTtvPD10WzFdO28rKyl7Y29uc3QgZT1pLnRyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZyhvLCEwLHIsbik7cy5wdXNoKGUpfX1lbHNle2NvbnN0IHI9ZVsxXT09PXRbMV0/dFswXTp2b2lkIDA7cy5wdXNoKGkudHJhbnNsYXRlQnVmZmVyTGluZVRvU3RyaW5nKGVbMV0sITAsZVswXSxyKSk7Zm9yKGxldCByPWVbMV0rMTtyPD10WzFdLTE7cisrKXtjb25zdCBlPWkubGluZXMuZ2V0KHIpLHQ9aS50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcociwhMCk7ZT8uaXNXcmFwcGVkP3Nbcy5sZW5ndGgtMV0rPXQ6cy5wdXNoKHQpfWlmKGVbMV0hPT10WzFdKXtjb25zdCBlPWkubGluZXMuZ2V0KHRbMV0pLHI9aS50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcodFsxXSwhMCwwLHRbMF0pO2UmJmUuaXNXcmFwcGVkP3Nbcy5sZW5ndGgtMV0rPXI6cy5wdXNoKHIpfX1yZXR1cm4gcy5tYXAoKGU9PmUucmVwbGFjZShwLFwiIFwiKSkpLmpvaW4oZC5pc1dpbmRvd3M/XCJcXHJcXG5cIjpcIlxcblwiKX1jbGVhclNlbGVjdGlvbigpe3RoaXMuX21vZGVsLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5fcmVtb3ZlTW91c2VEb3duTGlzdGVuZXJzKCksdGhpcy5yZWZyZXNoKCksdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UuZmlyZSgpfXJlZnJlc2goZSl7dGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lfHwodGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lPXRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+dGhpcy5fcmVmcmVzaCgpKSkpLGQuaXNMaW51eCYmZSYmdGhpcy5zZWxlY3Rpb25UZXh0Lmxlbmd0aCYmdGhpcy5fb25MaW51eE1vdXNlU2VsZWN0aW9uLmZpcmUodGhpcy5zZWxlY3Rpb25UZXh0KX1fcmVmcmVzaCgpe3RoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZT12b2lkIDAsdGhpcy5fb25SZWRyYXdSZXF1ZXN0LmZpcmUoe3N0YXJ0OnRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uU3RhcnQsZW5kOnRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uRW5kLGNvbHVtblNlbGVjdE1vZGU6Mz09PXRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGV9KX1faXNDbGlja0luU2VsZWN0aW9uKGUpe2NvbnN0IHQ9dGhpcy5fZ2V0TW91c2VCdWZmZXJDb29yZHMoZSksaT10aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvblN0YXJ0LHM9dGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25FbmQ7cmV0dXJuISEoaSYmcyYmdCkmJnRoaXMuX2FyZUNvb3Jkc0luU2VsZWN0aW9uKHQsaSxzKX1pc0NlbGxJblNlbGVjdGlvbihlLHQpe2NvbnN0IGk9dGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25TdGFydCxzPXRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uRW5kO3JldHVybiEoIWl8fCFzKSYmdGhpcy5fYXJlQ29vcmRzSW5TZWxlY3Rpb24oW2UsdF0saSxzKX1fYXJlQ29vcmRzSW5TZWxlY3Rpb24oZSx0LGkpe3JldHVybiBlWzFdPnRbMV0mJmVbMV08aVsxXXx8dFsxXT09PWlbMV0mJmVbMV09PT10WzFdJiZlWzBdPj10WzBdJiZlWzBdPGlbMF18fHRbMV08aVsxXSYmZVsxXT09PWlbMV0mJmVbMF08aVswXXx8dFsxXTxpWzFdJiZlWzFdPT09dFsxXSYmZVswXT49dFswXX1fc2VsZWN0V29yZEF0Q3Vyc29yKGUsdCl7Y29uc3QgaT10aGlzLl9saW5raWZpZXIuY3VycmVudExpbms/Lmxpbms/LnJhbmdlO2lmKGkpcmV0dXJuIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0PVtpLnN0YXJ0LngtMSxpLnN0YXJ0LnktMV0sdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRMZW5ndGg9KDAsXy5nZXRSYW5nZUxlbmd0aCkoaSx0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpLHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZD12b2lkIDAsITA7Y29uc3Qgcz10aGlzLl9nZXRNb3VzZUJ1ZmZlckNvb3JkcyhlKTtyZXR1cm4hIXMmJih0aGlzLl9zZWxlY3RXb3JkQXQocyx0KSx0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQ9dm9pZCAwLCEwKX1zZWxlY3RBbGwoKXt0aGlzLl9tb2RlbC5pc1NlbGVjdEFsbEFjdGl2ZT0hMCx0aGlzLnJlZnJlc2goKSx0aGlzLl9vblNlbGVjdGlvbkNoYW5nZS5maXJlKCl9c2VsZWN0TGluZXMoZSx0KXt0aGlzLl9tb2RlbC5jbGVhclNlbGVjdGlvbigpLGU9TWF0aC5tYXgoZSwwKSx0PU1hdGgubWluKHQsdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMubGVuZ3RoLTEpLHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0PVswLGVdLHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZD1bdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLHRdLHRoaXMucmVmcmVzaCgpLHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlLmZpcmUoKX1faGFuZGxlVHJpbShlKXt0aGlzLl9tb2RlbC5oYW5kbGVUcmltKGUpJiZ0aGlzLnJlZnJlc2goKX1fZ2V0TW91c2VCdWZmZXJDb29yZHMoZSl7Y29uc3QgdD10aGlzLl9tb3VzZVNlcnZpY2UuZ2V0Q29vcmRzKGUsdGhpcy5fc2NyZWVuRWxlbWVudCx0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLCEwKTtpZih0KXJldHVybiB0WzBdLS0sdFsxXS0tLHRbMV0rPXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwLHR9X2dldE1vdXNlRXZlbnRTY3JvbGxBbW91bnQoZSl7bGV0IHQ9KDAsbi5nZXRDb29yZHNSZWxhdGl2ZVRvRWxlbWVudCkodGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdyxlLHRoaXMuX3NjcmVlbkVsZW1lbnQpWzFdO2NvbnN0IGk9dGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0O3JldHVybiB0Pj0wJiZ0PD1pPzA6KHQ+aSYmKHQtPWkpLHQ9TWF0aC5taW4oTWF0aC5tYXgodCwtNTApLDUwKSx0Lz01MCx0L01hdGguYWJzKHQpK01hdGgucm91bmQoMTQqdCkpfXNob3VsZEZvcmNlU2VsZWN0aW9uKGUpe3JldHVybiBkLmlzTWFjP2UuYWx0S2V5JiZ0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLm1hY09wdGlvbkNsaWNrRm9yY2VzU2VsZWN0aW9uOmUuc2hpZnRLZXl9aGFuZGxlTW91c2VEb3duKGUpe2lmKHRoaXMuX21vdXNlRG93blRpbWVTdGFtcD1lLnRpbWVTdGFtcCwoMiE9PWUuYnV0dG9ufHwhdGhpcy5oYXNTZWxlY3Rpb24pJiYwPT09ZS5idXR0b24pe2lmKCF0aGlzLl9lbmFibGVkKXtpZighdGhpcy5zaG91bGRGb3JjZVNlbGVjdGlvbihlKSlyZXR1cm47ZS5zdG9wUHJvcGFnYXRpb24oKX1lLnByZXZlbnREZWZhdWx0KCksdGhpcy5fZHJhZ1Njcm9sbEFtb3VudD0wLHRoaXMuX2VuYWJsZWQmJmUuc2hpZnRLZXk/dGhpcy5faGFuZGxlSW5jcmVtZW50YWxDbGljayhlKToxPT09ZS5kZXRhaWw/dGhpcy5faGFuZGxlU2luZ2xlQ2xpY2soZSk6Mj09PWUuZGV0YWlsP3RoaXMuX2hhbmRsZURvdWJsZUNsaWNrKGUpOjM9PT1lLmRldGFpbCYmdGhpcy5faGFuZGxlVHJpcGxlQ2xpY2soZSksdGhpcy5fYWRkTW91c2VEb3duTGlzdGVuZXJzKCksdGhpcy5yZWZyZXNoKCEwKX19X2FkZE1vdXNlRG93bkxpc3RlbmVycygpe3RoaXMuX3NjcmVlbkVsZW1lbnQub3duZXJEb2N1bWVudCYmKHRoaXMuX3NjcmVlbkVsZW1lbnQub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5fbW91c2VNb3ZlTGlzdGVuZXIpLHRoaXMuX3NjcmVlbkVsZW1lbnQub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX21vdXNlVXBMaXN0ZW5lcikpLHRoaXMuX2RyYWdTY3JvbGxJbnRlcnZhbFRpbWVyPXRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuc2V0SW50ZXJ2YWwoKCgpPT50aGlzLl9kcmFnU2Nyb2xsKCkpLDUwKX1fcmVtb3ZlTW91c2VEb3duTGlzdGVuZXJzKCl7dGhpcy5fc2NyZWVuRWxlbWVudC5vd25lckRvY3VtZW50JiYodGhpcy5fc2NyZWVuRWxlbWVudC5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9tb3VzZU1vdmVMaXN0ZW5lciksdGhpcy5fc2NyZWVuRWxlbWVudC5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fbW91c2VVcExpc3RlbmVyKSksdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX2RyYWdTY3JvbGxJbnRlcnZhbFRpbWVyKSx0aGlzLl9kcmFnU2Nyb2xsSW50ZXJ2YWxUaW1lcj12b2lkIDB9X2hhbmRsZUluY3JlbWVudGFsQ2xpY2soZSl7dGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnQmJih0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQ9dGhpcy5fZ2V0TW91c2VCdWZmZXJDb29yZHMoZSkpfV9oYW5kbGVTaW5nbGVDbGljayhlKXtpZih0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydExlbmd0aD0wLHRoaXMuX21vZGVsLmlzU2VsZWN0QWxsQWN0aXZlPSExLHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGU9dGhpcy5zaG91bGRDb2x1bW5TZWxlY3QoZSk/MzowLHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0PXRoaXMuX2dldE1vdXNlQnVmZmVyQ29vcmRzKGUpLCF0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydClyZXR1cm47dGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kPXZvaWQgMDtjb25zdCB0PXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmdldCh0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydFsxXSk7dCYmdC5sZW5ndGghPT10aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydFswXSYmMD09PXQuaGFzV2lkdGgodGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRbMF0pJiZ0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydFswXSsrfV9oYW5kbGVEb3VibGVDbGljayhlKXt0aGlzLl9zZWxlY3RXb3JkQXRDdXJzb3IoZSwhMCkmJih0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlPTEpfV9oYW5kbGVUcmlwbGVDbGljayhlKXtjb25zdCB0PXRoaXMuX2dldE1vdXNlQnVmZmVyQ29vcmRzKGUpO3QmJih0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlPTIsdGhpcy5fc2VsZWN0TGluZUF0KHRbMV0pKX1zaG91bGRDb2x1bW5TZWxlY3QoZSl7cmV0dXJuIGUuYWx0S2V5JiYhKGQuaXNNYWMmJnRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubWFjT3B0aW9uQ2xpY2tGb3JjZXNTZWxlY3Rpb24pfV9oYW5kbGVNb3VzZU1vdmUoZSl7aWYoZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSwhdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnQpcmV0dXJuO2NvbnN0IHQ9dGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kP1t0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMF0sdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzFdXTpudWxsO2lmKHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZD10aGlzLl9nZXRNb3VzZUJ1ZmZlckNvb3JkcyhlKSwhdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kKXJldHVybiB2b2lkIHRoaXMucmVmcmVzaCghMCk7Mj09PXRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGU/dGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzFdPHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0WzFdP3RoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXT0wOnRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXT10aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM6MT09PXRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUmJnRoaXMuX3NlbGVjdFRvV29yZEF0KHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZCksdGhpcy5fZHJhZ1Njcm9sbEFtb3VudD10aGlzLl9nZXRNb3VzZUV2ZW50U2Nyb2xsQW1vdW50KGUpLDMhPT10aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlJiYodGhpcy5fZHJhZ1Njcm9sbEFtb3VudD4wP3RoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXT10aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM6dGhpcy5fZHJhZ1Njcm9sbEFtb3VudDwwJiYodGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdPTApKTtjb25zdCBpPXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO2lmKHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFsxXTxpLmxpbmVzLmxlbmd0aCl7Y29uc3QgZT1pLmxpbmVzLmdldCh0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMV0pO2UmJjA9PT1lLmhhc1dpZHRoKHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSkmJnRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXTx0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMmJnRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSsrfXQmJnRbMF09PT10aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMF0mJnRbMV09PT10aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMV18fHRoaXMucmVmcmVzaCghMCl9X2RyYWdTY3JvbGwoKXtpZih0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQmJnRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0JiZ0aGlzLl9kcmFnU2Nyb2xsQW1vdW50KXt0aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcy5maXJlKHthbW91bnQ6dGhpcy5fZHJhZ1Njcm9sbEFtb3VudCxzdXBwcmVzc1Njcm9sbEV2ZW50OiExfSk7Y29uc3QgZT10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcjt0aGlzLl9kcmFnU2Nyb2xsQW1vdW50PjA/KDMhPT10aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlJiYodGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdPXRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyksdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzFdPU1hdGgubWluKGUueWRpc3ArdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLGUubGluZXMubGVuZ3RoLTEpKTooMyE9PXRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUmJih0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMF09MCksdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzFdPWUueWRpc3ApLHRoaXMucmVmcmVzaCgpfX1faGFuZGxlTW91c2VVcChlKXtjb25zdCB0PWUudGltZVN0YW1wLXRoaXMuX21vdXNlRG93blRpbWVTdGFtcDtpZih0aGlzLl9yZW1vdmVNb3VzZURvd25MaXN0ZW5lcnMoKSx0aGlzLnNlbGVjdGlvblRleHQubGVuZ3RoPD0xJiZ0PDUwMCYmZS5hbHRLZXkmJnRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuYWx0Q2xpY2tNb3Zlc0N1cnNvcil7aWYodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2U9PT10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCl7Y29uc3QgdD10aGlzLl9tb3VzZVNlcnZpY2UuZ2V0Q29vcmRzKGUsdGhpcy5fZWxlbWVudCx0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLCExKTtpZih0JiZ2b2lkIDAhPT10WzBdJiZ2b2lkIDAhPT10WzFdKXtjb25zdCBlPSgwLG8ubW92ZVRvQ2VsbFNlcXVlbmNlKSh0WzBdLTEsdFsxXS0xLHRoaXMuX2J1ZmZlclNlcnZpY2UsdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uQ3Vyc29yS2V5cyk7dGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChlLCEwKX19fWVsc2UgdGhpcy5fZmlyZUV2ZW50SWZTZWxlY3Rpb25DaGFuZ2VkKCl9X2ZpcmVFdmVudElmU2VsZWN0aW9uQ2hhbmdlZCgpe2NvbnN0IGU9dGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25TdGFydCx0PXRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uRW5kLGk9ISghZXx8IXR8fGVbMF09PT10WzBdJiZlWzFdPT09dFsxXSk7aT9lJiZ0JiYodGhpcy5fb2xkU2VsZWN0aW9uU3RhcnQmJnRoaXMuX29sZFNlbGVjdGlvbkVuZCYmZVswXT09PXRoaXMuX29sZFNlbGVjdGlvblN0YXJ0WzBdJiZlWzFdPT09dGhpcy5fb2xkU2VsZWN0aW9uU3RhcnRbMV0mJnRbMF09PT10aGlzLl9vbGRTZWxlY3Rpb25FbmRbMF0mJnRbMV09PT10aGlzLl9vbGRTZWxlY3Rpb25FbmRbMV18fHRoaXMuX2ZpcmVPblNlbGVjdGlvbkNoYW5nZShlLHQsaSkpOnRoaXMuX29sZEhhc1NlbGVjdGlvbiYmdGhpcy5fZmlyZU9uU2VsZWN0aW9uQ2hhbmdlKGUsdCxpKX1fZmlyZU9uU2VsZWN0aW9uQ2hhbmdlKGUsdCxpKXt0aGlzLl9vbGRTZWxlY3Rpb25TdGFydD1lLHRoaXMuX29sZFNlbGVjdGlvbkVuZD10LHRoaXMuX29sZEhhc1NlbGVjdGlvbj1pLHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlLmZpcmUoKX1faGFuZGxlQnVmZmVyQWN0aXZhdGUoZSl7dGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMuX3RyaW1MaXN0ZW5lci5kaXNwb3NlKCksdGhpcy5fdHJpbUxpc3RlbmVyPWUuYWN0aXZlQnVmZmVyLmxpbmVzLm9uVHJpbSgoZT0+dGhpcy5faGFuZGxlVHJpbShlKSkpfV9jb252ZXJ0Vmlld3BvcnRDb2xUb0NoYXJhY3RlckluZGV4KGUsdCl7bGV0IGk9dDtmb3IobGV0IHM9MDt0Pj1zO3MrKyl7Y29uc3Qgcj1lLmxvYWRDZWxsKHMsdGhpcy5fd29ya0NlbGwpLmdldENoYXJzKCkubGVuZ3RoOzA9PT10aGlzLl93b3JrQ2VsbC5nZXRXaWR0aCgpP2ktLTpyPjEmJnQhPT1zJiYoaSs9ci0xKX1yZXR1cm4gaX1zZXRTZWxlY3Rpb24oZSx0LGkpe3RoaXMuX21vZGVsLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5fcmVtb3ZlTW91c2VEb3duTGlzdGVuZXJzKCksdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnQ9W2UsdF0sdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRMZW5ndGg9aSx0aGlzLnJlZnJlc2goKSx0aGlzLl9maXJlRXZlbnRJZlNlbGVjdGlvbkNoYW5nZWQoKX1yaWdodENsaWNrU2VsZWN0KGUpe3RoaXMuX2lzQ2xpY2tJblNlbGVjdGlvbihlKXx8KHRoaXMuX3NlbGVjdFdvcmRBdEN1cnNvcihlLCExKSYmdGhpcy5yZWZyZXNoKCEwKSx0aGlzLl9maXJlRXZlbnRJZlNlbGVjdGlvbkNoYW5nZWQoKSl9X2dldFdvcmRBdChlLHQsaT0hMCxzPSEwKXtpZihlWzBdPj10aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpcmV0dXJuO2NvbnN0IHI9dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIsbj1yLmxpbmVzLmdldChlWzFdKTtpZighbilyZXR1cm47Y29uc3Qgbz1yLnRyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZyhlWzFdLCExKTtsZXQgYT10aGlzLl9jb252ZXJ0Vmlld3BvcnRDb2xUb0NoYXJhY3RlckluZGV4KG4sZVswXSksaD1hO2NvbnN0IGM9ZVswXS1hO2xldCBsPTAsZD0wLF89MCx1PTA7aWYoXCIgXCI9PT1vLmNoYXJBdChhKSl7Zm9yKDthPjAmJlwiIFwiPT09by5jaGFyQXQoYS0xKTspYS0tO2Zvcig7aDxvLmxlbmd0aCYmXCIgXCI9PT1vLmNoYXJBdChoKzEpOyloKyt9ZWxzZXtsZXQgdD1lWzBdLGk9ZVswXTswPT09bi5nZXRXaWR0aCh0KSYmKGwrKyx0LS0pLDI9PT1uLmdldFdpZHRoKGkpJiYoZCsrLGkrKyk7Y29uc3Qgcz1uLmdldFN0cmluZyhpKS5sZW5ndGg7Zm9yKHM+MSYmKHUrPXMtMSxoKz1zLTEpO3Q+MCYmYT4wJiYhdGhpcy5faXNDaGFyV29yZFNlcGFyYXRvcihuLmxvYWRDZWxsKHQtMSx0aGlzLl93b3JrQ2VsbCkpOyl7bi5sb2FkQ2VsbCh0LTEsdGhpcy5fd29ya0NlbGwpO2NvbnN0IGU9dGhpcy5fd29ya0NlbGwuZ2V0Q2hhcnMoKS5sZW5ndGg7MD09PXRoaXMuX3dvcmtDZWxsLmdldFdpZHRoKCk/KGwrKyx0LS0pOmU+MSYmKF8rPWUtMSxhLT1lLTEpLGEtLSx0LS19Zm9yKDtpPG4ubGVuZ3RoJiZoKzE8by5sZW5ndGgmJiF0aGlzLl9pc0NoYXJXb3JkU2VwYXJhdG9yKG4ubG9hZENlbGwoaSsxLHRoaXMuX3dvcmtDZWxsKSk7KXtuLmxvYWRDZWxsKGkrMSx0aGlzLl93b3JrQ2VsbCk7Y29uc3QgZT10aGlzLl93b3JrQ2VsbC5nZXRDaGFycygpLmxlbmd0aDsyPT09dGhpcy5fd29ya0NlbGwuZ2V0V2lkdGgoKT8oZCsrLGkrKyk6ZT4xJiYodSs9ZS0xLGgrPWUtMSksaCsrLGkrK319aCsrO2xldCBmPWErYy1sK18sdj1NYXRoLm1pbih0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsaC1hK2wrZC1fLXUpO2lmKHR8fFwiXCIhPT1vLnNsaWNlKGEsaCkudHJpbSgpKXtpZihpJiYwPT09ZiYmMzIhPT1uLmdldENvZGVQb2ludCgwKSl7Y29uc3QgdD1yLmxpbmVzLmdldChlWzFdLTEpO2lmKHQmJm4uaXNXcmFwcGVkJiYzMiE9PXQuZ2V0Q29kZVBvaW50KHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scy0xKSl7Y29uc3QgdD10aGlzLl9nZXRXb3JkQXQoW3RoaXMuX2J1ZmZlclNlcnZpY2UuY29scy0xLGVbMV0tMV0sITEsITAsITEpO2lmKHQpe2NvbnN0IGU9dGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLXQuc3RhcnQ7Zi09ZSx2Kz1lfX19aWYocyYmZit2PT09dGhpcy5fYnVmZmVyU2VydmljZS5jb2xzJiYzMiE9PW4uZ2V0Q29kZVBvaW50KHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scy0xKSl7Y29uc3QgdD1yLmxpbmVzLmdldChlWzFdKzEpO2lmKHQ/LmlzV3JhcHBlZCYmMzIhPT10LmdldENvZGVQb2ludCgwKSl7Y29uc3QgdD10aGlzLl9nZXRXb3JkQXQoWzAsZVsxXSsxXSwhMSwhMSwhMCk7dCYmKHYrPXQubGVuZ3RoKX19cmV0dXJue3N0YXJ0OmYsbGVuZ3RoOnZ9fX1fc2VsZWN0V29yZEF0KGUsdCl7Y29uc3QgaT10aGlzLl9nZXRXb3JkQXQoZSx0KTtpZihpKXtmb3IoO2kuc3RhcnQ8MDspaS5zdGFydCs9dGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLGVbMV0tLTt0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydD1baS5zdGFydCxlWzFdXSx0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydExlbmd0aD1pLmxlbmd0aH19X3NlbGVjdFRvV29yZEF0KGUpe2NvbnN0IHQ9dGhpcy5fZ2V0V29yZEF0KGUsITApO2lmKHQpe2xldCBpPWVbMV07Zm9yKDt0LnN0YXJ0PDA7KXQuc3RhcnQrPXRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyxpLS07aWYoIXRoaXMuX21vZGVsLmFyZVNlbGVjdGlvblZhbHVlc1JldmVyc2VkKCkpZm9yKDt0LnN0YXJ0K3QubGVuZ3RoPnRoaXMuX2J1ZmZlclNlcnZpY2UuY29sczspdC5sZW5ndGgtPXRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyxpKys7dGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kPVt0aGlzLl9tb2RlbC5hcmVTZWxlY3Rpb25WYWx1ZXNSZXZlcnNlZCgpP3Quc3RhcnQ6dC5zdGFydCt0Lmxlbmd0aCxpXX19X2lzQ2hhcldvcmRTZXBhcmF0b3IoZSl7cmV0dXJuIDAhPT1lLmdldFdpZHRoKCkmJnRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud29yZFNlcGFyYXRvci5pbmRleE9mKGUuZ2V0Q2hhcnMoKSk+PTB9X3NlbGVjdExpbmVBdChlKXtjb25zdCB0PXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmdldFdyYXBwZWRSYW5nZUZvckxpbmUoZSksaT17c3RhcnQ6e3g6MCx5OnQuZmlyc3R9LGVuZDp7eDp0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMtMSx5OnQubGFzdH19O3RoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0PVswLHQuZmlyc3RdLHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZD12b2lkIDAsdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRMZW5ndGg9KDAsXy5nZXRSYW5nZUxlbmd0aCkoaSx0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpfX07dC5TZWxlY3Rpb25TZXJ2aWNlPWc9cyhbcigzLGYuSUJ1ZmZlclNlcnZpY2UpLHIoNCxmLklDb3JlU2VydmljZSkscig1LGguSU1vdXNlU2VydmljZSkscig2LGYuSU9wdGlvbnNTZXJ2aWNlKSxyKDcsaC5JUmVuZGVyU2VydmljZSkscig4LGguSUNvcmVCcm93c2VyU2VydmljZSldLGcpfSw0NzI1OihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LklMaW5rUHJvdmlkZXJTZXJ2aWNlPXQuSVRoZW1lU2VydmljZT10LklDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlPXQuSVNlbGVjdGlvblNlcnZpY2U9dC5JUmVuZGVyU2VydmljZT10LklNb3VzZVNlcnZpY2U9dC5JQ29yZUJyb3dzZXJTZXJ2aWNlPXQuSUNoYXJTaXplU2VydmljZT12b2lkIDA7Y29uc3Qgcz1pKDgzNDMpO3QuSUNoYXJTaXplU2VydmljZT0oMCxzLmNyZWF0ZURlY29yYXRvcikoXCJDaGFyU2l6ZVNlcnZpY2VcIiksdC5JQ29yZUJyb3dzZXJTZXJ2aWNlPSgwLHMuY3JlYXRlRGVjb3JhdG9yKShcIkNvcmVCcm93c2VyU2VydmljZVwiKSx0LklNb3VzZVNlcnZpY2U9KDAscy5jcmVhdGVEZWNvcmF0b3IpKFwiTW91c2VTZXJ2aWNlXCIpLHQuSVJlbmRlclNlcnZpY2U9KDAscy5jcmVhdGVEZWNvcmF0b3IpKFwiUmVuZGVyU2VydmljZVwiKSx0LklTZWxlY3Rpb25TZXJ2aWNlPSgwLHMuY3JlYXRlRGVjb3JhdG9yKShcIlNlbGVjdGlvblNlcnZpY2VcIiksdC5JQ2hhcmFjdGVySm9pbmVyU2VydmljZT0oMCxzLmNyZWF0ZURlY29yYXRvcikoXCJDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlXCIpLHQuSVRoZW1lU2VydmljZT0oMCxzLmNyZWF0ZURlY29yYXRvcikoXCJUaGVtZVNlcnZpY2VcIiksdC5JTGlua1Byb3ZpZGVyU2VydmljZT0oMCxzLmNyZWF0ZURlY29yYXRvcikoXCJMaW5rUHJvdmlkZXJTZXJ2aWNlXCIpfSw2NzMxOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz10aGlzJiZ0aGlzLl9fZGVjb3JhdGV8fGZ1bmN0aW9uKGUsdCxpLHMpe3ZhciByLG49YXJndW1lbnRzLmxlbmd0aCxvPW48Mz90Om51bGw9PT1zP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpOnM7aWYoXCJvYmplY3RcIj09dHlwZW9mIFJlZmxlY3QmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpbz1SZWZsZWN0LmRlY29yYXRlKGUsdCxpLHMpO2Vsc2UgZm9yKHZhciBhPWUubGVuZ3RoLTE7YT49MDthLS0pKHI9ZVthXSkmJihvPShuPDM/cihvKTpuPjM/cih0LGksbyk6cih0LGkpKXx8byk7cmV0dXJuIG4+MyYmbyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSxvKSxvfSxyPXRoaXMmJnRoaXMuX19wYXJhbXx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oaSxzKXt0KGkscyxlKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuVGhlbWVTZXJ2aWNlPXQuREVGQVVMVF9BTlNJX0NPTE9SUz12b2lkIDA7Y29uc3Qgbj1pKDcyMzkpLG89aSg4MDU1KSxhPWkoODQ2MCksaD1pKDg0NCksYz1pKDI1ODUpLGw9by5jc3MudG9Db2xvcihcIiNmZmZmZmZcIiksZD1vLmNzcy50b0NvbG9yKFwiIzAwMDAwMFwiKSxfPW8uY3NzLnRvQ29sb3IoXCIjZmZmZmZmXCIpLHU9by5jc3MudG9Db2xvcihcIiMwMDAwMDBcIiksZj17Y3NzOlwicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpXCIscmdiYTo0Mjk0OTY3MTE3fTt0LkRFRkFVTFRfQU5TSV9DT0xPUlM9T2JqZWN0LmZyZWV6ZSgoKCk9Pntjb25zdCBlPVtvLmNzcy50b0NvbG9yKFwiIzJlMzQzNlwiKSxvLmNzcy50b0NvbG9yKFwiI2NjMDAwMFwiKSxvLmNzcy50b0NvbG9yKFwiIzRlOWEwNlwiKSxvLmNzcy50b0NvbG9yKFwiI2M0YTAwMFwiKSxvLmNzcy50b0NvbG9yKFwiIzM0NjVhNFwiKSxvLmNzcy50b0NvbG9yKFwiIzc1NTA3YlwiKSxvLmNzcy50b0NvbG9yKFwiIzA2OTg5YVwiKSxvLmNzcy50b0NvbG9yKFwiI2QzZDdjZlwiKSxvLmNzcy50b0NvbG9yKFwiIzU1NTc1M1wiKSxvLmNzcy50b0NvbG9yKFwiI2VmMjkyOVwiKSxvLmNzcy50b0NvbG9yKFwiIzhhZTIzNFwiKSxvLmNzcy50b0NvbG9yKFwiI2ZjZTk0ZlwiKSxvLmNzcy50b0NvbG9yKFwiIzcyOWZjZlwiKSxvLmNzcy50b0NvbG9yKFwiI2FkN2ZhOFwiKSxvLmNzcy50b0NvbG9yKFwiIzM0ZTJlMlwiKSxvLmNzcy50b0NvbG9yKFwiI2VlZWVlY1wiKV0sdD1bMCw5NSwxMzUsMTc1LDIxNSwyNTVdO2ZvcihsZXQgaT0wO2k8MjE2O2krKyl7Y29uc3Qgcz10W2kvMzYlNnwwXSxyPXRbaS82JTZ8MF0sbj10W2klNl07ZS5wdXNoKHtjc3M6by5jaGFubmVscy50b0NzcyhzLHIsbikscmdiYTpvLmNoYW5uZWxzLnRvUmdiYShzLHIsbil9KX1mb3IobGV0IHQ9MDt0PDI0O3QrKyl7Y29uc3QgaT04KzEwKnQ7ZS5wdXNoKHtjc3M6by5jaGFubmVscy50b0NzcyhpLGksaSkscmdiYTpvLmNoYW5uZWxzLnRvUmdiYShpLGksaSl9KX1yZXR1cm4gZX0pKCkpO2xldCB2PXQuVGhlbWVTZXJ2aWNlPWNsYXNzIGV4dGVuZHMgaC5EaXNwb3NhYmxle2dldCBjb2xvcnMoKXtyZXR1cm4gdGhpcy5fY29sb3JzfWNvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5fb3B0aW9uc1NlcnZpY2U9ZSx0aGlzLl9jb250cmFzdENhY2hlPW5ldyBuLkNvbG9yQ29udHJhc3RDYWNoZSx0aGlzLl9oYWxmQ29udHJhc3RDYWNoZT1uZXcgbi5Db2xvckNvbnRyYXN0Q2FjaGUsdGhpcy5fb25DaGFuZ2VDb2xvcnM9dGhpcy5yZWdpc3RlcihuZXcgYS5FdmVudEVtaXR0ZXIpLHRoaXMub25DaGFuZ2VDb2xvcnM9dGhpcy5fb25DaGFuZ2VDb2xvcnMuZXZlbnQsdGhpcy5fY29sb3JzPXtmb3JlZ3JvdW5kOmwsYmFja2dyb3VuZDpkLGN1cnNvcjpfLGN1cnNvckFjY2VudDp1LHNlbGVjdGlvbkZvcmVncm91bmQ6dm9pZCAwLHNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudDpmLHNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWU6by5jb2xvci5ibGVuZChkLGYpLHNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50OmYsc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlOm8uY29sb3IuYmxlbmQoZCxmKSxhbnNpOnQuREVGQVVMVF9BTlNJX0NPTE9SUy5zbGljZSgpLGNvbnRyYXN0Q2FjaGU6dGhpcy5fY29udHJhc3RDYWNoZSxoYWxmQ29udHJhc3RDYWNoZTp0aGlzLl9oYWxmQ29udHJhc3RDYWNoZX0sdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpLHRoaXMuX3NldFRoZW1lKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGhlbWUpLHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZShcIm1pbmltdW1Db250cmFzdFJhdGlvXCIsKCgpPT50aGlzLl9jb250cmFzdENhY2hlLmNsZWFyKCkpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKFwidGhlbWVcIiwoKCk9PnRoaXMuX3NldFRoZW1lKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGhlbWUpKSkpfV9zZXRUaGVtZShlPXt9KXtjb25zdCBpPXRoaXMuX2NvbG9ycztpZihpLmZvcmVncm91bmQ9cChlLmZvcmVncm91bmQsbCksaS5iYWNrZ3JvdW5kPXAoZS5iYWNrZ3JvdW5kLGQpLGkuY3Vyc29yPXAoZS5jdXJzb3IsXyksaS5jdXJzb3JBY2NlbnQ9cChlLmN1cnNvckFjY2VudCx1KSxpLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudD1wKGUuc2VsZWN0aW9uQmFja2dyb3VuZCxmKSxpLnNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWU9by5jb2xvci5ibGVuZChpLmJhY2tncm91bmQsaS5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQpLGkuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQ9cChlLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZCxpLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCksaS5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWU9by5jb2xvci5ibGVuZChpLmJhY2tncm91bmQsaS5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudCksaS5zZWxlY3Rpb25Gb3JlZ3JvdW5kPWUuc2VsZWN0aW9uRm9yZWdyb3VuZD9wKGUuc2VsZWN0aW9uRm9yZWdyb3VuZCxvLk5VTExfQ09MT1IpOnZvaWQgMCxpLnNlbGVjdGlvbkZvcmVncm91bmQ9PT1vLk5VTExfQ09MT1ImJihpLnNlbGVjdGlvbkZvcmVncm91bmQ9dm9pZCAwKSxvLmNvbG9yLmlzT3BhcXVlKGkuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50KSl7Y29uc3QgZT0uMztpLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudD1vLmNvbG9yLm9wYWNpdHkoaS5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQsZSl9aWYoby5jb2xvci5pc09wYXF1ZShpLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50KSl7Y29uc3QgZT0uMztpLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50PW8uY29sb3Iub3BhY2l0eShpLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50LGUpfWlmKGkuYW5zaT10LkRFRkFVTFRfQU5TSV9DT0xPUlMuc2xpY2UoKSxpLmFuc2lbMF09cChlLmJsYWNrLHQuREVGQVVMVF9BTlNJX0NPTE9SU1swXSksaS5hbnNpWzFdPXAoZS5yZWQsdC5ERUZBVUxUX0FOU0lfQ09MT1JTWzFdKSxpLmFuc2lbMl09cChlLmdyZWVuLHQuREVGQVVMVF9BTlNJX0NPTE9SU1syXSksaS5hbnNpWzNdPXAoZS55ZWxsb3csdC5ERUZBVUxUX0FOU0lfQ09MT1JTWzNdKSxpLmFuc2lbNF09cChlLmJsdWUsdC5ERUZBVUxUX0FOU0lfQ09MT1JTWzRdKSxpLmFuc2lbNV09cChlLm1hZ2VudGEsdC5ERUZBVUxUX0FOU0lfQ09MT1JTWzVdKSxpLmFuc2lbNl09cChlLmN5YW4sdC5ERUZBVUxUX0FOU0lfQ09MT1JTWzZdKSxpLmFuc2lbN109cChlLndoaXRlLHQuREVGQVVMVF9BTlNJX0NPTE9SU1s3XSksaS5hbnNpWzhdPXAoZS5icmlnaHRCbGFjayx0LkRFRkFVTFRfQU5TSV9DT0xPUlNbOF0pLGkuYW5zaVs5XT1wKGUuYnJpZ2h0UmVkLHQuREVGQVVMVF9BTlNJX0NPTE9SU1s5XSksaS5hbnNpWzEwXT1wKGUuYnJpZ2h0R3JlZW4sdC5ERUZBVUxUX0FOU0lfQ09MT1JTWzEwXSksaS5hbnNpWzExXT1wKGUuYnJpZ2h0WWVsbG93LHQuREVGQVVMVF9BTlNJX0NPTE9SU1sxMV0pLGkuYW5zaVsxMl09cChlLmJyaWdodEJsdWUsdC5ERUZBVUxUX0FOU0lfQ09MT1JTWzEyXSksaS5hbnNpWzEzXT1wKGUuYnJpZ2h0TWFnZW50YSx0LkRFRkFVTFRfQU5TSV9DT0xPUlNbMTNdKSxpLmFuc2lbMTRdPXAoZS5icmlnaHRDeWFuLHQuREVGQVVMVF9BTlNJX0NPTE9SU1sxNF0pLGkuYW5zaVsxNV09cChlLmJyaWdodFdoaXRlLHQuREVGQVVMVF9BTlNJX0NPTE9SU1sxNV0pLGUuZXh0ZW5kZWRBbnNpKXtjb25zdCBzPU1hdGgubWluKGkuYW5zaS5sZW5ndGgtMTYsZS5leHRlbmRlZEFuc2kubGVuZ3RoKTtmb3IobGV0IHI9MDtyPHM7cisrKWkuYW5zaVtyKzE2XT1wKGUuZXh0ZW5kZWRBbnNpW3JdLHQuREVGQVVMVF9BTlNJX0NPTE9SU1tyKzE2XSl9dGhpcy5fY29udHJhc3RDYWNoZS5jbGVhcigpLHRoaXMuX2hhbGZDb250cmFzdENhY2hlLmNsZWFyKCksdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpLHRoaXMuX29uQ2hhbmdlQ29sb3JzLmZpcmUodGhpcy5jb2xvcnMpfXJlc3RvcmVDb2xvcihlKXt0aGlzLl9yZXN0b3JlQ29sb3IoZSksdGhpcy5fb25DaGFuZ2VDb2xvcnMuZmlyZSh0aGlzLmNvbG9ycyl9X3Jlc3RvcmVDb2xvcihlKXtpZih2b2lkIDAhPT1lKXN3aXRjaChlKXtjYXNlIDI1Njp0aGlzLl9jb2xvcnMuZm9yZWdyb3VuZD10aGlzLl9yZXN0b3JlQ29sb3JzLmZvcmVncm91bmQ7YnJlYWs7Y2FzZSAyNTc6dGhpcy5fY29sb3JzLmJhY2tncm91bmQ9dGhpcy5fcmVzdG9yZUNvbG9ycy5iYWNrZ3JvdW5kO2JyZWFrO2Nhc2UgMjU4OnRoaXMuX2NvbG9ycy5jdXJzb3I9dGhpcy5fcmVzdG9yZUNvbG9ycy5jdXJzb3I7YnJlYWs7ZGVmYXVsdDp0aGlzLl9jb2xvcnMuYW5zaVtlXT10aGlzLl9yZXN0b3JlQ29sb3JzLmFuc2lbZV19ZWxzZSBmb3IobGV0IGU9MDtlPHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaS5sZW5ndGg7KytlKXRoaXMuX2NvbG9ycy5hbnNpW2VdPXRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtlXX1tb2RpZnlDb2xvcnMoZSl7ZSh0aGlzLl9jb2xvcnMpLHRoaXMuX29uQ2hhbmdlQ29sb3JzLmZpcmUodGhpcy5jb2xvcnMpfV91cGRhdGVSZXN0b3JlQ29sb3JzKCl7dGhpcy5fcmVzdG9yZUNvbG9ycz17Zm9yZWdyb3VuZDp0aGlzLl9jb2xvcnMuZm9yZWdyb3VuZCxiYWNrZ3JvdW5kOnRoaXMuX2NvbG9ycy5iYWNrZ3JvdW5kLGN1cnNvcjp0aGlzLl9jb2xvcnMuY3Vyc29yLGFuc2k6dGhpcy5fY29sb3JzLmFuc2kuc2xpY2UoKX19fTtmdW5jdGlvbiBwKGUsdCl7aWYodm9pZCAwIT09ZSl0cnl7cmV0dXJuIG8uY3NzLnRvQ29sb3IoZSl9Y2F0Y2h7fXJldHVybiB0fXQuVGhlbWVTZXJ2aWNlPXY9cyhbcigwLGMuSU9wdGlvbnNTZXJ2aWNlKV0sdil9LDYzNDk6KGUsdCxpKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuQ2lyY3VsYXJMaXN0PXZvaWQgMDtjb25zdCBzPWkoODQ2MCkscj1pKDg0NCk7Y2xhc3MgbiBleHRlbmRzIHIuRGlzcG9zYWJsZXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuX21heExlbmd0aD1lLHRoaXMub25EZWxldGVFbWl0dGVyPXRoaXMucmVnaXN0ZXIobmV3IHMuRXZlbnRFbWl0dGVyKSx0aGlzLm9uRGVsZXRlPXRoaXMub25EZWxldGVFbWl0dGVyLmV2ZW50LHRoaXMub25JbnNlcnRFbWl0dGVyPXRoaXMucmVnaXN0ZXIobmV3IHMuRXZlbnRFbWl0dGVyKSx0aGlzLm9uSW5zZXJ0PXRoaXMub25JbnNlcnRFbWl0dGVyLmV2ZW50LHRoaXMub25UcmltRW1pdHRlcj10aGlzLnJlZ2lzdGVyKG5ldyBzLkV2ZW50RW1pdHRlciksdGhpcy5vblRyaW09dGhpcy5vblRyaW1FbWl0dGVyLmV2ZW50LHRoaXMuX2FycmF5PW5ldyBBcnJheSh0aGlzLl9tYXhMZW5ndGgpLHRoaXMuX3N0YXJ0SW5kZXg9MCx0aGlzLl9sZW5ndGg9MH1nZXQgbWF4TGVuZ3RoKCl7cmV0dXJuIHRoaXMuX21heExlbmd0aH1zZXQgbWF4TGVuZ3RoKGUpe2lmKHRoaXMuX21heExlbmd0aD09PWUpcmV0dXJuO2NvbnN0IHQ9bmV3IEFycmF5KGUpO2ZvcihsZXQgaT0wO2k8TWF0aC5taW4oZSx0aGlzLmxlbmd0aCk7aSsrKXRbaV09dGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgoaSldO3RoaXMuX2FycmF5PXQsdGhpcy5fbWF4TGVuZ3RoPWUsdGhpcy5fc3RhcnRJbmRleD0wfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5fbGVuZ3RofXNldCBsZW5ndGgoZSl7aWYoZT50aGlzLl9sZW5ndGgpZm9yKGxldCB0PXRoaXMuX2xlbmd0aDt0PGU7dCsrKXRoaXMuX2FycmF5W3RdPXZvaWQgMDt0aGlzLl9sZW5ndGg9ZX1nZXQoZSl7cmV0dXJuIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGUpXX1zZXQoZSx0KXt0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChlKV09dH1wdXNoKGUpe3RoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KHRoaXMuX2xlbmd0aCldPWUsdGhpcy5fbGVuZ3RoPT09dGhpcy5fbWF4TGVuZ3RoPyh0aGlzLl9zdGFydEluZGV4PSsrdGhpcy5fc3RhcnRJbmRleCV0aGlzLl9tYXhMZW5ndGgsdGhpcy5vblRyaW1FbWl0dGVyLmZpcmUoMSkpOnRoaXMuX2xlbmd0aCsrfXJlY3ljbGUoKXtpZih0aGlzLl9sZW5ndGghPT10aGlzLl9tYXhMZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiQ2FuIG9ubHkgcmVjeWNsZSB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbFwiKTtyZXR1cm4gdGhpcy5fc3RhcnRJbmRleD0rK3RoaXMuX3N0YXJ0SW5kZXgldGhpcy5fbWF4TGVuZ3RoLHRoaXMub25UcmltRW1pdHRlci5maXJlKDEpLHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KHRoaXMuX2xlbmd0aC0xKV19Z2V0IGlzRnVsbCgpe3JldHVybiB0aGlzLl9sZW5ndGg9PT10aGlzLl9tYXhMZW5ndGh9cG9wKCl7cmV0dXJuIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KHRoaXMuX2xlbmd0aC0tLTEpXX1zcGxpY2UoZSx0LC4uLmkpe2lmKHQpe2ZvcihsZXQgaT1lO2k8dGhpcy5fbGVuZ3RoLXQ7aSsrKXRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGkpXT10aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpK3QpXTt0aGlzLl9sZW5ndGgtPXQsdGhpcy5vbkRlbGV0ZUVtaXR0ZXIuZmlyZSh7aW5kZXg6ZSxhbW91bnQ6dH0pfWZvcihsZXQgdD10aGlzLl9sZW5ndGgtMTt0Pj1lO3QtLSl0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleCh0K2kubGVuZ3RoKV09dGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgodCldO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKXRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGUrdCldPWlbdF07aWYoaS5sZW5ndGgmJnRoaXMub25JbnNlcnRFbWl0dGVyLmZpcmUoe2luZGV4OmUsYW1vdW50OmkubGVuZ3RofSksdGhpcy5fbGVuZ3RoK2kubGVuZ3RoPnRoaXMuX21heExlbmd0aCl7Y29uc3QgZT10aGlzLl9sZW5ndGgraS5sZW5ndGgtdGhpcy5fbWF4TGVuZ3RoO3RoaXMuX3N0YXJ0SW5kZXgrPWUsdGhpcy5fbGVuZ3RoPXRoaXMuX21heExlbmd0aCx0aGlzLm9uVHJpbUVtaXR0ZXIuZmlyZShlKX1lbHNlIHRoaXMuX2xlbmd0aCs9aS5sZW5ndGh9dHJpbVN0YXJ0KGUpe2U+dGhpcy5fbGVuZ3RoJiYoZT10aGlzLl9sZW5ndGgpLHRoaXMuX3N0YXJ0SW5kZXgrPWUsdGhpcy5fbGVuZ3RoLT1lLHRoaXMub25UcmltRW1pdHRlci5maXJlKGUpfXNoaWZ0RWxlbWVudHMoZSx0LGkpe2lmKCEodDw9MCkpe2lmKGU8MHx8ZT49dGhpcy5fbGVuZ3RoKXRocm93IG5ldyBFcnJvcihcInN0YXJ0IGFyZ3VtZW50IG91dCBvZiByYW5nZVwiKTtpZihlK2k8MCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc2hpZnQgZWxlbWVudHMgaW4gbGlzdCBiZXlvbmQgaW5kZXggMFwiKTtpZihpPjApe2ZvcihsZXQgcz10LTE7cz49MDtzLS0pdGhpcy5zZXQoZStzK2ksdGhpcy5nZXQoZStzKSk7Y29uc3Qgcz1lK3QraS10aGlzLl9sZW5ndGg7aWYocz4wKWZvcih0aGlzLl9sZW5ndGgrPXM7dGhpcy5fbGVuZ3RoPnRoaXMuX21heExlbmd0aDspdGhpcy5fbGVuZ3RoLS0sdGhpcy5fc3RhcnRJbmRleCsrLHRoaXMub25UcmltRW1pdHRlci5maXJlKDEpfWVsc2UgZm9yKGxldCBzPTA7czx0O3MrKyl0aGlzLnNldChlK3MraSx0aGlzLmdldChlK3MpKX19X2dldEN5Y2xpY0luZGV4KGUpe3JldHVybih0aGlzLl9zdGFydEluZGV4K2UpJXRoaXMuX21heExlbmd0aH19dC5DaXJjdWxhckxpc3Q9bn0sMTQzOTooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuY2xvbmU9dm9pZCAwLHQuY2xvbmU9ZnVuY3Rpb24gZSh0LGk9NSl7aWYoXCJvYmplY3RcIiE9dHlwZW9mIHQpcmV0dXJuIHQ7Y29uc3Qgcz1BcnJheS5pc0FycmF5KHQpP1tdOnt9O2Zvcihjb25zdCByIGluIHQpc1tyXT1pPD0xP3Rbcl06dFtyXSYmZSh0W3JdLGktMSk7cmV0dXJuIHN9fSw4MDU1OihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5jb250cmFzdFJhdGlvPXQudG9QYWRkZWRIZXg9dC5yZ2JhPXQucmdiPXQuY3NzPXQuY29sb3I9dC5jaGFubmVscz10Lk5VTExfQ09MT1I9dm9pZCAwO2xldCBpPTAscz0wLHI9MCxuPTA7dmFyIG8sYSxoLGMsbDtmdW5jdGlvbiBkKGUpe2NvbnN0IHQ9ZS50b1N0cmluZygxNik7cmV0dXJuIHQubGVuZ3RoPDI/XCIwXCIrdDp0fWZ1bmN0aW9uIF8oZSx0KXtyZXR1cm4gZTx0Pyh0Ky4wNSkvKGUrLjA1KTooZSsuMDUpLyh0Ky4wNSl9dC5OVUxMX0NPTE9SPXtjc3M6XCIjMDAwMDAwMDBcIixyZ2JhOjB9LGZ1bmN0aW9uKGUpe2UudG9Dc3M9ZnVuY3Rpb24oZSx0LGkscyl7cmV0dXJuIHZvaWQgMCE9PXM/YCMke2QoZSl9JHtkKHQpfSR7ZChpKX0ke2Qocyl9YDpgIyR7ZChlKX0ke2QodCl9JHtkKGkpfWB9LGUudG9SZ2JhPWZ1bmN0aW9uKGUsdCxpLHM9MjU1KXtyZXR1cm4oZTw8MjR8dDw8MTZ8aTw8OHxzKT4+PjB9LGUudG9Db2xvcj1mdW5jdGlvbih0LGkscyxyKXtyZXR1cm57Y3NzOmUudG9Dc3ModCxpLHMscikscmdiYTplLnRvUmdiYSh0LGkscyxyKX19fShvfHwodC5jaGFubmVscz1vPXt9KSksZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQpe3JldHVybiBuPU1hdGgucm91bmQoMjU1KnQpLFtpLHMscl09bC50b0NoYW5uZWxzKGUucmdiYSkse2NzczpvLnRvQ3NzKGkscyxyLG4pLHJnYmE6by50b1JnYmEoaSxzLHIsbil9fWUuYmxlbmQ9ZnVuY3Rpb24oZSx0KXtpZihuPSgyNTUmdC5yZ2JhKS8yNTUsMT09PW4pcmV0dXJue2Nzczp0LmNzcyxyZ2JhOnQucmdiYX07Y29uc3QgYT10LnJnYmE+PjI0JjI1NSxoPXQucmdiYT4+MTYmMjU1LGM9dC5yZ2JhPj44JjI1NSxsPWUucmdiYT4+MjQmMjU1LGQ9ZS5yZ2JhPj4xNiYyNTUsXz1lLnJnYmE+PjgmMjU1O3JldHVybiBpPWwrTWF0aC5yb3VuZCgoYS1sKSpuKSxzPWQrTWF0aC5yb3VuZCgoaC1kKSpuKSxyPV8rTWF0aC5yb3VuZCgoYy1fKSpuKSx7Y3NzOm8udG9Dc3MoaSxzLHIpLHJnYmE6by50b1JnYmEoaSxzLHIpfX0sZS5pc09wYXF1ZT1mdW5jdGlvbihlKXtyZXR1cm4gMjU1PT0oMjU1JmUucmdiYSl9LGUuZW5zdXJlQ29udHJhc3RSYXRpbz1mdW5jdGlvbihlLHQsaSl7Y29uc3Qgcz1sLmVuc3VyZUNvbnRyYXN0UmF0aW8oZS5yZ2JhLHQucmdiYSxpKTtpZihzKXJldHVybiBvLnRvQ29sb3Iocz4+MjQmMjU1LHM+PjE2JjI1NSxzPj44JjI1NSl9LGUub3BhcXVlPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9KDI1NXxlLnJnYmEpPj4+MDtyZXR1cm5baSxzLHJdPWwudG9DaGFubmVscyh0KSx7Y3NzOm8udG9Dc3MoaSxzLHIpLHJnYmE6dH19LGUub3BhY2l0eT10LGUubXVsdGlwbHlPcGFjaXR5PWZ1bmN0aW9uKGUsaSl7cmV0dXJuIG49MjU1JmUucmdiYSx0KGUsbippLzI1NSl9LGUudG9Db2xvclJHQj1mdW5jdGlvbihlKXtyZXR1cm5bZS5yZ2JhPj4yNCYyNTUsZS5yZ2JhPj4xNiYyNTUsZS5yZ2JhPj44JjI1NV19fShhfHwodC5jb2xvcj1hPXt9KSksZnVuY3Rpb24oZSl7bGV0IHQsYTt0cnl7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO2Uud2lkdGg9MSxlLmhlaWdodD0xO2NvbnN0IGk9ZS5nZXRDb250ZXh0KFwiMmRcIix7d2lsbFJlYWRGcmVxdWVudGx5OiEwfSk7aSYmKHQ9aSx0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1cImNvcHlcIixhPXQuY3JlYXRlTGluZWFyR3JhZGllbnQoMCwwLDEsMSkpfWNhdGNoe31lLnRvQ29sb3I9ZnVuY3Rpb24oZSl7aWYoZS5tYXRjaCgvI1tcXGRhLWZdezMsOH0vaSkpc3dpdGNoKGUubGVuZ3RoKXtjYXNlIDQ6cmV0dXJuIGk9cGFyc2VJbnQoZS5zbGljZSgxLDIpLnJlcGVhdCgyKSwxNikscz1wYXJzZUludChlLnNsaWNlKDIsMykucmVwZWF0KDIpLDE2KSxyPXBhcnNlSW50KGUuc2xpY2UoMyw0KS5yZXBlYXQoMiksMTYpLG8udG9Db2xvcihpLHMscik7Y2FzZSA1OnJldHVybiBpPXBhcnNlSW50KGUuc2xpY2UoMSwyKS5yZXBlYXQoMiksMTYpLHM9cGFyc2VJbnQoZS5zbGljZSgyLDMpLnJlcGVhdCgyKSwxNikscj1wYXJzZUludChlLnNsaWNlKDMsNCkucmVwZWF0KDIpLDE2KSxuPXBhcnNlSW50KGUuc2xpY2UoNCw1KS5yZXBlYXQoMiksMTYpLG8udG9Db2xvcihpLHMscixuKTtjYXNlIDc6cmV0dXJue2NzczplLHJnYmE6KHBhcnNlSW50KGUuc2xpY2UoMSksMTYpPDw4fDI1NSk+Pj4wfTtjYXNlIDk6cmV0dXJue2NzczplLHJnYmE6cGFyc2VJbnQoZS5zbGljZSgxKSwxNik+Pj4wfX1jb25zdCBoPWUubWF0Y2goL3JnYmE/XFwoXFxzKihcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyooLFxccyooMHwxfFxcZD9cXC4oXFxkKykpXFxzKik/XFwpLyk7aWYoaClyZXR1cm4gaT1wYXJzZUludChoWzFdKSxzPXBhcnNlSW50KGhbMl0pLHI9cGFyc2VJbnQoaFszXSksbj1NYXRoLnJvdW5kKDI1NSoodm9pZCAwPT09aFs1XT8xOnBhcnNlRmxvYXQoaFs1XSkpKSxvLnRvQ29sb3IoaSxzLHIsbik7aWYoIXR8fCFhKXRocm93IG5ldyBFcnJvcihcImNzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0XCIpO2lmKHQuZmlsbFN0eWxlPWEsdC5maWxsU3R5bGU9ZSxcInN0cmluZ1wiIT10eXBlb2YgdC5maWxsU3R5bGUpdGhyb3cgbmV3IEVycm9yKFwiY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXRcIik7aWYodC5maWxsUmVjdCgwLDAsMSwxKSxbaSxzLHIsbl09dC5nZXRJbWFnZURhdGEoMCwwLDEsMSkuZGF0YSwyNTUhPT1uKXRocm93IG5ldyBFcnJvcihcImNzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0XCIpO3JldHVybntyZ2JhOm8udG9SZ2JhKGkscyxyLG4pLGNzczplfX19KGh8fCh0LmNzcz1oPXt9KSksZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQsaSl7Y29uc3Qgcz1lLzI1NSxyPXQvMjU1LG49aS8yNTU7cmV0dXJuLjIxMjYqKHM8PS4wMzkyOD9zLzEyLjkyOk1hdGgucG93KChzKy4wNTUpLzEuMDU1LDIuNCkpKy43MTUyKihyPD0uMDM5Mjg/ci8xMi45MjpNYXRoLnBvdygocisuMDU1KS8xLjA1NSwyLjQpKSsuMDcyMioobjw9LjAzOTI4P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KSl9ZS5yZWxhdGl2ZUx1bWluYW5jZT1mdW5jdGlvbihlKXtyZXR1cm4gdChlPj4xNiYyNTUsZT4+OCYyNTUsMjU1JmUpfSxlLnJlbGF0aXZlTHVtaW5hbmNlMj10fShjfHwodC5yZ2I9Yz17fSkpLGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSx0LGkpe2NvbnN0IHM9ZT4+MjQmMjU1LHI9ZT4+MTYmMjU1LG49ZT4+OCYyNTU7bGV0IG89dD4+MjQmMjU1LGE9dD4+MTYmMjU1LGg9dD4+OCYyNTUsbD1fKGMucmVsYXRpdmVMdW1pbmFuY2UyKG8sYSxoKSxjLnJlbGF0aXZlTHVtaW5hbmNlMihzLHIsbikpO2Zvcig7bDxpJiYobz4wfHxhPjB8fGg+MCk7KW8tPU1hdGgubWF4KDAsTWF0aC5jZWlsKC4xKm8pKSxhLT1NYXRoLm1heCgwLE1hdGguY2VpbCguMSphKSksaC09TWF0aC5tYXgoMCxNYXRoLmNlaWwoLjEqaCkpLGw9XyhjLnJlbGF0aXZlTHVtaW5hbmNlMihvLGEsaCksYy5yZWxhdGl2ZUx1bWluYW5jZTIocyxyLG4pKTtyZXR1cm4obzw8MjR8YTw8MTZ8aDw8OHwyNTUpPj4+MH1mdW5jdGlvbiBhKGUsdCxpKXtjb25zdCBzPWU+PjI0JjI1NSxyPWU+PjE2JjI1NSxuPWU+PjgmMjU1O2xldCBvPXQ+PjI0JjI1NSxhPXQ+PjE2JjI1NSxoPXQ+PjgmMjU1LGw9XyhjLnJlbGF0aXZlTHVtaW5hbmNlMihvLGEsaCksYy5yZWxhdGl2ZUx1bWluYW5jZTIocyxyLG4pKTtmb3IoO2w8aSYmKG88MjU1fHxhPDI1NXx8aDwyNTUpOylvPU1hdGgubWluKDI1NSxvK01hdGguY2VpbCguMSooMjU1LW8pKSksYT1NYXRoLm1pbigyNTUsYStNYXRoLmNlaWwoLjEqKDI1NS1hKSkpLGg9TWF0aC5taW4oMjU1LGgrTWF0aC5jZWlsKC4xKigyNTUtaCkpKSxsPV8oYy5yZWxhdGl2ZUx1bWluYW5jZTIobyxhLGgpLGMucmVsYXRpdmVMdW1pbmFuY2UyKHMscixuKSk7cmV0dXJuKG88PDI0fGE8PDE2fGg8PDh8MjU1KT4+PjB9ZS5ibGVuZD1mdW5jdGlvbihlLHQpe2lmKG49KDI1NSZ0KS8yNTUsMT09PW4pcmV0dXJuIHQ7Y29uc3QgYT10Pj4yNCYyNTUsaD10Pj4xNiYyNTUsYz10Pj44JjI1NSxsPWU+PjI0JjI1NSxkPWU+PjE2JjI1NSxfPWU+PjgmMjU1O3JldHVybiBpPWwrTWF0aC5yb3VuZCgoYS1sKSpuKSxzPWQrTWF0aC5yb3VuZCgoaC1kKSpuKSxyPV8rTWF0aC5yb3VuZCgoYy1fKSpuKSxvLnRvUmdiYShpLHMscil9LGUuZW5zdXJlQ29udHJhc3RSYXRpbz1mdW5jdGlvbihlLGkscyl7Y29uc3Qgcj1jLnJlbGF0aXZlTHVtaW5hbmNlKGU+PjgpLG49Yy5yZWxhdGl2ZUx1bWluYW5jZShpPj44KTtpZihfKHIsbik8cyl7aWYobjxyKXtjb25zdCBuPXQoZSxpLHMpLG89XyhyLGMucmVsYXRpdmVMdW1pbmFuY2Uobj4+OCkpO2lmKG88cyl7Y29uc3QgdD1hKGUsaSxzKTtyZXR1cm4gbz5fKHIsYy5yZWxhdGl2ZUx1bWluYW5jZSh0Pj44KSk/bjp0fXJldHVybiBufWNvbnN0IG89YShlLGkscyksaD1fKHIsYy5yZWxhdGl2ZUx1bWluYW5jZShvPj44KSk7aWYoaDxzKXtjb25zdCBuPXQoZSxpLHMpO3JldHVybiBoPl8ocixjLnJlbGF0aXZlTHVtaW5hbmNlKG4+PjgpKT9vOm59cmV0dXJuIG99fSxlLnJlZHVjZUx1bWluYW5jZT10LGUuaW5jcmVhc2VMdW1pbmFuY2U9YSxlLnRvQ2hhbm5lbHM9ZnVuY3Rpb24oZSl7cmV0dXJuW2U+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsMjU1JmVdfX0obHx8KHQucmdiYT1sPXt9KSksdC50b1BhZGRlZEhleD1kLHQuY29udHJhc3RSYXRpbz1ffSw4OTY5OihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkNvcmVUZXJtaW5hbD12b2lkIDA7Y29uc3Qgcz1pKDg0NCkscj1pKDI1ODUpLG49aSg0MzQ4KSxvPWkoNzg2NiksYT1pKDc0NCksaD1pKDczMDIpLGM9aSg2OTc1KSxsPWkoODQ2MCksZD1pKDE3NTMpLF89aSgxNDgwKSx1PWkoNzk5NCksZj1pKDkyODIpLHY9aSg1NDM1KSxwPWkoNTk4MSksZz1pKDI2NjApO2xldCBtPSExO2NsYXNzIFMgZXh0ZW5kcyBzLkRpc3Bvc2FibGV7Z2V0IG9uU2Nyb2xsKCl7cmV0dXJuIHRoaXMuX29uU2Nyb2xsQXBpfHwodGhpcy5fb25TY3JvbGxBcGk9dGhpcy5yZWdpc3RlcihuZXcgbC5FdmVudEVtaXR0ZXIpLHRoaXMuX29uU2Nyb2xsLmV2ZW50KChlPT57dGhpcy5fb25TY3JvbGxBcGk/LmZpcmUoZS5wb3NpdGlvbil9KSkpLHRoaXMuX29uU2Nyb2xsQXBpLmV2ZW50fWdldCBjb2xzKCl7cmV0dXJuIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29sc31nZXQgcm93cygpe3JldHVybiB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3N9Z2V0IGJ1ZmZlcnMoKXtyZXR1cm4gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMub3B0aW9uc1NlcnZpY2Uub3B0aW9uc31zZXQgb3B0aW9ucyhlKXtmb3IoY29uc3QgdCBpbiBlKXRoaXMub3B0aW9uc1NlcnZpY2Uub3B0aW9uc1t0XT1lW3RdfWNvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5fd2luZG93c1dyYXBwaW5nSGV1cmlzdGljcz10aGlzLnJlZ2lzdGVyKG5ldyBzLk11dGFibGVEaXNwb3NhYmxlKSx0aGlzLl9vbkJpbmFyeT10aGlzLnJlZ2lzdGVyKG5ldyBsLkV2ZW50RW1pdHRlciksdGhpcy5vbkJpbmFyeT10aGlzLl9vbkJpbmFyeS5ldmVudCx0aGlzLl9vbkRhdGE9dGhpcy5yZWdpc3RlcihuZXcgbC5FdmVudEVtaXR0ZXIpLHRoaXMub25EYXRhPXRoaXMuX29uRGF0YS5ldmVudCx0aGlzLl9vbkxpbmVGZWVkPXRoaXMucmVnaXN0ZXIobmV3IGwuRXZlbnRFbWl0dGVyKSx0aGlzLm9uTGluZUZlZWQ9dGhpcy5fb25MaW5lRmVlZC5ldmVudCx0aGlzLl9vblJlc2l6ZT10aGlzLnJlZ2lzdGVyKG5ldyBsLkV2ZW50RW1pdHRlciksdGhpcy5vblJlc2l6ZT10aGlzLl9vblJlc2l6ZS5ldmVudCx0aGlzLl9vbldyaXRlUGFyc2VkPXRoaXMucmVnaXN0ZXIobmV3IGwuRXZlbnRFbWl0dGVyKSx0aGlzLm9uV3JpdGVQYXJzZWQ9dGhpcy5fb25Xcml0ZVBhcnNlZC5ldmVudCx0aGlzLl9vblNjcm9sbD10aGlzLnJlZ2lzdGVyKG5ldyBsLkV2ZW50RW1pdHRlciksdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2U9bmV3IG4uSW5zdGFudGlhdGlvblNlcnZpY2UsdGhpcy5vcHRpb25zU2VydmljZT10aGlzLnJlZ2lzdGVyKG5ldyBoLk9wdGlvbnNTZXJ2aWNlKGUpKSx0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKHIuSU9wdGlvbnNTZXJ2aWNlLHRoaXMub3B0aW9uc1NlcnZpY2UpLHRoaXMuX2J1ZmZlclNlcnZpY2U9dGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShhLkJ1ZmZlclNlcnZpY2UpKSx0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKHIuSUJ1ZmZlclNlcnZpY2UsdGhpcy5fYnVmZmVyU2VydmljZSksdGhpcy5fbG9nU2VydmljZT10aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKG8uTG9nU2VydmljZSkpLHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2Uoci5JTG9nU2VydmljZSx0aGlzLl9sb2dTZXJ2aWNlKSx0aGlzLmNvcmVTZXJ2aWNlPXRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoYy5Db3JlU2VydmljZSkpLHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2Uoci5JQ29yZVNlcnZpY2UsdGhpcy5jb3JlU2VydmljZSksdGhpcy5jb3JlTW91c2VTZXJ2aWNlPXRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoZC5Db3JlTW91c2VTZXJ2aWNlKSksdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShyLklDb3JlTW91c2VTZXJ2aWNlLHRoaXMuY29yZU1vdXNlU2VydmljZSksdGhpcy51bmljb2RlU2VydmljZT10aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKF8uVW5pY29kZVNlcnZpY2UpKSx0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKHIuSVVuaWNvZGVTZXJ2aWNlLHRoaXMudW5pY29kZVNlcnZpY2UpLHRoaXMuX2NoYXJzZXRTZXJ2aWNlPXRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKHUuQ2hhcnNldFNlcnZpY2UpLHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2Uoci5JQ2hhcnNldFNlcnZpY2UsdGhpcy5fY2hhcnNldFNlcnZpY2UpLHRoaXMuX29zY0xpbmtTZXJ2aWNlPXRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKGcuT3NjTGlua1NlcnZpY2UpLHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2Uoci5JT3NjTGlua1NlcnZpY2UsdGhpcy5fb3NjTGlua1NlcnZpY2UpLHRoaXMuX2lucHV0SGFuZGxlcj10aGlzLnJlZ2lzdGVyKG5ldyB2LklucHV0SGFuZGxlcih0aGlzLl9idWZmZXJTZXJ2aWNlLHRoaXMuX2NoYXJzZXRTZXJ2aWNlLHRoaXMuY29yZVNlcnZpY2UsdGhpcy5fbG9nU2VydmljZSx0aGlzLm9wdGlvbnNTZXJ2aWNlLHRoaXMuX29zY0xpbmtTZXJ2aWNlLHRoaXMuY29yZU1vdXNlU2VydmljZSx0aGlzLnVuaWNvZGVTZXJ2aWNlKSksdGhpcy5yZWdpc3RlcigoMCxsLmZvcndhcmRFdmVudCkodGhpcy5faW5wdXRIYW5kbGVyLm9uTGluZUZlZWQsdGhpcy5fb25MaW5lRmVlZCkpLHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyKSx0aGlzLnJlZ2lzdGVyKCgwLGwuZm9yd2FyZEV2ZW50KSh0aGlzLl9idWZmZXJTZXJ2aWNlLm9uUmVzaXplLHRoaXMuX29uUmVzaXplKSksdGhpcy5yZWdpc3RlcigoMCxsLmZvcndhcmRFdmVudCkodGhpcy5jb3JlU2VydmljZS5vbkRhdGEsdGhpcy5fb25EYXRhKSksdGhpcy5yZWdpc3RlcigoMCxsLmZvcndhcmRFdmVudCkodGhpcy5jb3JlU2VydmljZS5vbkJpbmFyeSx0aGlzLl9vbkJpbmFyeSkpLHRoaXMucmVnaXN0ZXIodGhpcy5jb3JlU2VydmljZS5vblJlcXVlc3RTY3JvbGxUb0JvdHRvbSgoKCk9PnRoaXMuc2Nyb2xsVG9Cb3R0b20oKSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMuY29yZVNlcnZpY2Uub25Vc2VySW5wdXQoKCgpPT50aGlzLl93cml0ZUJ1ZmZlci5oYW5kbGVVc2VySW5wdXQoKSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMub3B0aW9uc1NlcnZpY2Uub25NdWx0aXBsZU9wdGlvbkNoYW5nZShbXCJ3aW5kb3dzTW9kZVwiLFwid2luZG93c1B0eVwiXSwoKCk9PnRoaXMuX2hhbmRsZVdpbmRvd3NQdHlPcHRpb25DaGFuZ2UoKSkpKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2Uub25TY3JvbGwoKGU9Pnt0aGlzLl9vblNjcm9sbC5maXJlKHtwb3NpdGlvbjp0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCxzb3VyY2U6MH0pLHRoaXMuX2lucHV0SGFuZGxlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5zY3JvbGxUb3AsdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIuc2Nyb2xsQm90dG9tKX0pKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25TY3JvbGwoKGU9Pnt0aGlzLl9vblNjcm9sbC5maXJlKHtwb3NpdGlvbjp0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCxzb3VyY2U6MH0pLHRoaXMuX2lucHV0SGFuZGxlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5zY3JvbGxUb3AsdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIuc2Nyb2xsQm90dG9tKX0pKSksdGhpcy5fd3JpdGVCdWZmZXI9dGhpcy5yZWdpc3RlcihuZXcgcC5Xcml0ZUJ1ZmZlcigoKGUsdCk9PnRoaXMuX2lucHV0SGFuZGxlci5wYXJzZShlLHQpKSkpLHRoaXMucmVnaXN0ZXIoKDAsbC5mb3J3YXJkRXZlbnQpKHRoaXMuX3dyaXRlQnVmZmVyLm9uV3JpdGVQYXJzZWQsdGhpcy5fb25Xcml0ZVBhcnNlZCkpfXdyaXRlKGUsdCl7dGhpcy5fd3JpdGVCdWZmZXIud3JpdGUoZSx0KX13cml0ZVN5bmMoZSx0KXt0aGlzLl9sb2dTZXJ2aWNlLmxvZ0xldmVsPD1yLkxvZ0xldmVsRW51bS5XQVJOJiYhbSYmKHRoaXMuX2xvZ1NlcnZpY2Uud2FybihcIndyaXRlU3luYyBpcyB1bnJlbGlhYmxlIGFuZCB3aWxsIGJlIHJlbW92ZWQgc29vbi5cIiksbT0hMCksdGhpcy5fd3JpdGVCdWZmZXIud3JpdGVTeW5jKGUsdCl9aW5wdXQoZSx0PSEwKXt0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoZSx0KX1yZXNpemUoZSx0KXtpc05hTihlKXx8aXNOYU4odCl8fChlPU1hdGgubWF4KGUsYS5NSU5JTVVNX0NPTFMpLHQ9TWF0aC5tYXgodCxhLk1JTklNVU1fUk9XUyksdGhpcy5fYnVmZmVyU2VydmljZS5yZXNpemUoZSx0KSl9c2Nyb2xsKGUsdD0hMSl7dGhpcy5fYnVmZmVyU2VydmljZS5zY3JvbGwoZSx0KX1zY3JvbGxMaW5lcyhlLHQsaSl7dGhpcy5fYnVmZmVyU2VydmljZS5zY3JvbGxMaW5lcyhlLHQsaSl9c2Nyb2xsUGFnZXMoZSl7dGhpcy5zY3JvbGxMaW5lcyhlKih0aGlzLnJvd3MtMSkpfXNjcm9sbFRvVG9wKCl7dGhpcy5zY3JvbGxMaW5lcygtdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3ApfXNjcm9sbFRvQm90dG9tKCl7dGhpcy5zY3JvbGxMaW5lcyh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55YmFzZS10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCl9c2Nyb2xsVG9MaW5lKGUpe2NvbnN0IHQ9ZS10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcDswIT09dCYmdGhpcy5zY3JvbGxMaW5lcyh0KX1yZWdpc3RlckVzY0hhbmRsZXIoZSx0KXtyZXR1cm4gdGhpcy5faW5wdXRIYW5kbGVyLnJlZ2lzdGVyRXNjSGFuZGxlcihlLHQpfXJlZ2lzdGVyRGNzSGFuZGxlcihlLHQpe3JldHVybiB0aGlzLl9pbnB1dEhhbmRsZXIucmVnaXN0ZXJEY3NIYW5kbGVyKGUsdCl9cmVnaXN0ZXJDc2lIYW5kbGVyKGUsdCl7cmV0dXJuIHRoaXMuX2lucHV0SGFuZGxlci5yZWdpc3RlckNzaUhhbmRsZXIoZSx0KX1yZWdpc3Rlck9zY0hhbmRsZXIoZSx0KXtyZXR1cm4gdGhpcy5faW5wdXRIYW5kbGVyLnJlZ2lzdGVyT3NjSGFuZGxlcihlLHQpfV9zZXR1cCgpe3RoaXMuX2hhbmRsZVdpbmRvd3NQdHlPcHRpb25DaGFuZ2UoKX1yZXNldCgpe3RoaXMuX2lucHV0SGFuZGxlci5yZXNldCgpLHRoaXMuX2J1ZmZlclNlcnZpY2UucmVzZXQoKSx0aGlzLl9jaGFyc2V0U2VydmljZS5yZXNldCgpLHRoaXMuY29yZVNlcnZpY2UucmVzZXQoKSx0aGlzLmNvcmVNb3VzZVNlcnZpY2UucmVzZXQoKX1faGFuZGxlV2luZG93c1B0eU9wdGlvbkNoYW5nZSgpe2xldCBlPSExO2NvbnN0IHQ9dGhpcy5vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd3NQdHk7dCYmdm9pZCAwIT09dC5idWlsZE51bWJlciYmdm9pZCAwIT09dC5idWlsZE51bWJlcj9lPSEhKFwiY29ucHR5XCI9PT10LmJhY2tlbmQmJnQuYnVpbGROdW1iZXI8MjEzNzYpOnRoaXMub3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dzTW9kZSYmKGU9ITApLGU/dGhpcy5fZW5hYmxlV2luZG93c1dyYXBwaW5nSGV1cmlzdGljcygpOnRoaXMuX3dpbmRvd3NXcmFwcGluZ0hldXJpc3RpY3MuY2xlYXIoKX1fZW5hYmxlV2luZG93c1dyYXBwaW5nSGV1cmlzdGljcygpe2lmKCF0aGlzLl93aW5kb3dzV3JhcHBpbmdIZXVyaXN0aWNzLnZhbHVlKXtjb25zdCBlPVtdO2UucHVzaCh0aGlzLm9uTGluZUZlZWQoZi51cGRhdGVXaW5kb3dzTW9kZVdyYXBwZWRTdGF0ZS5iaW5kKG51bGwsdGhpcy5fYnVmZmVyU2VydmljZSkpKSxlLnB1c2godGhpcy5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiSFwifSwoKCk9PigoMCxmLnVwZGF0ZVdpbmRvd3NNb2RlV3JhcHBlZFN0YXRlKSh0aGlzLl9idWZmZXJTZXJ2aWNlKSwhMSkpKSksdGhpcy5fd2luZG93c1dyYXBwaW5nSGV1cmlzdGljcy52YWx1ZT0oMCxzLnRvRGlzcG9zYWJsZSkoKCgpPT57Zm9yKGNvbnN0IHQgb2YgZSl0LmRpc3Bvc2UoKX0pKX19fXQuQ29yZVRlcm1pbmFsPVN9LDg0NjA6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LnJ1bkFuZFN1YnNjcmliZT10LmZvcndhcmRFdmVudD10LkV2ZW50RW1pdHRlcj12b2lkIDAsdC5FdmVudEVtaXR0ZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9saXN0ZW5lcnM9W10sdGhpcy5fZGlzcG9zZWQ9ITF9Z2V0IGV2ZW50KCl7cmV0dXJuIHRoaXMuX2V2ZW50fHwodGhpcy5fZXZlbnQ9ZT0+KHRoaXMuX2xpc3RlbmVycy5wdXNoKGUpLHtkaXNwb3NlOigpPT57aWYoIXRoaXMuX2Rpc3Bvc2VkKWZvcihsZXQgdD0wO3Q8dGhpcy5fbGlzdGVuZXJzLmxlbmd0aDt0KyspaWYodGhpcy5fbGlzdGVuZXJzW3RdPT09ZSlyZXR1cm4gdm9pZCB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSkpLHRoaXMuX2V2ZW50fWZpcmUoZSx0KXtjb25zdCBpPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5fbGlzdGVuZXJzLmxlbmd0aDtlKyspaS5wdXNoKHRoaXMuX2xpc3RlbmVyc1tlXSk7Zm9yKGxldCBzPTA7czxpLmxlbmd0aDtzKyspaVtzXS5jYWxsKHZvaWQgMCxlLHQpfWRpc3Bvc2UoKXt0aGlzLmNsZWFyTGlzdGVuZXJzKCksdGhpcy5fZGlzcG9zZWQ9ITB9Y2xlYXJMaXN0ZW5lcnMoKXt0aGlzLl9saXN0ZW5lcnMmJih0aGlzLl9saXN0ZW5lcnMubGVuZ3RoPTApfX0sdC5mb3J3YXJkRXZlbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSgoZT0+dC5maXJlKGUpKSl9LHQucnVuQW5kU3Vic2NyaWJlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQodm9pZCAwKSxlKChlPT50KGUpKSl9fSw1NDM1OmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz10aGlzJiZ0aGlzLl9fZGVjb3JhdGV8fGZ1bmN0aW9uKGUsdCxpLHMpe3ZhciByLG49YXJndW1lbnRzLmxlbmd0aCxvPW48Mz90Om51bGw9PT1zP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpOnM7aWYoXCJvYmplY3RcIj09dHlwZW9mIFJlZmxlY3QmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpbz1SZWZsZWN0LmRlY29yYXRlKGUsdCxpLHMpO2Vsc2UgZm9yKHZhciBhPWUubGVuZ3RoLTE7YT49MDthLS0pKHI9ZVthXSkmJihvPShuPDM/cihvKTpuPjM/cih0LGksbyk6cih0LGkpKXx8byk7cmV0dXJuIG4+MyYmbyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSxvKSxvfSxyPXRoaXMmJnRoaXMuX19wYXJhbXx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oaSxzKXt0KGkscyxlKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuSW5wdXRIYW5kbGVyPXQuV2luZG93c09wdGlvbnNSZXBvcnRUeXBlPXZvaWQgMDtjb25zdCBuPWkoMjU4NCksbz1pKDcxMTYpLGE9aSgyMDE1KSxoPWkoODQ0KSxjPWkoNDgyKSxsPWkoODQzNyksZD1pKDg0NjApLF89aSg2NDMpLHU9aSg1MTEpLGY9aSgzNzM0KSx2PWkoMjU4NSkscD1pKDE0ODApLGc9aSg2MjQyKSxtPWkoNjM1MSksUz1pKDU5NDEpLEM9e1wiKFwiOjAsXCIpXCI6MSxcIipcIjoyLFwiK1wiOjMsXCItXCI6MSxcIi5cIjoyfSxiPTEzMTA3MjtmdW5jdGlvbiB3KGUsdCl7aWYoZT4yNClyZXR1cm4gdC5zZXRXaW5MaW5lc3x8ITE7c3dpdGNoKGUpe2Nhc2UgMTpyZXR1cm4hIXQucmVzdG9yZVdpbjtjYXNlIDI6cmV0dXJuISF0Lm1pbmltaXplV2luO2Nhc2UgMzpyZXR1cm4hIXQuc2V0V2luUG9zaXRpb247Y2FzZSA0OnJldHVybiEhdC5zZXRXaW5TaXplUGl4ZWxzO2Nhc2UgNTpyZXR1cm4hIXQucmFpc2VXaW47Y2FzZSA2OnJldHVybiEhdC5sb3dlcldpbjtjYXNlIDc6cmV0dXJuISF0LnJlZnJlc2hXaW47Y2FzZSA4OnJldHVybiEhdC5zZXRXaW5TaXplQ2hhcnM7Y2FzZSA5OnJldHVybiEhdC5tYXhpbWl6ZVdpbjtjYXNlIDEwOnJldHVybiEhdC5mdWxsc2NyZWVuV2luO2Nhc2UgMTE6cmV0dXJuISF0LmdldFdpblN0YXRlO2Nhc2UgMTM6cmV0dXJuISF0LmdldFdpblBvc2l0aW9uO2Nhc2UgMTQ6cmV0dXJuISF0LmdldFdpblNpemVQaXhlbHM7Y2FzZSAxNTpyZXR1cm4hIXQuZ2V0U2NyZWVuU2l6ZVBpeGVscztjYXNlIDE2OnJldHVybiEhdC5nZXRDZWxsU2l6ZVBpeGVscztjYXNlIDE4OnJldHVybiEhdC5nZXRXaW5TaXplQ2hhcnM7Y2FzZSAxOTpyZXR1cm4hIXQuZ2V0U2NyZWVuU2l6ZUNoYXJzO2Nhc2UgMjA6cmV0dXJuISF0LmdldEljb25UaXRsZTtjYXNlIDIxOnJldHVybiEhdC5nZXRXaW5UaXRsZTtjYXNlIDIyOnJldHVybiEhdC5wdXNoVGl0bGU7Y2FzZSAyMzpyZXR1cm4hIXQucG9wVGl0bGU7Y2FzZSAyNDpyZXR1cm4hIXQuc2V0V2luTGluZXN9cmV0dXJuITF9dmFyIHk7IWZ1bmN0aW9uKGUpe2VbZS5HRVRfV0lOX1NJWkVfUElYRUxTPTBdPVwiR0VUX1dJTl9TSVpFX1BJWEVMU1wiLGVbZS5HRVRfQ0VMTF9TSVpFX1BJWEVMUz0xXT1cIkdFVF9DRUxMX1NJWkVfUElYRUxTXCJ9KHl8fCh0LldpbmRvd3NPcHRpb25zUmVwb3J0VHlwZT15PXt9KSk7bGV0IEU9MDtjbGFzcyBrIGV4dGVuZHMgaC5EaXNwb3NhYmxle2dldEF0dHJEYXRhKCl7cmV0dXJuIHRoaXMuX2N1ckF0dHJEYXRhfWNvbnN0cnVjdG9yKGUsdCxpLHMscixoLF8sZix2PW5ldyBhLkVzY2FwZVNlcXVlbmNlUGFyc2VyKXtzdXBlcigpLHRoaXMuX2J1ZmZlclNlcnZpY2U9ZSx0aGlzLl9jaGFyc2V0U2VydmljZT10LHRoaXMuX2NvcmVTZXJ2aWNlPWksdGhpcy5fbG9nU2VydmljZT1zLHRoaXMuX29wdGlvbnNTZXJ2aWNlPXIsdGhpcy5fb3NjTGlua1NlcnZpY2U9aCx0aGlzLl9jb3JlTW91c2VTZXJ2aWNlPV8sdGhpcy5fdW5pY29kZVNlcnZpY2U9Zix0aGlzLl9wYXJzZXI9dix0aGlzLl9wYXJzZUJ1ZmZlcj1uZXcgVWludDMyQXJyYXkoNDA5NiksdGhpcy5fc3RyaW5nRGVjb2Rlcj1uZXcgYy5TdHJpbmdUb1V0ZjMyLHRoaXMuX3V0ZjhEZWNvZGVyPW5ldyBjLlV0ZjhUb1V0ZjMyLHRoaXMuX3dvcmtDZWxsPW5ldyB1LkNlbGxEYXRhLHRoaXMuX3dpbmRvd1RpdGxlPVwiXCIsdGhpcy5faWNvbk5hbWU9XCJcIix0aGlzLl93aW5kb3dUaXRsZVN0YWNrPVtdLHRoaXMuX2ljb25OYW1lU3RhY2s9W10sdGhpcy5fY3VyQXR0ckRhdGE9bC5ERUZBVUxUX0FUVFJfREFUQS5jbG9uZSgpLHRoaXMuX2VyYXNlQXR0ckRhdGFJbnRlcm5hbD1sLkRFRkFVTFRfQVRUUl9EQVRBLmNsb25lKCksdGhpcy5fb25SZXF1ZXN0QmVsbD10aGlzLnJlZ2lzdGVyKG5ldyBkLkV2ZW50RW1pdHRlciksdGhpcy5vblJlcXVlc3RCZWxsPXRoaXMuX29uUmVxdWVzdEJlbGwuZXZlbnQsdGhpcy5fb25SZXF1ZXN0UmVmcmVzaFJvd3M9dGhpcy5yZWdpc3RlcihuZXcgZC5FdmVudEVtaXR0ZXIpLHRoaXMub25SZXF1ZXN0UmVmcmVzaFJvd3M9dGhpcy5fb25SZXF1ZXN0UmVmcmVzaFJvd3MuZXZlbnQsdGhpcy5fb25SZXF1ZXN0UmVzZXQ9dGhpcy5yZWdpc3RlcihuZXcgZC5FdmVudEVtaXR0ZXIpLHRoaXMub25SZXF1ZXN0UmVzZXQ9dGhpcy5fb25SZXF1ZXN0UmVzZXQuZXZlbnQsdGhpcy5fb25SZXF1ZXN0U2VuZEZvY3VzPXRoaXMucmVnaXN0ZXIobmV3IGQuRXZlbnRFbWl0dGVyKSx0aGlzLm9uUmVxdWVzdFNlbmRGb2N1cz10aGlzLl9vblJlcXVlc3RTZW5kRm9jdXMuZXZlbnQsdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhcj10aGlzLnJlZ2lzdGVyKG5ldyBkLkV2ZW50RW1pdHRlciksdGhpcy5vblJlcXVlc3RTeW5jU2Nyb2xsQmFyPXRoaXMuX29uUmVxdWVzdFN5bmNTY3JvbGxCYXIuZXZlbnQsdGhpcy5fb25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQ9dGhpcy5yZWdpc3RlcihuZXcgZC5FdmVudEVtaXR0ZXIpLHRoaXMub25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQ9dGhpcy5fb25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQuZXZlbnQsdGhpcy5fb25BMTF5Q2hhcj10aGlzLnJlZ2lzdGVyKG5ldyBkLkV2ZW50RW1pdHRlciksdGhpcy5vbkExMXlDaGFyPXRoaXMuX29uQTExeUNoYXIuZXZlbnQsdGhpcy5fb25BMTF5VGFiPXRoaXMucmVnaXN0ZXIobmV3IGQuRXZlbnRFbWl0dGVyKSx0aGlzLm9uQTExeVRhYj10aGlzLl9vbkExMXlUYWIuZXZlbnQsdGhpcy5fb25DdXJzb3JNb3ZlPXRoaXMucmVnaXN0ZXIobmV3IGQuRXZlbnRFbWl0dGVyKSx0aGlzLm9uQ3Vyc29yTW92ZT10aGlzLl9vbkN1cnNvck1vdmUuZXZlbnQsdGhpcy5fb25MaW5lRmVlZD10aGlzLnJlZ2lzdGVyKG5ldyBkLkV2ZW50RW1pdHRlciksdGhpcy5vbkxpbmVGZWVkPXRoaXMuX29uTGluZUZlZWQuZXZlbnQsdGhpcy5fb25TY3JvbGw9dGhpcy5yZWdpc3RlcihuZXcgZC5FdmVudEVtaXR0ZXIpLHRoaXMub25TY3JvbGw9dGhpcy5fb25TY3JvbGwuZXZlbnQsdGhpcy5fb25UaXRsZUNoYW5nZT10aGlzLnJlZ2lzdGVyKG5ldyBkLkV2ZW50RW1pdHRlciksdGhpcy5vblRpdGxlQ2hhbmdlPXRoaXMuX29uVGl0bGVDaGFuZ2UuZXZlbnQsdGhpcy5fb25Db2xvcj10aGlzLnJlZ2lzdGVyKG5ldyBkLkV2ZW50RW1pdHRlciksdGhpcy5vbkNvbG9yPXRoaXMuX29uQ29sb3IuZXZlbnQsdGhpcy5fcGFyc2VTdGFjaz17cGF1c2VkOiExLGN1cnNvclN0YXJ0WDowLGN1cnNvclN0YXJ0WTowLGRlY29kZWRMZW5ndGg6MCxwb3NpdGlvbjowfSx0aGlzLl9zcGVjaWFsQ29sb3JzPVsyNTYsMjU3LDI1OF0sdGhpcy5yZWdpc3Rlcih0aGlzLl9wYXJzZXIpLHRoaXMuX2RpcnR5Um93VHJhY2tlcj1uZXcgTCh0aGlzLl9idWZmZXJTZXJ2aWNlKSx0aGlzLl9hY3RpdmVCdWZmZXI9dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIsdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMub25CdWZmZXJBY3RpdmF0ZSgoZT0+dGhpcy5fYWN0aXZlQnVmZmVyPWUuYWN0aXZlQnVmZmVyKSkpLHRoaXMuX3BhcnNlci5zZXRDc2lIYW5kbGVyRmFsbGJhY2soKChlLHQpPT57dGhpcy5fbG9nU2VydmljZS5kZWJ1ZyhcIlVua25vd24gQ1NJIGNvZGU6IFwiLHtpZGVudGlmaWVyOnRoaXMuX3BhcnNlci5pZGVudFRvU3RyaW5nKGUpLHBhcmFtczp0LnRvQXJyYXkoKX0pfSkpLHRoaXMuX3BhcnNlci5zZXRFc2NIYW5kbGVyRmFsbGJhY2soKGU9Pnt0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKFwiVW5rbm93biBFU0MgY29kZTogXCIse2lkZW50aWZpZXI6dGhpcy5fcGFyc2VyLmlkZW50VG9TdHJpbmcoZSl9KX0pKSx0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXJGYWxsYmFjaygoZT0+e3RoaXMuX2xvZ1NlcnZpY2UuZGVidWcoXCJVbmtub3duIEVYRUNVVEUgY29kZTogXCIse2NvZGU6ZX0pfSkpLHRoaXMuX3BhcnNlci5zZXRPc2NIYW5kbGVyRmFsbGJhY2soKChlLHQsaSk9Pnt0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKFwiVW5rbm93biBPU0MgY29kZTogXCIse2lkZW50aWZpZXI6ZSxhY3Rpb246dCxkYXRhOml9KX0pKSx0aGlzLl9wYXJzZXIuc2V0RGNzSGFuZGxlckZhbGxiYWNrKCgoZSx0LGkpPT57XCJIT09LXCI9PT10JiYoaT1pLnRvQXJyYXkoKSksdGhpcy5fbG9nU2VydmljZS5kZWJ1ZyhcIlVua25vd24gRENTIGNvZGU6IFwiLHtpZGVudGlmaWVyOnRoaXMuX3BhcnNlci5pZGVudFRvU3RyaW5nKGUpLGFjdGlvbjp0LHBheWxvYWQ6aX0pfSkpLHRoaXMuX3BhcnNlci5zZXRQcmludEhhbmRsZXIoKChlLHQsaSk9PnRoaXMucHJpbnQoZSx0LGkpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7ZmluYWw6XCJAXCJ9LChlPT50aGlzLmluc2VydENoYXJzKGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7aW50ZXJtZWRpYXRlczpcIiBcIixmaW5hbDpcIkBcIn0sKGU9PnRoaXMuc2Nyb2xsTGVmdChlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiQVwifSwoZT0+dGhpcy5jdXJzb3JVcChlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ludGVybWVkaWF0ZXM6XCIgXCIsZmluYWw6XCJBXCJ9LChlPT50aGlzLnNjcm9sbFJpZ2h0KGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7ZmluYWw6XCJCXCJ9LChlPT50aGlzLmN1cnNvckRvd24oZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcIkNcIn0sKGU9PnRoaXMuY3Vyc29yRm9yd2FyZChlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiRFwifSwoZT0+dGhpcy5jdXJzb3JCYWNrd2FyZChlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiRVwifSwoZT0+dGhpcy5jdXJzb3JOZXh0TGluZShlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiRlwifSwoZT0+dGhpcy5jdXJzb3JQcmVjZWRpbmdMaW5lKGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7ZmluYWw6XCJHXCJ9LChlPT50aGlzLmN1cnNvckNoYXJBYnNvbHV0ZShlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiSFwifSwoZT0+dGhpcy5jdXJzb3JQb3NpdGlvbihlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiSVwifSwoZT0+dGhpcy5jdXJzb3JGb3J3YXJkVGFiKGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7ZmluYWw6XCJKXCJ9LChlPT50aGlzLmVyYXNlSW5EaXNwbGF5KGUsITEpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7cHJlZml4OlwiP1wiLGZpbmFsOlwiSlwifSwoZT0+dGhpcy5lcmFzZUluRGlzcGxheShlLCEwKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiS1wifSwoZT0+dGhpcy5lcmFzZUluTGluZShlLCExKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe3ByZWZpeDpcIj9cIixmaW5hbDpcIktcIn0sKGU9PnRoaXMuZXJhc2VJbkxpbmUoZSwhMCkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcIkxcIn0sKGU9PnRoaXMuaW5zZXJ0TGluZXMoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcIk1cIn0sKGU9PnRoaXMuZGVsZXRlTGluZXMoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcIlBcIn0sKGU9PnRoaXMuZGVsZXRlQ2hhcnMoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcIlNcIn0sKGU9PnRoaXMuc2Nyb2xsVXAoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcIlRcIn0sKGU9PnRoaXMuc2Nyb2xsRG93bihlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiWFwifSwoZT0+dGhpcy5lcmFzZUNoYXJzKGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7ZmluYWw6XCJaXCJ9LChlPT50aGlzLmN1cnNvckJhY2t3YXJkVGFiKGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7ZmluYWw6XCJgXCJ9LChlPT50aGlzLmNoYXJQb3NBYnNvbHV0ZShlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiYVwifSwoZT0+dGhpcy5oUG9zaXRpb25SZWxhdGl2ZShlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiYlwifSwoZT0+dGhpcy5yZXBlYXRQcmVjZWRpbmdDaGFyYWN0ZXIoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcImNcIn0sKGU9PnRoaXMuc2VuZERldmljZUF0dHJpYnV0ZXNQcmltYXJ5KGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7cHJlZml4OlwiPlwiLGZpbmFsOlwiY1wifSwoZT0+dGhpcy5zZW5kRGV2aWNlQXR0cmlidXRlc1NlY29uZGFyeShlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiZFwifSwoZT0+dGhpcy5saW5lUG9zQWJzb2x1dGUoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcImVcIn0sKGU9PnRoaXMudlBvc2l0aW9uUmVsYXRpdmUoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcImZcIn0sKGU9PnRoaXMuaFZQb3NpdGlvbihlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiZ1wifSwoZT0+dGhpcy50YWJDbGVhcihlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwiaFwifSwoZT0+dGhpcy5zZXRNb2RlKGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7cHJlZml4OlwiP1wiLGZpbmFsOlwiaFwifSwoZT0+dGhpcy5zZXRNb2RlUHJpdmF0ZShlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwibFwifSwoZT0+dGhpcy5yZXNldE1vZGUoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtwcmVmaXg6XCI/XCIsZmluYWw6XCJsXCJ9LChlPT50aGlzLnJlc2V0TW9kZVByaXZhdGUoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcIm1cIn0sKGU9PnRoaXMuY2hhckF0dHJpYnV0ZXMoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcIm5cIn0sKGU9PnRoaXMuZGV2aWNlU3RhdHVzKGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7cHJlZml4OlwiP1wiLGZpbmFsOlwiblwifSwoZT0+dGhpcy5kZXZpY2VTdGF0dXNQcml2YXRlKGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7aW50ZXJtZWRpYXRlczpcIiFcIixmaW5hbDpcInBcIn0sKGU9PnRoaXMuc29mdFJlc2V0KGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7aW50ZXJtZWRpYXRlczpcIiBcIixmaW5hbDpcInFcIn0sKGU9PnRoaXMuc2V0Q3Vyc29yU3R5bGUoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcInJcIn0sKGU9PnRoaXMuc2V0U2Nyb2xsUmVnaW9uKGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7ZmluYWw6XCJzXCJ9LChlPT50aGlzLnNhdmVDdXJzb3IoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtmaW5hbDpcInRcIn0sKGU9PnRoaXMud2luZG93T3B0aW9ucyhlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ZpbmFsOlwidVwifSwoZT0+dGhpcy5yZXN0b3JlQ3Vyc29yKGUpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7aW50ZXJtZWRpYXRlczpcIidcIixmaW5hbDpcIn1cIn0sKGU9PnRoaXMuaW5zZXJ0Q29sdW1ucyhlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ludGVybWVkaWF0ZXM6XCInXCIsZmluYWw6XCJ+XCJ9LChlPT50aGlzLmRlbGV0ZUNvbHVtbnMoZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHtpbnRlcm1lZGlhdGVzOidcIicsZmluYWw6XCJxXCJ9LChlPT50aGlzLnNlbGVjdFByb3RlY3RlZChlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoe2ludGVybWVkaWF0ZXM6XCIkXCIsZmluYWw6XCJwXCJ9LChlPT50aGlzLnJlcXVlc3RNb2RlKGUsITApKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7cHJlZml4OlwiP1wiLGludGVybWVkaWF0ZXM6XCIkXCIsZmluYWw6XCJwXCJ9LChlPT50aGlzLnJlcXVlc3RNb2RlKGUsITEpKSksdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKG4uQzAuQkVMLCgoKT0+dGhpcy5iZWxsKCkpKSx0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIobi5DMC5MRiwoKCk9PnRoaXMubGluZUZlZWQoKSkpLHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihuLkMwLlZULCgoKT0+dGhpcy5saW5lRmVlZCgpKSksdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKG4uQzAuRkYsKCgpPT50aGlzLmxpbmVGZWVkKCkpKSx0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIobi5DMC5DUiwoKCk9PnRoaXMuY2FycmlhZ2VSZXR1cm4oKSkpLHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihuLkMwLkJTLCgoKT0+dGhpcy5iYWNrc3BhY2UoKSkpLHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihuLkMwLkhULCgoKT0+dGhpcy50YWIoKSkpLHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihuLkMwLlNPLCgoKT0+dGhpcy5zaGlmdE91dCgpKSksdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKG4uQzAuU0ksKCgpPT50aGlzLnNoaWZ0SW4oKSkpLHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihuLkMxLklORCwoKCk9PnRoaXMuaW5kZXgoKSkpLHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihuLkMxLk5FTCwoKCk9PnRoaXMubmV4dExpbmUoKSkpLHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihuLkMxLkhUUywoKCk9PnRoaXMudGFiU2V0KCkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDAsbmV3IGcuT3NjSGFuZGxlcigoZT0+KHRoaXMuc2V0VGl0bGUoZSksdGhpcy5zZXRJY29uTmFtZShlKSwhMCkpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcigxLG5ldyBnLk9zY0hhbmRsZXIoKGU9PnRoaXMuc2V0SWNvbk5hbWUoZSkpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcigyLG5ldyBnLk9zY0hhbmRsZXIoKGU9PnRoaXMuc2V0VGl0bGUoZSkpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcig0LG5ldyBnLk9zY0hhbmRsZXIoKGU9PnRoaXMuc2V0T3JSZXBvcnRJbmRleGVkQ29sb3IoZSkpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcig4LG5ldyBnLk9zY0hhbmRsZXIoKGU9PnRoaXMuc2V0SHlwZXJsaW5rKGUpKSkpLHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMTAsbmV3IGcuT3NjSGFuZGxlcigoZT0+dGhpcy5zZXRPclJlcG9ydEZnQ29sb3IoZSkpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcigxMSxuZXcgZy5Pc2NIYW5kbGVyKChlPT50aGlzLnNldE9yUmVwb3J0QmdDb2xvcihlKSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDEyLG5ldyBnLk9zY0hhbmRsZXIoKGU9PnRoaXMuc2V0T3JSZXBvcnRDdXJzb3JDb2xvcihlKSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDEwNCxuZXcgZy5Pc2NIYW5kbGVyKChlPT50aGlzLnJlc3RvcmVJbmRleGVkQ29sb3IoZSkpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcigxMTAsbmV3IGcuT3NjSGFuZGxlcigoZT0+dGhpcy5yZXN0b3JlRmdDb2xvcihlKSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDExMSxuZXcgZy5Pc2NIYW5kbGVyKChlPT50aGlzLnJlc3RvcmVCZ0NvbG9yKGUpKSkpLHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMTEyLG5ldyBnLk9zY0hhbmRsZXIoKGU9PnRoaXMucmVzdG9yZUN1cnNvckNvbG9yKGUpKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoe2ZpbmFsOlwiN1wifSwoKCk9PnRoaXMuc2F2ZUN1cnNvcigpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7ZmluYWw6XCI4XCJ9LCgoKT0+dGhpcy5yZXN0b3JlQ3Vyc29yKCkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHtmaW5hbDpcIkRcIn0sKCgpPT50aGlzLmluZGV4KCkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHtmaW5hbDpcIkVcIn0sKCgpPT50aGlzLm5leHRMaW5lKCkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHtmaW5hbDpcIkhcIn0sKCgpPT50aGlzLnRhYlNldCgpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7ZmluYWw6XCJNXCJ9LCgoKT0+dGhpcy5yZXZlcnNlSW5kZXgoKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoe2ZpbmFsOlwiPVwifSwoKCk9PnRoaXMua2V5cGFkQXBwbGljYXRpb25Nb2RlKCkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHtmaW5hbDpcIj5cIn0sKCgpPT50aGlzLmtleXBhZE51bWVyaWNNb2RlKCkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHtmaW5hbDpcImNcIn0sKCgpPT50aGlzLmZ1bGxSZXNldCgpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7ZmluYWw6XCJuXCJ9LCgoKT0+dGhpcy5zZXRnTGV2ZWwoMikpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHtmaW5hbDpcIm9cIn0sKCgpPT50aGlzLnNldGdMZXZlbCgzKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoe2ZpbmFsOlwifFwifSwoKCk9PnRoaXMuc2V0Z0xldmVsKDMpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7ZmluYWw6XCJ9XCJ9LCgoKT0+dGhpcy5zZXRnTGV2ZWwoMikpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHtmaW5hbDpcIn5cIn0sKCgpPT50aGlzLnNldGdMZXZlbCgxKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoe2ludGVybWVkaWF0ZXM6XCIlXCIsZmluYWw6XCJAXCJ9LCgoKT0+dGhpcy5zZWxlY3REZWZhdWx0Q2hhcnNldCgpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7aW50ZXJtZWRpYXRlczpcIiVcIixmaW5hbDpcIkdcIn0sKCgpPT50aGlzLnNlbGVjdERlZmF1bHRDaGFyc2V0KCkpKTtmb3IoY29uc3QgZSBpbiBvLkNIQVJTRVRTKXRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoe2ludGVybWVkaWF0ZXM6XCIoXCIsZmluYWw6ZX0sKCgpPT50aGlzLnNlbGVjdENoYXJzZXQoXCIoXCIrZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHtpbnRlcm1lZGlhdGVzOlwiKVwiLGZpbmFsOmV9LCgoKT0+dGhpcy5zZWxlY3RDaGFyc2V0KFwiKVwiK2UpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7aW50ZXJtZWRpYXRlczpcIipcIixmaW5hbDplfSwoKCk9PnRoaXMuc2VsZWN0Q2hhcnNldChcIipcIitlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoe2ludGVybWVkaWF0ZXM6XCIrXCIsZmluYWw6ZX0sKCgpPT50aGlzLnNlbGVjdENoYXJzZXQoXCIrXCIrZSkpKSx0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHtpbnRlcm1lZGlhdGVzOlwiLVwiLGZpbmFsOmV9LCgoKT0+dGhpcy5zZWxlY3RDaGFyc2V0KFwiLVwiK2UpKSksdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7aW50ZXJtZWRpYXRlczpcIi5cIixmaW5hbDplfSwoKCk9PnRoaXMuc2VsZWN0Q2hhcnNldChcIi5cIitlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoe2ludGVybWVkaWF0ZXM6XCIvXCIsZmluYWw6ZX0sKCgpPT50aGlzLnNlbGVjdENoYXJzZXQoXCIvXCIrZSkpKTt0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHtpbnRlcm1lZGlhdGVzOlwiI1wiLGZpbmFsOlwiOFwifSwoKCk9PnRoaXMuc2NyZWVuQWxpZ25tZW50UGF0dGVybigpKSksdGhpcy5fcGFyc2VyLnNldEVycm9ySGFuZGxlcigoZT0+KHRoaXMuX2xvZ1NlcnZpY2UuZXJyb3IoXCJQYXJzaW5nIGVycm9yOiBcIixlKSxlKSkpLHRoaXMuX3BhcnNlci5yZWdpc3RlckRjc0hhbmRsZXIoe2ludGVybWVkaWF0ZXM6XCIkXCIsZmluYWw6XCJxXCJ9LG5ldyBtLkRjc0hhbmRsZXIoKChlLHQpPT50aGlzLnJlcXVlc3RTdGF0dXNTdHJpbmcoZSx0KSkpKX1fcHJlc2VydmVTdGFjayhlLHQsaSxzKXt0aGlzLl9wYXJzZVN0YWNrLnBhdXNlZD0hMCx0aGlzLl9wYXJzZVN0YWNrLmN1cnNvclN0YXJ0WD1lLHRoaXMuX3BhcnNlU3RhY2suY3Vyc29yU3RhcnRZPXQsdGhpcy5fcGFyc2VTdGFjay5kZWNvZGVkTGVuZ3RoPWksdGhpcy5fcGFyc2VTdGFjay5wb3NpdGlvbj1zfV9sb2dTbG93UmVzb2x2aW5nQXN5bmMoZSl7dGhpcy5fbG9nU2VydmljZS5sb2dMZXZlbDw9di5Mb2dMZXZlbEVudW0uV0FSTiYmUHJvbWlzZS5yYWNlKFtlLG5ldyBQcm9taXNlKCgoZSx0KT0+c2V0VGltZW91dCgoKCk9PnQoXCIjU0xPV19USU1FT1VUXCIpKSw1ZTMpKSldKS5jYXRjaCgoZT0+e2lmKFwiI1NMT1dfVElNRU9VVFwiIT09ZSl0aHJvdyBlO2NvbnNvbGUud2FybihcImFzeW5jIHBhcnNlciBoYW5kbGVyIHRha2luZyBsb25nZXIgdGhhbiA1MDAwIG1zXCIpfSkpfV9nZXRDdXJyZW50TGlua0lkKCl7cmV0dXJuIHRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkLnVybElkfXBhcnNlKGUsdCl7bGV0IGkscz10aGlzLl9hY3RpdmVCdWZmZXIueCxyPXRoaXMuX2FjdGl2ZUJ1ZmZlci55LG49MDtjb25zdCBvPXRoaXMuX3BhcnNlU3RhY2sucGF1c2VkO2lmKG8pe2lmKGk9dGhpcy5fcGFyc2VyLnBhcnNlKHRoaXMuX3BhcnNlQnVmZmVyLHRoaXMuX3BhcnNlU3RhY2suZGVjb2RlZExlbmd0aCx0KSlyZXR1cm4gdGhpcy5fbG9nU2xvd1Jlc29sdmluZ0FzeW5jKGkpLGk7cz10aGlzLl9wYXJzZVN0YWNrLmN1cnNvclN0YXJ0WCxyPXRoaXMuX3BhcnNlU3RhY2suY3Vyc29yU3RhcnRZLHRoaXMuX3BhcnNlU3RhY2sucGF1c2VkPSExLGUubGVuZ3RoPmImJihuPXRoaXMuX3BhcnNlU3RhY2sucG9zaXRpb24rYil9aWYodGhpcy5fbG9nU2VydmljZS5sb2dMZXZlbDw9di5Mb2dMZXZlbEVudW0uREVCVUcmJnRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoXCJwYXJzaW5nIGRhdGFcIisoXCJzdHJpbmdcIj09dHlwZW9mIGU/YCBcIiR7ZX1cImA6YCBcIiR7QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGUsKGU9PlN0cmluZy5mcm9tQ2hhckNvZGUoZSkpKS5qb2luKFwiXCIpfVwiYCksXCJzdHJpbmdcIj09dHlwZW9mIGU/ZS5zcGxpdChcIlwiKS5tYXAoKGU9PmUuY2hhckNvZGVBdCgwKSkpOmUpLHRoaXMuX3BhcnNlQnVmZmVyLmxlbmd0aDxlLmxlbmd0aCYmdGhpcy5fcGFyc2VCdWZmZXIubGVuZ3RoPGImJih0aGlzLl9wYXJzZUJ1ZmZlcj1uZXcgVWludDMyQXJyYXkoTWF0aC5taW4oZS5sZW5ndGgsYikpKSxvfHx0aGlzLl9kaXJ0eVJvd1RyYWNrZXIuY2xlYXJSYW5nZSgpLGUubGVuZ3RoPmIpZm9yKGxldCB0PW47dDxlLmxlbmd0aDt0Kz1iKXtjb25zdCBuPXQrYjxlLmxlbmd0aD90K2I6ZS5sZW5ndGgsbz1cInN0cmluZ1wiPT10eXBlb2YgZT90aGlzLl9zdHJpbmdEZWNvZGVyLmRlY29kZShlLnN1YnN0cmluZyh0LG4pLHRoaXMuX3BhcnNlQnVmZmVyKTp0aGlzLl91dGY4RGVjb2Rlci5kZWNvZGUoZS5zdWJhcnJheSh0LG4pLHRoaXMuX3BhcnNlQnVmZmVyKTtpZihpPXRoaXMuX3BhcnNlci5wYXJzZSh0aGlzLl9wYXJzZUJ1ZmZlcixvKSlyZXR1cm4gdGhpcy5fcHJlc2VydmVTdGFjayhzLHIsbyx0KSx0aGlzLl9sb2dTbG93UmVzb2x2aW5nQXN5bmMoaSksaX1lbHNlIGlmKCFvKXtjb25zdCB0PVwic3RyaW5nXCI9PXR5cGVvZiBlP3RoaXMuX3N0cmluZ0RlY29kZXIuZGVjb2RlKGUsdGhpcy5fcGFyc2VCdWZmZXIpOnRoaXMuX3V0ZjhEZWNvZGVyLmRlY29kZShlLHRoaXMuX3BhcnNlQnVmZmVyKTtpZihpPXRoaXMuX3BhcnNlci5wYXJzZSh0aGlzLl9wYXJzZUJ1ZmZlcix0KSlyZXR1cm4gdGhpcy5fcHJlc2VydmVTdGFjayhzLHIsdCwwKSx0aGlzLl9sb2dTbG93UmVzb2x2aW5nQXN5bmMoaSksaX10aGlzLl9hY3RpdmVCdWZmZXIueD09PXMmJnRoaXMuX2FjdGl2ZUJ1ZmZlci55PT09cnx8dGhpcy5fb25DdXJzb3JNb3ZlLmZpcmUoKTtjb25zdCBhPXRoaXMuX2RpcnR5Um93VHJhY2tlci5lbmQrKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnliYXNlLXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwKSxoPXRoaXMuX2RpcnR5Um93VHJhY2tlci5zdGFydCsodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2UtdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3ApO2g8dGhpcy5fYnVmZmVyU2VydmljZS5yb3dzJiZ0aGlzLl9vblJlcXVlc3RSZWZyZXNoUm93cy5maXJlKE1hdGgubWluKGgsdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLTEpLE1hdGgubWluKGEsdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLTEpKX1wcmludChlLHQsaSl7bGV0IHMscjtjb25zdCBuPXRoaXMuX2NoYXJzZXRTZXJ2aWNlLmNoYXJzZXQsbz10aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcmVlblJlYWRlck1vZGUsYT10aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsaD10aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMud3JhcGFyb3VuZCxkPXRoaXMuX2NvcmVTZXJ2aWNlLm1vZGVzLmluc2VydE1vZGUsdT10aGlzLl9jdXJBdHRyRGF0YTtsZXQgZj10aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSt0aGlzLl9hY3RpdmVCdWZmZXIueSk7dGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSksdGhpcy5fYWN0aXZlQnVmZmVyLngmJmktdD4wJiYyPT09Zi5nZXRXaWR0aCh0aGlzLl9hY3RpdmVCdWZmZXIueC0xKSYmZi5zZXRDZWxsRnJvbUNvZGVwb2ludCh0aGlzLl9hY3RpdmVCdWZmZXIueC0xLDAsMSx1KTtsZXQgdj10aGlzLl9wYXJzZXIucHJlY2VkaW5nSm9pblN0YXRlO2ZvcihsZXQgZz10O2c8aTsrK2cpe2lmKHM9ZVtnXSxzPDEyNyYmbil7Y29uc3QgZT1uW1N0cmluZy5mcm9tQ2hhckNvZGUocyldO2UmJihzPWUuY2hhckNvZGVBdCgwKSl9Y29uc3QgdD10aGlzLl91bmljb2RlU2VydmljZS5jaGFyUHJvcGVydGllcyhzLHYpO3I9cC5Vbmljb2RlU2VydmljZS5leHRyYWN0V2lkdGgodCk7Y29uc3QgaT1wLlVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RTaG91bGRKb2luKHQpLG09aT9wLlVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RXaWR0aCh2KTowO2lmKHY9dCxvJiZ0aGlzLl9vbkExMXlDaGFyLmZpcmUoKDAsYy5zdHJpbmdGcm9tQ29kZVBvaW50KShzKSksdGhpcy5fZ2V0Q3VycmVudExpbmtJZCgpJiZ0aGlzLl9vc2NMaW5rU2VydmljZS5hZGRMaW5lVG9MaW5rKHRoaXMuX2dldEN1cnJlbnRMaW5rSWQoKSx0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UrdGhpcy5fYWN0aXZlQnVmZmVyLnkpLHRoaXMuX2FjdGl2ZUJ1ZmZlci54K3ItbT5hKWlmKGgpe2NvbnN0IGU9ZjtsZXQgdD10aGlzLl9hY3RpdmVCdWZmZXIueC1tO2Zvcih0aGlzLl9hY3RpdmVCdWZmZXIueD1tLHRoaXMuX2FjdGl2ZUJ1ZmZlci55KyssdGhpcy5fYWN0aXZlQnVmZmVyLnk9PT10aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKzE/KHRoaXMuX2FjdGl2ZUJ1ZmZlci55LS0sdGhpcy5fYnVmZmVyU2VydmljZS5zY3JvbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpLCEwKSk6KHRoaXMuX2FjdGl2ZUJ1ZmZlci55Pj10aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MmJih0aGlzLl9hY3RpdmVCdWZmZXIueT10aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MtMSksdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UrdGhpcy5fYWN0aXZlQnVmZmVyLnkpLmlzV3JhcHBlZD0hMCksZj10aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSt0aGlzLl9hY3RpdmVCdWZmZXIueSksbT4wJiZmIGluc3RhbmNlb2YgbC5CdWZmZXJMaW5lJiZmLmNvcHlDZWxsc0Zyb20oZSx0LDAsbSwhMSk7dDxhOyllLnNldENlbGxGcm9tQ29kZXBvaW50KHQrKywwLDEsdSl9ZWxzZSBpZih0aGlzLl9hY3RpdmVCdWZmZXIueD1hLTEsMj09PXIpY29udGludWU7aWYoaSYmdGhpcy5fYWN0aXZlQnVmZmVyLngpe2NvbnN0IGU9Zi5nZXRXaWR0aCh0aGlzLl9hY3RpdmVCdWZmZXIueC0xKT8xOjI7Zi5hZGRDb2RlcG9pbnRUb0NlbGwodGhpcy5fYWN0aXZlQnVmZmVyLngtZSxzLHIpO2ZvcihsZXQgZT1yLW07LS1lPj0wOylmLnNldENlbGxGcm9tQ29kZXBvaW50KHRoaXMuX2FjdGl2ZUJ1ZmZlci54KyssMCwwLHUpfWVsc2UgaWYoZCYmKGYuaW5zZXJ0Q2VsbHModGhpcy5fYWN0aXZlQnVmZmVyLngsci1tLHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh1KSksMj09PWYuZ2V0V2lkdGgoYS0xKSYmZi5zZXRDZWxsRnJvbUNvZGVwb2ludChhLTEsXy5OVUxMX0NFTExfQ09ERSxfLk5VTExfQ0VMTF9XSURUSCx1KSksZi5zZXRDZWxsRnJvbUNvZGVwb2ludCh0aGlzLl9hY3RpdmVCdWZmZXIueCsrLHMscix1KSxyPjApZm9yKDstLXI7KWYuc2V0Q2VsbEZyb21Db2RlcG9pbnQodGhpcy5fYWN0aXZlQnVmZmVyLngrKywwLDAsdSl9dGhpcy5fcGFyc2VyLnByZWNlZGluZ0pvaW5TdGF0ZT12LHRoaXMuX2FjdGl2ZUJ1ZmZlci54PGEmJmktdD4wJiYwPT09Zi5nZXRXaWR0aCh0aGlzLl9hY3RpdmVCdWZmZXIueCkmJiFmLmhhc0NvbnRlbnQodGhpcy5fYWN0aXZlQnVmZmVyLngpJiZmLnNldENlbGxGcm9tQ29kZXBvaW50KHRoaXMuX2FjdGl2ZUJ1ZmZlci54LDAsMSx1KSx0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KX1yZWdpc3RlckNzaUhhbmRsZXIoZSx0KXtyZXR1cm5cInRcIiE9PWUuZmluYWx8fGUucHJlZml4fHxlLmludGVybWVkaWF0ZXM/dGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcihlLHQpOnRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoZSwoZT0+IXcoZS5wYXJhbXNbMF0sdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dPcHRpb25zKXx8dChlKSkpfXJlZ2lzdGVyRGNzSGFuZGxlcihlLHQpe3JldHVybiB0aGlzLl9wYXJzZXIucmVnaXN0ZXJEY3NIYW5kbGVyKGUsbmV3IG0uRGNzSGFuZGxlcih0KSl9cmVnaXN0ZXJFc2NIYW5kbGVyKGUsdCl7cmV0dXJuIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoZSx0KX1yZWdpc3Rlck9zY0hhbmRsZXIoZSx0KXtyZXR1cm4gdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcihlLG5ldyBnLk9zY0hhbmRsZXIodCkpfWJlbGwoKXtyZXR1cm4gdGhpcy5fb25SZXF1ZXN0QmVsbC5maXJlKCksITB9bGluZUZlZWQoKXtyZXR1cm4gdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSksdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jb252ZXJ0RW9sJiYodGhpcy5fYWN0aXZlQnVmZmVyLng9MCksdGhpcy5fYWN0aXZlQnVmZmVyLnkrKyx0aGlzLl9hY3RpdmVCdWZmZXIueT09PXRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20rMT8odGhpcy5fYWN0aXZlQnVmZmVyLnktLSx0aGlzLl9idWZmZXJTZXJ2aWNlLnNjcm9sbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTp0aGlzLl9hY3RpdmVCdWZmZXIueT49dGhpcy5fYnVmZmVyU2VydmljZS5yb3dzP3RoaXMuX2FjdGl2ZUJ1ZmZlci55PXRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cy0xOnRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlK3RoaXMuX2FjdGl2ZUJ1ZmZlci55KS5pc1dyYXBwZWQ9ITEsdGhpcy5fYWN0aXZlQnVmZmVyLng+PXRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyYmdGhpcy5fYWN0aXZlQnVmZmVyLngtLSx0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KSx0aGlzLl9vbkxpbmVGZWVkLmZpcmUoKSwhMH1jYXJyaWFnZVJldHVybigpe3JldHVybiB0aGlzLl9hY3RpdmVCdWZmZXIueD0wLCEwfWJhY2tzcGFjZSgpe2lmKCF0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMucmV2ZXJzZVdyYXBhcm91bmQpcmV0dXJuIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCksdGhpcy5fYWN0aXZlQnVmZmVyLng+MCYmdGhpcy5fYWN0aXZlQnVmZmVyLngtLSwhMDtpZih0aGlzLl9yZXN0cmljdEN1cnNvcih0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpLHRoaXMuX2FjdGl2ZUJ1ZmZlci54PjApdGhpcy5fYWN0aXZlQnVmZmVyLngtLTtlbHNlIGlmKDA9PT10aGlzLl9hY3RpdmVCdWZmZXIueCYmdGhpcy5fYWN0aXZlQnVmZmVyLnk+dGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCYmdGhpcy5fYWN0aXZlQnVmZmVyLnk8PXRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20mJnRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlK3RoaXMuX2FjdGl2ZUJ1ZmZlci55KT8uaXNXcmFwcGVkKXt0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSt0aGlzLl9hY3RpdmVCdWZmZXIueSkuaXNXcmFwcGVkPSExLHRoaXMuX2FjdGl2ZUJ1ZmZlci55LS0sdGhpcy5fYWN0aXZlQnVmZmVyLng9dGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLTE7Y29uc3QgZT10aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSt0aGlzLl9hY3RpdmVCdWZmZXIueSk7ZS5oYXNXaWR0aCh0aGlzLl9hY3RpdmVCdWZmZXIueCkmJiFlLmhhc0NvbnRlbnQodGhpcy5fYWN0aXZlQnVmZmVyLngpJiZ0aGlzLl9hY3RpdmVCdWZmZXIueC0tfXJldHVybiB0aGlzLl9yZXN0cmljdEN1cnNvcigpLCEwfXRhYigpe2lmKHRoaXMuX2FjdGl2ZUJ1ZmZlci54Pj10aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpcmV0dXJuITA7Y29uc3QgZT10aGlzLl9hY3RpdmVCdWZmZXIueDtyZXR1cm4gdGhpcy5fYWN0aXZlQnVmZmVyLng9dGhpcy5fYWN0aXZlQnVmZmVyLm5leHRTdG9wKCksdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zY3JlZW5SZWFkZXJNb2RlJiZ0aGlzLl9vbkExMXlUYWIuZmlyZSh0aGlzLl9hY3RpdmVCdWZmZXIueC1lKSwhMH1zaGlmdE91dCgpe3JldHVybiB0aGlzLl9jaGFyc2V0U2VydmljZS5zZXRnTGV2ZWwoMSksITB9c2hpZnRJbigpe3JldHVybiB0aGlzLl9jaGFyc2V0U2VydmljZS5zZXRnTGV2ZWwoMCksITB9X3Jlc3RyaWN0Q3Vyc29yKGU9dGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLTEpe3RoaXMuX2FjdGl2ZUJ1ZmZlci54PU1hdGgubWluKGUsTWF0aC5tYXgoMCx0aGlzLl9hY3RpdmVCdWZmZXIueCkpLHRoaXMuX2FjdGl2ZUJ1ZmZlci55PXRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5vcmlnaW4/TWF0aC5taW4odGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSxNYXRoLm1heCh0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLHRoaXMuX2FjdGl2ZUJ1ZmZlci55KSk6TWF0aC5taW4odGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLTEsTWF0aC5tYXgoMCx0aGlzLl9hY3RpdmVCdWZmZXIueSkpLHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpfV9zZXRDdXJzb3IoZSx0KXt0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KSx0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMub3JpZ2luPyh0aGlzLl9hY3RpdmVCdWZmZXIueD1lLHRoaXMuX2FjdGl2ZUJ1ZmZlci55PXRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3ArdCk6KHRoaXMuX2FjdGl2ZUJ1ZmZlci54PWUsdGhpcy5fYWN0aXZlQnVmZmVyLnk9dCksdGhpcy5fcmVzdHJpY3RDdXJzb3IoKSx0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KX1fbW92ZUN1cnNvcihlLHQpe3RoaXMuX3Jlc3RyaWN0Q3Vyc29yKCksdGhpcy5fc2V0Q3Vyc29yKHRoaXMuX2FjdGl2ZUJ1ZmZlci54K2UsdGhpcy5fYWN0aXZlQnVmZmVyLnkrdCl9Y3Vyc29yVXAoZSl7Y29uc3QgdD10aGlzLl9hY3RpdmVCdWZmZXIueS10aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wO3JldHVybiB0Pj0wP3RoaXMuX21vdmVDdXJzb3IoMCwtTWF0aC5taW4odCxlLnBhcmFtc1swXXx8MSkpOnRoaXMuX21vdmVDdXJzb3IoMCwtKGUucGFyYW1zWzBdfHwxKSksITB9Y3Vyc29yRG93bihlKXtjb25zdCB0PXRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20tdGhpcy5fYWN0aXZlQnVmZmVyLnk7cmV0dXJuIHQ+PTA/dGhpcy5fbW92ZUN1cnNvcigwLE1hdGgubWluKHQsZS5wYXJhbXNbMF18fDEpKTp0aGlzLl9tb3ZlQ3Vyc29yKDAsZS5wYXJhbXNbMF18fDEpLCEwfWN1cnNvckZvcndhcmQoZSl7cmV0dXJuIHRoaXMuX21vdmVDdXJzb3IoZS5wYXJhbXNbMF18fDEsMCksITB9Y3Vyc29yQmFja3dhcmQoZSl7cmV0dXJuIHRoaXMuX21vdmVDdXJzb3IoLShlLnBhcmFtc1swXXx8MSksMCksITB9Y3Vyc29yTmV4dExpbmUoZSl7cmV0dXJuIHRoaXMuY3Vyc29yRG93bihlKSx0aGlzLl9hY3RpdmVCdWZmZXIueD0wLCEwfWN1cnNvclByZWNlZGluZ0xpbmUoZSl7cmV0dXJuIHRoaXMuY3Vyc29yVXAoZSksdGhpcy5fYWN0aXZlQnVmZmVyLng9MCwhMH1jdXJzb3JDaGFyQWJzb2x1dGUoZSl7cmV0dXJuIHRoaXMuX3NldEN1cnNvcigoZS5wYXJhbXNbMF18fDEpLTEsdGhpcy5fYWN0aXZlQnVmZmVyLnkpLCEwfWN1cnNvclBvc2l0aW9uKGUpe3JldHVybiB0aGlzLl9zZXRDdXJzb3IoZS5sZW5ndGg+PTI/KGUucGFyYW1zWzFdfHwxKS0xOjAsKGUucGFyYW1zWzBdfHwxKS0xKSwhMH1jaGFyUG9zQWJzb2x1dGUoZSl7cmV0dXJuIHRoaXMuX3NldEN1cnNvcigoZS5wYXJhbXNbMF18fDEpLTEsdGhpcy5fYWN0aXZlQnVmZmVyLnkpLCEwfWhQb3NpdGlvblJlbGF0aXZlKGUpe3JldHVybiB0aGlzLl9tb3ZlQ3Vyc29yKGUucGFyYW1zWzBdfHwxLDApLCEwfWxpbmVQb3NBYnNvbHV0ZShlKXtyZXR1cm4gdGhpcy5fc2V0Q3Vyc29yKHRoaXMuX2FjdGl2ZUJ1ZmZlci54LChlLnBhcmFtc1swXXx8MSktMSksITB9dlBvc2l0aW9uUmVsYXRpdmUoZSl7cmV0dXJuIHRoaXMuX21vdmVDdXJzb3IoMCxlLnBhcmFtc1swXXx8MSksITB9aFZQb3NpdGlvbihlKXtyZXR1cm4gdGhpcy5jdXJzb3JQb3NpdGlvbihlKSwhMH10YWJDbGVhcihlKXtjb25zdCB0PWUucGFyYW1zWzBdO3JldHVybiAwPT09dD9kZWxldGUgdGhpcy5fYWN0aXZlQnVmZmVyLnRhYnNbdGhpcy5fYWN0aXZlQnVmZmVyLnhdOjM9PT10JiYodGhpcy5fYWN0aXZlQnVmZmVyLnRhYnM9e30pLCEwfWN1cnNvckZvcndhcmRUYWIoZSl7aWYodGhpcy5fYWN0aXZlQnVmZmVyLng+PXRoaXMuX2J1ZmZlclNlcnZpY2UuY29scylyZXR1cm4hMDtsZXQgdD1lLnBhcmFtc1swXXx8MTtmb3IoO3QtLTspdGhpcy5fYWN0aXZlQnVmZmVyLng9dGhpcy5fYWN0aXZlQnVmZmVyLm5leHRTdG9wKCk7cmV0dXJuITB9Y3Vyc29yQmFja3dhcmRUYWIoZSl7aWYodGhpcy5fYWN0aXZlQnVmZmVyLng+PXRoaXMuX2J1ZmZlclNlcnZpY2UuY29scylyZXR1cm4hMDtsZXQgdD1lLnBhcmFtc1swXXx8MTtmb3IoO3QtLTspdGhpcy5fYWN0aXZlQnVmZmVyLng9dGhpcy5fYWN0aXZlQnVmZmVyLnByZXZTdG9wKCk7cmV0dXJuITB9c2VsZWN0UHJvdGVjdGVkKGUpe2NvbnN0IHQ9ZS5wYXJhbXNbMF07cmV0dXJuIDE9PT10JiYodGhpcy5fY3VyQXR0ckRhdGEuYmd8PTUzNjg3MDkxMiksMiE9PXQmJjAhPT10fHwodGhpcy5fY3VyQXR0ckRhdGEuYmcmPS01MzY4NzA5MTMpLCEwfV9lcmFzZUluQnVmZmVyTGluZShlLHQsaSxzPSExLHI9ITEpe2NvbnN0IG49dGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UrZSk7bi5yZXBsYWNlQ2VsbHModCxpLHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpLHIpLHMmJihuLmlzV3JhcHBlZD0hMSl9X3Jlc2V0QnVmZmVyTGluZShlLHQ9ITEpe2NvbnN0IGk9dGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UrZSk7aSYmKGkuZmlsbCh0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0TnVsbENlbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSx0KSx0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5jbGVhck1hcmtlcnModGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlK2UpLGkuaXNXcmFwcGVkPSExKX1lcmFzZUluRGlzcGxheShlLHQ9ITEpe2xldCBpO3N3aXRjaCh0aGlzLl9yZXN0cmljdEN1cnNvcih0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpLGUucGFyYW1zWzBdKXtjYXNlIDA6Zm9yKGk9dGhpcy5fYWN0aXZlQnVmZmVyLnksdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eShpKSx0aGlzLl9lcmFzZUluQnVmZmVyTGluZShpKyssdGhpcy5fYWN0aXZlQnVmZmVyLngsdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLDA9PT10aGlzLl9hY3RpdmVCdWZmZXIueCx0KTtpPHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cztpKyspdGhpcy5fcmVzZXRCdWZmZXJMaW5lKGksdCk7dGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eShpKTticmVhaztjYXNlIDE6Zm9yKGk9dGhpcy5fYWN0aXZlQnVmZmVyLnksdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eShpKSx0aGlzLl9lcmFzZUluQnVmZmVyTGluZShpLDAsdGhpcy5fYWN0aXZlQnVmZmVyLngrMSwhMCx0KSx0aGlzLl9hY3RpdmVCdWZmZXIueCsxPj10aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMmJih0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KGkrMSkuaXNXcmFwcGVkPSExKTtpLS07KXRoaXMuX3Jlc2V0QnVmZmVyTGluZShpLHQpO3RoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkoMCk7YnJlYWs7Y2FzZSAyOmZvcihpPXRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyx0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KGktMSk7aS0tOyl0aGlzLl9yZXNldEJ1ZmZlckxpbmUoaSx0KTt0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KDApO2JyZWFrO2Nhc2UgMzpjb25zdCBlPXRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5sZW5ndGgtdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzO2U+MCYmKHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy50cmltU3RhcnQoZSksdGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlPU1hdGgubWF4KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZS1lLDApLHRoaXMuX2FjdGl2ZUJ1ZmZlci55ZGlzcD1NYXRoLm1heCh0aGlzLl9hY3RpdmVCdWZmZXIueWRpc3AtZSwwKSx0aGlzLl9vblNjcm9sbC5maXJlKDApKX1yZXR1cm4hMH1lcmFzZUluTGluZShlLHQ9ITEpe3N3aXRjaCh0aGlzLl9yZXN0cmljdEN1cnNvcih0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpLGUucGFyYW1zWzBdKXtjYXNlIDA6dGhpcy5fZXJhc2VJbkJ1ZmZlckxpbmUodGhpcy5fYWN0aXZlQnVmZmVyLnksdGhpcy5fYWN0aXZlQnVmZmVyLngsdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLDA9PT10aGlzLl9hY3RpdmVCdWZmZXIueCx0KTticmVhaztjYXNlIDE6dGhpcy5fZXJhc2VJbkJ1ZmZlckxpbmUodGhpcy5fYWN0aXZlQnVmZmVyLnksMCx0aGlzLl9hY3RpdmVCdWZmZXIueCsxLCExLHQpO2JyZWFrO2Nhc2UgMjp0aGlzLl9lcmFzZUluQnVmZmVyTGluZSh0aGlzLl9hY3RpdmVCdWZmZXIueSwwLHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywhMCx0KX1yZXR1cm4gdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSksITB9aW5zZXJ0TGluZXMoZSl7dGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtsZXQgdD1lLnBhcmFtc1swXXx8MTtpZih0aGlzLl9hY3RpdmVCdWZmZXIueT50aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tfHx0aGlzLl9hY3RpdmVCdWZmZXIueTx0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wKXJldHVybiEwO2NvbnN0IGk9dGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlK3RoaXMuX2FjdGl2ZUJ1ZmZlci55LHM9dGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLTEtdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSxyPXRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cy0xK3RoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZS1zKzE7Zm9yKDt0LS07KXRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5zcGxpY2Uoci0xLDEpLHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5zcGxpY2UoaSwwLHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXRCbGFua0xpbmUodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSk7cmV0dXJuIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSx0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKSx0aGlzLl9hY3RpdmVCdWZmZXIueD0wLCEwfWRlbGV0ZUxpbmVzKGUpe3RoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7bGV0IHQ9ZS5wYXJhbXNbMF18fDE7aWYodGhpcy5fYWN0aXZlQnVmZmVyLnk+dGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbXx8dGhpcy5fYWN0aXZlQnVmZmVyLnk8dGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcClyZXR1cm4hMDtjb25zdCBpPXRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSt0aGlzLl9hY3RpdmVCdWZmZXIueTtsZXQgcztmb3Iocz10aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MtMS10aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tLHM9dGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLTErdGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlLXM7dC0tOyl0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKGksMSksdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnNwbGljZShzLDAsdGhpcy5fYWN0aXZlQnVmZmVyLmdldEJsYW5rTGluZSh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTtyZXR1cm4gdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55LHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20pLHRoaXMuX2FjdGl2ZUJ1ZmZlci54PTAsITB9aW5zZXJ0Q2hhcnMoZSl7dGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtjb25zdCB0PXRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlK3RoaXMuX2FjdGl2ZUJ1ZmZlci55KTtyZXR1cm4gdCYmKHQuaW5zZXJ0Q2VsbHModGhpcy5fYWN0aXZlQnVmZmVyLngsZS5wYXJhbXNbMF18fDEsdGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSkpLHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpKSwhMH1kZWxldGVDaGFycyhlKXt0aGlzLl9yZXN0cmljdEN1cnNvcigpO2NvbnN0IHQ9dGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UrdGhpcy5fYWN0aXZlQnVmZmVyLnkpO3JldHVybiB0JiYodC5kZWxldGVDZWxscyh0aGlzLl9hY3RpdmVCdWZmZXIueCxlLnBhcmFtc1swXXx8MSx0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0TnVsbENlbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSksdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSkpLCEwfXNjcm9sbFVwKGUpe2xldCB0PWUucGFyYW1zWzBdfHwxO2Zvcig7dC0tOyl0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSt0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLDEpLHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5zcGxpY2UodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlK3RoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20sMCx0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0QmxhbmtMaW5lKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSkpO3JldHVybiB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCx0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKSwhMH1zY3JvbGxEb3duKGUpe2xldCB0PWUucGFyYW1zWzBdfHwxO2Zvcig7dC0tOyl0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSt0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tLDEpLHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5zcGxpY2UodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlK3RoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsMCx0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0QmxhbmtMaW5lKGwuREVGQVVMVF9BVFRSX0RBVEEpKTtyZXR1cm4gdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSksITB9c2Nyb2xsTGVmdChlKXtpZih0aGlzLl9hY3RpdmVCdWZmZXIueT50aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tfHx0aGlzLl9hY3RpdmVCdWZmZXIueTx0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wKXJldHVybiEwO2NvbnN0IHQ9ZS5wYXJhbXNbMF18fDE7Zm9yKGxldCBlPXRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3A7ZTw9dGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbTsrK2Upe2NvbnN0IGk9dGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UrZSk7aS5kZWxldGVDZWxscygwLHQsdGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSkpLGkuaXNXcmFwcGVkPSExfXJldHVybiB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCx0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKSwhMH1zY3JvbGxSaWdodChlKXtpZih0aGlzLl9hY3RpdmVCdWZmZXIueT50aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tfHx0aGlzLl9hY3RpdmVCdWZmZXIueTx0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wKXJldHVybiEwO2NvbnN0IHQ9ZS5wYXJhbXNbMF18fDE7Zm9yKGxldCBlPXRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3A7ZTw9dGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbTsrK2Upe2NvbnN0IGk9dGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UrZSk7aS5pbnNlcnRDZWxscygwLHQsdGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSkpLGkuaXNXcmFwcGVkPSExfXJldHVybiB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCx0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKSwhMH1pbnNlcnRDb2x1bW5zKGUpe2lmKHRoaXMuX2FjdGl2ZUJ1ZmZlci55PnRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b218fHRoaXMuX2FjdGl2ZUJ1ZmZlci55PHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3ApcmV0dXJuITA7Y29uc3QgdD1lLnBhcmFtc1swXXx8MTtmb3IobGV0IGU9dGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcDtlPD10aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tOysrZSl7Y29uc3QgaT10aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZStlKTtpLmluc2VydENlbGxzKHRoaXMuX2FjdGl2ZUJ1ZmZlci54LHQsdGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSkpLGkuaXNXcmFwcGVkPSExfXJldHVybiB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCx0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKSwhMH1kZWxldGVDb2x1bW5zKGUpe2lmKHRoaXMuX2FjdGl2ZUJ1ZmZlci55PnRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b218fHRoaXMuX2FjdGl2ZUJ1ZmZlci55PHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3ApcmV0dXJuITA7Y29uc3QgdD1lLnBhcmFtc1swXXx8MTtmb3IobGV0IGU9dGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcDtlPD10aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tOysrZSl7Y29uc3QgaT10aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZStlKTtpLmRlbGV0ZUNlbGxzKHRoaXMuX2FjdGl2ZUJ1ZmZlci54LHQsdGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSkpLGkuaXNXcmFwcGVkPSExfXJldHVybiB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCx0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKSwhMH1lcmFzZUNoYXJzKGUpe3RoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7Y29uc3QgdD10aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSt0aGlzLl9hY3RpdmVCdWZmZXIueSk7cmV0dXJuIHQmJih0LnJlcGxhY2VDZWxscyh0aGlzLl9hY3RpdmVCdWZmZXIueCx0aGlzLl9hY3RpdmVCdWZmZXIueCsoZS5wYXJhbXNbMF18fDEpLHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKSx0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KSksITB9cmVwZWF0UHJlY2VkaW5nQ2hhcmFjdGVyKGUpe2NvbnN0IHQ9dGhpcy5fcGFyc2VyLnByZWNlZGluZ0pvaW5TdGF0ZTtpZighdClyZXR1cm4hMDtjb25zdCBpPWUucGFyYW1zWzBdfHwxLHM9cC5Vbmljb2RlU2VydmljZS5leHRyYWN0V2lkdGgodCkscj10aGlzLl9hY3RpdmVCdWZmZXIueC1zLG49dGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UrdGhpcy5fYWN0aXZlQnVmZmVyLnkpLmdldFN0cmluZyhyKSxvPW5ldyBVaW50MzJBcnJheShuLmxlbmd0aCppKTtsZXQgYT0wO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7KXtjb25zdCB0PW4uY29kZVBvaW50QXQoZSl8fDA7b1thKytdPXQsZSs9dD42NTUzNT8yOjF9bGV0IGg9YTtmb3IobGV0IGU9MTtlPGk7KytlKW8uY29weVdpdGhpbihoLDAsYSksaCs9YTtyZXR1cm4gdGhpcy5wcmludChvLDAsaCksITB9c2VuZERldmljZUF0dHJpYnV0ZXNQcmltYXJ5KGUpe3JldHVybiBlLnBhcmFtc1swXT4wfHwodGhpcy5faXMoXCJ4dGVybVwiKXx8dGhpcy5faXMoXCJyeHZ0LXVuaWNvZGVcIil8fHRoaXMuX2lzKFwic2NyZWVuXCIpP3RoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQobi5DMC5FU0MrXCJbPzE7MmNcIik6dGhpcy5faXMoXCJsaW51eFwiKSYmdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChuLkMwLkVTQytcIls/NmNcIikpLCEwfXNlbmREZXZpY2VBdHRyaWJ1dGVzU2Vjb25kYXJ5KGUpe3JldHVybiBlLnBhcmFtc1swXT4wfHwodGhpcy5faXMoXCJ4dGVybVwiKT90aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KG4uQzAuRVNDK1wiWz4wOzI3NjswY1wiKTp0aGlzLl9pcyhcInJ4dnQtdW5pY29kZVwiKT90aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KG4uQzAuRVNDK1wiWz44NTs5NTswY1wiKTp0aGlzLl9pcyhcImxpbnV4XCIpP3RoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoZS5wYXJhbXNbMF0rXCJjXCIpOnRoaXMuX2lzKFwic2NyZWVuXCIpJiZ0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KG4uQzAuRVNDK1wiWz44Mzs0MDAwMzswY1wiKSksITB9X2lzKGUpe3JldHVybiAwPT09KHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGVybU5hbWUrXCJcIikuaW5kZXhPZihlKX1zZXRNb2RlKGUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXN3aXRjaChlLnBhcmFtc1t0XSl7Y2FzZSA0OnRoaXMuX2NvcmVTZXJ2aWNlLm1vZGVzLmluc2VydE1vZGU9ITA7YnJlYWs7Y2FzZSAyMDp0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmNvbnZlcnRFb2w9ITB9cmV0dXJuITB9c2V0TW9kZVByaXZhdGUoZSl7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspc3dpdGNoKGUucGFyYW1zW3RdKXtjYXNlIDE6dGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uQ3Vyc29yS2V5cz0hMDticmVhaztjYXNlIDI6dGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0NoYXJzZXQoMCxvLkRFRkFVTFRfQ0hBUlNFVCksdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0NoYXJzZXQoMSxvLkRFRkFVTFRfQ0hBUlNFVCksdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0NoYXJzZXQoMixvLkRFRkFVTFRfQ0hBUlNFVCksdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0NoYXJzZXQoMyxvLkRFRkFVTFRfQ0hBUlNFVCk7YnJlYWs7Y2FzZSAzOnRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93T3B0aW9ucy5zZXRXaW5MaW5lcyYmKHRoaXMuX2J1ZmZlclNlcnZpY2UucmVzaXplKDEzMix0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpLHRoaXMuX29uUmVxdWVzdFJlc2V0LmZpcmUoKSk7YnJlYWs7Y2FzZSA2OnRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5vcmlnaW49ITAsdGhpcy5fc2V0Q3Vyc29yKDAsMCk7YnJlYWs7Y2FzZSA3OnRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy53cmFwYXJvdW5kPSEwO2JyZWFrO2Nhc2UgMTI6dGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5jdXJzb3JCbGluaz0hMDticmVhaztjYXNlIDQ1OnRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5yZXZlcnNlV3JhcGFyb3VuZD0hMDticmVhaztjYXNlIDY2OnRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoXCJTZXJpYWwgcG9ydCByZXF1ZXN0ZWQgYXBwbGljYXRpb24ga2V5cGFkLlwiKSx0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuYXBwbGljYXRpb25LZXlwYWQ9ITAsdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7YnJlYWs7Y2FzZSA5OnRoaXMuX2NvcmVNb3VzZVNlcnZpY2UuYWN0aXZlUHJvdG9jb2w9XCJYMTBcIjticmVhaztjYXNlIDFlMzp0aGlzLl9jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZVByb3RvY29sPVwiVlQyMDBcIjticmVhaztjYXNlIDEwMDI6dGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVQcm90b2NvbD1cIkRSQUdcIjticmVhaztjYXNlIDEwMDM6dGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVQcm90b2NvbD1cIkFOWVwiO2JyZWFrO2Nhc2UgMTAwNDp0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuc2VuZEZvY3VzPSEwLHRoaXMuX29uUmVxdWVzdFNlbmRGb2N1cy5maXJlKCk7YnJlYWs7Y2FzZSAxMDA1OnRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoXCJERUNTRVQgMTAwNSBub3Qgc3VwcG9ydGVkIChzZWUgIzI1MDcpXCIpO2JyZWFrO2Nhc2UgMTAwNjp0aGlzLl9jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZUVuY29kaW5nPVwiU0dSXCI7YnJlYWs7Y2FzZSAxMDE1OnRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoXCJERUNTRVQgMTAxNSBub3Qgc3VwcG9ydGVkIChzZWUgIzI1MDcpXCIpO2JyZWFrO2Nhc2UgMTAxNjp0aGlzLl9jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZUVuY29kaW5nPVwiU0dSX1BJWEVMU1wiO2JyZWFrO2Nhc2UgMjU6dGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JIaWRkZW49ITE7YnJlYWs7Y2FzZSAxMDQ4OnRoaXMuc2F2ZUN1cnNvcigpO2JyZWFrO2Nhc2UgMTA0OTp0aGlzLnNhdmVDdXJzb3IoKTtjYXNlIDQ3OmNhc2UgMTA0Nzp0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWN0aXZhdGVBbHRCdWZmZXIodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSx0aGlzLl9jb3JlU2VydmljZS5pc0N1cnNvckluaXRpYWxpemVkPSEwLHRoaXMuX29uUmVxdWVzdFJlZnJlc2hSb3dzLmZpcmUoMCx0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MtMSksdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7YnJlYWs7Y2FzZSAyMDA0OnRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5icmFja2V0ZWRQYXN0ZU1vZGU9ITB9cmV0dXJuITB9cmVzZXRNb2RlKGUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXN3aXRjaChlLnBhcmFtc1t0XSl7Y2FzZSA0OnRoaXMuX2NvcmVTZXJ2aWNlLm1vZGVzLmluc2VydE1vZGU9ITE7YnJlYWs7Y2FzZSAyMDp0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmNvbnZlcnRFb2w9ITF9cmV0dXJuITB9cmVzZXRNb2RlUHJpdmF0ZShlKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylzd2l0Y2goZS5wYXJhbXNbdF0pe2Nhc2UgMTp0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuYXBwbGljYXRpb25DdXJzb3JLZXlzPSExO2JyZWFrO2Nhc2UgMzp0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd09wdGlvbnMuc2V0V2luTGluZXMmJih0aGlzLl9idWZmZXJTZXJ2aWNlLnJlc2l6ZSg4MCx0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpLHRoaXMuX29uUmVxdWVzdFJlc2V0LmZpcmUoKSk7YnJlYWs7Y2FzZSA2OnRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5vcmlnaW49ITEsdGhpcy5fc2V0Q3Vyc29yKDAsMCk7YnJlYWs7Y2FzZSA3OnRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy53cmFwYXJvdW5kPSExO2JyZWFrO2Nhc2UgMTI6dGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5jdXJzb3JCbGluaz0hMTticmVhaztjYXNlIDQ1OnRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5yZXZlcnNlV3JhcGFyb3VuZD0hMTticmVhaztjYXNlIDY2OnRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoXCJTd2l0Y2hpbmcgYmFjayB0byBub3JtYWwga2V5cGFkLlwiKSx0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuYXBwbGljYXRpb25LZXlwYWQ9ITEsdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7YnJlYWs7Y2FzZSA5OmNhc2UgMWUzOmNhc2UgMTAwMjpjYXNlIDEwMDM6dGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVQcm90b2NvbD1cIk5PTkVcIjticmVhaztjYXNlIDEwMDQ6dGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLnNlbmRGb2N1cz0hMTticmVhaztjYXNlIDEwMDU6dGhpcy5fbG9nU2VydmljZS5kZWJ1ZyhcIkRFQ1JTVCAxMDA1IG5vdCBzdXBwb3J0ZWQgKHNlZSAjMjUwNylcIik7YnJlYWs7Y2FzZSAxMDA2OmNhc2UgMTAxNjp0aGlzLl9jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZUVuY29kaW5nPVwiREVGQVVMVFwiO2JyZWFrO2Nhc2UgMTAxNTp0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKFwiREVDUlNUIDEwMTUgbm90IHN1cHBvcnRlZCAoc2VlICMyNTA3KVwiKTticmVhaztjYXNlIDI1OnRoaXMuX2NvcmVTZXJ2aWNlLmlzQ3Vyc29ySGlkZGVuPSEwO2JyZWFrO2Nhc2UgMTA0ODp0aGlzLnJlc3RvcmVDdXJzb3IoKTticmVhaztjYXNlIDEwNDk6Y2FzZSA0NzpjYXNlIDEwNDc6dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2YXRlTm9ybWFsQnVmZmVyKCksMTA0OT09PWUucGFyYW1zW3RdJiZ0aGlzLnJlc3RvcmVDdXJzb3IoKSx0aGlzLl9jb3JlU2VydmljZS5pc0N1cnNvckluaXRpYWxpemVkPSEwLHRoaXMuX29uUmVxdWVzdFJlZnJlc2hSb3dzLmZpcmUoMCx0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MtMSksdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7YnJlYWs7Y2FzZSAyMDA0OnRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5icmFja2V0ZWRQYXN0ZU1vZGU9ITF9cmV0dXJuITB9cmVxdWVzdE1vZGUoZSx0KXtjb25zdCBpPXRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcyx7YWN0aXZlUHJvdG9jb2w6cyxhY3RpdmVFbmNvZGluZzpyfT10aGlzLl9jb3JlTW91c2VTZXJ2aWNlLG89dGhpcy5fY29yZVNlcnZpY2Use2J1ZmZlcnM6YSxjb2xzOmh9PXRoaXMuX2J1ZmZlclNlcnZpY2Use2FjdGl2ZTpjLGFsdDpsfT1hLGQ9dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucyxfPWU9PmU/MToyLHU9ZS5wYXJhbXNbMF07cmV0dXJuIGY9dSx2PXQ/Mj09PXU/NDo0PT09dT9fKG8ubW9kZXMuaW5zZXJ0TW9kZSk6MTI9PT11PzM6MjA9PT11P18oZC5jb252ZXJ0RW9sKTowOjE9PT11P18oaS5hcHBsaWNhdGlvbkN1cnNvcktleXMpOjM9PT11P2Qud2luZG93T3B0aW9ucy5zZXRXaW5MaW5lcz84MD09PWg/MjoxMzI9PT1oPzE6MDowOjY9PT11P18oaS5vcmlnaW4pOjc9PT11P18oaS53cmFwYXJvdW5kKTo4PT09dT8zOjk9PT11P18oXCJYMTBcIj09PXMpOjEyPT09dT9fKGQuY3Vyc29yQmxpbmspOjI1PT09dT9fKCFvLmlzQ3Vyc29ySGlkZGVuKTo0NT09PXU/XyhpLnJldmVyc2VXcmFwYXJvdW5kKTo2Nj09PXU/XyhpLmFwcGxpY2F0aW9uS2V5cGFkKTo2Nz09PXU/NDoxZTM9PT11P18oXCJWVDIwMFwiPT09cyk6MTAwMj09PXU/XyhcIkRSQUdcIj09PXMpOjEwMDM9PT11P18oXCJBTllcIj09PXMpOjEwMDQ9PT11P18oaS5zZW5kRm9jdXMpOjEwMDU9PT11PzQ6MTAwNj09PXU/XyhcIlNHUlwiPT09cik6MTAxNT09PXU/NDoxMDE2PT09dT9fKFwiU0dSX1BJWEVMU1wiPT09cik6MTA0OD09PXU/MTo0Nz09PXV8fDEwNDc9PT11fHwxMDQ5PT09dT9fKGM9PT1sKToyMDA0PT09dT9fKGkuYnJhY2tldGVkUGFzdGVNb2RlKTowLG8udHJpZ2dlckRhdGFFdmVudChgJHtuLkMwLkVTQ31bJHt0P1wiXCI6XCI/XCJ9JHtmfTske3Z9JHlgKSwhMDt2YXIgZix2fV91cGRhdGVBdHRyQ29sb3IoZSx0LGkscyxyKXtyZXR1cm4gMj09PXQ/KGV8PTUwMzMxNjQ4LGUmPS0xNjc3NzIxNixlfD1mLkF0dHJpYnV0ZURhdGEuZnJvbUNvbG9yUkdCKFtpLHMscl0pKTo1PT09dCYmKGUmPS01MDMzMTkwNCxlfD0zMzU1NDQzMnwyNTUmaSksZX1fZXh0cmFjdENvbG9yKGUsdCxpKXtjb25zdCBzPVswLDAsLTEsMCwwLDBdO2xldCByPTAsbj0wO2Rve2lmKHNbbityXT1lLnBhcmFtc1t0K25dLGUuaGFzU3ViUGFyYW1zKHQrbikpe2NvbnN0IGk9ZS5nZXRTdWJQYXJhbXModCtuKTtsZXQgbz0wO2RvezU9PT1zWzFdJiYocj0xKSxzW24rbysxK3JdPWlbb119d2hpbGUoKytvPGkubGVuZ3RoJiZvK24rMStyPHMubGVuZ3RoKTticmVha31pZig1PT09c1sxXSYmbityPj0yfHwyPT09c1sxXSYmbityPj01KWJyZWFrO3NbMV0mJihyPTEpfXdoaWxlKCsrbit0PGUubGVuZ3RoJiZuK3I8cy5sZW5ndGgpO2ZvcihsZXQgZT0yO2U8cy5sZW5ndGg7KytlKS0xPT09c1tlXSYmKHNbZV09MCk7c3dpdGNoKHNbMF0pe2Nhc2UgMzg6aS5mZz10aGlzLl91cGRhdGVBdHRyQ29sb3IoaS5mZyxzWzFdLHNbM10sc1s0XSxzWzVdKTticmVhaztjYXNlIDQ4OmkuYmc9dGhpcy5fdXBkYXRlQXR0ckNvbG9yKGkuYmcsc1sxXSxzWzNdLHNbNF0sc1s1XSk7YnJlYWs7Y2FzZSA1ODppLmV4dGVuZGVkPWkuZXh0ZW5kZWQuY2xvbmUoKSxpLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yPXRoaXMuX3VwZGF0ZUF0dHJDb2xvcihpLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yLHNbMV0sc1szXSxzWzRdLHNbNV0pfXJldHVybiBufV9wcm9jZXNzVW5kZXJsaW5lKGUsdCl7dC5leHRlbmRlZD10LmV4dGVuZGVkLmNsb25lKCksKCF+ZXx8ZT41KSYmKGU9MSksdC5leHRlbmRlZC51bmRlcmxpbmVTdHlsZT1lLHQuZmd8PTI2ODQzNTQ1NiwwPT09ZSYmKHQuZmcmPS0yNjg0MzU0NTcpLHQudXBkYXRlRXh0ZW5kZWQoKX1fcHJvY2Vzc1NHUjAoZSl7ZS5mZz1sLkRFRkFVTFRfQVRUUl9EQVRBLmZnLGUuYmc9bC5ERUZBVUxUX0FUVFJfREFUQS5iZyxlLmV4dGVuZGVkPWUuZXh0ZW5kZWQuY2xvbmUoKSxlLmV4dGVuZGVkLnVuZGVybGluZVN0eWxlPTAsZS5leHRlbmRlZC51bmRlcmxpbmVDb2xvciY9LTY3MTA4ODY0LGUudXBkYXRlRXh0ZW5kZWQoKX1jaGFyQXR0cmlidXRlcyhlKXtpZigxPT09ZS5sZW5ndGgmJjA9PT1lLnBhcmFtc1swXSlyZXR1cm4gdGhpcy5fcHJvY2Vzc1NHUjAodGhpcy5fY3VyQXR0ckRhdGEpLCEwO2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IGk7Y29uc3Qgcz10aGlzLl9jdXJBdHRyRGF0YTtmb3IobGV0IHI9MDtyPHQ7cisrKWk9ZS5wYXJhbXNbcl0saT49MzAmJmk8PTM3PyhzLmZnJj0tNTAzMzE5MDQscy5mZ3w9MTY3NzcyMTZ8aS0zMCk6aT49NDAmJmk8PTQ3PyhzLmJnJj0tNTAzMzE5MDQscy5iZ3w9MTY3NzcyMTZ8aS00MCk6aT49OTAmJmk8PTk3PyhzLmZnJj0tNTAzMzE5MDQscy5mZ3w9MTY3NzcyMjR8aS05MCk6aT49MTAwJiZpPD0xMDc/KHMuYmcmPS01MDMzMTkwNCxzLmJnfD0xNjc3NzIyNHxpLTEwMCk6MD09PWk/dGhpcy5fcHJvY2Vzc1NHUjAocyk6MT09PWk/cy5mZ3w9MTM0MjE3NzI4OjM9PT1pP3MuYmd8PTY3MTA4ODY0OjQ9PT1pPyhzLmZnfD0yNjg0MzU0NTYsdGhpcy5fcHJvY2Vzc1VuZGVybGluZShlLmhhc1N1YlBhcmFtcyhyKT9lLmdldFN1YlBhcmFtcyhyKVswXToxLHMpKTo1PT09aT9zLmZnfD01MzY4NzA5MTI6Nz09PWk/cy5mZ3w9NjcxMDg4NjQ6OD09PWk/cy5mZ3w9MTA3Mzc0MTgyNDo5PT09aT9zLmZnfD0yMTQ3NDgzNjQ4OjI9PT1pP3MuYmd8PTEzNDIxNzcyODoyMT09PWk/dGhpcy5fcHJvY2Vzc1VuZGVybGluZSgyLHMpOjIyPT09aT8ocy5mZyY9LTEzNDIxNzcyOSxzLmJnJj0tMTM0MjE3NzI5KToyMz09PWk/cy5iZyY9LTY3MTA4ODY1OjI0PT09aT8ocy5mZyY9LTI2ODQzNTQ1Nyx0aGlzLl9wcm9jZXNzVW5kZXJsaW5lKDAscykpOjI1PT09aT9zLmZnJj0tNTM2ODcwOTEzOjI3PT09aT9zLmZnJj0tNjcxMDg4NjU6Mjg9PT1pP3MuZmcmPS0xMDczNzQxODI1OjI5PT09aT9zLmZnJj0yMTQ3NDgzNjQ3OjM5PT09aT8ocy5mZyY9LTY3MTA4ODY0LHMuZmd8PTE2Nzc3MjE1JmwuREVGQVVMVF9BVFRSX0RBVEEuZmcpOjQ5PT09aT8ocy5iZyY9LTY3MTA4ODY0LHMuYmd8PTE2Nzc3MjE1JmwuREVGQVVMVF9BVFRSX0RBVEEuYmcpOjM4PT09aXx8NDg9PT1pfHw1OD09PWk/cis9dGhpcy5fZXh0cmFjdENvbG9yKGUscixzKTo1Mz09PWk/cy5iZ3w9MTA3Mzc0MTgyNDo1NT09PWk/cy5iZyY9LTEwNzM3NDE4MjU6NTk9PT1pPyhzLmV4dGVuZGVkPXMuZXh0ZW5kZWQuY2xvbmUoKSxzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yPS0xLHMudXBkYXRlRXh0ZW5kZWQoKSk6MTAwPT09aT8ocy5mZyY9LTY3MTA4ODY0LHMuZmd8PTE2Nzc3MjE1JmwuREVGQVVMVF9BVFRSX0RBVEEuZmcscy5iZyY9LTY3MTA4ODY0LHMuYmd8PTE2Nzc3MjE1JmwuREVGQVVMVF9BVFRSX0RBVEEuYmcpOnRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoXCJVbmtub3duIFNHUiBhdHRyaWJ1dGU6ICVkLlwiLGkpO3JldHVybiEwfWRldmljZVN0YXR1cyhlKXtzd2l0Y2goZS5wYXJhbXNbMF0pe2Nhc2UgNTp0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGAke24uQzAuRVNDfVswbmApO2JyZWFrO2Nhc2UgNjpjb25zdCBlPXRoaXMuX2FjdGl2ZUJ1ZmZlci55KzEsdD10aGlzLl9hY3RpdmVCdWZmZXIueCsxO3RoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7bi5DMC5FU0N9WyR7ZX07JHt0fVJgKX1yZXR1cm4hMH1kZXZpY2VTdGF0dXNQcml2YXRlKGUpe2lmKDY9PT1lLnBhcmFtc1swXSl7Y29uc3QgZT10aGlzLl9hY3RpdmVCdWZmZXIueSsxLHQ9dGhpcy5fYWN0aXZlQnVmZmVyLngrMTt0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGAke24uQzAuRVNDfVs/JHtlfTske3R9UmApfXJldHVybiEwfXNvZnRSZXNldChlKXtyZXR1cm4gdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JIaWRkZW49ITEsdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCksdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcD0wLHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b209dGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLTEsdGhpcy5fY3VyQXR0ckRhdGE9bC5ERUZBVUxUX0FUVFJfREFUQS5jbG9uZSgpLHRoaXMuX2NvcmVTZXJ2aWNlLnJlc2V0KCksdGhpcy5fY2hhcnNldFNlcnZpY2UucmVzZXQoKSx0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRYPTAsdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkWT10aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UsdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkQ3VyQXR0ckRhdGEuZmc9dGhpcy5fY3VyQXR0ckRhdGEuZmcsdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkQ3VyQXR0ckRhdGEuYmc9dGhpcy5fY3VyQXR0ckRhdGEuYmcsdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkQ2hhcnNldD10aGlzLl9jaGFyc2V0U2VydmljZS5jaGFyc2V0LHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5vcmlnaW49ITEsITB9c2V0Q3Vyc29yU3R5bGUoZSl7Y29uc3QgdD1lLnBhcmFtc1swXXx8MTtzd2l0Y2godCl7Y2FzZSAxOmNhc2UgMjp0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmN1cnNvclN0eWxlPVwiYmxvY2tcIjticmVhaztjYXNlIDM6Y2FzZSA0OnRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMuY3Vyc29yU3R5bGU9XCJ1bmRlcmxpbmVcIjticmVhaztjYXNlIDU6Y2FzZSA2OnRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMuY3Vyc29yU3R5bGU9XCJiYXJcIn1jb25zdCBpPXQlMj09MTtyZXR1cm4gdGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5jdXJzb3JCbGluaz1pLCEwfXNldFNjcm9sbFJlZ2lvbihlKXtjb25zdCB0PWUucGFyYW1zWzBdfHwxO2xldCBpO3JldHVybihlLmxlbmd0aDwyfHwoaT1lLnBhcmFtc1sxXSk+dGhpcy5fYnVmZmVyU2VydmljZS5yb3dzfHwwPT09aSkmJihpPXRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyksaT50JiYodGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcD10LTEsdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbT1pLTEsdGhpcy5fc2V0Q3Vyc29yKDAsMCkpLCEwfXdpbmRvd09wdGlvbnMoZSl7aWYoIXcoZS5wYXJhbXNbMF0sdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dPcHRpb25zKSlyZXR1cm4hMDtjb25zdCB0PWUubGVuZ3RoPjE/ZS5wYXJhbXNbMV06MDtzd2l0Y2goZS5wYXJhbXNbMF0pe2Nhc2UgMTQ6MiE9PXQmJnRoaXMuX29uUmVxdWVzdFdpbmRvd3NPcHRpb25zUmVwb3J0LmZpcmUoeS5HRVRfV0lOX1NJWkVfUElYRUxTKTticmVhaztjYXNlIDE2OnRoaXMuX29uUmVxdWVzdFdpbmRvd3NPcHRpb25zUmVwb3J0LmZpcmUoeS5HRVRfQ0VMTF9TSVpFX1BJWEVMUyk7YnJlYWs7Y2FzZSAxODp0aGlzLl9idWZmZXJTZXJ2aWNlJiZ0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGAke24uQzAuRVNDfVs4OyR7dGhpcy5fYnVmZmVyU2VydmljZS5yb3dzfTske3RoaXMuX2J1ZmZlclNlcnZpY2UuY29sc310YCk7YnJlYWs7Y2FzZSAyMjowIT09dCYmMiE9PXR8fCh0aGlzLl93aW5kb3dUaXRsZVN0YWNrLnB1c2godGhpcy5fd2luZG93VGl0bGUpLHRoaXMuX3dpbmRvd1RpdGxlU3RhY2subGVuZ3RoPjEwJiZ0aGlzLl93aW5kb3dUaXRsZVN0YWNrLnNoaWZ0KCkpLDAhPT10JiYxIT09dHx8KHRoaXMuX2ljb25OYW1lU3RhY2sucHVzaCh0aGlzLl9pY29uTmFtZSksdGhpcy5faWNvbk5hbWVTdGFjay5sZW5ndGg+MTAmJnRoaXMuX2ljb25OYW1lU3RhY2suc2hpZnQoKSk7YnJlYWs7Y2FzZSAyMzowIT09dCYmMiE9PXR8fHRoaXMuX3dpbmRvd1RpdGxlU3RhY2subGVuZ3RoJiZ0aGlzLnNldFRpdGxlKHRoaXMuX3dpbmRvd1RpdGxlU3RhY2sucG9wKCkpLDAhPT10JiYxIT09dHx8dGhpcy5faWNvbk5hbWVTdGFjay5sZW5ndGgmJnRoaXMuc2V0SWNvbk5hbWUodGhpcy5faWNvbk5hbWVTdGFjay5wb3AoKSl9cmV0dXJuITB9c2F2ZUN1cnNvcihlKXtyZXR1cm4gdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkWD10aGlzLl9hY3RpdmVCdWZmZXIueCx0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRZPXRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSt0aGlzLl9hY3RpdmVCdWZmZXIueSx0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDdXJBdHRyRGF0YS5mZz10aGlzLl9jdXJBdHRyRGF0YS5mZyx0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDdXJBdHRyRGF0YS5iZz10aGlzLl9jdXJBdHRyRGF0YS5iZyx0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDaGFyc2V0PXRoaXMuX2NoYXJzZXRTZXJ2aWNlLmNoYXJzZXQsITB9cmVzdG9yZUN1cnNvcihlKXtyZXR1cm4gdGhpcy5fYWN0aXZlQnVmZmVyLng9dGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkWHx8MCx0aGlzLl9hY3RpdmVCdWZmZXIueT1NYXRoLm1heCh0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRZLXRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSwwKSx0aGlzLl9jdXJBdHRyRGF0YS5mZz10aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDdXJBdHRyRGF0YS5mZyx0aGlzLl9jdXJBdHRyRGF0YS5iZz10aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDdXJBdHRyRGF0YS5iZyx0aGlzLl9jaGFyc2V0U2VydmljZS5jaGFyc2V0PXRoaXMuX3NhdmVkQ2hhcnNldCx0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDaGFyc2V0JiYodGhpcy5fY2hhcnNldFNlcnZpY2UuY2hhcnNldD10aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDaGFyc2V0KSx0aGlzLl9yZXN0cmljdEN1cnNvcigpLCEwfXNldFRpdGxlKGUpe3JldHVybiB0aGlzLl93aW5kb3dUaXRsZT1lLHRoaXMuX29uVGl0bGVDaGFuZ2UuZmlyZShlKSwhMH1zZXRJY29uTmFtZShlKXtyZXR1cm4gdGhpcy5faWNvbk5hbWU9ZSwhMH1zZXRPclJlcG9ydEluZGV4ZWRDb2xvcihlKXtjb25zdCB0PVtdLGk9ZS5zcGxpdChcIjtcIik7Zm9yKDtpLmxlbmd0aD4xOyl7Y29uc3QgZT1pLnNoaWZ0KCkscz1pLnNoaWZ0KCk7aWYoL15cXGQrJC8uZXhlYyhlKSl7Y29uc3QgaT1wYXJzZUludChlKTtpZihEKGkpKWlmKFwiP1wiPT09cyl0LnB1c2goe3R5cGU6MCxpbmRleDppfSk7ZWxzZXtjb25zdCBlPSgwLFMucGFyc2VDb2xvcikocyk7ZSYmdC5wdXNoKHt0eXBlOjEsaW5kZXg6aSxjb2xvcjplfSl9fX1yZXR1cm4gdC5sZW5ndGgmJnRoaXMuX29uQ29sb3IuZmlyZSh0KSwhMH1zZXRIeXBlcmxpbmsoZSl7Y29uc3QgdD1lLnNwbGl0KFwiO1wiKTtyZXR1cm4hKHQubGVuZ3RoPDIpJiYodFsxXT90aGlzLl9jcmVhdGVIeXBlcmxpbmsodFswXSx0WzFdKTohdFswXSYmdGhpcy5fZmluaXNoSHlwZXJsaW5rKCkpfV9jcmVhdGVIeXBlcmxpbmsoZSx0KXt0aGlzLl9nZXRDdXJyZW50TGlua0lkKCkmJnRoaXMuX2ZpbmlzaEh5cGVybGluaygpO2NvbnN0IGk9ZS5zcGxpdChcIjpcIik7bGV0IHM7Y29uc3Qgcj1pLmZpbmRJbmRleCgoZT0+ZS5zdGFydHNXaXRoKFwiaWQ9XCIpKSk7cmV0dXJuLTEhPT1yJiYocz1pW3JdLnNsaWNlKDMpfHx2b2lkIDApLHRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkPXRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkLmNsb25lKCksdGhpcy5fY3VyQXR0ckRhdGEuZXh0ZW5kZWQudXJsSWQ9dGhpcy5fb3NjTGlua1NlcnZpY2UucmVnaXN0ZXJMaW5rKHtpZDpzLHVyaTp0fSksdGhpcy5fY3VyQXR0ckRhdGEudXBkYXRlRXh0ZW5kZWQoKSwhMH1fZmluaXNoSHlwZXJsaW5rKCl7cmV0dXJuIHRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkPXRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkLmNsb25lKCksdGhpcy5fY3VyQXR0ckRhdGEuZXh0ZW5kZWQudXJsSWQ9MCx0aGlzLl9jdXJBdHRyRGF0YS51cGRhdGVFeHRlbmRlZCgpLCEwfV9zZXRPclJlcG9ydFNwZWNpYWxDb2xvcihlLHQpe2NvbnN0IGk9ZS5zcGxpdChcIjtcIik7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aCYmISh0Pj10aGlzLl9zcGVjaWFsQ29sb3JzLmxlbmd0aCk7KytlLCsrdClpZihcIj9cIj09PWlbZV0pdGhpcy5fb25Db2xvci5maXJlKFt7dHlwZTowLGluZGV4OnRoaXMuX3NwZWNpYWxDb2xvcnNbdF19XSk7ZWxzZXtjb25zdCBzPSgwLFMucGFyc2VDb2xvcikoaVtlXSk7cyYmdGhpcy5fb25Db2xvci5maXJlKFt7dHlwZToxLGluZGV4OnRoaXMuX3NwZWNpYWxDb2xvcnNbdF0sY29sb3I6c31dKX1yZXR1cm4hMH1zZXRPclJlcG9ydEZnQ29sb3IoZSl7cmV0dXJuIHRoaXMuX3NldE9yUmVwb3J0U3BlY2lhbENvbG9yKGUsMCl9c2V0T3JSZXBvcnRCZ0NvbG9yKGUpe3JldHVybiB0aGlzLl9zZXRPclJlcG9ydFNwZWNpYWxDb2xvcihlLDEpfXNldE9yUmVwb3J0Q3Vyc29yQ29sb3IoZSl7cmV0dXJuIHRoaXMuX3NldE9yUmVwb3J0U3BlY2lhbENvbG9yKGUsMil9cmVzdG9yZUluZGV4ZWRDb2xvcihlKXtpZighZSlyZXR1cm4gdGhpcy5fb25Db2xvci5maXJlKFt7dHlwZToyfV0pLCEwO2NvbnN0IHQ9W10saT1lLnNwbGl0KFwiO1wiKTtmb3IobGV0IGU9MDtlPGkubGVuZ3RoOysrZSlpZigvXlxcZCskLy5leGVjKGlbZV0pKXtjb25zdCBzPXBhcnNlSW50KGlbZV0pO0QocykmJnQucHVzaCh7dHlwZToyLGluZGV4OnN9KX1yZXR1cm4gdC5sZW5ndGgmJnRoaXMuX29uQ29sb3IuZmlyZSh0KSwhMH1yZXN0b3JlRmdDb2xvcihlKXtyZXR1cm4gdGhpcy5fb25Db2xvci5maXJlKFt7dHlwZToyLGluZGV4OjI1Nn1dKSwhMH1yZXN0b3JlQmdDb2xvcihlKXtyZXR1cm4gdGhpcy5fb25Db2xvci5maXJlKFt7dHlwZToyLGluZGV4OjI1N31dKSwhMH1yZXN0b3JlQ3Vyc29yQ29sb3IoZSl7cmV0dXJuIHRoaXMuX29uQ29sb3IuZmlyZShbe3R5cGU6MixpbmRleDoyNTh9XSksITB9bmV4dExpbmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlQnVmZmVyLng9MCx0aGlzLmluZGV4KCksITB9a2V5cGFkQXBwbGljYXRpb25Nb2RlKCl7cmV0dXJuIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoXCJTZXJpYWwgcG9ydCByZXF1ZXN0ZWQgYXBwbGljYXRpb24ga2V5cGFkLlwiKSx0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuYXBwbGljYXRpb25LZXlwYWQ9ITAsdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCksITB9a2V5cGFkTnVtZXJpY01vZGUoKXtyZXR1cm4gdGhpcy5fbG9nU2VydmljZS5kZWJ1ZyhcIlN3aXRjaGluZyBiYWNrIHRvIG5vcm1hbCBrZXlwYWQuXCIpLHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbktleXBhZD0hMSx0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmZpcmUoKSwhMH1zZWxlY3REZWZhdWx0Q2hhcnNldCgpe3JldHVybiB0aGlzLl9jaGFyc2V0U2VydmljZS5zZXRnTGV2ZWwoMCksdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0NoYXJzZXQoMCxvLkRFRkFVTFRfQ0hBUlNFVCksITB9c2VsZWN0Q2hhcnNldChlKXtyZXR1cm4gMiE9PWUubGVuZ3RoPyh0aGlzLnNlbGVjdERlZmF1bHRDaGFyc2V0KCksITApOihcIi9cIj09PWVbMF18fHRoaXMuX2NoYXJzZXRTZXJ2aWNlLnNldGdDaGFyc2V0KENbZVswXV0sby5DSEFSU0VUU1tlWzFdXXx8by5ERUZBVUxUX0NIQVJTRVQpLCEwKX1pbmRleCgpe3JldHVybiB0aGlzLl9yZXN0cmljdEN1cnNvcigpLHRoaXMuX2FjdGl2ZUJ1ZmZlci55KyssdGhpcy5fYWN0aXZlQnVmZmVyLnk9PT10aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKzE/KHRoaXMuX2FjdGl2ZUJ1ZmZlci55LS0sdGhpcy5fYnVmZmVyU2VydmljZS5zY3JvbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSk6dGhpcy5fYWN0aXZlQnVmZmVyLnk+PXRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyYmKHRoaXMuX2FjdGl2ZUJ1ZmZlci55PXRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cy0xKSx0aGlzLl9yZXN0cmljdEN1cnNvcigpLCEwfXRhYlNldCgpe3JldHVybiB0aGlzLl9hY3RpdmVCdWZmZXIudGFic1t0aGlzLl9hY3RpdmVCdWZmZXIueF09ITAsITB9cmV2ZXJzZUluZGV4KCl7aWYodGhpcy5fcmVzdHJpY3RDdXJzb3IoKSx0aGlzLl9hY3RpdmVCdWZmZXIueT09PXRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3Ape2NvbnN0IGU9dGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbS10aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wO3RoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5zaGlmdEVsZW1lbnRzKHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSt0aGlzLl9hY3RpdmVCdWZmZXIueSxlLDEpLHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5zZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlK3RoaXMuX2FjdGl2ZUJ1ZmZlci55LHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXRCbGFua0xpbmUodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSksdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSl9ZWxzZSB0aGlzLl9hY3RpdmVCdWZmZXIueS0tLHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7cmV0dXJuITB9ZnVsbFJlc2V0KCl7cmV0dXJuIHRoaXMuX3BhcnNlci5yZXNldCgpLHRoaXMuX29uUmVxdWVzdFJlc2V0LmZpcmUoKSwhMH1yZXNldCgpe3RoaXMuX2N1ckF0dHJEYXRhPWwuREVGQVVMVF9BVFRSX0RBVEEuY2xvbmUoKSx0aGlzLl9lcmFzZUF0dHJEYXRhSW50ZXJuYWw9bC5ERUZBVUxUX0FUVFJfREFUQS5jbG9uZSgpfV9lcmFzZUF0dHJEYXRhKCl7cmV0dXJuIHRoaXMuX2VyYXNlQXR0ckRhdGFJbnRlcm5hbC5iZyY9LTY3MTA4ODY0LHRoaXMuX2VyYXNlQXR0ckRhdGFJbnRlcm5hbC5iZ3w9NjcxMDg4NjMmdGhpcy5fY3VyQXR0ckRhdGEuYmcsdGhpcy5fZXJhc2VBdHRyRGF0YUludGVybmFsfXNldGdMZXZlbChlKXtyZXR1cm4gdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0xldmVsKGUpLCEwfXNjcmVlbkFsaWdubWVudFBhdHRlcm4oKXtjb25zdCBlPW5ldyB1LkNlbGxEYXRhO2UuY29udGVudD0xPDwyMnxcIkVcIi5jaGFyQ29kZUF0KDApLGUuZmc9dGhpcy5fY3VyQXR0ckRhdGEuZmcsZS5iZz10aGlzLl9jdXJBdHRyRGF0YS5iZyx0aGlzLl9zZXRDdXJzb3IoMCwwKTtmb3IobGV0IHQ9MDt0PHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93czsrK3Qpe2NvbnN0IGk9dGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlK3RoaXMuX2FjdGl2ZUJ1ZmZlci55K3Qscz10aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KGkpO3MmJihzLmZpbGwoZSkscy5pc1dyYXBwZWQ9ITEpfXJldHVybiB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0FsbERpcnR5KCksdGhpcy5fc2V0Q3Vyc29yKDAsMCksITB9cmVxdWVzdFN0YXR1c1N0cmluZyhlLHQpe2NvbnN0IGk9dGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIscz10aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zO3JldHVybihlPT4odGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChgJHtuLkMwLkVTQ30ke2V9JHtuLkMwLkVTQ31cXFxcYCksITApKSgnXCJxJz09PWU/YFAxJHIke3RoaXMuX2N1ckF0dHJEYXRhLmlzUHJvdGVjdGVkKCk/MTowfVwicWA6J1wicCc9PT1lPydQMSRyNjE7MVwicCc6XCJyXCI9PT1lP2BQMSRyJHtpLnNjcm9sbFRvcCsxfTske2kuc2Nyb2xsQm90dG9tKzF9cmA6XCJtXCI9PT1lP1wiUDEkcjBtXCI6XCIgcVwiPT09ZT9gUDEkciR7e2Jsb2NrOjIsdW5kZXJsaW5lOjQsYmFyOjZ9W3MuY3Vyc29yU3R5bGVdLShzLmN1cnNvckJsaW5rPzE6MCl9IHFgOlwiUDAkclwiKX1tYXJrUmFuZ2VEaXJ0eShlLHQpe3RoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eShlLHQpfX10LklucHV0SGFuZGxlcj1rO2xldCBMPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX2J1ZmZlclNlcnZpY2U9ZSx0aGlzLmNsZWFyUmFuZ2UoKX1jbGVhclJhbmdlKCl7dGhpcy5zdGFydD10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55LHRoaXMuZW5kPXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnl9bWFya0RpcnR5KGUpe2U8dGhpcy5zdGFydD90aGlzLnN0YXJ0PWU6ZT50aGlzLmVuZCYmKHRoaXMuZW5kPWUpfW1hcmtSYW5nZURpcnR5KGUsdCl7ZT50JiYoRT1lLGU9dCx0PUUpLGU8dGhpcy5zdGFydCYmKHRoaXMuc3RhcnQ9ZSksdD50aGlzLmVuZCYmKHRoaXMuZW5kPXQpfW1hcmtBbGxEaXJ0eSgpe3RoaXMubWFya1JhbmdlRGlydHkoMCx0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MtMSl9fTtmdW5jdGlvbiBEKGUpe3JldHVybiAwPD1lJiZlPDI1Nn1MPXMoW3IoMCx2LklCdWZmZXJTZXJ2aWNlKV0sTCl9LDg0NDooZSx0KT0+e2Z1bmN0aW9uIGkoZSl7Zm9yKGNvbnN0IHQgb2YgZSl0LmRpc3Bvc2UoKTtlLmxlbmd0aD0wfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZT10LmRpc3Bvc2VBcnJheT10LnRvRGlzcG9zYWJsZT10Lk11dGFibGVEaXNwb3NhYmxlPXQuRGlzcG9zYWJsZT12b2lkIDAsdC5EaXNwb3NhYmxlPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fZGlzcG9zYWJsZXM9W10sdGhpcy5faXNEaXNwb3NlZD0hMX1kaXNwb3NlKCl7dGhpcy5faXNEaXNwb3NlZD0hMDtmb3IoY29uc3QgZSBvZiB0aGlzLl9kaXNwb3NhYmxlcyllLmRpc3Bvc2UoKTt0aGlzLl9kaXNwb3NhYmxlcy5sZW5ndGg9MH1yZWdpc3RlcihlKXtyZXR1cm4gdGhpcy5fZGlzcG9zYWJsZXMucHVzaChlKSxlfXVucmVnaXN0ZXIoZSl7Y29uc3QgdD10aGlzLl9kaXNwb3NhYmxlcy5pbmRleE9mKGUpOy0xIT09dCYmdGhpcy5fZGlzcG9zYWJsZXMuc3BsaWNlKHQsMSl9fSx0Lk11dGFibGVEaXNwb3NhYmxlPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5faXNEaXNwb3NlZD0hMX1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5faXNEaXNwb3NlZD92b2lkIDA6dGhpcy5fdmFsdWV9c2V0IHZhbHVlKGUpe3RoaXMuX2lzRGlzcG9zZWR8fGU9PT10aGlzLl92YWx1ZXx8KHRoaXMuX3ZhbHVlPy5kaXNwb3NlKCksdGhpcy5fdmFsdWU9ZSl9Y2xlYXIoKXt0aGlzLnZhbHVlPXZvaWQgMH1kaXNwb3NlKCl7dGhpcy5faXNEaXNwb3NlZD0hMCx0aGlzLl92YWx1ZT8uZGlzcG9zZSgpLHRoaXMuX3ZhbHVlPXZvaWQgMH19LHQudG9EaXNwb3NhYmxlPWZ1bmN0aW9uKGUpe3JldHVybntkaXNwb3NlOmV9fSx0LmRpc3Bvc2VBcnJheT1pLHQuZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZT1mdW5jdGlvbihlKXtyZXR1cm57ZGlzcG9zZTooKT0+aShlKX19fSwxNTA1OihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5Gb3VyS2V5TWFwPXQuVHdvS2V5TWFwPXZvaWQgMDtjbGFzcyBpe2NvbnN0cnVjdG9yKCl7dGhpcy5fZGF0YT17fX1zZXQoZSx0LGkpe3RoaXMuX2RhdGFbZV18fCh0aGlzLl9kYXRhW2VdPXt9KSx0aGlzLl9kYXRhW2VdW3RdPWl9Z2V0KGUsdCl7cmV0dXJuIHRoaXMuX2RhdGFbZV0/dGhpcy5fZGF0YVtlXVt0XTp2b2lkIDB9Y2xlYXIoKXt0aGlzLl9kYXRhPXt9fX10LlR3b0tleU1hcD1pLHQuRm91cktleU1hcD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2RhdGE9bmV3IGl9c2V0KGUsdCxzLHIsbil7dGhpcy5fZGF0YS5nZXQoZSx0KXx8dGhpcy5fZGF0YS5zZXQoZSx0LG5ldyBpKSx0aGlzLl9kYXRhLmdldChlLHQpLnNldChzLHIsbil9Z2V0KGUsdCxpLHMpe3JldHVybiB0aGlzLl9kYXRhLmdldChlLHQpPy5nZXQoaSxzKX1jbGVhcigpe3RoaXMuX2RhdGEuY2xlYXIoKX19fSw2MTE0OihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5pc0Nocm9tZU9TPXQuaXNMaW51eD10LmlzV2luZG93cz10LmlzSXBob25lPXQuaXNJcGFkPXQuaXNNYWM9dC5nZXRTYWZhcmlWZXJzaW9uPXQuaXNTYWZhcmk9dC5pc0xlZ2FjeUVkZ2U9dC5pc0ZpcmVmb3g9dC5pc05vZGU9dm9pZCAwLHQuaXNOb2RlPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBwcm9jZXNzJiZcInRpdGxlXCJpbiBwcm9jZXNzO2NvbnN0IGk9dC5pc05vZGU/XCJub2RlXCI6bmF2aWdhdG9yLnVzZXJBZ2VudCxzPXQuaXNOb2RlP1wibm9kZVwiOm5hdmlnYXRvci5wbGF0Zm9ybTt0LmlzRmlyZWZveD1pLmluY2x1ZGVzKFwiRmlyZWZveFwiKSx0LmlzTGVnYWN5RWRnZT1pLmluY2x1ZGVzKFwiRWRnZVwiKSx0LmlzU2FmYXJpPS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QoaSksdC5nZXRTYWZhcmlWZXJzaW9uPWZ1bmN0aW9uKCl7aWYoIXQuaXNTYWZhcmkpcmV0dXJuIDA7Y29uc3QgZT1pLm1hdGNoKC9WZXJzaW9uXFwvKFxcZCspLyk7cmV0dXJuIG51bGw9PT1lfHxlLmxlbmd0aDwyPzA6cGFyc2VJbnQoZVsxXSl9LHQuaXNNYWM9W1wiTWFjaW50b3NoXCIsXCJNYWNJbnRlbFwiLFwiTWFjUFBDXCIsXCJNYWM2OEtcIl0uaW5jbHVkZXMocyksdC5pc0lwYWQ9XCJpUGFkXCI9PT1zLHQuaXNJcGhvbmU9XCJpUGhvbmVcIj09PXMsdC5pc1dpbmRvd3M9W1wiV2luZG93c1wiLFwiV2luMTZcIixcIldpbjMyXCIsXCJXaW5DRVwiXS5pbmNsdWRlcyhzKSx0LmlzTGludXg9cy5pbmRleE9mKFwiTGludXhcIik+PTAsdC5pc0Nocm9tZU9TPS9cXGJDck9TXFxiLy50ZXN0KGkpfSw2MTA2OihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5Tb3J0ZWRMaXN0PXZvaWQgMDtsZXQgaT0wO3QuU29ydGVkTGlzdD1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9nZXRLZXk9ZSx0aGlzLl9hcnJheT1bXX1jbGVhcigpe3RoaXMuX2FycmF5Lmxlbmd0aD0wfWluc2VydChlKXswIT09dGhpcy5fYXJyYXkubGVuZ3RoPyhpPXRoaXMuX3NlYXJjaCh0aGlzLl9nZXRLZXkoZSkpLHRoaXMuX2FycmF5LnNwbGljZShpLDAsZSkpOnRoaXMuX2FycmF5LnB1c2goZSl9ZGVsZXRlKGUpe2lmKDA9PT10aGlzLl9hcnJheS5sZW5ndGgpcmV0dXJuITE7Y29uc3QgdD10aGlzLl9nZXRLZXkoZSk7aWYodm9pZCAwPT09dClyZXR1cm4hMTtpZihpPXRoaXMuX3NlYXJjaCh0KSwtMT09PWkpcmV0dXJuITE7aWYodGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W2ldKSE9PXQpcmV0dXJuITE7ZG97aWYodGhpcy5fYXJyYXlbaV09PT1lKXJldHVybiB0aGlzLl9hcnJheS5zcGxpY2UoaSwxKSwhMH13aGlsZSgrK2k8dGhpcy5fYXJyYXkubGVuZ3RoJiZ0aGlzLl9nZXRLZXkodGhpcy5fYXJyYXlbaV0pPT09dCk7cmV0dXJuITF9KmdldEtleUl0ZXJhdG9yKGUpe2lmKDAhPT10aGlzLl9hcnJheS5sZW5ndGgmJihpPXRoaXMuX3NlYXJjaChlKSwhKGk8MHx8aT49dGhpcy5fYXJyYXkubGVuZ3RoKSYmdGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W2ldKT09PWUpKWRve3lpZWxkIHRoaXMuX2FycmF5W2ldfXdoaWxlKCsraTx0aGlzLl9hcnJheS5sZW5ndGgmJnRoaXMuX2dldEtleSh0aGlzLl9hcnJheVtpXSk9PT1lKX1mb3JFYWNoQnlLZXkoZSx0KXtpZigwIT09dGhpcy5fYXJyYXkubGVuZ3RoJiYoaT10aGlzLl9zZWFyY2goZSksIShpPDB8fGk+PXRoaXMuX2FycmF5Lmxlbmd0aCkmJnRoaXMuX2dldEtleSh0aGlzLl9hcnJheVtpXSk9PT1lKSlkb3t0KHRoaXMuX2FycmF5W2ldKX13aGlsZSgrK2k8dGhpcy5fYXJyYXkubGVuZ3RoJiZ0aGlzLl9nZXRLZXkodGhpcy5fYXJyYXlbaV0pPT09ZSl9dmFsdWVzKCl7cmV0dXJuWy4uLnRoaXMuX2FycmF5XS52YWx1ZXMoKX1fc2VhcmNoKGUpe2xldCB0PTAsaT10aGlzLl9hcnJheS5sZW5ndGgtMTtmb3IoO2k+PXQ7KXtsZXQgcz10K2k+PjE7Y29uc3Qgcj10aGlzLl9nZXRLZXkodGhpcy5fYXJyYXlbc10pO2lmKHI+ZSlpPXMtMTtlbHNle2lmKCEocjxlKSl7Zm9yKDtzPjAmJnRoaXMuX2dldEtleSh0aGlzLl9hcnJheVtzLTFdKT09PWU7KXMtLTtyZXR1cm4gc310PXMrMX19cmV0dXJuIHR9fX0sNzIyNjooZSx0LGkpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5EZWJvdW5jZWRJZGxlVGFzaz10LklkbGVUYXNrUXVldWU9dC5Qcmlvcml0eVRhc2tRdWV1ZT12b2lkIDA7Y29uc3Qgcz1pKDYxMTQpO2NsYXNzIHJ7Y29uc3RydWN0b3IoKXt0aGlzLl90YXNrcz1bXSx0aGlzLl9pPTB9ZW5xdWV1ZShlKXt0aGlzLl90YXNrcy5wdXNoKGUpLHRoaXMuX3N0YXJ0KCl9Zmx1c2goKXtmb3IoO3RoaXMuX2k8dGhpcy5fdGFza3MubGVuZ3RoOyl0aGlzLl90YXNrc1t0aGlzLl9pXSgpfHx0aGlzLl9pKys7dGhpcy5jbGVhcigpfWNsZWFyKCl7dGhpcy5faWRsZUNhbGxiYWNrJiYodGhpcy5fY2FuY2VsQ2FsbGJhY2sodGhpcy5faWRsZUNhbGxiYWNrKSx0aGlzLl9pZGxlQ2FsbGJhY2s9dm9pZCAwKSx0aGlzLl9pPTAsdGhpcy5fdGFza3MubGVuZ3RoPTB9X3N0YXJ0KCl7dGhpcy5faWRsZUNhbGxiYWNrfHwodGhpcy5faWRsZUNhbGxiYWNrPXRoaXMuX3JlcXVlc3RDYWxsYmFjayh0aGlzLl9wcm9jZXNzLmJpbmQodGhpcykpKX1fcHJvY2VzcyhlKXt0aGlzLl9pZGxlQ2FsbGJhY2s9dm9pZCAwO2xldCB0PTAsaT0wLHM9ZS50aW1lUmVtYWluaW5nKCkscj0wO2Zvcig7dGhpcy5faTx0aGlzLl90YXNrcy5sZW5ndGg7KXtpZih0PURhdGUubm93KCksdGhpcy5fdGFza3NbdGhpcy5faV0oKXx8dGhpcy5faSsrLHQ9TWF0aC5tYXgoMSxEYXRlLm5vdygpLXQpLGk9TWF0aC5tYXgodCxpKSxyPWUudGltZVJlbWFpbmluZygpLDEuNSppPnIpcmV0dXJuIHMtdDwtMjAmJmNvbnNvbGUud2FybihgdGFzayBxdWV1ZSBleGNlZWRlZCBhbGxvdHRlZCBkZWFkbGluZSBieSAke01hdGguYWJzKE1hdGgucm91bmQocy10KSl9bXNgKSx2b2lkIHRoaXMuX3N0YXJ0KCk7cz1yfXRoaXMuY2xlYXIoKX19Y2xhc3MgbiBleHRlbmRzIHJ7X3JlcXVlc3RDYWxsYmFjayhlKXtyZXR1cm4gc2V0VGltZW91dCgoKCk9PmUodGhpcy5fY3JlYXRlRGVhZGxpbmUoMTYpKSkpfV9jYW5jZWxDYWxsYmFjayhlKXtjbGVhclRpbWVvdXQoZSl9X2NyZWF0ZURlYWRsaW5lKGUpe2NvbnN0IHQ9RGF0ZS5ub3coKStlO3JldHVybnt0aW1lUmVtYWluaW5nOigpPT5NYXRoLm1heCgwLHQtRGF0ZS5ub3coKSl9fX10LlByaW9yaXR5VGFza1F1ZXVlPW4sdC5JZGxlVGFza1F1ZXVlPSFzLmlzTm9kZSYmXCJyZXF1ZXN0SWRsZUNhbGxiYWNrXCJpbiB3aW5kb3c/Y2xhc3MgZXh0ZW5kcyBye19yZXF1ZXN0Q2FsbGJhY2soZSl7cmV0dXJuIHJlcXVlc3RJZGxlQ2FsbGJhY2soZSl9X2NhbmNlbENhbGxiYWNrKGUpe2NhbmNlbElkbGVDYWxsYmFjayhlKX19Om4sdC5EZWJvdW5jZWRJZGxlVGFzaz1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3F1ZXVlPW5ldyB0LklkbGVUYXNrUXVldWV9c2V0KGUpe3RoaXMuX3F1ZXVlLmNsZWFyKCksdGhpcy5fcXVldWUuZW5xdWV1ZShlKX1mbHVzaCgpe3RoaXMuX3F1ZXVlLmZsdXNoKCl9fX0sOTI4MjooZSx0LGkpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC51cGRhdGVXaW5kb3dzTW9kZVdyYXBwZWRTdGF0ZT12b2lkIDA7Y29uc3Qgcz1pKDY0Myk7dC51cGRhdGVXaW5kb3dzTW9kZVdyYXBwZWRTdGF0ZT1mdW5jdGlvbihlKXtjb25zdCB0PWUuYnVmZmVyLmxpbmVzLmdldChlLmJ1ZmZlci55YmFzZStlLmJ1ZmZlci55LTEpLGk9dD8uZ2V0KGUuY29scy0xKSxyPWUuYnVmZmVyLmxpbmVzLmdldChlLmJ1ZmZlci55YmFzZStlLmJ1ZmZlci55KTtyJiZpJiYoci5pc1dyYXBwZWQ9aVtzLkNIQVJfREFUQV9DT0RFX0lOREVYXSE9PXMuTlVMTF9DRUxMX0NPREUmJmlbcy5DSEFSX0RBVEFfQ09ERV9JTkRFWF0hPT1zLldISVRFU1BBQ0VfQ0VMTF9DT0RFKX19LDM3MzQ6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkV4dGVuZGVkQXR0cnM9dC5BdHRyaWJ1dGVEYXRhPXZvaWQgMDtjbGFzcyBpe2NvbnN0cnVjdG9yKCl7dGhpcy5mZz0wLHRoaXMuYmc9MCx0aGlzLmV4dGVuZGVkPW5ldyBzfXN0YXRpYyB0b0NvbG9yUkdCKGUpe3JldHVybltlPj4+MTYmMjU1LGU+Pj44JjI1NSwyNTUmZV19c3RhdGljIGZyb21Db2xvclJHQihlKXtyZXR1cm4oMjU1JmVbMF0pPDwxNnwoMjU1JmVbMV0pPDw4fDI1NSZlWzJdfWNsb25lKCl7Y29uc3QgZT1uZXcgaTtyZXR1cm4gZS5mZz10aGlzLmZnLGUuYmc9dGhpcy5iZyxlLmV4dGVuZGVkPXRoaXMuZXh0ZW5kZWQuY2xvbmUoKSxlfWlzSW52ZXJzZSgpe3JldHVybiA2NzEwODg2NCZ0aGlzLmZnfWlzQm9sZCgpe3JldHVybiAxMzQyMTc3MjgmdGhpcy5mZ31pc1VuZGVybGluZSgpe3JldHVybiB0aGlzLmhhc0V4dGVuZGVkQXR0cnMoKSYmMCE9PXRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGU/MToyNjg0MzU0NTYmdGhpcy5mZ31pc0JsaW5rKCl7cmV0dXJuIDUzNjg3MDkxMiZ0aGlzLmZnfWlzSW52aXNpYmxlKCl7cmV0dXJuIDEwNzM3NDE4MjQmdGhpcy5mZ31pc0l0YWxpYygpe3JldHVybiA2NzEwODg2NCZ0aGlzLmJnfWlzRGltKCl7cmV0dXJuIDEzNDIxNzcyOCZ0aGlzLmJnfWlzU3RyaWtldGhyb3VnaCgpe3JldHVybiAyMTQ3NDgzNjQ4JnRoaXMuZmd9aXNQcm90ZWN0ZWQoKXtyZXR1cm4gNTM2ODcwOTEyJnRoaXMuYmd9aXNPdmVybGluZSgpe3JldHVybiAxMDczNzQxODI0JnRoaXMuYmd9Z2V0RmdDb2xvck1vZGUoKXtyZXR1cm4gNTAzMzE2NDgmdGhpcy5mZ31nZXRCZ0NvbG9yTW9kZSgpe3JldHVybiA1MDMzMTY0OCZ0aGlzLmJnfWlzRmdSR0IoKXtyZXR1cm4gNTAzMzE2NDg9PSg1MDMzMTY0OCZ0aGlzLmZnKX1pc0JnUkdCKCl7cmV0dXJuIDUwMzMxNjQ4PT0oNTAzMzE2NDgmdGhpcy5iZyl9aXNGZ1BhbGV0dGUoKXtyZXR1cm4gMTY3NzcyMTY9PSg1MDMzMTY0OCZ0aGlzLmZnKXx8MzM1NTQ0MzI9PSg1MDMzMTY0OCZ0aGlzLmZnKX1pc0JnUGFsZXR0ZSgpe3JldHVybiAxNjc3NzIxNj09KDUwMzMxNjQ4JnRoaXMuYmcpfHwzMzU1NDQzMj09KDUwMzMxNjQ4JnRoaXMuYmcpfWlzRmdEZWZhdWx0KCl7cmV0dXJuIDA9PSg1MDMzMTY0OCZ0aGlzLmZnKX1pc0JnRGVmYXVsdCgpe3JldHVybiAwPT0oNTAzMzE2NDgmdGhpcy5iZyl9aXNBdHRyaWJ1dGVEZWZhdWx0KCl7cmV0dXJuIDA9PT10aGlzLmZnJiYwPT09dGhpcy5iZ31nZXRGZ0NvbG9yKCl7c3dpdGNoKDUwMzMxNjQ4JnRoaXMuZmcpe2Nhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpyZXR1cm4gMjU1JnRoaXMuZmc7Y2FzZSA1MDMzMTY0ODpyZXR1cm4gMTY3NzcyMTUmdGhpcy5mZztkZWZhdWx0OnJldHVybi0xfX1nZXRCZ0NvbG9yKCl7c3dpdGNoKDUwMzMxNjQ4JnRoaXMuYmcpe2Nhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpyZXR1cm4gMjU1JnRoaXMuYmc7Y2FzZSA1MDMzMTY0ODpyZXR1cm4gMTY3NzcyMTUmdGhpcy5iZztkZWZhdWx0OnJldHVybi0xfX1oYXNFeHRlbmRlZEF0dHJzKCl7cmV0dXJuIDI2ODQzNTQ1NiZ0aGlzLmJnfXVwZGF0ZUV4dGVuZGVkKCl7dGhpcy5leHRlbmRlZC5pc0VtcHR5KCk/dGhpcy5iZyY9LTI2ODQzNTQ1Nzp0aGlzLmJnfD0yNjg0MzU0NTZ9Z2V0VW5kZXJsaW5lQ29sb3IoKXtpZigyNjg0MzU0NTYmdGhpcy5iZyYmfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3Ipc3dpdGNoKDUwMzMxNjQ4JnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3Ipe2Nhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpyZXR1cm4gMjU1JnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3I7Y2FzZSA1MDMzMTY0ODpyZXR1cm4gMTY3NzcyMTUmdGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvcjtkZWZhdWx0OnJldHVybiB0aGlzLmdldEZnQ29sb3IoKX1yZXR1cm4gdGhpcy5nZXRGZ0NvbG9yKCl9Z2V0VW5kZXJsaW5lQ29sb3JNb2RlKCl7cmV0dXJuIDI2ODQzNTQ1NiZ0aGlzLmJnJiZ+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvcj81MDMzMTY0OCZ0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yOnRoaXMuZ2V0RmdDb2xvck1vZGUoKX1pc1VuZGVybGluZUNvbG9yUkdCKCl7cmV0dXJuIDI2ODQzNTQ1NiZ0aGlzLmJnJiZ+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvcj81MDMzMTY0OD09KDUwMzMxNjQ4JnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IpOnRoaXMuaXNGZ1JHQigpfWlzVW5kZXJsaW5lQ29sb3JQYWxldHRlKCl7cmV0dXJuIDI2ODQzNTQ1NiZ0aGlzLmJnJiZ+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvcj8xNjc3NzIxNj09KDUwMzMxNjQ4JnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IpfHwzMzU1NDQzMj09KDUwMzMxNjQ4JnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IpOnRoaXMuaXNGZ1BhbGV0dGUoKX1pc1VuZGVybGluZUNvbG9yRGVmYXVsdCgpe3JldHVybiAyNjg0MzU0NTYmdGhpcy5iZyYmfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3I/MD09KDUwMzMxNjQ4JnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IpOnRoaXMuaXNGZ0RlZmF1bHQoKX1nZXRVbmRlcmxpbmVTdHlsZSgpe3JldHVybiAyNjg0MzU0NTYmdGhpcy5mZz8yNjg0MzU0NTYmdGhpcy5iZz90aGlzLmV4dGVuZGVkLnVuZGVybGluZVN0eWxlOjE6MH1nZXRVbmRlcmxpbmVWYXJpYW50T2Zmc2V0KCl7cmV0dXJuIHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lVmFyaWFudE9mZnNldH19dC5BdHRyaWJ1dGVEYXRhPWk7Y2xhc3Mgc3tnZXQgZXh0KCl7cmV0dXJuIHRoaXMuX3VybElkPy00Njk3NjIwNDkmdGhpcy5fZXh0fHRoaXMudW5kZXJsaW5lU3R5bGU8PDI2OnRoaXMuX2V4dH1zZXQgZXh0KGUpe3RoaXMuX2V4dD1lfWdldCB1bmRlcmxpbmVTdHlsZSgpe3JldHVybiB0aGlzLl91cmxJZD81Oig0Njk3NjIwNDgmdGhpcy5fZXh0KT4+MjZ9c2V0IHVuZGVybGluZVN0eWxlKGUpe3RoaXMuX2V4dCY9LTQ2OTc2MjA0OSx0aGlzLl9leHR8PWU8PDI2JjQ2OTc2MjA0OH1nZXQgdW5kZXJsaW5lQ29sb3IoKXtyZXR1cm4gNjcxMDg4NjMmdGhpcy5fZXh0fXNldCB1bmRlcmxpbmVDb2xvcihlKXt0aGlzLl9leHQmPS02NzEwODg2NCx0aGlzLl9leHR8PTY3MTA4ODYzJmV9Z2V0IHVybElkKCl7cmV0dXJuIHRoaXMuX3VybElkfXNldCB1cmxJZChlKXt0aGlzLl91cmxJZD1lfWdldCB1bmRlcmxpbmVWYXJpYW50T2Zmc2V0KCl7Y29uc3QgZT0oMzc1ODA5NjM4NCZ0aGlzLl9leHQpPj4yOTtyZXR1cm4gZTwwPzQyOTQ5NjcyODheZTplfXNldCB1bmRlcmxpbmVWYXJpYW50T2Zmc2V0KGUpe3RoaXMuX2V4dCY9NTM2ODcwOTExLHRoaXMuX2V4dHw9ZTw8MjkmMzc1ODA5NjM4NH1jb25zdHJ1Y3RvcihlPTAsdD0wKXt0aGlzLl9leHQ9MCx0aGlzLl91cmxJZD0wLHRoaXMuX2V4dD1lLHRoaXMuX3VybElkPXR9Y2xvbmUoKXtyZXR1cm4gbmV3IHModGhpcy5fZXh0LHRoaXMuX3VybElkKX1pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLnVuZGVybGluZVN0eWxlJiYwPT09dGhpcy5fdXJsSWR9fXQuRXh0ZW5kZWRBdHRycz1zfSw5MDkyOihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkJ1ZmZlcj10Lk1BWF9CVUZGRVJfU0laRT12b2lkIDA7Y29uc3Qgcz1pKDYzNDkpLHI9aSg3MjI2KSxuPWkoMzczNCksbz1pKDg0MzcpLGE9aSg0NjM0KSxoPWkoNTExKSxjPWkoNjQzKSxsPWkoNDg2MyksZD1pKDcxMTYpO3QuTUFYX0JVRkZFUl9TSVpFPTQyOTQ5NjcyOTUsdC5CdWZmZXI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LGkpe3RoaXMuX2hhc1Njcm9sbGJhY2s9ZSx0aGlzLl9vcHRpb25zU2VydmljZT10LHRoaXMuX2J1ZmZlclNlcnZpY2U9aSx0aGlzLnlkaXNwPTAsdGhpcy55YmFzZT0wLHRoaXMueT0wLHRoaXMueD0wLHRoaXMudGFicz17fSx0aGlzLnNhdmVkWT0wLHRoaXMuc2F2ZWRYPTAsdGhpcy5zYXZlZEN1ckF0dHJEYXRhPW8uREVGQVVMVF9BVFRSX0RBVEEuY2xvbmUoKSx0aGlzLnNhdmVkQ2hhcnNldD1kLkRFRkFVTFRfQ0hBUlNFVCx0aGlzLm1hcmtlcnM9W10sdGhpcy5fbnVsbENlbGw9aC5DZWxsRGF0YS5mcm9tQ2hhckRhdGEoWzAsYy5OVUxMX0NFTExfQ0hBUixjLk5VTExfQ0VMTF9XSURUSCxjLk5VTExfQ0VMTF9DT0RFXSksdGhpcy5fd2hpdGVzcGFjZUNlbGw9aC5DZWxsRGF0YS5mcm9tQ2hhckRhdGEoWzAsYy5XSElURVNQQUNFX0NFTExfQ0hBUixjLldISVRFU1BBQ0VfQ0VMTF9XSURUSCxjLldISVRFU1BBQ0VfQ0VMTF9DT0RFXSksdGhpcy5faXNDbGVhcmluZz0hMSx0aGlzLl9tZW1vcnlDbGVhbnVwUXVldWU9bmV3IHIuSWRsZVRhc2tRdWV1ZSx0aGlzLl9tZW1vcnlDbGVhbnVwUG9zaXRpb249MCx0aGlzLl9jb2xzPXRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyx0aGlzLl9yb3dzPXRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyx0aGlzLmxpbmVzPW5ldyBzLkNpcmN1bGFyTGlzdCh0aGlzLl9nZXRDb3JyZWN0QnVmZmVyTGVuZ3RoKHRoaXMuX3Jvd3MpKSx0aGlzLnNjcm9sbFRvcD0wLHRoaXMuc2Nyb2xsQm90dG9tPXRoaXMuX3Jvd3MtMSx0aGlzLnNldHVwVGFiU3RvcHMoKX1nZXROdWxsQ2VsbChlKXtyZXR1cm4gZT8odGhpcy5fbnVsbENlbGwuZmc9ZS5mZyx0aGlzLl9udWxsQ2VsbC5iZz1lLmJnLHRoaXMuX251bGxDZWxsLmV4dGVuZGVkPWUuZXh0ZW5kZWQpOih0aGlzLl9udWxsQ2VsbC5mZz0wLHRoaXMuX251bGxDZWxsLmJnPTAsdGhpcy5fbnVsbENlbGwuZXh0ZW5kZWQ9bmV3IG4uRXh0ZW5kZWRBdHRycyksdGhpcy5fbnVsbENlbGx9Z2V0V2hpdGVzcGFjZUNlbGwoZSl7cmV0dXJuIGU/KHRoaXMuX3doaXRlc3BhY2VDZWxsLmZnPWUuZmcsdGhpcy5fd2hpdGVzcGFjZUNlbGwuYmc9ZS5iZyx0aGlzLl93aGl0ZXNwYWNlQ2VsbC5leHRlbmRlZD1lLmV4dGVuZGVkKToodGhpcy5fd2hpdGVzcGFjZUNlbGwuZmc9MCx0aGlzLl93aGl0ZXNwYWNlQ2VsbC5iZz0wLHRoaXMuX3doaXRlc3BhY2VDZWxsLmV4dGVuZGVkPW5ldyBuLkV4dGVuZGVkQXR0cnMpLHRoaXMuX3doaXRlc3BhY2VDZWxsfWdldEJsYW5rTGluZShlLHQpe3JldHVybiBuZXcgby5CdWZmZXJMaW5lKHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyx0aGlzLmdldE51bGxDZWxsKGUpLHQpfWdldCBoYXNTY3JvbGxiYWNrKCl7cmV0dXJuIHRoaXMuX2hhc1Njcm9sbGJhY2smJnRoaXMubGluZXMubWF4TGVuZ3RoPnRoaXMuX3Jvd3N9Z2V0IGlzQ3Vyc29ySW5WaWV3cG9ydCgpe2NvbnN0IGU9dGhpcy55YmFzZSt0aGlzLnktdGhpcy55ZGlzcDtyZXR1cm4gZT49MCYmZTx0aGlzLl9yb3dzfV9nZXRDb3JyZWN0QnVmZmVyTGVuZ3RoKGUpe2lmKCF0aGlzLl9oYXNTY3JvbGxiYWNrKXJldHVybiBlO2NvbnN0IGk9ZSt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcm9sbGJhY2s7cmV0dXJuIGk+dC5NQVhfQlVGRkVSX1NJWkU/dC5NQVhfQlVGRkVSX1NJWkU6aX1maWxsVmlld3BvcnRSb3dzKGUpe2lmKDA9PT10aGlzLmxpbmVzLmxlbmd0aCl7dm9pZCAwPT09ZSYmKGU9by5ERUZBVUxUX0FUVFJfREFUQSk7bGV0IHQ9dGhpcy5fcm93cztmb3IoO3QtLTspdGhpcy5saW5lcy5wdXNoKHRoaXMuZ2V0QmxhbmtMaW5lKGUpKX19Y2xlYXIoKXt0aGlzLnlkaXNwPTAsdGhpcy55YmFzZT0wLHRoaXMueT0wLHRoaXMueD0wLHRoaXMubGluZXM9bmV3IHMuQ2lyY3VsYXJMaXN0KHRoaXMuX2dldENvcnJlY3RCdWZmZXJMZW5ndGgodGhpcy5fcm93cykpLHRoaXMuc2Nyb2xsVG9wPTAsdGhpcy5zY3JvbGxCb3R0b209dGhpcy5fcm93cy0xLHRoaXMuc2V0dXBUYWJTdG9wcygpfXJlc2l6ZShlLHQpe2NvbnN0IGk9dGhpcy5nZXROdWxsQ2VsbChvLkRFRkFVTFRfQVRUUl9EQVRBKTtsZXQgcz0wO2NvbnN0IHI9dGhpcy5fZ2V0Q29ycmVjdEJ1ZmZlckxlbmd0aCh0KTtpZihyPnRoaXMubGluZXMubWF4TGVuZ3RoJiYodGhpcy5saW5lcy5tYXhMZW5ndGg9ciksdGhpcy5saW5lcy5sZW5ndGg+MCl7aWYodGhpcy5fY29sczxlKWZvcihsZXQgdD0wO3Q8dGhpcy5saW5lcy5sZW5ndGg7dCsrKXMrPSt0aGlzLmxpbmVzLmdldCh0KS5yZXNpemUoZSxpKTtsZXQgbj0wO2lmKHRoaXMuX3Jvd3M8dClmb3IobGV0IHM9dGhpcy5fcm93cztzPHQ7cysrKXRoaXMubGluZXMubGVuZ3RoPHQrdGhpcy55YmFzZSYmKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93c01vZGV8fHZvaWQgMCE9PXRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93c1B0eS5iYWNrZW5kfHx2b2lkIDAhPT10aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd3NQdHkuYnVpbGROdW1iZXI/dGhpcy5saW5lcy5wdXNoKG5ldyBvLkJ1ZmZlckxpbmUoZSxpKSk6dGhpcy55YmFzZT4wJiZ0aGlzLmxpbmVzLmxlbmd0aDw9dGhpcy55YmFzZSt0aGlzLnkrbisxPyh0aGlzLnliYXNlLS0sbisrLHRoaXMueWRpc3A+MCYmdGhpcy55ZGlzcC0tKTp0aGlzLmxpbmVzLnB1c2gobmV3IG8uQnVmZmVyTGluZShlLGkpKSk7ZWxzZSBmb3IobGV0IGU9dGhpcy5fcm93cztlPnQ7ZS0tKXRoaXMubGluZXMubGVuZ3RoPnQrdGhpcy55YmFzZSYmKHRoaXMubGluZXMubGVuZ3RoPnRoaXMueWJhc2UrdGhpcy55KzE/dGhpcy5saW5lcy5wb3AoKToodGhpcy55YmFzZSsrLHRoaXMueWRpc3ArKykpO2lmKHI8dGhpcy5saW5lcy5tYXhMZW5ndGgpe2NvbnN0IGU9dGhpcy5saW5lcy5sZW5ndGgtcjtlPjAmJih0aGlzLmxpbmVzLnRyaW1TdGFydChlKSx0aGlzLnliYXNlPU1hdGgubWF4KHRoaXMueWJhc2UtZSwwKSx0aGlzLnlkaXNwPU1hdGgubWF4KHRoaXMueWRpc3AtZSwwKSx0aGlzLnNhdmVkWT1NYXRoLm1heCh0aGlzLnNhdmVkWS1lLDApKSx0aGlzLmxpbmVzLm1heExlbmd0aD1yfXRoaXMueD1NYXRoLm1pbih0aGlzLngsZS0xKSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQtMSksbiYmKHRoaXMueSs9biksdGhpcy5zYXZlZFg9TWF0aC5taW4odGhpcy5zYXZlZFgsZS0xKSx0aGlzLnNjcm9sbFRvcD0wfWlmKHRoaXMuc2Nyb2xsQm90dG9tPXQtMSx0aGlzLl9pc1JlZmxvd0VuYWJsZWQmJih0aGlzLl9yZWZsb3coZSx0KSx0aGlzLl9jb2xzPmUpKWZvcihsZXQgdD0wO3Q8dGhpcy5saW5lcy5sZW5ndGg7dCsrKXMrPSt0aGlzLmxpbmVzLmdldCh0KS5yZXNpemUoZSxpKTt0aGlzLl9jb2xzPWUsdGhpcy5fcm93cz10LHRoaXMuX21lbW9yeUNsZWFudXBRdWV1ZS5jbGVhcigpLHM+LjEqdGhpcy5saW5lcy5sZW5ndGgmJih0aGlzLl9tZW1vcnlDbGVhbnVwUG9zaXRpb249MCx0aGlzLl9tZW1vcnlDbGVhbnVwUXVldWUuZW5xdWV1ZSgoKCk9PnRoaXMuX2JhdGNoZWRNZW1vcnlDbGVhbnVwKCkpKSl9X2JhdGNoZWRNZW1vcnlDbGVhbnVwKCl7bGV0IGU9ITA7dGhpcy5fbWVtb3J5Q2xlYW51cFBvc2l0aW9uPj10aGlzLmxpbmVzLmxlbmd0aCYmKHRoaXMuX21lbW9yeUNsZWFudXBQb3NpdGlvbj0wLGU9ITEpO2xldCB0PTA7Zm9yKDt0aGlzLl9tZW1vcnlDbGVhbnVwUG9zaXRpb248dGhpcy5saW5lcy5sZW5ndGg7KWlmKHQrPXRoaXMubGluZXMuZ2V0KHRoaXMuX21lbW9yeUNsZWFudXBQb3NpdGlvbisrKS5jbGVhbnVwTWVtb3J5KCksdD4xMDApcmV0dXJuITA7cmV0dXJuIGV9Z2V0IF9pc1JlZmxvd0VuYWJsZWQoKXtjb25zdCBlPXRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93c1B0eTtyZXR1cm4gZSYmZS5idWlsZE51bWJlcj90aGlzLl9oYXNTY3JvbGxiYWNrJiZcImNvbnB0eVwiPT09ZS5iYWNrZW5kJiZlLmJ1aWxkTnVtYmVyPj0yMTM3Njp0aGlzLl9oYXNTY3JvbGxiYWNrJiYhdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dzTW9kZX1fcmVmbG93KGUsdCl7dGhpcy5fY29scyE9PWUmJihlPnRoaXMuX2NvbHM/dGhpcy5fcmVmbG93TGFyZ2VyKGUsdCk6dGhpcy5fcmVmbG93U21hbGxlcihlLHQpKX1fcmVmbG93TGFyZ2VyKGUsdCl7Y29uc3QgaT0oMCxhLnJlZmxvd0xhcmdlckdldExpbmVzVG9SZW1vdmUpKHRoaXMubGluZXMsdGhpcy5fY29scyxlLHRoaXMueWJhc2UrdGhpcy55LHRoaXMuZ2V0TnVsbENlbGwoby5ERUZBVUxUX0FUVFJfREFUQSkpO2lmKGkubGVuZ3RoPjApe2NvbnN0IHM9KDAsYS5yZWZsb3dMYXJnZXJDcmVhdGVOZXdMYXlvdXQpKHRoaXMubGluZXMsaSk7KDAsYS5yZWZsb3dMYXJnZXJBcHBseU5ld0xheW91dCkodGhpcy5saW5lcyxzLmxheW91dCksdGhpcy5fcmVmbG93TGFyZ2VyQWRqdXN0Vmlld3BvcnQoZSx0LHMuY291bnRSZW1vdmVkKX19X3JlZmxvd0xhcmdlckFkanVzdFZpZXdwb3J0KGUsdCxpKXtjb25zdCBzPXRoaXMuZ2V0TnVsbENlbGwoby5ERUZBVUxUX0FUVFJfREFUQSk7bGV0IHI9aTtmb3IoO3ItLSA+MDspMD09PXRoaXMueWJhc2U/KHRoaXMueT4wJiZ0aGlzLnktLSx0aGlzLmxpbmVzLmxlbmd0aDx0JiZ0aGlzLmxpbmVzLnB1c2gobmV3IG8uQnVmZmVyTGluZShlLHMpKSk6KHRoaXMueWRpc3A9PT10aGlzLnliYXNlJiZ0aGlzLnlkaXNwLS0sdGhpcy55YmFzZS0tKTt0aGlzLnNhdmVkWT1NYXRoLm1heCh0aGlzLnNhdmVkWS1pLDApfV9yZWZsb3dTbWFsbGVyKGUsdCl7Y29uc3QgaT10aGlzLmdldE51bGxDZWxsKG8uREVGQVVMVF9BVFRSX0RBVEEpLHM9W107bGV0IHI9MDtmb3IobGV0IG49dGhpcy5saW5lcy5sZW5ndGgtMTtuPj0wO24tLSl7bGV0IGg9dGhpcy5saW5lcy5nZXQobik7aWYoIWh8fCFoLmlzV3JhcHBlZCYmaC5nZXRUcmltbWVkTGVuZ3RoKCk8PWUpY29udGludWU7Y29uc3QgYz1baF07Zm9yKDtoLmlzV3JhcHBlZCYmbj4wOyloPXRoaXMubGluZXMuZ2V0KC0tbiksYy51bnNoaWZ0KGgpO2NvbnN0IGw9dGhpcy55YmFzZSt0aGlzLnk7aWYobD49biYmbDxuK2MubGVuZ3RoKWNvbnRpbnVlO2NvbnN0IGQ9Y1tjLmxlbmd0aC0xXS5nZXRUcmltbWVkTGVuZ3RoKCksXz0oMCxhLnJlZmxvd1NtYWxsZXJHZXROZXdMaW5lTGVuZ3RocykoYyx0aGlzLl9jb2xzLGUpLHU9Xy5sZW5ndGgtYy5sZW5ndGg7bGV0IGY7Zj0wPT09dGhpcy55YmFzZSYmdGhpcy55IT09dGhpcy5saW5lcy5sZW5ndGgtMT9NYXRoLm1heCgwLHRoaXMueS10aGlzLmxpbmVzLm1heExlbmd0aCt1KTpNYXRoLm1heCgwLHRoaXMubGluZXMubGVuZ3RoLXRoaXMubGluZXMubWF4TGVuZ3RoK3UpO2NvbnN0IHY9W107Zm9yKGxldCBlPTA7ZTx1O2UrKyl7Y29uc3QgZT10aGlzLmdldEJsYW5rTGluZShvLkRFRkFVTFRfQVRUUl9EQVRBLCEwKTt2LnB1c2goZSl9di5sZW5ndGg+MCYmKHMucHVzaCh7c3RhcnQ6bitjLmxlbmd0aCtyLG5ld0xpbmVzOnZ9KSxyKz12Lmxlbmd0aCksYy5wdXNoKC4uLnYpO2xldCBwPV8ubGVuZ3RoLTEsZz1fW3BdOzA9PT1nJiYocC0tLGc9X1twXSk7bGV0IG09Yy5sZW5ndGgtdS0xLFM9ZDtmb3IoO20+PTA7KXtjb25zdCBlPU1hdGgubWluKFMsZyk7aWYodm9pZCAwPT09Y1twXSlicmVhaztpZihjW3BdLmNvcHlDZWxsc0Zyb20oY1ttXSxTLWUsZy1lLGUsITApLGctPWUsMD09PWcmJihwLS0sZz1fW3BdKSxTLT1lLDA9PT1TKXttLS07Y29uc3QgZT1NYXRoLm1heChtLDApO1M9KDAsYS5nZXRXcmFwcGVkTGluZVRyaW1tZWRMZW5ndGgpKGMsZSx0aGlzLl9jb2xzKX19Zm9yKGxldCB0PTA7dDxjLmxlbmd0aDt0KyspX1t0XTxlJiZjW3RdLnNldENlbGwoX1t0XSxpKTtsZXQgQz11LWY7Zm9yKDtDLS0gPjA7KTA9PT10aGlzLnliYXNlP3RoaXMueTx0LTE/KHRoaXMueSsrLHRoaXMubGluZXMucG9wKCkpOih0aGlzLnliYXNlKyssdGhpcy55ZGlzcCsrKTp0aGlzLnliYXNlPE1hdGgubWluKHRoaXMubGluZXMubWF4TGVuZ3RoLHRoaXMubGluZXMubGVuZ3RoK3IpLXQmJih0aGlzLnliYXNlPT09dGhpcy55ZGlzcCYmdGhpcy55ZGlzcCsrLHRoaXMueWJhc2UrKyk7dGhpcy5zYXZlZFk9TWF0aC5taW4odGhpcy5zYXZlZFkrdSx0aGlzLnliYXNlK3QtMSl9aWYocy5sZW5ndGg+MCl7Y29uc3QgZT1bXSx0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5saW5lcy5sZW5ndGg7ZSsrKXQucHVzaCh0aGlzLmxpbmVzLmdldChlKSk7Y29uc3QgaT10aGlzLmxpbmVzLmxlbmd0aDtsZXQgbj1pLTEsbz0wLGE9c1tvXTt0aGlzLmxpbmVzLmxlbmd0aD1NYXRoLm1pbih0aGlzLmxpbmVzLm1heExlbmd0aCx0aGlzLmxpbmVzLmxlbmd0aCtyKTtsZXQgaD0wO2ZvcihsZXQgYz1NYXRoLm1pbih0aGlzLmxpbmVzLm1heExlbmd0aC0xLGkrci0xKTtjPj0wO2MtLSlpZihhJiZhLnN0YXJ0Pm4raCl7Zm9yKGxldCBlPWEubmV3TGluZXMubGVuZ3RoLTE7ZT49MDtlLS0pdGhpcy5saW5lcy5zZXQoYy0tLGEubmV3TGluZXNbZV0pO2MrKyxlLnB1c2goe2luZGV4Om4rMSxhbW91bnQ6YS5uZXdMaW5lcy5sZW5ndGh9KSxoKz1hLm5ld0xpbmVzLmxlbmd0aCxhPXNbKytvXX1lbHNlIHRoaXMubGluZXMuc2V0KGMsdFtuLS1dKTtsZXQgYz0wO2ZvcihsZXQgdD1lLmxlbmd0aC0xO3Q+PTA7dC0tKWVbdF0uaW5kZXgrPWMsdGhpcy5saW5lcy5vbkluc2VydEVtaXR0ZXIuZmlyZShlW3RdKSxjKz1lW3RdLmFtb3VudDtjb25zdCBsPU1hdGgubWF4KDAsaStyLXRoaXMubGluZXMubWF4TGVuZ3RoKTtsPjAmJnRoaXMubGluZXMub25UcmltRW1pdHRlci5maXJlKGwpfX10cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcoZSx0LGk9MCxzKXtjb25zdCByPXRoaXMubGluZXMuZ2V0KGUpO3JldHVybiByP3IudHJhbnNsYXRlVG9TdHJpbmcodCxpLHMpOlwiXCJ9Z2V0V3JhcHBlZFJhbmdlRm9yTGluZShlKXtsZXQgdD1lLGk9ZTtmb3IoO3Q+MCYmdGhpcy5saW5lcy5nZXQodCkuaXNXcmFwcGVkOyl0LS07Zm9yKDtpKzE8dGhpcy5saW5lcy5sZW5ndGgmJnRoaXMubGluZXMuZ2V0KGkrMSkuaXNXcmFwcGVkOylpKys7cmV0dXJue2ZpcnN0OnQsbGFzdDppfX1zZXR1cFRhYlN0b3BzKGUpe2ZvcihudWxsIT1lP3RoaXMudGFic1tlXXx8KGU9dGhpcy5wcmV2U3RvcChlKSk6KHRoaXMudGFicz17fSxlPTApO2U8dGhpcy5fY29scztlKz10aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnRhYlN0b3BXaWR0aCl0aGlzLnRhYnNbZV09ITB9cHJldlN0b3AoZSl7Zm9yKG51bGw9PWUmJihlPXRoaXMueCk7IXRoaXMudGFic1stLWVdJiZlPjA7KTtyZXR1cm4gZT49dGhpcy5fY29scz90aGlzLl9jb2xzLTE6ZTwwPzA6ZX1uZXh0U3RvcChlKXtmb3IobnVsbD09ZSYmKGU9dGhpcy54KTshdGhpcy50YWJzWysrZV0mJmU8dGhpcy5fY29sczspO3JldHVybiBlPj10aGlzLl9jb2xzP3RoaXMuX2NvbHMtMTplPDA/MDplfWNsZWFyTWFya2VycyhlKXt0aGlzLl9pc0NsZWFyaW5nPSEwO2ZvcihsZXQgdD0wO3Q8dGhpcy5tYXJrZXJzLmxlbmd0aDt0KyspdGhpcy5tYXJrZXJzW3RdLmxpbmU9PT1lJiYodGhpcy5tYXJrZXJzW3RdLmRpc3Bvc2UoKSx0aGlzLm1hcmtlcnMuc3BsaWNlKHQtLSwxKSk7dGhpcy5faXNDbGVhcmluZz0hMX1jbGVhckFsbE1hcmtlcnMoKXt0aGlzLl9pc0NsZWFyaW5nPSEwO2ZvcihsZXQgZT0wO2U8dGhpcy5tYXJrZXJzLmxlbmd0aDtlKyspdGhpcy5tYXJrZXJzW2VdLmRpc3Bvc2UoKSx0aGlzLm1hcmtlcnMuc3BsaWNlKGUtLSwxKTt0aGlzLl9pc0NsZWFyaW5nPSExfWFkZE1hcmtlcihlKXtjb25zdCB0PW5ldyBsLk1hcmtlcihlKTtyZXR1cm4gdGhpcy5tYXJrZXJzLnB1c2godCksdC5yZWdpc3Rlcih0aGlzLmxpbmVzLm9uVHJpbSgoZT0+e3QubGluZS09ZSx0LmxpbmU8MCYmdC5kaXNwb3NlKCl9KSkpLHQucmVnaXN0ZXIodGhpcy5saW5lcy5vbkluc2VydCgoZT0+e3QubGluZT49ZS5pbmRleCYmKHQubGluZSs9ZS5hbW91bnQpfSkpKSx0LnJlZ2lzdGVyKHRoaXMubGluZXMub25EZWxldGUoKGU9Pnt0LmxpbmU+PWUuaW5kZXgmJnQubGluZTxlLmluZGV4K2UuYW1vdW50JiZ0LmRpc3Bvc2UoKSx0LmxpbmU+ZS5pbmRleCYmKHQubGluZS09ZS5hbW91bnQpfSkpKSx0LnJlZ2lzdGVyKHQub25EaXNwb3NlKCgoKT0+dGhpcy5fcmVtb3ZlTWFya2VyKHQpKSkpLHR9X3JlbW92ZU1hcmtlcihlKXt0aGlzLl9pc0NsZWFyaW5nfHx0aGlzLm1hcmtlcnMuc3BsaWNlKHRoaXMubWFya2Vycy5pbmRleE9mKGUpLDEpfX19LDg0Mzc6KGUsdCxpKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuQnVmZmVyTGluZT10LkRFRkFVTFRfQVRUUl9EQVRBPXZvaWQgMDtjb25zdCBzPWkoMzczNCkscj1pKDUxMSksbj1pKDY0Myksbz1pKDQ4Mik7dC5ERUZBVUxUX0FUVFJfREFUQT1PYmplY3QuZnJlZXplKG5ldyBzLkF0dHJpYnV0ZURhdGEpO2xldCBhPTA7Y2xhc3MgaHtjb25zdHJ1Y3RvcihlLHQsaT0hMSl7dGhpcy5pc1dyYXBwZWQ9aSx0aGlzLl9jb21iaW5lZD17fSx0aGlzLl9leHRlbmRlZEF0dHJzPXt9LHRoaXMuX2RhdGE9bmV3IFVpbnQzMkFycmF5KDMqZSk7Y29uc3Qgcz10fHxyLkNlbGxEYXRhLmZyb21DaGFyRGF0YShbMCxuLk5VTExfQ0VMTF9DSEFSLG4uTlVMTF9DRUxMX1dJRFRILG4uTlVMTF9DRUxMX0NPREVdKTtmb3IobGV0IHQ9MDt0PGU7Kyt0KXRoaXMuc2V0Q2VsbCh0LHMpO3RoaXMubGVuZ3RoPWV9Z2V0KGUpe2NvbnN0IHQ9dGhpcy5fZGF0YVszKmUrMF0saT0yMDk3MTUxJnQ7cmV0dXJuW3RoaXMuX2RhdGFbMyplKzFdLDIwOTcxNTImdD90aGlzLl9jb21iaW5lZFtlXTppPygwLG8uc3RyaW5nRnJvbUNvZGVQb2ludCkoaSk6XCJcIix0Pj4yMiwyMDk3MTUyJnQ/dGhpcy5fY29tYmluZWRbZV0uY2hhckNvZGVBdCh0aGlzLl9jb21iaW5lZFtlXS5sZW5ndGgtMSk6aV19c2V0KGUsdCl7dGhpcy5fZGF0YVszKmUrMV09dFtuLkNIQVJfREFUQV9BVFRSX0lOREVYXSx0W24uQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmxlbmd0aD4xPyh0aGlzLl9jb21iaW5lZFtlXT10WzFdLHRoaXMuX2RhdGFbMyplKzBdPTIwOTcxNTJ8ZXx0W24uQ0hBUl9EQVRBX1dJRFRIX0lOREVYXTw8MjIpOnRoaXMuX2RhdGFbMyplKzBdPXRbbi5DSEFSX0RBVEFfQ0hBUl9JTkRFWF0uY2hhckNvZGVBdCgwKXx0W24uQ0hBUl9EQVRBX1dJRFRIX0lOREVYXTw8MjJ9Z2V0V2lkdGgoZSl7cmV0dXJuIHRoaXMuX2RhdGFbMyplKzBdPj4yMn1oYXNXaWR0aChlKXtyZXR1cm4gMTI1ODI5MTImdGhpcy5fZGF0YVszKmUrMF19Z2V0RmcoZSl7cmV0dXJuIHRoaXMuX2RhdGFbMyplKzFdfWdldEJnKGUpe3JldHVybiB0aGlzLl9kYXRhWzMqZSsyXX1oYXNDb250ZW50KGUpe3JldHVybiA0MTk0MzAzJnRoaXMuX2RhdGFbMyplKzBdfWdldENvZGVQb2ludChlKXtjb25zdCB0PXRoaXMuX2RhdGFbMyplKzBdO3JldHVybiAyMDk3MTUyJnQ/dGhpcy5fY29tYmluZWRbZV0uY2hhckNvZGVBdCh0aGlzLl9jb21iaW5lZFtlXS5sZW5ndGgtMSk6MjA5NzE1MSZ0fWlzQ29tYmluZWQoZSl7cmV0dXJuIDIwOTcxNTImdGhpcy5fZGF0YVszKmUrMF19Z2V0U3RyaW5nKGUpe2NvbnN0IHQ9dGhpcy5fZGF0YVszKmUrMF07cmV0dXJuIDIwOTcxNTImdD90aGlzLl9jb21iaW5lZFtlXToyMDk3MTUxJnQ/KDAsby5zdHJpbmdGcm9tQ29kZVBvaW50KSgyMDk3MTUxJnQpOlwiXCJ9aXNQcm90ZWN0ZWQoZSl7cmV0dXJuIDUzNjg3MDkxMiZ0aGlzLl9kYXRhWzMqZSsyXX1sb2FkQ2VsbChlLHQpe3JldHVybiBhPTMqZSx0LmNvbnRlbnQ9dGhpcy5fZGF0YVthKzBdLHQuZmc9dGhpcy5fZGF0YVthKzFdLHQuYmc9dGhpcy5fZGF0YVthKzJdLDIwOTcxNTImdC5jb250ZW50JiYodC5jb21iaW5lZERhdGE9dGhpcy5fY29tYmluZWRbZV0pLDI2ODQzNTQ1NiZ0LmJnJiYodC5leHRlbmRlZD10aGlzLl9leHRlbmRlZEF0dHJzW2VdKSx0fXNldENlbGwoZSx0KXsyMDk3MTUyJnQuY29udGVudCYmKHRoaXMuX2NvbWJpbmVkW2VdPXQuY29tYmluZWREYXRhKSwyNjg0MzU0NTYmdC5iZyYmKHRoaXMuX2V4dGVuZGVkQXR0cnNbZV09dC5leHRlbmRlZCksdGhpcy5fZGF0YVszKmUrMF09dC5jb250ZW50LHRoaXMuX2RhdGFbMyplKzFdPXQuZmcsdGhpcy5fZGF0YVszKmUrMl09dC5iZ31zZXRDZWxsRnJvbUNvZGVwb2ludChlLHQsaSxzKXsyNjg0MzU0NTYmcy5iZyYmKHRoaXMuX2V4dGVuZGVkQXR0cnNbZV09cy5leHRlbmRlZCksdGhpcy5fZGF0YVszKmUrMF09dHxpPDwyMix0aGlzLl9kYXRhWzMqZSsxXT1zLmZnLHRoaXMuX2RhdGFbMyplKzJdPXMuYmd9YWRkQ29kZXBvaW50VG9DZWxsKGUsdCxpKXtsZXQgcz10aGlzLl9kYXRhWzMqZSswXTsyMDk3MTUyJnM/dGhpcy5fY29tYmluZWRbZV0rPSgwLG8uc3RyaW5nRnJvbUNvZGVQb2ludCkodCk6MjA5NzE1MSZzPyh0aGlzLl9jb21iaW5lZFtlXT0oMCxvLnN0cmluZ0Zyb21Db2RlUG9pbnQpKDIwOTcxNTEmcykrKDAsby5zdHJpbmdGcm9tQ29kZVBvaW50KSh0KSxzJj0tMjA5NzE1MixzfD0yMDk3MTUyKTpzPXR8MTw8MjIsaSYmKHMmPS0xMjU4MjkxMyxzfD1pPDwyMiksdGhpcy5fZGF0YVszKmUrMF09c31pbnNlcnRDZWxscyhlLHQsaSl7aWYoKGUlPXRoaXMubGVuZ3RoKSYmMj09PXRoaXMuZ2V0V2lkdGgoZS0xKSYmdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChlLTEsMCwxLGkpLHQ8dGhpcy5sZW5ndGgtZSl7Y29uc3Qgcz1uZXcgci5DZWxsRGF0YTtmb3IobGV0IGk9dGhpcy5sZW5ndGgtZS10LTE7aT49MDstLWkpdGhpcy5zZXRDZWxsKGUrdCtpLHRoaXMubG9hZENlbGwoZStpLHMpKTtmb3IobGV0IHM9MDtzPHQ7KytzKXRoaXMuc2V0Q2VsbChlK3MsaSl9ZWxzZSBmb3IobGV0IHQ9ZTt0PHRoaXMubGVuZ3RoOysrdCl0aGlzLnNldENlbGwodCxpKTsyPT09dGhpcy5nZXRXaWR0aCh0aGlzLmxlbmd0aC0xKSYmdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludCh0aGlzLmxlbmd0aC0xLDAsMSxpKX1kZWxldGVDZWxscyhlLHQsaSl7aWYoZSU9dGhpcy5sZW5ndGgsdDx0aGlzLmxlbmd0aC1lKXtjb25zdCBzPW5ldyByLkNlbGxEYXRhO2ZvcihsZXQgaT0wO2k8dGhpcy5sZW5ndGgtZS10OysraSl0aGlzLnNldENlbGwoZStpLHRoaXMubG9hZENlbGwoZSt0K2kscykpO2ZvcihsZXQgZT10aGlzLmxlbmd0aC10O2U8dGhpcy5sZW5ndGg7KytlKXRoaXMuc2V0Q2VsbChlLGkpfWVsc2UgZm9yKGxldCB0PWU7dDx0aGlzLmxlbmd0aDsrK3QpdGhpcy5zZXRDZWxsKHQsaSk7ZSYmMj09PXRoaXMuZ2V0V2lkdGgoZS0xKSYmdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChlLTEsMCwxLGkpLDAhPT10aGlzLmdldFdpZHRoKGUpfHx0aGlzLmhhc0NvbnRlbnQoZSl8fHRoaXMuc2V0Q2VsbEZyb21Db2RlcG9pbnQoZSwwLDEsaSl9cmVwbGFjZUNlbGxzKGUsdCxpLHM9ITEpe2lmKHMpZm9yKGUmJjI9PT10aGlzLmdldFdpZHRoKGUtMSkmJiF0aGlzLmlzUHJvdGVjdGVkKGUtMSkmJnRoaXMuc2V0Q2VsbEZyb21Db2RlcG9pbnQoZS0xLDAsMSxpKSx0PHRoaXMubGVuZ3RoJiYyPT09dGhpcy5nZXRXaWR0aCh0LTEpJiYhdGhpcy5pc1Byb3RlY3RlZCh0KSYmdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludCh0LDAsMSxpKTtlPHQmJmU8dGhpcy5sZW5ndGg7KXRoaXMuaXNQcm90ZWN0ZWQoZSl8fHRoaXMuc2V0Q2VsbChlLGkpLGUrKztlbHNlIGZvcihlJiYyPT09dGhpcy5nZXRXaWR0aChlLTEpJiZ0aGlzLnNldENlbGxGcm9tQ29kZXBvaW50KGUtMSwwLDEsaSksdDx0aGlzLmxlbmd0aCYmMj09PXRoaXMuZ2V0V2lkdGgodC0xKSYmdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludCh0LDAsMSxpKTtlPHQmJmU8dGhpcy5sZW5ndGg7KXRoaXMuc2V0Q2VsbChlKyssaSl9cmVzaXplKGUsdCl7aWYoZT09PXRoaXMubGVuZ3RoKXJldHVybiA0KnRoaXMuX2RhdGEubGVuZ3RoKjI8dGhpcy5fZGF0YS5idWZmZXIuYnl0ZUxlbmd0aDtjb25zdCBpPTMqZTtpZihlPnRoaXMubGVuZ3RoKXtpZih0aGlzLl9kYXRhLmJ1ZmZlci5ieXRlTGVuZ3RoPj00KmkpdGhpcy5fZGF0YT1uZXcgVWludDMyQXJyYXkodGhpcy5fZGF0YS5idWZmZXIsMCxpKTtlbHNle2NvbnN0IGU9bmV3IFVpbnQzMkFycmF5KGkpO2Uuc2V0KHRoaXMuX2RhdGEpLHRoaXMuX2RhdGE9ZX1mb3IobGV0IGk9dGhpcy5sZW5ndGg7aTxlOysraSl0aGlzLnNldENlbGwoaSx0KX1lbHNle3RoaXMuX2RhdGE9dGhpcy5fZGF0YS5zdWJhcnJheSgwLGkpO2NvbnN0IHQ9T2JqZWN0LmtleXModGhpcy5fY29tYmluZWQpO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtjb25zdCBzPXBhcnNlSW50KHRbaV0sMTApO3M+PWUmJmRlbGV0ZSB0aGlzLl9jb21iaW5lZFtzXX1jb25zdCBzPU9iamVjdC5rZXlzKHRoaXMuX2V4dGVuZGVkQXR0cnMpO2ZvcihsZXQgdD0wO3Q8cy5sZW5ndGg7dCsrKXtjb25zdCBpPXBhcnNlSW50KHNbdF0sMTApO2k+PWUmJmRlbGV0ZSB0aGlzLl9leHRlbmRlZEF0dHJzW2ldfX1yZXR1cm4gdGhpcy5sZW5ndGg9ZSw0KmkqMjx0aGlzLl9kYXRhLmJ1ZmZlci5ieXRlTGVuZ3RofWNsZWFudXBNZW1vcnkoKXtpZig0KnRoaXMuX2RhdGEubGVuZ3RoKjI8dGhpcy5fZGF0YS5idWZmZXIuYnl0ZUxlbmd0aCl7Y29uc3QgZT1uZXcgVWludDMyQXJyYXkodGhpcy5fZGF0YS5sZW5ndGgpO3JldHVybiBlLnNldCh0aGlzLl9kYXRhKSx0aGlzLl9kYXRhPWUsMX1yZXR1cm4gMH1maWxsKGUsdD0hMSl7aWYodClmb3IobGV0IHQ9MDt0PHRoaXMubGVuZ3RoOysrdCl0aGlzLmlzUHJvdGVjdGVkKHQpfHx0aGlzLnNldENlbGwodCxlKTtlbHNle3RoaXMuX2NvbWJpbmVkPXt9LHRoaXMuX2V4dGVuZGVkQXR0cnM9e307Zm9yKGxldCB0PTA7dDx0aGlzLmxlbmd0aDsrK3QpdGhpcy5zZXRDZWxsKHQsZSl9fWNvcHlGcm9tKGUpe3RoaXMubGVuZ3RoIT09ZS5sZW5ndGg/dGhpcy5fZGF0YT1uZXcgVWludDMyQXJyYXkoZS5fZGF0YSk6dGhpcy5fZGF0YS5zZXQoZS5fZGF0YSksdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5fY29tYmluZWQ9e307Zm9yKGNvbnN0IHQgaW4gZS5fY29tYmluZWQpdGhpcy5fY29tYmluZWRbdF09ZS5fY29tYmluZWRbdF07dGhpcy5fZXh0ZW5kZWRBdHRycz17fTtmb3IoY29uc3QgdCBpbiBlLl9leHRlbmRlZEF0dHJzKXRoaXMuX2V4dGVuZGVkQXR0cnNbdF09ZS5fZXh0ZW5kZWRBdHRyc1t0XTt0aGlzLmlzV3JhcHBlZD1lLmlzV3JhcHBlZH1jbG9uZSgpe2NvbnN0IGU9bmV3IGgoMCk7ZS5fZGF0YT1uZXcgVWludDMyQXJyYXkodGhpcy5fZGF0YSksZS5sZW5ndGg9dGhpcy5sZW5ndGg7Zm9yKGNvbnN0IHQgaW4gdGhpcy5fY29tYmluZWQpZS5fY29tYmluZWRbdF09dGhpcy5fY29tYmluZWRbdF07Zm9yKGNvbnN0IHQgaW4gdGhpcy5fZXh0ZW5kZWRBdHRycyllLl9leHRlbmRlZEF0dHJzW3RdPXRoaXMuX2V4dGVuZGVkQXR0cnNbdF07cmV0dXJuIGUuaXNXcmFwcGVkPXRoaXMuaXNXcmFwcGVkLGV9Z2V0VHJpbW1lZExlbmd0aCgpe2ZvcihsZXQgZT10aGlzLmxlbmd0aC0xO2U+PTA7LS1lKWlmKDQxOTQzMDMmdGhpcy5fZGF0YVszKmUrMF0pcmV0dXJuIGUrKHRoaXMuX2RhdGFbMyplKzBdPj4yMik7cmV0dXJuIDB9Z2V0Tm9CZ1RyaW1tZWRMZW5ndGgoKXtmb3IobGV0IGU9dGhpcy5sZW5ndGgtMTtlPj0wOy0tZSlpZig0MTk0MzAzJnRoaXMuX2RhdGFbMyplKzBdfHw1MDMzMTY0OCZ0aGlzLl9kYXRhWzMqZSsyXSlyZXR1cm4gZSsodGhpcy5fZGF0YVszKmUrMF0+PjIyKTtyZXR1cm4gMH1jb3B5Q2VsbHNGcm9tKGUsdCxpLHMscil7Y29uc3Qgbj1lLl9kYXRhO2lmKHIpZm9yKGxldCByPXMtMTtyPj0wO3ItLSl7Zm9yKGxldCBlPTA7ZTwzO2UrKyl0aGlzLl9kYXRhWzMqKGkrcikrZV09blszKih0K3IpK2VdOzI2ODQzNTQ1NiZuWzMqKHQrcikrMl0mJih0aGlzLl9leHRlbmRlZEF0dHJzW2krcl09ZS5fZXh0ZW5kZWRBdHRyc1t0K3JdKX1lbHNlIGZvcihsZXQgcj0wO3I8cztyKyspe2ZvcihsZXQgZT0wO2U8MztlKyspdGhpcy5fZGF0YVszKihpK3IpK2VdPW5bMyoodCtyKStlXTsyNjg0MzU0NTYmblszKih0K3IpKzJdJiYodGhpcy5fZXh0ZW5kZWRBdHRyc1tpK3JdPWUuX2V4dGVuZGVkQXR0cnNbdCtyXSl9Y29uc3Qgbz1PYmplY3Qua2V5cyhlLl9jb21iaW5lZCk7Zm9yKGxldCBzPTA7czxvLmxlbmd0aDtzKyspe2NvbnN0IHI9cGFyc2VJbnQob1tzXSwxMCk7cj49dCYmKHRoaXMuX2NvbWJpbmVkW3ItdCtpXT1lLl9jb21iaW5lZFtyXSl9fXRyYW5zbGF0ZVRvU3RyaW5nKGUsdCxpLHMpe3Q9dD8/MCxpPWk/P3RoaXMubGVuZ3RoLGUmJihpPU1hdGgubWluKGksdGhpcy5nZXRUcmltbWVkTGVuZ3RoKCkpKSxzJiYocy5sZW5ndGg9MCk7bGV0IHI9XCJcIjtmb3IoO3Q8aTspe2NvbnN0IGU9dGhpcy5fZGF0YVszKnQrMF0saT0yMDk3MTUxJmUsYT0yMDk3MTUyJmU/dGhpcy5fY29tYmluZWRbdF06aT8oMCxvLnN0cmluZ0Zyb21Db2RlUG9pbnQpKGkpOm4uV0hJVEVTUEFDRV9DRUxMX0NIQVI7aWYocis9YSxzKWZvcihsZXQgZT0wO2U8YS5sZW5ndGg7KytlKXMucHVzaCh0KTt0Kz1lPj4yMnx8MX1yZXR1cm4gcyYmcy5wdXNoKHQpLHJ9fXQuQnVmZmVyTGluZT1ofSw0ODQxOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5nZXRSYW5nZUxlbmd0aD12b2lkIDAsdC5nZXRSYW5nZUxlbmd0aD1mdW5jdGlvbihlLHQpe2lmKGUuc3RhcnQueT5lLmVuZC55KXRocm93IG5ldyBFcnJvcihgQnVmZmVyIHJhbmdlIGVuZCAoJHtlLmVuZC54fSwgJHtlLmVuZC55fSkgY2Fubm90IGJlIGJlZm9yZSBzdGFydCAoJHtlLnN0YXJ0Lnh9LCAke2Uuc3RhcnQueX0pYCk7cmV0dXJuIHQqKGUuZW5kLnktZS5zdGFydC55KSsoZS5lbmQueC1lLnN0YXJ0LngrMSl9fSw0NjM0OihlLHQpPT57ZnVuY3Rpb24gaShlLHQsaSl7aWYodD09PWUubGVuZ3RoLTEpcmV0dXJuIGVbdF0uZ2V0VHJpbW1lZExlbmd0aCgpO2NvbnN0IHM9IWVbdF0uaGFzQ29udGVudChpLTEpJiYxPT09ZVt0XS5nZXRXaWR0aChpLTEpLHI9Mj09PWVbdCsxXS5nZXRXaWR0aCgwKTtyZXR1cm4gcyYmcj9pLTE6aX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LmdldFdyYXBwZWRMaW5lVHJpbW1lZExlbmd0aD10LnJlZmxvd1NtYWxsZXJHZXROZXdMaW5lTGVuZ3Rocz10LnJlZmxvd0xhcmdlckFwcGx5TmV3TGF5b3V0PXQucmVmbG93TGFyZ2VyQ3JlYXRlTmV3TGF5b3V0PXQucmVmbG93TGFyZ2VyR2V0TGluZXNUb1JlbW92ZT12b2lkIDAsdC5yZWZsb3dMYXJnZXJHZXRMaW5lc1RvUmVtb3ZlPWZ1bmN0aW9uKGUsdCxzLHIsbil7Y29uc3Qgbz1bXTtmb3IobGV0IGE9MDthPGUubGVuZ3RoLTE7YSsrKXtsZXQgaD1hLGM9ZS5nZXQoKytoKTtpZighYy5pc1dyYXBwZWQpY29udGludWU7Y29uc3QgbD1bZS5nZXQoYSldO2Zvcig7aDxlLmxlbmd0aCYmYy5pc1dyYXBwZWQ7KWwucHVzaChjKSxjPWUuZ2V0KCsraCk7aWYocj49YSYmcjxoKXthKz1sLmxlbmd0aC0xO2NvbnRpbnVlfWxldCBkPTAsXz1pKGwsZCx0KSx1PTEsZj0wO2Zvcig7dTxsLmxlbmd0aDspe2NvbnN0IGU9aShsLHUsdCkscj1lLWYsbz1zLV8sYT1NYXRoLm1pbihyLG8pO2xbZF0uY29weUNlbGxzRnJvbShsW3VdLGYsXyxhLCExKSxfKz1hLF89PT1zJiYoZCsrLF89MCksZis9YSxmPT09ZSYmKHUrKyxmPTApLDA9PT1fJiYwIT09ZCYmMj09PWxbZC0xXS5nZXRXaWR0aChzLTEpJiYobFtkXS5jb3B5Q2VsbHNGcm9tKGxbZC0xXSxzLTEsXysrLDEsITEpLGxbZC0xXS5zZXRDZWxsKHMtMSxuKSl9bFtkXS5yZXBsYWNlQ2VsbHMoXyxzLG4pO2xldCB2PTA7Zm9yKGxldCBlPWwubGVuZ3RoLTE7ZT4wJiYoZT5kfHwwPT09bFtlXS5nZXRUcmltbWVkTGVuZ3RoKCkpO2UtLSl2Kys7dj4wJiYoby5wdXNoKGErbC5sZW5ndGgtdiksby5wdXNoKHYpKSxhKz1sLmxlbmd0aC0xfXJldHVybiBvfSx0LnJlZmxvd0xhcmdlckNyZWF0ZU5ld0xheW91dD1mdW5jdGlvbihlLHQpe2NvbnN0IGk9W107bGV0IHM9MCxyPXRbc10sbj0wO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKWlmKHI9PT1vKXtjb25zdCBpPXRbKytzXTtlLm9uRGVsZXRlRW1pdHRlci5maXJlKHtpbmRleDpvLW4sYW1vdW50Oml9KSxvKz1pLTEsbis9aSxyPXRbKytzXX1lbHNlIGkucHVzaChvKTtyZXR1cm57bGF5b3V0OmksY291bnRSZW1vdmVkOm59fSx0LnJlZmxvd0xhcmdlckFwcGx5TmV3TGF5b3V0PWZ1bmN0aW9uKGUsdCl7Y29uc3QgaT1bXTtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKylpLnB1c2goZS5nZXQodFtzXSkpO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKWUuc2V0KHQsaVt0XSk7ZS5sZW5ndGg9dC5sZW5ndGh9LHQucmVmbG93U21hbGxlckdldE5ld0xpbmVMZW5ndGhzPWZ1bmN0aW9uKGUsdCxzKXtjb25zdCByPVtdLG49ZS5tYXAoKChzLHIpPT5pKGUscix0KSkpLnJlZHVjZSgoKGUsdCk9PmUrdCkpO2xldCBvPTAsYT0wLGg9MDtmb3IoO2g8bjspe2lmKG4taDxzKXtyLnB1c2gobi1oKTticmVha31vKz1zO2NvbnN0IGM9aShlLGEsdCk7bz5jJiYoby09YyxhKyspO2NvbnN0IGw9Mj09PWVbYV0uZ2V0V2lkdGgoby0xKTtsJiZvLS07Y29uc3QgZD1sP3MtMTpzO3IucHVzaChkKSxoKz1kfXJldHVybiByfSx0LmdldFdyYXBwZWRMaW5lVHJpbW1lZExlbmd0aD1pfSw1Mjk1OihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkJ1ZmZlclNldD12b2lkIDA7Y29uc3Qgcz1pKDg0NjApLHI9aSg4NDQpLG49aSg5MDkyKTtjbGFzcyBvIGV4dGVuZHMgci5EaXNwb3NhYmxle2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKSx0aGlzLl9vcHRpb25zU2VydmljZT1lLHRoaXMuX2J1ZmZlclNlcnZpY2U9dCx0aGlzLl9vbkJ1ZmZlckFjdGl2YXRlPXRoaXMucmVnaXN0ZXIobmV3IHMuRXZlbnRFbWl0dGVyKSx0aGlzLm9uQnVmZmVyQWN0aXZhdGU9dGhpcy5fb25CdWZmZXJBY3RpdmF0ZS5ldmVudCx0aGlzLnJlc2V0KCksdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKFwic2Nyb2xsYmFja1wiLCgoKT0+dGhpcy5yZXNpemUodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cykpKSksdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKFwidGFiU3RvcFdpZHRoXCIsKCgpPT50aGlzLnNldHVwVGFiU3RvcHMoKSkpKX1yZXNldCgpe3RoaXMuX25vcm1hbD1uZXcgbi5CdWZmZXIoITAsdGhpcy5fb3B0aW9uc1NlcnZpY2UsdGhpcy5fYnVmZmVyU2VydmljZSksdGhpcy5fbm9ybWFsLmZpbGxWaWV3cG9ydFJvd3MoKSx0aGlzLl9hbHQ9bmV3IG4uQnVmZmVyKCExLHRoaXMuX29wdGlvbnNTZXJ2aWNlLHRoaXMuX2J1ZmZlclNlcnZpY2UpLHRoaXMuX2FjdGl2ZUJ1ZmZlcj10aGlzLl9ub3JtYWwsdGhpcy5fb25CdWZmZXJBY3RpdmF0ZS5maXJlKHthY3RpdmVCdWZmZXI6dGhpcy5fbm9ybWFsLGluYWN0aXZlQnVmZmVyOnRoaXMuX2FsdH0pLHRoaXMuc2V0dXBUYWJTdG9wcygpfWdldCBhbHQoKXtyZXR1cm4gdGhpcy5fYWx0fWdldCBhY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlQnVmZmVyfWdldCBub3JtYWwoKXtyZXR1cm4gdGhpcy5fbm9ybWFsfWFjdGl2YXRlTm9ybWFsQnVmZmVyKCl7dGhpcy5fYWN0aXZlQnVmZmVyIT09dGhpcy5fbm9ybWFsJiYodGhpcy5fbm9ybWFsLng9dGhpcy5fYWx0LngsdGhpcy5fbm9ybWFsLnk9dGhpcy5fYWx0LnksdGhpcy5fYWx0LmNsZWFyQWxsTWFya2VycygpLHRoaXMuX2FsdC5jbGVhcigpLHRoaXMuX2FjdGl2ZUJ1ZmZlcj10aGlzLl9ub3JtYWwsdGhpcy5fb25CdWZmZXJBY3RpdmF0ZS5maXJlKHthY3RpdmVCdWZmZXI6dGhpcy5fbm9ybWFsLGluYWN0aXZlQnVmZmVyOnRoaXMuX2FsdH0pKX1hY3RpdmF0ZUFsdEJ1ZmZlcihlKXt0aGlzLl9hY3RpdmVCdWZmZXIhPT10aGlzLl9hbHQmJih0aGlzLl9hbHQuZmlsbFZpZXdwb3J0Um93cyhlKSx0aGlzLl9hbHQueD10aGlzLl9ub3JtYWwueCx0aGlzLl9hbHQueT10aGlzLl9ub3JtYWwueSx0aGlzLl9hY3RpdmVCdWZmZXI9dGhpcy5fYWx0LHRoaXMuX29uQnVmZmVyQWN0aXZhdGUuZmlyZSh7YWN0aXZlQnVmZmVyOnRoaXMuX2FsdCxpbmFjdGl2ZUJ1ZmZlcjp0aGlzLl9ub3JtYWx9KSl9cmVzaXplKGUsdCl7dGhpcy5fbm9ybWFsLnJlc2l6ZShlLHQpLHRoaXMuX2FsdC5yZXNpemUoZSx0KSx0aGlzLnNldHVwVGFiU3RvcHMoZSl9c2V0dXBUYWJTdG9wcyhlKXt0aGlzLl9ub3JtYWwuc2V0dXBUYWJTdG9wcyhlKSx0aGlzLl9hbHQuc2V0dXBUYWJTdG9wcyhlKX19dC5CdWZmZXJTZXQ9b30sNTExOihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkNlbGxEYXRhPXZvaWQgMDtjb25zdCBzPWkoNDgyKSxyPWkoNjQzKSxuPWkoMzczNCk7Y2xhc3MgbyBleHRlbmRzIG4uQXR0cmlidXRlRGF0YXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb250ZW50PTAsdGhpcy5mZz0wLHRoaXMuYmc9MCx0aGlzLmV4dGVuZGVkPW5ldyBuLkV4dGVuZGVkQXR0cnMsdGhpcy5jb21iaW5lZERhdGE9XCJcIn1zdGF0aWMgZnJvbUNoYXJEYXRhKGUpe2NvbnN0IHQ9bmV3IG87cmV0dXJuIHQuc2V0RnJvbUNoYXJEYXRhKGUpLHR9aXNDb21iaW5lZCgpe3JldHVybiAyMDk3MTUyJnRoaXMuY29udGVudH1nZXRXaWR0aCgpe3JldHVybiB0aGlzLmNvbnRlbnQ+PjIyfWdldENoYXJzKCl7cmV0dXJuIDIwOTcxNTImdGhpcy5jb250ZW50P3RoaXMuY29tYmluZWREYXRhOjIwOTcxNTEmdGhpcy5jb250ZW50PygwLHMuc3RyaW5nRnJvbUNvZGVQb2ludCkoMjA5NzE1MSZ0aGlzLmNvbnRlbnQpOlwiXCJ9Z2V0Q29kZSgpe3JldHVybiB0aGlzLmlzQ29tYmluZWQoKT90aGlzLmNvbWJpbmVkRGF0YS5jaGFyQ29kZUF0KHRoaXMuY29tYmluZWREYXRhLmxlbmd0aC0xKToyMDk3MTUxJnRoaXMuY29udGVudH1zZXRGcm9tQ2hhckRhdGEoZSl7dGhpcy5mZz1lW3IuQ0hBUl9EQVRBX0FUVFJfSU5ERVhdLHRoaXMuYmc9MDtsZXQgdD0hMTtpZihlW3IuQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmxlbmd0aD4yKXQ9ITA7ZWxzZSBpZigyPT09ZVtyLkNIQVJfREFUQV9DSEFSX0lOREVYXS5sZW5ndGgpe2NvbnN0IGk9ZVtyLkNIQVJfREFUQV9DSEFSX0lOREVYXS5jaGFyQ29kZUF0KDApO2lmKDU1Mjk2PD1pJiZpPD01NjMxOSl7Y29uc3Qgcz1lW3IuQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMSk7NTYzMjA8PXMmJnM8PTU3MzQzP3RoaXMuY29udGVudD0xMDI0KihpLTU1Mjk2KStzLTU2MzIwKzY1NTM2fGVbci5DSEFSX0RBVEFfV0lEVEhfSU5ERVhdPDwyMjp0PSEwfWVsc2UgdD0hMH1lbHNlIHRoaXMuY29udGVudD1lW3IuQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMCl8ZVtyLkNIQVJfREFUQV9XSURUSF9JTkRFWF08PDIyO3QmJih0aGlzLmNvbWJpbmVkRGF0YT1lW3IuQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLHRoaXMuY29udGVudD0yMDk3MTUyfGVbci5DSEFSX0RBVEFfV0lEVEhfSU5ERVhdPDwyMil9Z2V0QXNDaGFyRGF0YSgpe3JldHVyblt0aGlzLmZnLHRoaXMuZ2V0Q2hhcnMoKSx0aGlzLmdldFdpZHRoKCksdGhpcy5nZXRDb2RlKCldfX10LkNlbGxEYXRhPW99LDY0MzooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuV0hJVEVTUEFDRV9DRUxMX0NPREU9dC5XSElURVNQQUNFX0NFTExfV0lEVEg9dC5XSElURVNQQUNFX0NFTExfQ0hBUj10Lk5VTExfQ0VMTF9DT0RFPXQuTlVMTF9DRUxMX1dJRFRIPXQuTlVMTF9DRUxMX0NIQVI9dC5DSEFSX0RBVEFfQ09ERV9JTkRFWD10LkNIQVJfREFUQV9XSURUSF9JTkRFWD10LkNIQVJfREFUQV9DSEFSX0lOREVYPXQuQ0hBUl9EQVRBX0FUVFJfSU5ERVg9dC5ERUZBVUxUX0VYVD10LkRFRkFVTFRfQVRUUj10LkRFRkFVTFRfQ09MT1I9dm9pZCAwLHQuREVGQVVMVF9DT0xPUj0wLHQuREVGQVVMVF9BVFRSPTI1Nnx0LkRFRkFVTFRfQ09MT1I8PDksdC5ERUZBVUxUX0VYVD0wLHQuQ0hBUl9EQVRBX0FUVFJfSU5ERVg9MCx0LkNIQVJfREFUQV9DSEFSX0lOREVYPTEsdC5DSEFSX0RBVEFfV0lEVEhfSU5ERVg9Mix0LkNIQVJfREFUQV9DT0RFX0lOREVYPTMsdC5OVUxMX0NFTExfQ0hBUj1cIlwiLHQuTlVMTF9DRUxMX1dJRFRIPTEsdC5OVUxMX0NFTExfQ09ERT0wLHQuV0hJVEVTUEFDRV9DRUxMX0NIQVI9XCIgXCIsdC5XSElURVNQQUNFX0NFTExfV0lEVEg9MSx0LldISVRFU1BBQ0VfQ0VMTF9DT0RFPTMyfSw0ODYzOihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0Lk1hcmtlcj12b2lkIDA7Y29uc3Qgcz1pKDg0NjApLHI9aSg4NDQpO2NsYXNzIG57Z2V0IGlkKCl7cmV0dXJuIHRoaXMuX2lkfWNvbnN0cnVjdG9yKGUpe3RoaXMubGluZT1lLHRoaXMuaXNEaXNwb3NlZD0hMSx0aGlzLl9kaXNwb3NhYmxlcz1bXSx0aGlzLl9pZD1uLl9uZXh0SWQrKyx0aGlzLl9vbkRpc3Bvc2U9dGhpcy5yZWdpc3RlcihuZXcgcy5FdmVudEVtaXR0ZXIpLHRoaXMub25EaXNwb3NlPXRoaXMuX29uRGlzcG9zZS5ldmVudH1kaXNwb3NlKCl7dGhpcy5pc0Rpc3Bvc2VkfHwodGhpcy5pc0Rpc3Bvc2VkPSEwLHRoaXMubGluZT0tMSx0aGlzLl9vbkRpc3Bvc2UuZmlyZSgpLCgwLHIuZGlzcG9zZUFycmF5KSh0aGlzLl9kaXNwb3NhYmxlcyksdGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoPTApfXJlZ2lzdGVyKGUpe3JldHVybiB0aGlzLl9kaXNwb3NhYmxlcy5wdXNoKGUpLGV9fXQuTWFya2VyPW4sbi5fbmV4dElkPTF9LDcxMTY6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkRFRkFVTFRfQ0hBUlNFVD10LkNIQVJTRVRTPXZvaWQgMCx0LkNIQVJTRVRTPXt9LHQuREVGQVVMVF9DSEFSU0VUPXQuQ0hBUlNFVFMuQix0LkNIQVJTRVRTWzBdPXtcImBcIjpcIuKXhlwiLGE6XCLilpJcIixiOlwi4pCJXCIsYzpcIuKQjFwiLGQ6XCLikI1cIixlOlwi4pCKXCIsZjpcIsKwXCIsZzpcIsKxXCIsaDpcIuKQpFwiLGk6XCLikItcIixqOlwi4pSYXCIsazpcIuKUkFwiLGw6XCLilIxcIixtOlwi4pSUXCIsbjpcIuKUvFwiLG86XCLijrpcIixwOlwi4o67XCIscTpcIuKUgFwiLHI6XCLijrxcIixzOlwi4o69XCIsdDpcIuKUnFwiLHU6XCLilKRcIix2Olwi4pS0XCIsdzpcIuKUrFwiLHg6XCLilIJcIix5Olwi4omkXCIsejpcIuKJpVwiLFwie1wiOlwiz4BcIixcInxcIjpcIuKJoFwiLFwifVwiOlwiwqNcIixcIn5cIjpcIsK3XCJ9LHQuQ0hBUlNFVFMuQT17XCIjXCI6XCLCo1wifSx0LkNIQVJTRVRTLkI9dm9pZCAwLHQuQ0hBUlNFVFNbNF09e1wiI1wiOlwiwqNcIixcIkBcIjpcIsK+XCIsXCJbXCI6XCJpalwiLFwiXFxcXFwiOlwiwr1cIixcIl1cIjpcInxcIixcIntcIjpcIsKoXCIsXCJ8XCI6XCJmXCIsXCJ9XCI6XCLCvFwiLFwiflwiOlwiwrRcIn0sdC5DSEFSU0VUUy5DPXQuQ0hBUlNFVFNbNV09e1wiW1wiOlwiw4RcIixcIlxcXFxcIjpcIsOWXCIsXCJdXCI6XCLDhVwiLFwiXlwiOlwiw5xcIixcImBcIjpcIsOpXCIsXCJ7XCI6XCLDpFwiLFwifFwiOlwiw7ZcIixcIn1cIjpcIsOlXCIsXCJ+XCI6XCLDvFwifSx0LkNIQVJTRVRTLlI9e1wiI1wiOlwiwqNcIixcIkBcIjpcIsOgXCIsXCJbXCI6XCLCsFwiLFwiXFxcXFwiOlwiw6dcIixcIl1cIjpcIsKnXCIsXCJ7XCI6XCLDqVwiLFwifFwiOlwiw7lcIixcIn1cIjpcIsOoXCIsXCJ+XCI6XCLCqFwifSx0LkNIQVJTRVRTLlE9e1wiQFwiOlwiw6BcIixcIltcIjpcIsOiXCIsXCJcXFxcXCI6XCLDp1wiLFwiXVwiOlwiw6pcIixcIl5cIjpcIsOuXCIsXCJgXCI6XCLDtFwiLFwie1wiOlwiw6lcIixcInxcIjpcIsO5XCIsXCJ9XCI6XCLDqFwiLFwiflwiOlwiw7tcIn0sdC5DSEFSU0VUUy5LPXtcIkBcIjpcIsKnXCIsXCJbXCI6XCLDhFwiLFwiXFxcXFwiOlwiw5ZcIixcIl1cIjpcIsOcXCIsXCJ7XCI6XCLDpFwiLFwifFwiOlwiw7ZcIixcIn1cIjpcIsO8XCIsXCJ+XCI6XCLDn1wifSx0LkNIQVJTRVRTLlk9e1wiI1wiOlwiwqNcIixcIkBcIjpcIsKnXCIsXCJbXCI6XCLCsFwiLFwiXFxcXFwiOlwiw6dcIixcIl1cIjpcIsOpXCIsXCJgXCI6XCLDuVwiLFwie1wiOlwiw6BcIixcInxcIjpcIsOyXCIsXCJ9XCI6XCLDqFwiLFwiflwiOlwiw6xcIn0sdC5DSEFSU0VUUy5FPXQuQ0hBUlNFVFNbNl09e1wiQFwiOlwiw4RcIixcIltcIjpcIsOGXCIsXCJcXFxcXCI6XCLDmFwiLFwiXVwiOlwiw4VcIixcIl5cIjpcIsOcXCIsXCJgXCI6XCLDpFwiLFwie1wiOlwiw6ZcIixcInxcIjpcIsO4XCIsXCJ9XCI6XCLDpVwiLFwiflwiOlwiw7xcIn0sdC5DSEFSU0VUUy5aPXtcIiNcIjpcIsKjXCIsXCJAXCI6XCLCp1wiLFwiW1wiOlwiwqFcIixcIlxcXFxcIjpcIsORXCIsXCJdXCI6XCLCv1wiLFwie1wiOlwiwrBcIixcInxcIjpcIsOxXCIsXCJ9XCI6XCLDp1wifSx0LkNIQVJTRVRTLkg9dC5DSEFSU0VUU1s3XT17XCJAXCI6XCLDiVwiLFwiW1wiOlwiw4RcIixcIlxcXFxcIjpcIsOWXCIsXCJdXCI6XCLDhVwiLFwiXlwiOlwiw5xcIixcImBcIjpcIsOpXCIsXCJ7XCI6XCLDpFwiLFwifFwiOlwiw7ZcIixcIn1cIjpcIsOlXCIsXCJ+XCI6XCLDvFwifSx0LkNIQVJTRVRTW1wiPVwiXT17XCIjXCI6XCLDuVwiLFwiQFwiOlwiw6BcIixcIltcIjpcIsOpXCIsXCJcXFxcXCI6XCLDp1wiLFwiXVwiOlwiw6pcIixcIl5cIjpcIsOuXCIsXzpcIsOoXCIsXCJgXCI6XCLDtFwiLFwie1wiOlwiw6RcIixcInxcIjpcIsO2XCIsXCJ9XCI6XCLDvFwiLFwiflwiOlwiw7tcIn19LDI1ODQ6KGUsdCk9Pnt2YXIgaSxzLHI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5DMV9FU0NBUEVEPXQuQzE9dC5DMD12b2lkIDAsZnVuY3Rpb24oZSl7ZS5OVUw9XCJcXDBcIixlLlNPSD1cIlx1MDAwMVwiLGUuU1RYPVwiXHUwMDAyXCIsZS5FVFg9XCJcdTAwMDNcIixlLkVPVD1cIlx1MDAwNFwiLGUuRU5RPVwiXHUwMDA1XCIsZS5BQ0s9XCJcdTAwMDZcIixlLkJFTD1cIlx1MDAwN1wiLGUuQlM9XCJcXGJcIixlLkhUPVwiXFx0XCIsZS5MRj1cIlxcblwiLGUuVlQ9XCJcXHZcIixlLkZGPVwiXFxmXCIsZS5DUj1cIlxcclwiLGUuU089XCJcdTAwMGVcIixlLlNJPVwiXHUwMDBmXCIsZS5ETEU9XCJcdTAwMTBcIixlLkRDMT1cIlx1MDAxMVwiLGUuREMyPVwiXHUwMDEyXCIsZS5EQzM9XCJcdTAwMTNcIixlLkRDND1cIlx1MDAxNFwiLGUuTkFLPVwiXHUwMDE1XCIsZS5TWU49XCJcdTAwMTZcIixlLkVUQj1cIlx1MDAxN1wiLGUuQ0FOPVwiXHUwMDE4XCIsZS5FTT1cIlx1MDAxOVwiLGUuU1VCPVwiXHUwMDFhXCIsZS5FU0M9XCJcdTAwMWJcIixlLkZTPVwiXHUwMDFjXCIsZS5HUz1cIlx1MDAxZFwiLGUuUlM9XCJcdTAwMWVcIixlLlVTPVwiXHUwMDFmXCIsZS5TUD1cIiBcIixlLkRFTD1cIn9cIn0oaXx8KHQuQzA9aT17fSkpLGZ1bmN0aW9uKGUpe2UuUEFEPVwiwoBcIixlLkhPUD1cIsKBXCIsZS5CUEg9XCLCglwiLGUuTkJIPVwiwoNcIixlLklORD1cIsKEXCIsZS5ORUw9XCLChVwiLGUuU1NBPVwiwoZcIixlLkVTQT1cIsKHXCIsZS5IVFM9XCLCiFwiLGUuSFRKPVwiwolcIixlLlZUUz1cIsKKXCIsZS5QTEQ9XCLCi1wiLGUuUExVPVwiwoxcIixlLlJJPVwiwo1cIixlLlNTMj1cIsKOXCIsZS5TUzM9XCLCj1wiLGUuRENTPVwiwpBcIixlLlBVMT1cIsKRXCIsZS5QVTI9XCLCklwiLGUuU1RTPVwiwpNcIixlLkNDSD1cIsKUXCIsZS5NVz1cIsKVXCIsZS5TUEE9XCLCllwiLGUuRVBBPVwiwpdcIixlLlNPUz1cIsKYXCIsZS5TR0NJPVwiwplcIixlLlNDST1cIsKaXCIsZS5DU0k9XCLCm1wiLGUuU1Q9XCLCnFwiLGUuT1NDPVwiwp1cIixlLlBNPVwiwp5cIixlLkFQQz1cIsKfXCJ9KHN8fCh0LkMxPXM9e30pKSxmdW5jdGlvbihlKXtlLlNUPWAke2kuRVNDfVxcXFxgfShyfHwodC5DMV9FU0NBUEVEPXI9e30pKX0sNzM5OTooZSx0LGkpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5ldmFsdWF0ZUtleWJvYXJkRXZlbnQ9dm9pZCAwO2NvbnN0IHM9aSgyNTg0KSxyPXs0ODpbXCIwXCIsXCIpXCJdLDQ5OltcIjFcIixcIiFcIl0sNTA6W1wiMlwiLFwiQFwiXSw1MTpbXCIzXCIsXCIjXCJdLDUyOltcIjRcIixcIiRcIl0sNTM6W1wiNVwiLFwiJVwiXSw1NDpbXCI2XCIsXCJeXCJdLDU1OltcIjdcIixcIiZcIl0sNTY6W1wiOFwiLFwiKlwiXSw1NzpbXCI5XCIsXCIoXCJdLDE4NjpbXCI7XCIsXCI6XCJdLDE4NzpbXCI9XCIsXCIrXCJdLDE4ODpbXCIsXCIsXCI8XCJdLDE4OTpbXCItXCIsXCJfXCJdLDE5MDpbXCIuXCIsXCI+XCJdLDE5MTpbXCIvXCIsXCI/XCJdLDE5MjpbXCJgXCIsXCJ+XCJdLDIxOTpbXCJbXCIsXCJ7XCJdLDIyMDpbXCJcXFxcXCIsXCJ8XCJdLDIyMTpbXCJdXCIsXCJ9XCJdLDIyMjpbXCInXCIsJ1wiJ119O3QuZXZhbHVhdGVLZXlib2FyZEV2ZW50PWZ1bmN0aW9uKGUsdCxpLG4pe2NvbnN0IG89e3R5cGU6MCxjYW5jZWw6ITEsa2V5OnZvaWQgMH0sYT0oZS5zaGlmdEtleT8xOjApfChlLmFsdEtleT8yOjApfChlLmN0cmxLZXk/NDowKXwoZS5tZXRhS2V5Pzg6MCk7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSAwOlwiVUlLZXlJbnB1dFVwQXJyb3dcIj09PWUua2V5P28ua2V5PXQ/cy5DMC5FU0MrXCJPQVwiOnMuQzAuRVNDK1wiW0FcIjpcIlVJS2V5SW5wdXRMZWZ0QXJyb3dcIj09PWUua2V5P28ua2V5PXQ/cy5DMC5FU0MrXCJPRFwiOnMuQzAuRVNDK1wiW0RcIjpcIlVJS2V5SW5wdXRSaWdodEFycm93XCI9PT1lLmtleT9vLmtleT10P3MuQzAuRVNDK1wiT0NcIjpzLkMwLkVTQytcIltDXCI6XCJVSUtleUlucHV0RG93bkFycm93XCI9PT1lLmtleSYmKG8ua2V5PXQ/cy5DMC5FU0MrXCJPQlwiOnMuQzAuRVNDK1wiW0JcIik7YnJlYWs7Y2FzZSA4Om8ua2V5PWUuY3RybEtleT9cIlxcYlwiOnMuQzAuREVMLGUuYWx0S2V5JiYoby5rZXk9cy5DMC5FU0Mrby5rZXkpO2JyZWFrO2Nhc2UgOTppZihlLnNoaWZ0S2V5KXtvLmtleT1zLkMwLkVTQytcIltaXCI7YnJlYWt9by5rZXk9cy5DMC5IVCxvLmNhbmNlbD0hMDticmVhaztjYXNlIDEzOm8ua2V5PWUuYWx0S2V5P3MuQzAuRVNDK3MuQzAuQ1I6cy5DMC5DUixvLmNhbmNlbD0hMDticmVhaztjYXNlIDI3Om8ua2V5PXMuQzAuRVNDLGUuYWx0S2V5JiYoby5rZXk9cy5DMC5FU0Mrcy5DMC5FU0MpLG8uY2FuY2VsPSEwO2JyZWFrO2Nhc2UgMzc6aWYoZS5tZXRhS2V5KWJyZWFrO2E/KG8ua2V5PXMuQzAuRVNDK1wiWzE7XCIrKGErMSkrXCJEXCIsby5rZXk9PT1zLkMwLkVTQytcIlsxOzNEXCImJihvLmtleT1zLkMwLkVTQysoaT9cImJcIjpcIlsxOzVEXCIpKSk6by5rZXk9dD9zLkMwLkVTQytcIk9EXCI6cy5DMC5FU0MrXCJbRFwiO2JyZWFrO2Nhc2UgMzk6aWYoZS5tZXRhS2V5KWJyZWFrO2E/KG8ua2V5PXMuQzAuRVNDK1wiWzE7XCIrKGErMSkrXCJDXCIsby5rZXk9PT1zLkMwLkVTQytcIlsxOzNDXCImJihvLmtleT1zLkMwLkVTQysoaT9cImZcIjpcIlsxOzVDXCIpKSk6by5rZXk9dD9zLkMwLkVTQytcIk9DXCI6cy5DMC5FU0MrXCJbQ1wiO2JyZWFrO2Nhc2UgMzg6aWYoZS5tZXRhS2V5KWJyZWFrO2E/KG8ua2V5PXMuQzAuRVNDK1wiWzE7XCIrKGErMSkrXCJBXCIsaXx8by5rZXkhPT1zLkMwLkVTQytcIlsxOzNBXCJ8fChvLmtleT1zLkMwLkVTQytcIlsxOzVBXCIpKTpvLmtleT10P3MuQzAuRVNDK1wiT0FcIjpzLkMwLkVTQytcIltBXCI7YnJlYWs7Y2FzZSA0MDppZihlLm1ldGFLZXkpYnJlYWs7YT8oby5rZXk9cy5DMC5FU0MrXCJbMTtcIisoYSsxKStcIkJcIixpfHxvLmtleSE9PXMuQzAuRVNDK1wiWzE7M0JcInx8KG8ua2V5PXMuQzAuRVNDK1wiWzE7NUJcIikpOm8ua2V5PXQ/cy5DMC5FU0MrXCJPQlwiOnMuQzAuRVNDK1wiW0JcIjticmVhaztjYXNlIDQ1OmUuc2hpZnRLZXl8fGUuY3RybEtleXx8KG8ua2V5PXMuQzAuRVNDK1wiWzJ+XCIpO2JyZWFrO2Nhc2UgNDY6by5rZXk9YT9zLkMwLkVTQytcIlszO1wiKyhhKzEpK1wiflwiOnMuQzAuRVNDK1wiWzN+XCI7YnJlYWs7Y2FzZSAzNjpvLmtleT1hP3MuQzAuRVNDK1wiWzE7XCIrKGErMSkrXCJIXCI6dD9zLkMwLkVTQytcIk9IXCI6cy5DMC5FU0MrXCJbSFwiO2JyZWFrO2Nhc2UgMzU6by5rZXk9YT9zLkMwLkVTQytcIlsxO1wiKyhhKzEpK1wiRlwiOnQ/cy5DMC5FU0MrXCJPRlwiOnMuQzAuRVNDK1wiW0ZcIjticmVhaztjYXNlIDMzOmUuc2hpZnRLZXk/by50eXBlPTI6ZS5jdHJsS2V5P28ua2V5PXMuQzAuRVNDK1wiWzU7XCIrKGErMSkrXCJ+XCI6by5rZXk9cy5DMC5FU0MrXCJbNX5cIjticmVhaztjYXNlIDM0OmUuc2hpZnRLZXk/by50eXBlPTM6ZS5jdHJsS2V5P28ua2V5PXMuQzAuRVNDK1wiWzY7XCIrKGErMSkrXCJ+XCI6by5rZXk9cy5DMC5FU0MrXCJbNn5cIjticmVhaztjYXNlIDExMjpvLmtleT1hP3MuQzAuRVNDK1wiWzE7XCIrKGErMSkrXCJQXCI6cy5DMC5FU0MrXCJPUFwiO2JyZWFrO2Nhc2UgMTEzOm8ua2V5PWE/cy5DMC5FU0MrXCJbMTtcIisoYSsxKStcIlFcIjpzLkMwLkVTQytcIk9RXCI7YnJlYWs7Y2FzZSAxMTQ6by5rZXk9YT9zLkMwLkVTQytcIlsxO1wiKyhhKzEpK1wiUlwiOnMuQzAuRVNDK1wiT1JcIjticmVhaztjYXNlIDExNTpvLmtleT1hP3MuQzAuRVNDK1wiWzE7XCIrKGErMSkrXCJTXCI6cy5DMC5FU0MrXCJPU1wiO2JyZWFrO2Nhc2UgMTE2Om8ua2V5PWE/cy5DMC5FU0MrXCJbMTU7XCIrKGErMSkrXCJ+XCI6cy5DMC5FU0MrXCJbMTV+XCI7YnJlYWs7Y2FzZSAxMTc6by5rZXk9YT9zLkMwLkVTQytcIlsxNztcIisoYSsxKStcIn5cIjpzLkMwLkVTQytcIlsxN35cIjticmVhaztjYXNlIDExODpvLmtleT1hP3MuQzAuRVNDK1wiWzE4O1wiKyhhKzEpK1wiflwiOnMuQzAuRVNDK1wiWzE4flwiO2JyZWFrO2Nhc2UgMTE5Om8ua2V5PWE/cy5DMC5FU0MrXCJbMTk7XCIrKGErMSkrXCJ+XCI6cy5DMC5FU0MrXCJbMTl+XCI7YnJlYWs7Y2FzZSAxMjA6by5rZXk9YT9zLkMwLkVTQytcIlsyMDtcIisoYSsxKStcIn5cIjpzLkMwLkVTQytcIlsyMH5cIjticmVhaztjYXNlIDEyMTpvLmtleT1hP3MuQzAuRVNDK1wiWzIxO1wiKyhhKzEpK1wiflwiOnMuQzAuRVNDK1wiWzIxflwiO2JyZWFrO2Nhc2UgMTIyOm8ua2V5PWE/cy5DMC5FU0MrXCJbMjM7XCIrKGErMSkrXCJ+XCI6cy5DMC5FU0MrXCJbMjN+XCI7YnJlYWs7Y2FzZSAxMjM6by5rZXk9YT9zLkMwLkVTQytcIlsyNDtcIisoYSsxKStcIn5cIjpzLkMwLkVTQytcIlsyNH5cIjticmVhaztkZWZhdWx0OmlmKCFlLmN0cmxLZXl8fGUuc2hpZnRLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXkpaWYoaSYmIW58fCFlLmFsdEtleXx8ZS5tZXRhS2V5KSFpfHxlLmFsdEtleXx8ZS5jdHJsS2V5fHxlLnNoaWZ0S2V5fHwhZS5tZXRhS2V5P2Uua2V5JiYhZS5jdHJsS2V5JiYhZS5hbHRLZXkmJiFlLm1ldGFLZXkmJmUua2V5Q29kZT49NDgmJjE9PT1lLmtleS5sZW5ndGg/by5rZXk9ZS5rZXk6ZS5rZXkmJmUuY3RybEtleSYmKFwiX1wiPT09ZS5rZXkmJihvLmtleT1zLkMwLlVTKSxcIkBcIj09PWUua2V5JiYoby5rZXk9cy5DMC5OVUwpKTo2NT09PWUua2V5Q29kZSYmKG8udHlwZT0xKTtlbHNle2NvbnN0IHQ9cltlLmtleUNvZGVdLGk9dD8uW2Uuc2hpZnRLZXk/MTowXTtpZihpKW8ua2V5PXMuQzAuRVNDK2k7ZWxzZSBpZihlLmtleUNvZGU+PTY1JiZlLmtleUNvZGU8PTkwKXtjb25zdCB0PWUuY3RybEtleT9lLmtleUNvZGUtNjQ6ZS5rZXlDb2RlKzMyO2xldCBpPVN0cmluZy5mcm9tQ2hhckNvZGUodCk7ZS5zaGlmdEtleSYmKGk9aS50b1VwcGVyQ2FzZSgpKSxvLmtleT1zLkMwLkVTQytpfWVsc2UgaWYoMzI9PT1lLmtleUNvZGUpby5rZXk9cy5DMC5FU0MrKGUuY3RybEtleT9zLkMwLk5VTDpcIiBcIik7ZWxzZSBpZihcIkRlYWRcIj09PWUua2V5JiZlLmNvZGUuc3RhcnRzV2l0aChcIktleVwiKSl7bGV0IHQ9ZS5jb2RlLnNsaWNlKDMsNCk7ZS5zaGlmdEtleXx8KHQ9dC50b0xvd2VyQ2FzZSgpKSxvLmtleT1zLkMwLkVTQyt0LG8uY2FuY2VsPSEwfX1lbHNlIGUua2V5Q29kZT49NjUmJmUua2V5Q29kZTw9OTA/by5rZXk9U3RyaW5nLmZyb21DaGFyQ29kZShlLmtleUNvZGUtNjQpOjMyPT09ZS5rZXlDb2RlP28ua2V5PXMuQzAuTlVMOmUua2V5Q29kZT49NTEmJmUua2V5Q29kZTw9NTU/by5rZXk9U3RyaW5nLmZyb21DaGFyQ29kZShlLmtleUNvZGUtNTErMjcpOjU2PT09ZS5rZXlDb2RlP28ua2V5PXMuQzAuREVMOjIxOT09PWUua2V5Q29kZT9vLmtleT1zLkMwLkVTQzoyMjA9PT1lLmtleUNvZGU/by5rZXk9cy5DMC5GUzoyMjE9PT1lLmtleUNvZGUmJihvLmtleT1zLkMwLkdTKX1yZXR1cm4gb319LDQ4MjooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuVXRmOFRvVXRmMzI9dC5TdHJpbmdUb1V0ZjMyPXQudXRmMzJUb1N0cmluZz10LnN0cmluZ0Zyb21Db2RlUG9pbnQ9dm9pZCAwLHQuc3RyaW5nRnJvbUNvZGVQb2ludD1mdW5jdGlvbihlKXtyZXR1cm4gZT42NTUzNT8oZS09NjU1MzYsU3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NisoZT4+MTApKStTdHJpbmcuZnJvbUNoYXJDb2RlKGUlMTAyNCs1NjMyMCkpOlN0cmluZy5mcm9tQ2hhckNvZGUoZSl9LHQudXRmMzJUb1N0cmluZz1mdW5jdGlvbihlLHQ9MCxpPWUubGVuZ3RoKXtsZXQgcz1cIlwiO2ZvcihsZXQgcj10O3I8aTsrK3Ipe2xldCB0PWVbcl07dD42NTUzNT8odC09NjU1MzYscys9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NisodD4+MTApKStTdHJpbmcuZnJvbUNoYXJDb2RlKHQlMTAyNCs1NjMyMCkpOnMrPVN0cmluZy5mcm9tQ2hhckNvZGUodCl9cmV0dXJuIHN9LHQuU3RyaW5nVG9VdGYzMj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2ludGVyaW09MH1jbGVhcigpe3RoaXMuX2ludGVyaW09MH1kZWNvZGUoZSx0KXtjb25zdCBpPWUubGVuZ3RoO2lmKCFpKXJldHVybiAwO2xldCBzPTAscj0wO2lmKHRoaXMuX2ludGVyaW0pe2NvbnN0IGk9ZS5jaGFyQ29kZUF0KHIrKyk7NTYzMjA8PWkmJmk8PTU3MzQzP3RbcysrXT0xMDI0Kih0aGlzLl9pbnRlcmltLTU1Mjk2KStpLTU2MzIwKzY1NTM2Oih0W3MrK109dGhpcy5faW50ZXJpbSx0W3MrK109aSksdGhpcy5faW50ZXJpbT0wfWZvcihsZXQgbj1yO248aTsrK24pe2NvbnN0IHI9ZS5jaGFyQ29kZUF0KG4pO2lmKDU1Mjk2PD1yJiZyPD01NjMxOSl7aWYoKytuPj1pKXJldHVybiB0aGlzLl9pbnRlcmltPXIscztjb25zdCBvPWUuY2hhckNvZGVBdChuKTs1NjMyMDw9byYmbzw9NTczNDM/dFtzKytdPTEwMjQqKHItNTUyOTYpK28tNTYzMjArNjU1MzY6KHRbcysrXT1yLHRbcysrXT1vKX1lbHNlIDY1Mjc5IT09ciYmKHRbcysrXT1yKX1yZXR1cm4gc319LHQuVXRmOFRvVXRmMzI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmludGVyaW09bmV3IFVpbnQ4QXJyYXkoMyl9Y2xlYXIoKXt0aGlzLmludGVyaW0uZmlsbCgwKX1kZWNvZGUoZSx0KXtjb25zdCBpPWUubGVuZ3RoO2lmKCFpKXJldHVybiAwO2xldCBzLHIsbixvLGE9MCxoPTAsYz0wO2lmKHRoaXMuaW50ZXJpbVswXSl7bGV0IHM9ITEscj10aGlzLmludGVyaW1bMF07ciY9MTkyPT0oMjI0JnIpPzMxOjIyND09KDI0MCZyKT8xNTo3O2xldCBuLG89MDtmb3IoOyhuPTYzJnRoaXMuaW50ZXJpbVsrK29dKSYmbzw0OylyPDw9NixyfD1uO2NvbnN0IGg9MTkyPT0oMjI0JnRoaXMuaW50ZXJpbVswXSk/MjoyMjQ9PSgyNDAmdGhpcy5pbnRlcmltWzBdKT8zOjQsbD1oLW87Zm9yKDtjPGw7KXtpZihjPj1pKXJldHVybiAwO2lmKG49ZVtjKytdLDEyOCE9KDE5MiZuKSl7Yy0tLHM9ITA7YnJlYWt9dGhpcy5pbnRlcmltW28rK109bixyPDw9NixyfD02MyZufXN8fCgyPT09aD9yPDEyOD9jLS06dFthKytdPXI6Mz09PWg/cjwyMDQ4fHxyPj01NTI5NiYmcjw9NTczNDN8fDY1Mjc5PT09cnx8KHRbYSsrXT1yKTpyPDY1NTM2fHxyPjExMTQxMTF8fCh0W2ErK109cikpLHRoaXMuaW50ZXJpbS5maWxsKDApfWNvbnN0IGw9aS00O2xldCBkPWM7Zm9yKDtkPGk7KXtmb3IoOyEoIShkPGwpfHwxMjgmKHM9ZVtkXSl8fDEyOCYocj1lW2QrMV0pfHwxMjgmKG49ZVtkKzJdKXx8MTI4JihvPWVbZCszXSkpOyl0W2ErK109cyx0W2ErK109cix0W2ErK109bix0W2ErK109byxkKz00O2lmKHM9ZVtkKytdLHM8MTI4KXRbYSsrXT1zO2Vsc2UgaWYoMTkyPT0oMjI0JnMpKXtpZihkPj1pKXJldHVybiB0aGlzLmludGVyaW1bMF09cyxhO2lmKHI9ZVtkKytdLDEyOCE9KDE5MiZyKSl7ZC0tO2NvbnRpbnVlfWlmKGg9KDMxJnMpPDw2fDYzJnIsaDwxMjgpe2QtLTtjb250aW51ZX10W2ErK109aH1lbHNlIGlmKDIyND09KDI0MCZzKSl7aWYoZD49aSlyZXR1cm4gdGhpcy5pbnRlcmltWzBdPXMsYTtpZihyPWVbZCsrXSwxMjghPSgxOTImcikpe2QtLTtjb250aW51ZX1pZihkPj1pKXJldHVybiB0aGlzLmludGVyaW1bMF09cyx0aGlzLmludGVyaW1bMV09cixhO2lmKG49ZVtkKytdLDEyOCE9KDE5MiZuKSl7ZC0tO2NvbnRpbnVlfWlmKGg9KDE1JnMpPDwxMnwoNjMmcik8PDZ8NjMmbixoPDIwNDh8fGg+PTU1Mjk2JiZoPD01NzM0M3x8NjUyNzk9PT1oKWNvbnRpbnVlO3RbYSsrXT1ofWVsc2UgaWYoMjQwPT0oMjQ4JnMpKXtpZihkPj1pKXJldHVybiB0aGlzLmludGVyaW1bMF09cyxhO2lmKHI9ZVtkKytdLDEyOCE9KDE5MiZyKSl7ZC0tO2NvbnRpbnVlfWlmKGQ+PWkpcmV0dXJuIHRoaXMuaW50ZXJpbVswXT1zLHRoaXMuaW50ZXJpbVsxXT1yLGE7aWYobj1lW2QrK10sMTI4IT0oMTkyJm4pKXtkLS07Y29udGludWV9aWYoZD49aSlyZXR1cm4gdGhpcy5pbnRlcmltWzBdPXMsdGhpcy5pbnRlcmltWzFdPXIsdGhpcy5pbnRlcmltWzJdPW4sYTtpZihvPWVbZCsrXSwxMjghPSgxOTImbykpe2QtLTtjb250aW51ZX1pZihoPSg3JnMpPDwxOHwoNjMmcik8PDEyfCg2MyZuKTw8Nnw2MyZvLGg8NjU1MzZ8fGg+MTExNDExMSljb250aW51ZTt0W2ErK109aH19cmV0dXJuIGF9fX0sMjI1OihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LlVuaWNvZGVWNj12b2lkIDA7Y29uc3Qgcz1pKDE0ODApLHI9W1s3NjgsODc5XSxbMTE1NSwxMTU4XSxbMTE2MCwxMTYxXSxbMTQyNSwxNDY5XSxbMTQ3MSwxNDcxXSxbMTQ3MywxNDc0XSxbMTQ3NiwxNDc3XSxbMTQ3OSwxNDc5XSxbMTUzNiwxNTM5XSxbMTU1MiwxNTU3XSxbMTYxMSwxNjMwXSxbMTY0OCwxNjQ4XSxbMTc1MCwxNzY0XSxbMTc2NywxNzY4XSxbMTc3MCwxNzczXSxbMTgwNywxODA3XSxbMTgwOSwxODA5XSxbMTg0MCwxODY2XSxbMTk1OCwxOTY4XSxbMjAyNywyMDM1XSxbMjMwNSwyMzA2XSxbMjM2NCwyMzY0XSxbMjM2OSwyMzc2XSxbMjM4MSwyMzgxXSxbMjM4NSwyMzg4XSxbMjQwMiwyNDAzXSxbMjQzMywyNDMzXSxbMjQ5MiwyNDkyXSxbMjQ5NywyNTAwXSxbMjUwOSwyNTA5XSxbMjUzMCwyNTMxXSxbMjU2MSwyNTYyXSxbMjYyMCwyNjIwXSxbMjYyNSwyNjI2XSxbMjYzMSwyNjMyXSxbMjYzNSwyNjM3XSxbMjY3MiwyNjczXSxbMjY4OSwyNjkwXSxbMjc0OCwyNzQ4XSxbMjc1MywyNzU3XSxbMjc1OSwyNzYwXSxbMjc2NSwyNzY1XSxbMjc4NiwyNzg3XSxbMjgxNywyODE3XSxbMjg3NiwyODc2XSxbMjg3OSwyODc5XSxbMjg4MSwyODgzXSxbMjg5MywyODkzXSxbMjkwMiwyOTAyXSxbMjk0NiwyOTQ2XSxbMzAwOCwzMDA4XSxbMzAyMSwzMDIxXSxbMzEzNCwzMTM2XSxbMzE0MiwzMTQ0XSxbMzE0NiwzMTQ5XSxbMzE1NywzMTU4XSxbMzI2MCwzMjYwXSxbMzI2MywzMjYzXSxbMzI3MCwzMjcwXSxbMzI3NiwzMjc3XSxbMzI5OCwzMjk5XSxbMzM5MywzMzk1XSxbMzQwNSwzNDA1XSxbMzUzMCwzNTMwXSxbMzUzOCwzNTQwXSxbMzU0MiwzNTQyXSxbMzYzMywzNjMzXSxbMzYzNiwzNjQyXSxbMzY1NSwzNjYyXSxbMzc2MSwzNzYxXSxbMzc2NCwzNzY5XSxbMzc3MSwzNzcyXSxbMzc4NCwzNzg5XSxbMzg2NCwzODY1XSxbMzg5MywzODkzXSxbMzg5NSwzODk1XSxbMzg5NywzODk3XSxbMzk1MywzOTY2XSxbMzk2OCwzOTcyXSxbMzk3NCwzOTc1XSxbMzk4NCwzOTkxXSxbMzk5Myw0MDI4XSxbNDAzOCw0MDM4XSxbNDE0MSw0MTQ0XSxbNDE0Niw0MTQ2XSxbNDE1MCw0MTUxXSxbNDE1Myw0MTUzXSxbNDE4NCw0MTg1XSxbNDQ0OCw0NjA3XSxbNDk1OSw0OTU5XSxbNTkwNiw1OTA4XSxbNTkzOCw1OTQwXSxbNTk3MCw1OTcxXSxbNjAwMiw2MDAzXSxbNjA2OCw2MDY5XSxbNjA3MSw2MDc3XSxbNjA4Niw2MDg2XSxbNjA4OSw2MDk5XSxbNjEwOSw2MTA5XSxbNjE1NSw2MTU3XSxbNjMxMyw2MzEzXSxbNjQzMiw2NDM0XSxbNjQzOSw2NDQwXSxbNjQ1MCw2NDUwXSxbNjQ1Nyw2NDU5XSxbNjY3OSw2NjgwXSxbNjkxMiw2OTE1XSxbNjk2NCw2OTY0XSxbNjk2Niw2OTcwXSxbNjk3Miw2OTcyXSxbNjk3OCw2OTc4XSxbNzAxOSw3MDI3XSxbNzYxNiw3NjI2XSxbNzY3OCw3Njc5XSxbODIwMyw4MjA3XSxbODIzNCw4MjM4XSxbODI4OCw4MjkxXSxbODI5OCw4MzAzXSxbODQwMCw4NDMxXSxbMTIzMzAsMTIzMzVdLFsxMjQ0MSwxMjQ0Ml0sWzQzMDE0LDQzMDE0XSxbNDMwMTksNDMwMTldLFs0MzA0NSw0MzA0Nl0sWzY0Mjg2LDY0Mjg2XSxbNjUwMjQsNjUwMzldLFs2NTA1Niw2NTA1OV0sWzY1Mjc5LDY1Mjc5XSxbNjU1MjksNjU1MzFdXSxuPVtbNjgwOTcsNjgwOTldLFs2ODEwMSw2ODEwMl0sWzY4MTA4LDY4MTExXSxbNjgxNTIsNjgxNTRdLFs2ODE1OSw2ODE1OV0sWzExOTE0MywxMTkxNDVdLFsxMTkxNTUsMTE5MTcwXSxbMTE5MTczLDExOTE3OV0sWzExOTIxMCwxMTkyMTNdLFsxMTkzNjIsMTE5MzY0XSxbOTE3NTA1LDkxNzUwNV0sWzkxNzUzNiw5MTc2MzFdLFs5MTc3NjAsOTE3OTk5XV07bGV0IG87dC5Vbmljb2RlVjY9Y2xhc3N7Y29uc3RydWN0b3IoKXtpZih0aGlzLnZlcnNpb249XCI2XCIsIW8pe289bmV3IFVpbnQ4QXJyYXkoNjU1MzYpLG8uZmlsbCgxKSxvWzBdPTAsby5maWxsKDAsMSwzMiksby5maWxsKDAsMTI3LDE2MCksby5maWxsKDIsNDM1Miw0NDQ4KSxvWzkwMDFdPTIsb1s5MDAyXT0yLG8uZmlsbCgyLDExOTA0LDQyMTkyKSxvWzEyMzUxXT0xLG8uZmlsbCgyLDQ0MDMyLDU1MjA0KSxvLmZpbGwoMiw2Mzc0NCw2NDI1Niksby5maWxsKDIsNjUwNDAsNjUwNTApLG8uZmlsbCgyLDY1MDcyLDY1MTM2KSxvLmZpbGwoMiw2NTI4MCw2NTM3Nyksby5maWxsKDIsNjU1MDQsNjU1MTEpO2ZvcihsZXQgZT0wO2U8ci5sZW5ndGg7KytlKW8uZmlsbCgwLHJbZV1bMF0scltlXVsxXSsxKX19d2N3aWR0aChlKXtyZXR1cm4gZTwzMj8wOmU8MTI3PzE6ZTw2NTUzNj9vW2VdOmZ1bmN0aW9uKGUsdCl7bGV0IGkscz0wLHI9dC5sZW5ndGgtMTtpZihlPHRbMF1bMF18fGU+dFtyXVsxXSlyZXR1cm4hMTtmb3IoO3I+PXM7KWlmKGk9cytyPj4xLGU+dFtpXVsxXSlzPWkrMTtlbHNle2lmKCEoZTx0W2ldWzBdKSlyZXR1cm4hMDtyPWktMX1yZXR1cm4hMX0oZSxuKT8wOmU+PTEzMTA3MiYmZTw9MTk2NjA1fHxlPj0xOTY2MDgmJmU8PTI2MjE0MT8yOjF9Y2hhclByb3BlcnRpZXMoZSx0KXtsZXQgaT10aGlzLndjd2lkdGgoZSkscj0wPT09aSYmMCE9PXQ7aWYocil7Y29uc3QgZT1zLlVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RXaWR0aCh0KTswPT09ZT9yPSExOmU+aSYmKGk9ZSl9cmV0dXJuIHMuVW5pY29kZVNlcnZpY2UuY3JlYXRlUHJvcGVydHlWYWx1ZSgwLGkscil9fX0sNTk4MTooZSx0LGkpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5Xcml0ZUJ1ZmZlcj12b2lkIDA7Y29uc3Qgcz1pKDg0NjApLHI9aSg4NDQpO2NsYXNzIG4gZXh0ZW5kcyByLkRpc3Bvc2FibGV7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLl9hY3Rpb249ZSx0aGlzLl93cml0ZUJ1ZmZlcj1bXSx0aGlzLl9jYWxsYmFja3M9W10sdGhpcy5fcGVuZGluZ0RhdGE9MCx0aGlzLl9idWZmZXJPZmZzZXQ9MCx0aGlzLl9pc1N5bmNXcml0aW5nPSExLHRoaXMuX3N5bmNDYWxscz0wLHRoaXMuX2RpZFVzZXJJbnB1dD0hMSx0aGlzLl9vbldyaXRlUGFyc2VkPXRoaXMucmVnaXN0ZXIobmV3IHMuRXZlbnRFbWl0dGVyKSx0aGlzLm9uV3JpdGVQYXJzZWQ9dGhpcy5fb25Xcml0ZVBhcnNlZC5ldmVudH1oYW5kbGVVc2VySW5wdXQoKXt0aGlzLl9kaWRVc2VySW5wdXQ9ITB9d3JpdGVTeW5jKGUsdCl7aWYodm9pZCAwIT09dCYmdGhpcy5fc3luY0NhbGxzPnQpcmV0dXJuIHZvaWQodGhpcy5fc3luY0NhbGxzPTApO2lmKHRoaXMuX3BlbmRpbmdEYXRhKz1lLmxlbmd0aCx0aGlzLl93cml0ZUJ1ZmZlci5wdXNoKGUpLHRoaXMuX2NhbGxiYWNrcy5wdXNoKHZvaWQgMCksdGhpcy5fc3luY0NhbGxzKyssdGhpcy5faXNTeW5jV3JpdGluZylyZXR1cm47bGV0IGk7Zm9yKHRoaXMuX2lzU3luY1dyaXRpbmc9ITA7aT10aGlzLl93cml0ZUJ1ZmZlci5zaGlmdCgpOyl7dGhpcy5fYWN0aW9uKGkpO2NvbnN0IGU9dGhpcy5fY2FsbGJhY2tzLnNoaWZ0KCk7ZSYmZSgpfXRoaXMuX3BlbmRpbmdEYXRhPTAsdGhpcy5fYnVmZmVyT2Zmc2V0PTIxNDc0ODM2NDcsdGhpcy5faXNTeW5jV3JpdGluZz0hMSx0aGlzLl9zeW5jQ2FsbHM9MH13cml0ZShlLHQpe2lmKHRoaXMuX3BlbmRpbmdEYXRhPjVlNyl0aHJvdyBuZXcgRXJyb3IoXCJ3cml0ZSBkYXRhIGRpc2NhcmRlZCwgdXNlIGZsb3cgY29udHJvbCB0byBhdm9pZCBsb3NpbmcgZGF0YVwiKTtpZighdGhpcy5fd3JpdGVCdWZmZXIubGVuZ3RoKXtpZih0aGlzLl9idWZmZXJPZmZzZXQ9MCx0aGlzLl9kaWRVc2VySW5wdXQpcmV0dXJuIHRoaXMuX2RpZFVzZXJJbnB1dD0hMSx0aGlzLl9wZW5kaW5nRGF0YSs9ZS5sZW5ndGgsdGhpcy5fd3JpdGVCdWZmZXIucHVzaChlKSx0aGlzLl9jYWxsYmFja3MucHVzaCh0KSx2b2lkIHRoaXMuX2lubmVyV3JpdGUoKTtzZXRUaW1lb3V0KCgoKT0+dGhpcy5faW5uZXJXcml0ZSgpKSl9dGhpcy5fcGVuZGluZ0RhdGErPWUubGVuZ3RoLHRoaXMuX3dyaXRlQnVmZmVyLnB1c2goZSksdGhpcy5fY2FsbGJhY2tzLnB1c2godCl9X2lubmVyV3JpdGUoZT0wLHQ9ITApe2NvbnN0IGk9ZXx8RGF0ZS5ub3coKTtmb3IoO3RoaXMuX3dyaXRlQnVmZmVyLmxlbmd0aD50aGlzLl9idWZmZXJPZmZzZXQ7KXtjb25zdCBlPXRoaXMuX3dyaXRlQnVmZmVyW3RoaXMuX2J1ZmZlck9mZnNldF0scz10aGlzLl9hY3Rpb24oZSx0KTtpZihzKXtjb25zdCBlPWU9PkRhdGUubm93KCktaT49MTI/c2V0VGltZW91dCgoKCk9PnRoaXMuX2lubmVyV3JpdGUoMCxlKSkpOnRoaXMuX2lubmVyV3JpdGUoaSxlKTtyZXR1cm4gdm9pZCBzLmNhdGNoKChlPT4ocXVldWVNaWNyb3Rhc2soKCgpPT57dGhyb3cgZX0pKSxQcm9taXNlLnJlc29sdmUoITEpKSkpLnRoZW4oZSl9Y29uc3Qgcj10aGlzLl9jYWxsYmFja3NbdGhpcy5fYnVmZmVyT2Zmc2V0XTtpZihyJiZyKCksdGhpcy5fYnVmZmVyT2Zmc2V0KyssdGhpcy5fcGVuZGluZ0RhdGEtPWUubGVuZ3RoLERhdGUubm93KCktaT49MTIpYnJlYWt9dGhpcy5fd3JpdGVCdWZmZXIubGVuZ3RoPnRoaXMuX2J1ZmZlck9mZnNldD8odGhpcy5fYnVmZmVyT2Zmc2V0PjUwJiYodGhpcy5fd3JpdGVCdWZmZXI9dGhpcy5fd3JpdGVCdWZmZXIuc2xpY2UodGhpcy5fYnVmZmVyT2Zmc2V0KSx0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzLnNsaWNlKHRoaXMuX2J1ZmZlck9mZnNldCksdGhpcy5fYnVmZmVyT2Zmc2V0PTApLHNldFRpbWVvdXQoKCgpPT50aGlzLl9pbm5lcldyaXRlKCkpKSk6KHRoaXMuX3dyaXRlQnVmZmVyLmxlbmd0aD0wLHRoaXMuX2NhbGxiYWNrcy5sZW5ndGg9MCx0aGlzLl9wZW5kaW5nRGF0YT0wLHRoaXMuX2J1ZmZlck9mZnNldD0wKSx0aGlzLl9vbldyaXRlUGFyc2VkLmZpcmUoKX19dC5Xcml0ZUJ1ZmZlcj1ufSw1OTQxOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC50b1JnYlN0cmluZz10LnBhcnNlQ29sb3I9dm9pZCAwO2NvbnN0IGk9L14oW1xcZGEtZl0pXFwvKFtcXGRhLWZdKVxcLyhbXFxkYS1mXSkkfF4oW1xcZGEtZl17Mn0pXFwvKFtcXGRhLWZdezJ9KVxcLyhbXFxkYS1mXXsyfSkkfF4oW1xcZGEtZl17M30pXFwvKFtcXGRhLWZdezN9KVxcLyhbXFxkYS1mXXszfSkkfF4oW1xcZGEtZl17NH0pXFwvKFtcXGRhLWZdezR9KVxcLyhbXFxkYS1mXXs0fSkkLyxzPS9eW1xcZGEtZl0rJC87ZnVuY3Rpb24gcihlLHQpe2NvbnN0IGk9ZS50b1N0cmluZygxNikscz1pLmxlbmd0aDwyP1wiMFwiK2k6aTtzd2l0Y2godCl7Y2FzZSA0OnJldHVybiBpWzBdO2Nhc2UgODpyZXR1cm4gcztjYXNlIDEyOnJldHVybihzK3MpLnNsaWNlKDAsMyk7ZGVmYXVsdDpyZXR1cm4gcytzfX10LnBhcnNlQ29sb3I9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuO2xldCB0PWUudG9Mb3dlckNhc2UoKTtpZigwPT09dC5pbmRleE9mKFwicmdiOlwiKSl7dD10LnNsaWNlKDQpO2NvbnN0IGU9aS5leGVjKHQpO2lmKGUpe2NvbnN0IHQ9ZVsxXT8xNTplWzRdPzI1NTplWzddPzQwOTU6NjU1MzU7cmV0dXJuW01hdGgucm91bmQocGFyc2VJbnQoZVsxXXx8ZVs0XXx8ZVs3XXx8ZVsxMF0sMTYpL3QqMjU1KSxNYXRoLnJvdW5kKHBhcnNlSW50KGVbMl18fGVbNV18fGVbOF18fGVbMTFdLDE2KS90KjI1NSksTWF0aC5yb3VuZChwYXJzZUludChlWzNdfHxlWzZdfHxlWzldfHxlWzEyXSwxNikvdCoyNTUpXX19ZWxzZSBpZigwPT09dC5pbmRleE9mKFwiI1wiKSYmKHQ9dC5zbGljZSgxKSxzLmV4ZWModCkmJlszLDYsOSwxMl0uaW5jbHVkZXModC5sZW5ndGgpKSl7Y29uc3QgZT10Lmxlbmd0aC8zLGk9WzAsMCwwXTtmb3IobGV0IHM9MDtzPDM7KytzKXtjb25zdCByPXBhcnNlSW50KHQuc2xpY2UoZSpzLGUqcytlKSwxNik7aVtzXT0xPT09ZT9yPDw0OjI9PT1lP3I6Mz09PWU/cj4+NDpyPj44fXJldHVybiBpfX0sdC50b1JnYlN0cmluZz1mdW5jdGlvbihlLHQ9MTYpe2NvbnN0W2kscyxuXT1lO3JldHVybmByZ2I6JHtyKGksdCl9LyR7cihzLHQpfS8ke3Iobix0KX1gfX0sNTc3MDooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuUEFZTE9BRF9MSU1JVD12b2lkIDAsdC5QQVlMT0FEX0xJTUlUPTFlN30sNjM1MTooZSx0LGkpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5EY3NIYW5kbGVyPXQuRGNzUGFyc2VyPXZvaWQgMDtjb25zdCBzPWkoNDgyKSxyPWkoODc0Miksbj1pKDU3NzApLG89W107dC5EY3NQYXJzZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9oYW5kbGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2FjdGl2ZT1vLHRoaXMuX2lkZW50PTAsdGhpcy5faGFuZGxlckZiPSgpPT57fSx0aGlzLl9zdGFjaz17cGF1c2VkOiExLGxvb3BQb3NpdGlvbjowLGZhbGxUaHJvdWdoOiExfX1kaXNwb3NlKCl7dGhpcy5faGFuZGxlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9oYW5kbGVyRmI9KCk9Pnt9LHRoaXMuX2FjdGl2ZT1vfXJlZ2lzdGVySGFuZGxlcihlLHQpe3ZvaWQgMD09PXRoaXMuX2hhbmRsZXJzW2VdJiYodGhpcy5faGFuZGxlcnNbZV09W10pO2NvbnN0IGk9dGhpcy5faGFuZGxlcnNbZV07cmV0dXJuIGkucHVzaCh0KSx7ZGlzcG9zZTooKT0+e2NvbnN0IGU9aS5pbmRleE9mKHQpOy0xIT09ZSYmaS5zcGxpY2UoZSwxKX19fWNsZWFySGFuZGxlcihlKXt0aGlzLl9oYW5kbGVyc1tlXSYmZGVsZXRlIHRoaXMuX2hhbmRsZXJzW2VdfXNldEhhbmRsZXJGYWxsYmFjayhlKXt0aGlzLl9oYW5kbGVyRmI9ZX1yZXNldCgpe2lmKHRoaXMuX2FjdGl2ZS5sZW5ndGgpZm9yKGxldCBlPXRoaXMuX3N0YWNrLnBhdXNlZD90aGlzLl9zdGFjay5sb29wUG9zaXRpb24tMTp0aGlzLl9hY3RpdmUubGVuZ3RoLTE7ZT49MDstLWUpdGhpcy5fYWN0aXZlW2VdLnVuaG9vayghMSk7dGhpcy5fc3RhY2sucGF1c2VkPSExLHRoaXMuX2FjdGl2ZT1vLHRoaXMuX2lkZW50PTB9aG9vayhlLHQpe2lmKHRoaXMucmVzZXQoKSx0aGlzLl9pZGVudD1lLHRoaXMuX2FjdGl2ZT10aGlzLl9oYW5kbGVyc1tlXXx8byx0aGlzLl9hY3RpdmUubGVuZ3RoKWZvcihsZXQgZT10aGlzLl9hY3RpdmUubGVuZ3RoLTE7ZT49MDtlLS0pdGhpcy5fYWN0aXZlW2VdLmhvb2sodCk7ZWxzZSB0aGlzLl9oYW5kbGVyRmIodGhpcy5faWRlbnQsXCJIT09LXCIsdCl9cHV0KGUsdCxpKXtpZih0aGlzLl9hY3RpdmUubGVuZ3RoKWZvcihsZXQgcz10aGlzLl9hY3RpdmUubGVuZ3RoLTE7cz49MDtzLS0pdGhpcy5fYWN0aXZlW3NdLnB1dChlLHQsaSk7ZWxzZSB0aGlzLl9oYW5kbGVyRmIodGhpcy5faWRlbnQsXCJQVVRcIiwoMCxzLnV0ZjMyVG9TdHJpbmcpKGUsdCxpKSl9dW5ob29rKGUsdD0hMCl7aWYodGhpcy5fYWN0aXZlLmxlbmd0aCl7bGV0IGk9ITEscz10aGlzLl9hY3RpdmUubGVuZ3RoLTEscj0hMTtpZih0aGlzLl9zdGFjay5wYXVzZWQmJihzPXRoaXMuX3N0YWNrLmxvb3BQb3NpdGlvbi0xLGk9dCxyPXRoaXMuX3N0YWNrLmZhbGxUaHJvdWdoLHRoaXMuX3N0YWNrLnBhdXNlZD0hMSksIXImJiExPT09aSl7Zm9yKDtzPj0wJiYoaT10aGlzLl9hY3RpdmVbc10udW5ob29rKGUpLCEwIT09aSk7cy0tKWlmKGkgaW5zdGFuY2VvZiBQcm9taXNlKXJldHVybiB0aGlzLl9zdGFjay5wYXVzZWQ9ITAsdGhpcy5fc3RhY2subG9vcFBvc2l0aW9uPXMsdGhpcy5fc3RhY2suZmFsbFRocm91Z2g9ITEsaTtzLS19Zm9yKDtzPj0wO3MtLSlpZihpPXRoaXMuX2FjdGl2ZVtzXS51bmhvb2soITEpLGkgaW5zdGFuY2VvZiBQcm9taXNlKXJldHVybiB0aGlzLl9zdGFjay5wYXVzZWQ9ITAsdGhpcy5fc3RhY2subG9vcFBvc2l0aW9uPXMsdGhpcy5fc3RhY2suZmFsbFRocm91Z2g9ITAsaX1lbHNlIHRoaXMuX2hhbmRsZXJGYih0aGlzLl9pZGVudCxcIlVOSE9PS1wiLGUpO3RoaXMuX2FjdGl2ZT1vLHRoaXMuX2lkZW50PTB9fTtjb25zdCBhPW5ldyByLlBhcmFtczthLmFkZFBhcmFtKDApLHQuRGNzSGFuZGxlcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9oYW5kbGVyPWUsdGhpcy5fZGF0YT1cIlwiLHRoaXMuX3BhcmFtcz1hLHRoaXMuX2hpdExpbWl0PSExfWhvb2soZSl7dGhpcy5fcGFyYW1zPWUubGVuZ3RoPjF8fGUucGFyYW1zWzBdP2UuY2xvbmUoKTphLHRoaXMuX2RhdGE9XCJcIix0aGlzLl9oaXRMaW1pdD0hMX1wdXQoZSx0LGkpe3RoaXMuX2hpdExpbWl0fHwodGhpcy5fZGF0YSs9KDAscy51dGYzMlRvU3RyaW5nKShlLHQsaSksdGhpcy5fZGF0YS5sZW5ndGg+bi5QQVlMT0FEX0xJTUlUJiYodGhpcy5fZGF0YT1cIlwiLHRoaXMuX2hpdExpbWl0PSEwKSl9dW5ob29rKGUpe2xldCB0PSExO2lmKHRoaXMuX2hpdExpbWl0KXQ9ITE7ZWxzZSBpZihlJiYodD10aGlzLl9oYW5kbGVyKHRoaXMuX2RhdGEsdGhpcy5fcGFyYW1zKSx0IGluc3RhbmNlb2YgUHJvbWlzZSkpcmV0dXJuIHQudGhlbigoZT0+KHRoaXMuX3BhcmFtcz1hLHRoaXMuX2RhdGE9XCJcIix0aGlzLl9oaXRMaW1pdD0hMSxlKSkpO3JldHVybiB0aGlzLl9wYXJhbXM9YSx0aGlzLl9kYXRhPVwiXCIsdGhpcy5faGl0TGltaXQ9ITEsdH19fSwyMDE1OihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkVzY2FwZVNlcXVlbmNlUGFyc2VyPXQuVlQ1MDBfVFJBTlNJVElPTl9UQUJMRT10LlRyYW5zaXRpb25UYWJsZT12b2lkIDA7Y29uc3Qgcz1pKDg0NCkscj1pKDg3NDIpLG49aSg2MjQyKSxvPWkoNjM1MSk7Y2xhc3MgYXtjb25zdHJ1Y3RvcihlKXt0aGlzLnRhYmxlPW5ldyBVaW50OEFycmF5KGUpfXNldERlZmF1bHQoZSx0KXt0aGlzLnRhYmxlLmZpbGwoZTw8NHx0KX1hZGQoZSx0LGkscyl7dGhpcy50YWJsZVt0PDw4fGVdPWk8PDR8c31hZGRNYW55KGUsdCxpLHMpe2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKXRoaXMudGFibGVbdDw8OHxlW3JdXT1pPDw0fHN9fXQuVHJhbnNpdGlvblRhYmxlPWE7Y29uc3QgaD0xNjA7dC5WVDUwMF9UUkFOU0lUSU9OX1RBQkxFPWZ1bmN0aW9uKCl7Y29uc3QgZT1uZXcgYSg0MDk1KSx0PUFycmF5LmFwcGx5KG51bGwsQXJyYXkoMjU2KSkubWFwKCgoZSx0KT0+dCkpLGk9KGUsaSk9PnQuc2xpY2UoZSxpKSxzPWkoMzIsMTI3KSxyPWkoMCwyNCk7ci5wdXNoKDI1KSxyLnB1c2guYXBwbHkocixpKDI4LDMyKSk7Y29uc3Qgbj1pKDAsMTQpO2xldCBvO2ZvcihvIGluIGUuc2V0RGVmYXVsdCgxLDApLGUuYWRkTWFueShzLDAsMiwwKSxuKWUuYWRkTWFueShbMjQsMjYsMTUzLDE1NF0sbywzLDApLGUuYWRkTWFueShpKDEyOCwxNDQpLG8sMywwKSxlLmFkZE1hbnkoaSgxNDQsMTUyKSxvLDMsMCksZS5hZGQoMTU2LG8sMCwwKSxlLmFkZCgyNyxvLDExLDEpLGUuYWRkKDE1NyxvLDQsOCksZS5hZGRNYW55KFsxNTIsMTU4LDE1OV0sbywwLDcpLGUuYWRkKDE1NSxvLDExLDMpLGUuYWRkKDE0NCxvLDExLDkpO3JldHVybiBlLmFkZE1hbnkociwwLDMsMCksZS5hZGRNYW55KHIsMSwzLDEpLGUuYWRkKDEyNywxLDAsMSksZS5hZGRNYW55KHIsOCwwLDgpLGUuYWRkTWFueShyLDMsMywzKSxlLmFkZCgxMjcsMywwLDMpLGUuYWRkTWFueShyLDQsMyw0KSxlLmFkZCgxMjcsNCwwLDQpLGUuYWRkTWFueShyLDYsMyw2KSxlLmFkZE1hbnkociw1LDMsNSksZS5hZGQoMTI3LDUsMCw1KSxlLmFkZE1hbnkociwyLDMsMiksZS5hZGQoMTI3LDIsMCwyKSxlLmFkZCg5MywxLDQsOCksZS5hZGRNYW55KHMsOCw1LDgpLGUuYWRkKDEyNyw4LDUsOCksZS5hZGRNYW55KFsxNTYsMjcsMjQsMjYsN10sOCw2LDApLGUuYWRkTWFueShpKDI4LDMyKSw4LDAsOCksZS5hZGRNYW55KFs4OCw5NCw5NV0sMSwwLDcpLGUuYWRkTWFueShzLDcsMCw3KSxlLmFkZE1hbnkociw3LDAsNyksZS5hZGQoMTU2LDcsMCwwKSxlLmFkZCgxMjcsNywwLDcpLGUuYWRkKDkxLDEsMTEsMyksZS5hZGRNYW55KGkoNjQsMTI3KSwzLDcsMCksZS5hZGRNYW55KGkoNDgsNjApLDMsOCw0KSxlLmFkZE1hbnkoWzYwLDYxLDYyLDYzXSwzLDksNCksZS5hZGRNYW55KGkoNDgsNjApLDQsOCw0KSxlLmFkZE1hbnkoaSg2NCwxMjcpLDQsNywwKSxlLmFkZE1hbnkoWzYwLDYxLDYyLDYzXSw0LDAsNiksZS5hZGRNYW55KGkoMzIsNjQpLDYsMCw2KSxlLmFkZCgxMjcsNiwwLDYpLGUuYWRkTWFueShpKDY0LDEyNyksNiwwLDApLGUuYWRkTWFueShpKDMyLDQ4KSwzLDksNSksZS5hZGRNYW55KGkoMzIsNDgpLDUsOSw1KSxlLmFkZE1hbnkoaSg0OCw2NCksNSwwLDYpLGUuYWRkTWFueShpKDY0LDEyNyksNSw3LDApLGUuYWRkTWFueShpKDMyLDQ4KSw0LDksNSksZS5hZGRNYW55KGkoMzIsNDgpLDEsOSwyKSxlLmFkZE1hbnkoaSgzMiw0OCksMiw5LDIpLGUuYWRkTWFueShpKDQ4LDEyNyksMiwxMCwwKSxlLmFkZE1hbnkoaSg0OCw4MCksMSwxMCwwKSxlLmFkZE1hbnkoaSg4MSw4OCksMSwxMCwwKSxlLmFkZE1hbnkoWzg5LDkwLDkyXSwxLDEwLDApLGUuYWRkTWFueShpKDk2LDEyNyksMSwxMCwwKSxlLmFkZCg4MCwxLDExLDkpLGUuYWRkTWFueShyLDksMCw5KSxlLmFkZCgxMjcsOSwwLDkpLGUuYWRkTWFueShpKDI4LDMyKSw5LDAsOSksZS5hZGRNYW55KGkoMzIsNDgpLDksOSwxMiksZS5hZGRNYW55KGkoNDgsNjApLDksOCwxMCksZS5hZGRNYW55KFs2MCw2MSw2Miw2M10sOSw5LDEwKSxlLmFkZE1hbnkociwxMSwwLDExKSxlLmFkZE1hbnkoaSgzMiwxMjgpLDExLDAsMTEpLGUuYWRkTWFueShpKDI4LDMyKSwxMSwwLDExKSxlLmFkZE1hbnkociwxMCwwLDEwKSxlLmFkZCgxMjcsMTAsMCwxMCksZS5hZGRNYW55KGkoMjgsMzIpLDEwLDAsMTApLGUuYWRkTWFueShpKDQ4LDYwKSwxMCw4LDEwKSxlLmFkZE1hbnkoWzYwLDYxLDYyLDYzXSwxMCwwLDExKSxlLmFkZE1hbnkoaSgzMiw0OCksMTAsOSwxMiksZS5hZGRNYW55KHIsMTIsMCwxMiksZS5hZGQoMTI3LDEyLDAsMTIpLGUuYWRkTWFueShpKDI4LDMyKSwxMiwwLDEyKSxlLmFkZE1hbnkoaSgzMiw0OCksMTIsOSwxMiksZS5hZGRNYW55KGkoNDgsNjQpLDEyLDAsMTEpLGUuYWRkTWFueShpKDY0LDEyNyksMTIsMTIsMTMpLGUuYWRkTWFueShpKDY0LDEyNyksMTAsMTIsMTMpLGUuYWRkTWFueShpKDY0LDEyNyksOSwxMiwxMyksZS5hZGRNYW55KHIsMTMsMTMsMTMpLGUuYWRkTWFueShzLDEzLDEzLDEzKSxlLmFkZCgxMjcsMTMsMCwxMyksZS5hZGRNYW55KFsyNywxNTYsMjQsMjZdLDEzLDE0LDApLGUuYWRkKGgsMCwyLDApLGUuYWRkKGgsOCw1LDgpLGUuYWRkKGgsNiwwLDYpLGUuYWRkKGgsMTEsMCwxMSksZS5hZGQoaCwxMywxMywxMyksZX0oKTtjbGFzcyBjIGV4dGVuZHMgcy5EaXNwb3NhYmxle2NvbnN0cnVjdG9yKGU9dC5WVDUwMF9UUkFOU0lUSU9OX1RBQkxFKXtzdXBlcigpLHRoaXMuX3RyYW5zaXRpb25zPWUsdGhpcy5fcGFyc2VTdGFjaz17c3RhdGU6MCxoYW5kbGVyczpbXSxoYW5kbGVyUG9zOjAsdHJhbnNpdGlvbjowLGNodW5rUG9zOjB9LHRoaXMuaW5pdGlhbFN0YXRlPTAsdGhpcy5jdXJyZW50U3RhdGU9dGhpcy5pbml0aWFsU3RhdGUsdGhpcy5fcGFyYW1zPW5ldyByLlBhcmFtcyx0aGlzLl9wYXJhbXMuYWRkUGFyYW0oMCksdGhpcy5fY29sbGVjdD0wLHRoaXMucHJlY2VkaW5nSm9pblN0YXRlPTAsdGhpcy5fcHJpbnRIYW5kbGVyRmI9KGUsdCxpKT0+e30sdGhpcy5fZXhlY3V0ZUhhbmRsZXJGYj1lPT57fSx0aGlzLl9jc2lIYW5kbGVyRmI9KGUsdCk9Pnt9LHRoaXMuX2VzY0hhbmRsZXJGYj1lPT57fSx0aGlzLl9lcnJvckhhbmRsZXJGYj1lPT5lLHRoaXMuX3ByaW50SGFuZGxlcj10aGlzLl9wcmludEhhbmRsZXJGYix0aGlzLl9leGVjdXRlSGFuZGxlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9jc2lIYW5kbGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2VzY0hhbmRsZXJzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5yZWdpc3RlcigoMCxzLnRvRGlzcG9zYWJsZSkoKCgpPT57dGhpcy5fY3NpSGFuZGxlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9leGVjdXRlSGFuZGxlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9lc2NIYW5kbGVycz1PYmplY3QuY3JlYXRlKG51bGwpfSkpKSx0aGlzLl9vc2NQYXJzZXI9dGhpcy5yZWdpc3RlcihuZXcgbi5Pc2NQYXJzZXIpLHRoaXMuX2Rjc1BhcnNlcj10aGlzLnJlZ2lzdGVyKG5ldyBvLkRjc1BhcnNlciksdGhpcy5fZXJyb3JIYW5kbGVyPXRoaXMuX2Vycm9ySGFuZGxlckZiLHRoaXMucmVnaXN0ZXJFc2NIYW5kbGVyKHtmaW5hbDpcIlxcXFxcIn0sKCgpPT4hMCkpfV9pZGVudGlmaWVyKGUsdD1bNjQsMTI2XSl7bGV0IGk9MDtpZihlLnByZWZpeCl7aWYoZS5wcmVmaXgubGVuZ3RoPjEpdGhyb3cgbmV3IEVycm9yKFwib25seSBvbmUgYnl0ZSBhcyBwcmVmaXggc3VwcG9ydGVkXCIpO2lmKGk9ZS5wcmVmaXguY2hhckNvZGVBdCgwKSxpJiY2MD5pfHxpPjYzKXRocm93IG5ldyBFcnJvcihcInByZWZpeCBtdXN0IGJlIGluIHJhbmdlIDB4M2MgLi4gMHgzZlwiKX1pZihlLmludGVybWVkaWF0ZXMpe2lmKGUuaW50ZXJtZWRpYXRlcy5sZW5ndGg+Mil0aHJvdyBuZXcgRXJyb3IoXCJvbmx5IHR3byBieXRlcyBhcyBpbnRlcm1lZGlhdGVzIGFyZSBzdXBwb3J0ZWRcIik7Zm9yKGxldCB0PTA7dDxlLmludGVybWVkaWF0ZXMubGVuZ3RoOysrdCl7Y29uc3Qgcz1lLmludGVybWVkaWF0ZXMuY2hhckNvZGVBdCh0KTtpZigzMj5zfHxzPjQ3KXRocm93IG5ldyBFcnJvcihcImludGVybWVkaWF0ZSBtdXN0IGJlIGluIHJhbmdlIDB4MjAgLi4gMHgyZlwiKTtpPDw9OCxpfD1zfX1pZigxIT09ZS5maW5hbC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiZmluYWwgbXVzdCBiZSBhIHNpbmdsZSBieXRlXCIpO2NvbnN0IHM9ZS5maW5hbC5jaGFyQ29kZUF0KDApO2lmKHRbMF0+c3x8cz50WzFdKXRocm93IG5ldyBFcnJvcihgZmluYWwgbXVzdCBiZSBpbiByYW5nZSAke3RbMF19IC4uICR7dFsxXX1gKTtyZXR1cm4gaTw8PTgsaXw9cyxpfWlkZW50VG9TdHJpbmcoZSl7Y29uc3QgdD1bXTtmb3IoO2U7KXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDI1NSZlKSksZT4+PTg7cmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4oXCJcIil9c2V0UHJpbnRIYW5kbGVyKGUpe3RoaXMuX3ByaW50SGFuZGxlcj1lfWNsZWFyUHJpbnRIYW5kbGVyKCl7dGhpcy5fcHJpbnRIYW5kbGVyPXRoaXMuX3ByaW50SGFuZGxlckZifXJlZ2lzdGVyRXNjSGFuZGxlcihlLHQpe2NvbnN0IGk9dGhpcy5faWRlbnRpZmllcihlLFs0OCwxMjZdKTt2b2lkIDA9PT10aGlzLl9lc2NIYW5kbGVyc1tpXSYmKHRoaXMuX2VzY0hhbmRsZXJzW2ldPVtdKTtjb25zdCBzPXRoaXMuX2VzY0hhbmRsZXJzW2ldO3JldHVybiBzLnB1c2godCkse2Rpc3Bvc2U6KCk9Pntjb25zdCBlPXMuaW5kZXhPZih0KTstMSE9PWUmJnMuc3BsaWNlKGUsMSl9fX1jbGVhckVzY0hhbmRsZXIoZSl7dGhpcy5fZXNjSGFuZGxlcnNbdGhpcy5faWRlbnRpZmllcihlLFs0OCwxMjZdKV0mJmRlbGV0ZSB0aGlzLl9lc2NIYW5kbGVyc1t0aGlzLl9pZGVudGlmaWVyKGUsWzQ4LDEyNl0pXX1zZXRFc2NIYW5kbGVyRmFsbGJhY2soZSl7dGhpcy5fZXNjSGFuZGxlckZiPWV9c2V0RXhlY3V0ZUhhbmRsZXIoZSx0KXt0aGlzLl9leGVjdXRlSGFuZGxlcnNbZS5jaGFyQ29kZUF0KDApXT10fWNsZWFyRXhlY3V0ZUhhbmRsZXIoZSl7dGhpcy5fZXhlY3V0ZUhhbmRsZXJzW2UuY2hhckNvZGVBdCgwKV0mJmRlbGV0ZSB0aGlzLl9leGVjdXRlSGFuZGxlcnNbZS5jaGFyQ29kZUF0KDApXX1zZXRFeGVjdXRlSGFuZGxlckZhbGxiYWNrKGUpe3RoaXMuX2V4ZWN1dGVIYW5kbGVyRmI9ZX1yZWdpc3RlckNzaUhhbmRsZXIoZSx0KXtjb25zdCBpPXRoaXMuX2lkZW50aWZpZXIoZSk7dm9pZCAwPT09dGhpcy5fY3NpSGFuZGxlcnNbaV0mJih0aGlzLl9jc2lIYW5kbGVyc1tpXT1bXSk7Y29uc3Qgcz10aGlzLl9jc2lIYW5kbGVyc1tpXTtyZXR1cm4gcy5wdXNoKHQpLHtkaXNwb3NlOigpPT57Y29uc3QgZT1zLmluZGV4T2YodCk7LTEhPT1lJiZzLnNwbGljZShlLDEpfX19Y2xlYXJDc2lIYW5kbGVyKGUpe3RoaXMuX2NzaUhhbmRsZXJzW3RoaXMuX2lkZW50aWZpZXIoZSldJiZkZWxldGUgdGhpcy5fY3NpSGFuZGxlcnNbdGhpcy5faWRlbnRpZmllcihlKV19c2V0Q3NpSGFuZGxlckZhbGxiYWNrKGUpe3RoaXMuX2NzaUhhbmRsZXJGYj1lfXJlZ2lzdGVyRGNzSGFuZGxlcihlLHQpe3JldHVybiB0aGlzLl9kY3NQYXJzZXIucmVnaXN0ZXJIYW5kbGVyKHRoaXMuX2lkZW50aWZpZXIoZSksdCl9Y2xlYXJEY3NIYW5kbGVyKGUpe3RoaXMuX2Rjc1BhcnNlci5jbGVhckhhbmRsZXIodGhpcy5faWRlbnRpZmllcihlKSl9c2V0RGNzSGFuZGxlckZhbGxiYWNrKGUpe3RoaXMuX2Rjc1BhcnNlci5zZXRIYW5kbGVyRmFsbGJhY2soZSl9cmVnaXN0ZXJPc2NIYW5kbGVyKGUsdCl7cmV0dXJuIHRoaXMuX29zY1BhcnNlci5yZWdpc3RlckhhbmRsZXIoZSx0KX1jbGVhck9zY0hhbmRsZXIoZSl7dGhpcy5fb3NjUGFyc2VyLmNsZWFySGFuZGxlcihlKX1zZXRPc2NIYW5kbGVyRmFsbGJhY2soZSl7dGhpcy5fb3NjUGFyc2VyLnNldEhhbmRsZXJGYWxsYmFjayhlKX1zZXRFcnJvckhhbmRsZXIoZSl7dGhpcy5fZXJyb3JIYW5kbGVyPWV9Y2xlYXJFcnJvckhhbmRsZXIoKXt0aGlzLl9lcnJvckhhbmRsZXI9dGhpcy5fZXJyb3JIYW5kbGVyRmJ9cmVzZXQoKXt0aGlzLmN1cnJlbnRTdGF0ZT10aGlzLmluaXRpYWxTdGF0ZSx0aGlzLl9vc2NQYXJzZXIucmVzZXQoKSx0aGlzLl9kY3NQYXJzZXIucmVzZXQoKSx0aGlzLl9wYXJhbXMucmVzZXQoKSx0aGlzLl9wYXJhbXMuYWRkUGFyYW0oMCksdGhpcy5fY29sbGVjdD0wLHRoaXMucHJlY2VkaW5nSm9pblN0YXRlPTAsMCE9PXRoaXMuX3BhcnNlU3RhY2suc3RhdGUmJih0aGlzLl9wYXJzZVN0YWNrLnN0YXRlPTIsdGhpcy5fcGFyc2VTdGFjay5oYW5kbGVycz1bXSl9X3ByZXNlcnZlU3RhY2soZSx0LGkscyxyKXt0aGlzLl9wYXJzZVN0YWNrLnN0YXRlPWUsdGhpcy5fcGFyc2VTdGFjay5oYW5kbGVycz10LHRoaXMuX3BhcnNlU3RhY2suaGFuZGxlclBvcz1pLHRoaXMuX3BhcnNlU3RhY2sudHJhbnNpdGlvbj1zLHRoaXMuX3BhcnNlU3RhY2suY2h1bmtQb3M9cn1wYXJzZShlLHQsaSl7bGV0IHMscj0wLG49MCxvPTA7aWYodGhpcy5fcGFyc2VTdGFjay5zdGF0ZSlpZigyPT09dGhpcy5fcGFyc2VTdGFjay5zdGF0ZSl0aGlzLl9wYXJzZVN0YWNrLnN0YXRlPTAsbz10aGlzLl9wYXJzZVN0YWNrLmNodW5rUG9zKzE7ZWxzZXtpZih2b2lkIDA9PT1pfHwxPT09dGhpcy5fcGFyc2VTdGFjay5zdGF0ZSl0aHJvdyB0aGlzLl9wYXJzZVN0YWNrLnN0YXRlPTEsbmV3IEVycm9yKFwiaW1wcm9wZXIgY29udGludWF0aW9uIGR1ZSB0byBwcmV2aW91cyBhc3luYyBoYW5kbGVyLCBnaXZpbmcgdXAgcGFyc2luZ1wiKTtjb25zdCB0PXRoaXMuX3BhcnNlU3RhY2suaGFuZGxlcnM7bGV0IG49dGhpcy5fcGFyc2VTdGFjay5oYW5kbGVyUG9zLTE7c3dpdGNoKHRoaXMuX3BhcnNlU3RhY2suc3RhdGUpe2Nhc2UgMzppZighMT09PWkmJm4+LTEpZm9yKDtuPj0wJiYocz10W25dKHRoaXMuX3BhcmFtcyksITAhPT1zKTtuLS0paWYocyBpbnN0YW5jZW9mIFByb21pc2UpcmV0dXJuIHRoaXMuX3BhcnNlU3RhY2suaGFuZGxlclBvcz1uLHM7dGhpcy5fcGFyc2VTdGFjay5oYW5kbGVycz1bXTticmVhaztjYXNlIDQ6aWYoITE9PT1pJiZuPi0xKWZvcig7bj49MCYmKHM9dFtuXSgpLCEwIT09cyk7bi0tKWlmKHMgaW5zdGFuY2VvZiBQcm9taXNlKXJldHVybiB0aGlzLl9wYXJzZVN0YWNrLmhhbmRsZXJQb3M9bixzO3RoaXMuX3BhcnNlU3RhY2suaGFuZGxlcnM9W107YnJlYWs7Y2FzZSA2OmlmKHI9ZVt0aGlzLl9wYXJzZVN0YWNrLmNodW5rUG9zXSxzPXRoaXMuX2Rjc1BhcnNlci51bmhvb2soMjQhPT1yJiYyNiE9PXIsaSkscylyZXR1cm4gczsyNz09PXImJih0aGlzLl9wYXJzZVN0YWNrLnRyYW5zaXRpb258PTEpLHRoaXMuX3BhcmFtcy5yZXNldCgpLHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKSx0aGlzLl9jb2xsZWN0PTA7YnJlYWs7Y2FzZSA1OmlmKHI9ZVt0aGlzLl9wYXJzZVN0YWNrLmNodW5rUG9zXSxzPXRoaXMuX29zY1BhcnNlci5lbmQoMjQhPT1yJiYyNiE9PXIsaSkscylyZXR1cm4gczsyNz09PXImJih0aGlzLl9wYXJzZVN0YWNrLnRyYW5zaXRpb258PTEpLHRoaXMuX3BhcmFtcy5yZXNldCgpLHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKSx0aGlzLl9jb2xsZWN0PTB9dGhpcy5fcGFyc2VTdGFjay5zdGF0ZT0wLG89dGhpcy5fcGFyc2VTdGFjay5jaHVua1BvcysxLHRoaXMucHJlY2VkaW5nSm9pblN0YXRlPTAsdGhpcy5jdXJyZW50U3RhdGU9MTUmdGhpcy5fcGFyc2VTdGFjay50cmFuc2l0aW9ufWZvcihsZXQgaT1vO2k8dDsrK2kpe3N3aXRjaChyPWVbaV0sbj10aGlzLl90cmFuc2l0aW9ucy50YWJsZVt0aGlzLmN1cnJlbnRTdGF0ZTw8OHwocjwxNjA/cjpoKV0sbj4+NCl7Y2FzZSAyOmZvcihsZXQgcz1pKzE7Oysrcyl7aWYocz49dHx8KHI9ZVtzXSk8MzJ8fHI+MTI2JiZyPGgpe3RoaXMuX3ByaW50SGFuZGxlcihlLGkscyksaT1zLTE7YnJlYWt9aWYoKytzPj10fHwocj1lW3NdKTwzMnx8cj4xMjYmJnI8aCl7dGhpcy5fcHJpbnRIYW5kbGVyKGUsaSxzKSxpPXMtMTticmVha31pZigrK3M+PXR8fChyPWVbc10pPDMyfHxyPjEyNiYmcjxoKXt0aGlzLl9wcmludEhhbmRsZXIoZSxpLHMpLGk9cy0xO2JyZWFrfWlmKCsrcz49dHx8KHI9ZVtzXSk8MzJ8fHI+MTI2JiZyPGgpe3RoaXMuX3ByaW50SGFuZGxlcihlLGkscyksaT1zLTE7YnJlYWt9fWJyZWFrO2Nhc2UgMzp0aGlzLl9leGVjdXRlSGFuZGxlcnNbcl0/dGhpcy5fZXhlY3V0ZUhhbmRsZXJzW3JdKCk6dGhpcy5fZXhlY3V0ZUhhbmRsZXJGYihyKSx0aGlzLnByZWNlZGluZ0pvaW5TdGF0ZT0wO2JyZWFrO2Nhc2UgMDpicmVhaztjYXNlIDE6aWYodGhpcy5fZXJyb3JIYW5kbGVyKHtwb3NpdGlvbjppLGNvZGU6cixjdXJyZW50U3RhdGU6dGhpcy5jdXJyZW50U3RhdGUsY29sbGVjdDp0aGlzLl9jb2xsZWN0LHBhcmFtczp0aGlzLl9wYXJhbXMsYWJvcnQ6ITF9KS5hYm9ydClyZXR1cm47YnJlYWs7Y2FzZSA3OmNvbnN0IG89dGhpcy5fY3NpSGFuZGxlcnNbdGhpcy5fY29sbGVjdDw8OHxyXTtsZXQgYT1vP28ubGVuZ3RoLTE6LTE7Zm9yKDthPj0wJiYocz1vW2FdKHRoaXMuX3BhcmFtcyksITAhPT1zKTthLS0paWYocyBpbnN0YW5jZW9mIFByb21pc2UpcmV0dXJuIHRoaXMuX3ByZXNlcnZlU3RhY2soMyxvLGEsbixpKSxzO2E8MCYmdGhpcy5fY3NpSGFuZGxlckZiKHRoaXMuX2NvbGxlY3Q8PDh8cix0aGlzLl9wYXJhbXMpLHRoaXMucHJlY2VkaW5nSm9pblN0YXRlPTA7YnJlYWs7Y2FzZSA4OmRve3N3aXRjaChyKXtjYXNlIDU5OnRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKTticmVhaztjYXNlIDU4OnRoaXMuX3BhcmFtcy5hZGRTdWJQYXJhbSgtMSk7YnJlYWs7ZGVmYXVsdDp0aGlzLl9wYXJhbXMuYWRkRGlnaXQoci00OCl9fXdoaWxlKCsraTx0JiYocj1lW2ldKT40NyYmcjw2MCk7aS0tO2JyZWFrO2Nhc2UgOTp0aGlzLl9jb2xsZWN0PDw9OCx0aGlzLl9jb2xsZWN0fD1yO2JyZWFrO2Nhc2UgMTA6Y29uc3QgYz10aGlzLl9lc2NIYW5kbGVyc1t0aGlzLl9jb2xsZWN0PDw4fHJdO2xldCBsPWM/Yy5sZW5ndGgtMTotMTtmb3IoO2w+PTAmJihzPWNbbF0oKSwhMCE9PXMpO2wtLSlpZihzIGluc3RhbmNlb2YgUHJvbWlzZSlyZXR1cm4gdGhpcy5fcHJlc2VydmVTdGFjayg0LGMsbCxuLGkpLHM7bDwwJiZ0aGlzLl9lc2NIYW5kbGVyRmIodGhpcy5fY29sbGVjdDw8OHxyKSx0aGlzLnByZWNlZGluZ0pvaW5TdGF0ZT0wO2JyZWFrO2Nhc2UgMTE6dGhpcy5fcGFyYW1zLnJlc2V0KCksdGhpcy5fcGFyYW1zLmFkZFBhcmFtKDApLHRoaXMuX2NvbGxlY3Q9MDticmVhaztjYXNlIDEyOnRoaXMuX2Rjc1BhcnNlci5ob29rKHRoaXMuX2NvbGxlY3Q8PDh8cix0aGlzLl9wYXJhbXMpO2JyZWFrO2Nhc2UgMTM6Zm9yKGxldCBzPWkrMTs7KytzKWlmKHM+PXR8fDI0PT09KHI9ZVtzXSl8fDI2PT09cnx8Mjc9PT1yfHxyPjEyNyYmcjxoKXt0aGlzLl9kY3NQYXJzZXIucHV0KGUsaSxzKSxpPXMtMTticmVha31icmVhaztjYXNlIDE0OmlmKHM9dGhpcy5fZGNzUGFyc2VyLnVuaG9vaygyNCE9PXImJjI2IT09cikscylyZXR1cm4gdGhpcy5fcHJlc2VydmVTdGFjayg2LFtdLDAsbixpKSxzOzI3PT09ciYmKG58PTEpLHRoaXMuX3BhcmFtcy5yZXNldCgpLHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKSx0aGlzLl9jb2xsZWN0PTAsdGhpcy5wcmVjZWRpbmdKb2luU3RhdGU9MDticmVhaztjYXNlIDQ6dGhpcy5fb3NjUGFyc2VyLnN0YXJ0KCk7YnJlYWs7Y2FzZSA1OmZvcihsZXQgcz1pKzE7O3MrKylpZihzPj10fHwocj1lW3NdKTwzMnx8cj4xMjcmJnI8aCl7dGhpcy5fb3NjUGFyc2VyLnB1dChlLGkscyksaT1zLTE7YnJlYWt9YnJlYWs7Y2FzZSA2OmlmKHM9dGhpcy5fb3NjUGFyc2VyLmVuZCgyNCE9PXImJjI2IT09cikscylyZXR1cm4gdGhpcy5fcHJlc2VydmVTdGFjayg1LFtdLDAsbixpKSxzOzI3PT09ciYmKG58PTEpLHRoaXMuX3BhcmFtcy5yZXNldCgpLHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKSx0aGlzLl9jb2xsZWN0PTAsdGhpcy5wcmVjZWRpbmdKb2luU3RhdGU9MH10aGlzLmN1cnJlbnRTdGF0ZT0xNSZufX19dC5Fc2NhcGVTZXF1ZW5jZVBhcnNlcj1jfSw2MjQyOihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0Lk9zY0hhbmRsZXI9dC5Pc2NQYXJzZXI9dm9pZCAwO2NvbnN0IHM9aSg1NzcwKSxyPWkoNDgyKSxuPVtdO3QuT3NjUGFyc2VyPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fc3RhdGU9MCx0aGlzLl9hY3RpdmU9bix0aGlzLl9pZD0tMSx0aGlzLl9oYW5kbGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2hhbmRsZXJGYj0oKT0+e30sdGhpcy5fc3RhY2s9e3BhdXNlZDohMSxsb29wUG9zaXRpb246MCxmYWxsVGhyb3VnaDohMX19cmVnaXN0ZXJIYW5kbGVyKGUsdCl7dm9pZCAwPT09dGhpcy5faGFuZGxlcnNbZV0mJih0aGlzLl9oYW5kbGVyc1tlXT1bXSk7Y29uc3QgaT10aGlzLl9oYW5kbGVyc1tlXTtyZXR1cm4gaS5wdXNoKHQpLHtkaXNwb3NlOigpPT57Y29uc3QgZT1pLmluZGV4T2YodCk7LTEhPT1lJiZpLnNwbGljZShlLDEpfX19Y2xlYXJIYW5kbGVyKGUpe3RoaXMuX2hhbmRsZXJzW2VdJiZkZWxldGUgdGhpcy5faGFuZGxlcnNbZV19c2V0SGFuZGxlckZhbGxiYWNrKGUpe3RoaXMuX2hhbmRsZXJGYj1lfWRpc3Bvc2UoKXt0aGlzLl9oYW5kbGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2hhbmRsZXJGYj0oKT0+e30sdGhpcy5fYWN0aXZlPW59cmVzZXQoKXtpZigyPT09dGhpcy5fc3RhdGUpZm9yKGxldCBlPXRoaXMuX3N0YWNrLnBhdXNlZD90aGlzLl9zdGFjay5sb29wUG9zaXRpb24tMTp0aGlzLl9hY3RpdmUubGVuZ3RoLTE7ZT49MDstLWUpdGhpcy5fYWN0aXZlW2VdLmVuZCghMSk7dGhpcy5fc3RhY2sucGF1c2VkPSExLHRoaXMuX2FjdGl2ZT1uLHRoaXMuX2lkPS0xLHRoaXMuX3N0YXRlPTB9X3N0YXJ0KCl7aWYodGhpcy5fYWN0aXZlPXRoaXMuX2hhbmRsZXJzW3RoaXMuX2lkXXx8bix0aGlzLl9hY3RpdmUubGVuZ3RoKWZvcihsZXQgZT10aGlzLl9hY3RpdmUubGVuZ3RoLTE7ZT49MDtlLS0pdGhpcy5fYWN0aXZlW2VdLnN0YXJ0KCk7ZWxzZSB0aGlzLl9oYW5kbGVyRmIodGhpcy5faWQsXCJTVEFSVFwiKX1fcHV0KGUsdCxpKXtpZih0aGlzLl9hY3RpdmUubGVuZ3RoKWZvcihsZXQgcz10aGlzLl9hY3RpdmUubGVuZ3RoLTE7cz49MDtzLS0pdGhpcy5fYWN0aXZlW3NdLnB1dChlLHQsaSk7ZWxzZSB0aGlzLl9oYW5kbGVyRmIodGhpcy5faWQsXCJQVVRcIiwoMCxyLnV0ZjMyVG9TdHJpbmcpKGUsdCxpKSl9c3RhcnQoKXt0aGlzLnJlc2V0KCksdGhpcy5fc3RhdGU9MX1wdXQoZSx0LGkpe2lmKDMhPT10aGlzLl9zdGF0ZSl7aWYoMT09PXRoaXMuX3N0YXRlKWZvcig7dDxpOyl7Y29uc3QgaT1lW3QrK107aWYoNTk9PT1pKXt0aGlzLl9zdGF0ZT0yLHRoaXMuX3N0YXJ0KCk7YnJlYWt9aWYoaTw0OHx8NTc8aSlyZXR1cm4gdm9pZCh0aGlzLl9zdGF0ZT0zKTstMT09PXRoaXMuX2lkJiYodGhpcy5faWQ9MCksdGhpcy5faWQ9MTAqdGhpcy5faWQraS00OH0yPT09dGhpcy5fc3RhdGUmJmktdD4wJiZ0aGlzLl9wdXQoZSx0LGkpfX1lbmQoZSx0PSEwKXtpZigwIT09dGhpcy5fc3RhdGUpe2lmKDMhPT10aGlzLl9zdGF0ZSlpZigxPT09dGhpcy5fc3RhdGUmJnRoaXMuX3N0YXJ0KCksdGhpcy5fYWN0aXZlLmxlbmd0aCl7bGV0IGk9ITEscz10aGlzLl9hY3RpdmUubGVuZ3RoLTEscj0hMTtpZih0aGlzLl9zdGFjay5wYXVzZWQmJihzPXRoaXMuX3N0YWNrLmxvb3BQb3NpdGlvbi0xLGk9dCxyPXRoaXMuX3N0YWNrLmZhbGxUaHJvdWdoLHRoaXMuX3N0YWNrLnBhdXNlZD0hMSksIXImJiExPT09aSl7Zm9yKDtzPj0wJiYoaT10aGlzLl9hY3RpdmVbc10uZW5kKGUpLCEwIT09aSk7cy0tKWlmKGkgaW5zdGFuY2VvZiBQcm9taXNlKXJldHVybiB0aGlzLl9zdGFjay5wYXVzZWQ9ITAsdGhpcy5fc3RhY2subG9vcFBvc2l0aW9uPXMsdGhpcy5fc3RhY2suZmFsbFRocm91Z2g9ITEsaTtzLS19Zm9yKDtzPj0wO3MtLSlpZihpPXRoaXMuX2FjdGl2ZVtzXS5lbmQoITEpLGkgaW5zdGFuY2VvZiBQcm9taXNlKXJldHVybiB0aGlzLl9zdGFjay5wYXVzZWQ9ITAsdGhpcy5fc3RhY2subG9vcFBvc2l0aW9uPXMsdGhpcy5fc3RhY2suZmFsbFRocm91Z2g9ITAsaX1lbHNlIHRoaXMuX2hhbmRsZXJGYih0aGlzLl9pZCxcIkVORFwiLGUpO3RoaXMuX2FjdGl2ZT1uLHRoaXMuX2lkPS0xLHRoaXMuX3N0YXRlPTB9fX0sdC5Pc2NIYW5kbGVyPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX2hhbmRsZXI9ZSx0aGlzLl9kYXRhPVwiXCIsdGhpcy5faGl0TGltaXQ9ITF9c3RhcnQoKXt0aGlzLl9kYXRhPVwiXCIsdGhpcy5faGl0TGltaXQ9ITF9cHV0KGUsdCxpKXt0aGlzLl9oaXRMaW1pdHx8KHRoaXMuX2RhdGErPSgwLHIudXRmMzJUb1N0cmluZykoZSx0LGkpLHRoaXMuX2RhdGEubGVuZ3RoPnMuUEFZTE9BRF9MSU1JVCYmKHRoaXMuX2RhdGE9XCJcIix0aGlzLl9oaXRMaW1pdD0hMCkpfWVuZChlKXtsZXQgdD0hMTtpZih0aGlzLl9oaXRMaW1pdCl0PSExO2Vsc2UgaWYoZSYmKHQ9dGhpcy5faGFuZGxlcih0aGlzLl9kYXRhKSx0IGluc3RhbmNlb2YgUHJvbWlzZSkpcmV0dXJuIHQudGhlbigoZT0+KHRoaXMuX2RhdGE9XCJcIix0aGlzLl9oaXRMaW1pdD0hMSxlKSkpO3JldHVybiB0aGlzLl9kYXRhPVwiXCIsdGhpcy5faGl0TGltaXQ9ITEsdH19fSw4NzQyOihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5QYXJhbXM9dm9pZCAwO2NvbnN0IGk9MjE0NzQ4MzY0NztjbGFzcyBze3N0YXRpYyBmcm9tQXJyYXkoZSl7Y29uc3QgdD1uZXcgcztpZighZS5sZW5ndGgpcmV0dXJuIHQ7Zm9yKGxldCBpPUFycmF5LmlzQXJyYXkoZVswXSk/MTowO2k8ZS5sZW5ndGg7KytpKXtjb25zdCBzPWVbaV07aWYoQXJyYXkuaXNBcnJheShzKSlmb3IobGV0IGU9MDtlPHMubGVuZ3RoOysrZSl0LmFkZFN1YlBhcmFtKHNbZV0pO2Vsc2UgdC5hZGRQYXJhbShzKX1yZXR1cm4gdH1jb25zdHJ1Y3RvcihlPTMyLHQ9MzIpe2lmKHRoaXMubWF4TGVuZ3RoPWUsdGhpcy5tYXhTdWJQYXJhbXNMZW5ndGg9dCx0PjI1Nil0aHJvdyBuZXcgRXJyb3IoXCJtYXhTdWJQYXJhbXNMZW5ndGggbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIDI1NlwiKTt0aGlzLnBhcmFtcz1uZXcgSW50MzJBcnJheShlKSx0aGlzLmxlbmd0aD0wLHRoaXMuX3N1YlBhcmFtcz1uZXcgSW50MzJBcnJheSh0KSx0aGlzLl9zdWJQYXJhbXNMZW5ndGg9MCx0aGlzLl9zdWJQYXJhbXNJZHg9bmV3IFVpbnQxNkFycmF5KGUpLHRoaXMuX3JlamVjdERpZ2l0cz0hMSx0aGlzLl9yZWplY3RTdWJEaWdpdHM9ITEsdGhpcy5fZGlnaXRJc1N1Yj0hMX1jbG9uZSgpe2NvbnN0IGU9bmV3IHModGhpcy5tYXhMZW5ndGgsdGhpcy5tYXhTdWJQYXJhbXNMZW5ndGgpO3JldHVybiBlLnBhcmFtcy5zZXQodGhpcy5wYXJhbXMpLGUubGVuZ3RoPXRoaXMubGVuZ3RoLGUuX3N1YlBhcmFtcy5zZXQodGhpcy5fc3ViUGFyYW1zKSxlLl9zdWJQYXJhbXNMZW5ndGg9dGhpcy5fc3ViUGFyYW1zTGVuZ3RoLGUuX3N1YlBhcmFtc0lkeC5zZXQodGhpcy5fc3ViUGFyYW1zSWR4KSxlLl9yZWplY3REaWdpdHM9dGhpcy5fcmVqZWN0RGlnaXRzLGUuX3JlamVjdFN1YkRpZ2l0cz10aGlzLl9yZWplY3RTdWJEaWdpdHMsZS5fZGlnaXRJc1N1Yj10aGlzLl9kaWdpdElzU3ViLGV9dG9BcnJheSgpe2NvbnN0IGU9W107Zm9yKGxldCB0PTA7dDx0aGlzLmxlbmd0aDsrK3Qpe2UucHVzaCh0aGlzLnBhcmFtc1t0XSk7Y29uc3QgaT10aGlzLl9zdWJQYXJhbXNJZHhbdF0+Pjgscz0yNTUmdGhpcy5fc3ViUGFyYW1zSWR4W3RdO3MtaT4wJiZlLnB1c2goQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fc3ViUGFyYW1zLGkscykpfXJldHVybiBlfXJlc2V0KCl7dGhpcy5sZW5ndGg9MCx0aGlzLl9zdWJQYXJhbXNMZW5ndGg9MCx0aGlzLl9yZWplY3REaWdpdHM9ITEsdGhpcy5fcmVqZWN0U3ViRGlnaXRzPSExLHRoaXMuX2RpZ2l0SXNTdWI9ITF9YWRkUGFyYW0oZSl7aWYodGhpcy5fZGlnaXRJc1N1Yj0hMSx0aGlzLmxlbmd0aD49dGhpcy5tYXhMZW5ndGgpdGhpcy5fcmVqZWN0RGlnaXRzPSEwO2Vsc2V7aWYoZTwtMSl0aHJvdyBuZXcgRXJyb3IoXCJ2YWx1ZXMgbGVzc2VyIHRoYW4gLTEgYXJlIG5vdCBhbGxvd2VkXCIpO3RoaXMuX3N1YlBhcmFtc0lkeFt0aGlzLmxlbmd0aF09dGhpcy5fc3ViUGFyYW1zTGVuZ3RoPDw4fHRoaXMuX3N1YlBhcmFtc0xlbmd0aCx0aGlzLnBhcmFtc1t0aGlzLmxlbmd0aCsrXT1lPmk/aTplfX1hZGRTdWJQYXJhbShlKXtpZih0aGlzLl9kaWdpdElzU3ViPSEwLHRoaXMubGVuZ3RoKWlmKHRoaXMuX3JlamVjdERpZ2l0c3x8dGhpcy5fc3ViUGFyYW1zTGVuZ3RoPj10aGlzLm1heFN1YlBhcmFtc0xlbmd0aCl0aGlzLl9yZWplY3RTdWJEaWdpdHM9ITA7ZWxzZXtpZihlPC0xKXRocm93IG5ldyBFcnJvcihcInZhbHVlcyBsZXNzZXIgdGhhbiAtMSBhcmUgbm90IGFsbG93ZWRcIik7dGhpcy5fc3ViUGFyYW1zW3RoaXMuX3N1YlBhcmFtc0xlbmd0aCsrXT1lPmk/aTplLHRoaXMuX3N1YlBhcmFtc0lkeFt0aGlzLmxlbmd0aC0xXSsrfX1oYXNTdWJQYXJhbXMoZSl7cmV0dXJuKDI1NSZ0aGlzLl9zdWJQYXJhbXNJZHhbZV0pLSh0aGlzLl9zdWJQYXJhbXNJZHhbZV0+PjgpPjB9Z2V0U3ViUGFyYW1zKGUpe2NvbnN0IHQ9dGhpcy5fc3ViUGFyYW1zSWR4W2VdPj44LGk9MjU1JnRoaXMuX3N1YlBhcmFtc0lkeFtlXTtyZXR1cm4gaS10PjA/dGhpcy5fc3ViUGFyYW1zLnN1YmFycmF5KHQsaSk6bnVsbH1nZXRTdWJQYXJhbXNBbGwoKXtjb25zdCBlPXt9O2ZvcihsZXQgdD0wO3Q8dGhpcy5sZW5ndGg7Kyt0KXtjb25zdCBpPXRoaXMuX3N1YlBhcmFtc0lkeFt0XT4+OCxzPTI1NSZ0aGlzLl9zdWJQYXJhbXNJZHhbdF07cy1pPjAmJihlW3RdPXRoaXMuX3N1YlBhcmFtcy5zbGljZShpLHMpKX1yZXR1cm4gZX1hZGREaWdpdChlKXtsZXQgdDtpZih0aGlzLl9yZWplY3REaWdpdHN8fCEodD10aGlzLl9kaWdpdElzU3ViP3RoaXMuX3N1YlBhcmFtc0xlbmd0aDp0aGlzLmxlbmd0aCl8fHRoaXMuX2RpZ2l0SXNTdWImJnRoaXMuX3JlamVjdFN1YkRpZ2l0cylyZXR1cm47Y29uc3Qgcz10aGlzLl9kaWdpdElzU3ViP3RoaXMuX3N1YlBhcmFtczp0aGlzLnBhcmFtcyxyPXNbdC0xXTtzW3QtMV09fnI/TWF0aC5taW4oMTAqcitlLGkpOmV9fXQuUGFyYW1zPXN9LDU3NDE6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkFkZG9uTWFuYWdlcj12b2lkIDAsdC5BZGRvbk1hbmFnZXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9hZGRvbnM9W119ZGlzcG9zZSgpe2ZvcihsZXQgZT10aGlzLl9hZGRvbnMubGVuZ3RoLTE7ZT49MDtlLS0pdGhpcy5fYWRkb25zW2VdLmluc3RhbmNlLmRpc3Bvc2UoKX1sb2FkQWRkb24oZSx0KXtjb25zdCBpPXtpbnN0YW5jZTp0LGRpc3Bvc2U6dC5kaXNwb3NlLGlzRGlzcG9zZWQ6ITF9O3RoaXMuX2FkZG9ucy5wdXNoKGkpLHQuZGlzcG9zZT0oKT0+dGhpcy5fd3JhcHBlZEFkZG9uRGlzcG9zZShpKSx0LmFjdGl2YXRlKGUpfV93cmFwcGVkQWRkb25EaXNwb3NlKGUpe2lmKGUuaXNEaXNwb3NlZClyZXR1cm47bGV0IHQ9LTE7Zm9yKGxldCBpPTA7aTx0aGlzLl9hZGRvbnMubGVuZ3RoO2krKylpZih0aGlzLl9hZGRvbnNbaV09PT1lKXt0PWk7YnJlYWt9aWYoLTE9PT10KXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBkaXNwb3NlIGFuIGFkZG9uIHRoYXQgaGFzIG5vdCBiZWVuIGxvYWRlZFwiKTtlLmlzRGlzcG9zZWQ9ITAsZS5kaXNwb3NlLmFwcGx5KGUuaW5zdGFuY2UpLHRoaXMuX2FkZG9ucy5zcGxpY2UodCwxKX19fSw4NzcxOihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkJ1ZmZlckFwaVZpZXc9dm9pZCAwO2NvbnN0IHM9aSgzNzg1KSxyPWkoNTExKTt0LkJ1ZmZlckFwaVZpZXc9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl9idWZmZXI9ZSx0aGlzLnR5cGU9dH1pbml0KGUpe3JldHVybiB0aGlzLl9idWZmZXI9ZSx0aGlzfWdldCBjdXJzb3JZKCl7cmV0dXJuIHRoaXMuX2J1ZmZlci55fWdldCBjdXJzb3JYKCl7cmV0dXJuIHRoaXMuX2J1ZmZlci54fWdldCB2aWV3cG9ydFkoKXtyZXR1cm4gdGhpcy5fYnVmZmVyLnlkaXNwfWdldCBiYXNlWSgpe3JldHVybiB0aGlzLl9idWZmZXIueWJhc2V9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLl9idWZmZXIubGluZXMubGVuZ3RofWdldExpbmUoZSl7Y29uc3QgdD10aGlzLl9idWZmZXIubGluZXMuZ2V0KGUpO2lmKHQpcmV0dXJuIG5ldyBzLkJ1ZmZlckxpbmVBcGlWaWV3KHQpfWdldE51bGxDZWxsKCl7cmV0dXJuIG5ldyByLkNlbGxEYXRhfX19LDM3ODU6KGUsdCxpKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuQnVmZmVyTGluZUFwaVZpZXc9dm9pZCAwO2NvbnN0IHM9aSg1MTEpO3QuQnVmZmVyTGluZUFwaVZpZXc9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fbGluZT1lfWdldCBpc1dyYXBwZWQoKXtyZXR1cm4gdGhpcy5fbGluZS5pc1dyYXBwZWR9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLl9saW5lLmxlbmd0aH1nZXRDZWxsKGUsdCl7aWYoIShlPDB8fGU+PXRoaXMuX2xpbmUubGVuZ3RoKSlyZXR1cm4gdD8odGhpcy5fbGluZS5sb2FkQ2VsbChlLHQpLHQpOnRoaXMuX2xpbmUubG9hZENlbGwoZSxuZXcgcy5DZWxsRGF0YSl9dHJhbnNsYXRlVG9TdHJpbmcoZSx0LGkpe3JldHVybiB0aGlzLl9saW5lLnRyYW5zbGF0ZVRvU3RyaW5nKGUsdCxpKX19fSw4Mjg1OihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkJ1ZmZlck5hbWVzcGFjZUFwaT12b2lkIDA7Y29uc3Qgcz1pKDg3NzEpLHI9aSg4NDYwKSxuPWkoODQ0KTtjbGFzcyBvIGV4dGVuZHMgbi5EaXNwb3NhYmxle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5fY29yZT1lLHRoaXMuX29uQnVmZmVyQ2hhbmdlPXRoaXMucmVnaXN0ZXIobmV3IHIuRXZlbnRFbWl0dGVyKSx0aGlzLm9uQnVmZmVyQ2hhbmdlPXRoaXMuX29uQnVmZmVyQ2hhbmdlLmV2ZW50LHRoaXMuX25vcm1hbD1uZXcgcy5CdWZmZXJBcGlWaWV3KHRoaXMuX2NvcmUuYnVmZmVycy5ub3JtYWwsXCJub3JtYWxcIiksdGhpcy5fYWx0ZXJuYXRlPW5ldyBzLkJ1ZmZlckFwaVZpZXcodGhpcy5fY29yZS5idWZmZXJzLmFsdCxcImFsdGVybmF0ZVwiKSx0aGlzLl9jb3JlLmJ1ZmZlcnMub25CdWZmZXJBY3RpdmF0ZSgoKCk9PnRoaXMuX29uQnVmZmVyQ2hhbmdlLmZpcmUodGhpcy5hY3RpdmUpKSl9Z2V0IGFjdGl2ZSgpe2lmKHRoaXMuX2NvcmUuYnVmZmVycy5hY3RpdmU9PT10aGlzLl9jb3JlLmJ1ZmZlcnMubm9ybWFsKXJldHVybiB0aGlzLm5vcm1hbDtpZih0aGlzLl9jb3JlLmJ1ZmZlcnMuYWN0aXZlPT09dGhpcy5fY29yZS5idWZmZXJzLmFsdClyZXR1cm4gdGhpcy5hbHRlcm5hdGU7dGhyb3cgbmV3IEVycm9yKFwiQWN0aXZlIGJ1ZmZlciBpcyBuZWl0aGVyIG5vcm1hbCBub3IgYWx0ZXJuYXRlXCIpfWdldCBub3JtYWwoKXtyZXR1cm4gdGhpcy5fbm9ybWFsLmluaXQodGhpcy5fY29yZS5idWZmZXJzLm5vcm1hbCl9Z2V0IGFsdGVybmF0ZSgpe3JldHVybiB0aGlzLl9hbHRlcm5hdGUuaW5pdCh0aGlzLl9jb3JlLmJ1ZmZlcnMuYWx0KX19dC5CdWZmZXJOYW1lc3BhY2VBcGk9b30sNzk3NTooZSx0KT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuUGFyc2VyQXBpPXZvaWQgMCx0LlBhcnNlckFwaT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9jb3JlPWV9cmVnaXN0ZXJDc2lIYW5kbGVyKGUsdCl7cmV0dXJuIHRoaXMuX2NvcmUucmVnaXN0ZXJDc2lIYW5kbGVyKGUsKGU9PnQoZS50b0FycmF5KCkpKSl9YWRkQ3NpSGFuZGxlcihlLHQpe3JldHVybiB0aGlzLnJlZ2lzdGVyQ3NpSGFuZGxlcihlLHQpfXJlZ2lzdGVyRGNzSGFuZGxlcihlLHQpe3JldHVybiB0aGlzLl9jb3JlLnJlZ2lzdGVyRGNzSGFuZGxlcihlLCgoZSxpKT0+dChlLGkudG9BcnJheSgpKSkpfWFkZERjc0hhbmRsZXIoZSx0KXtyZXR1cm4gdGhpcy5yZWdpc3RlckRjc0hhbmRsZXIoZSx0KX1yZWdpc3RlckVzY0hhbmRsZXIoZSx0KXtyZXR1cm4gdGhpcy5fY29yZS5yZWdpc3RlckVzY0hhbmRsZXIoZSx0KX1hZGRFc2NIYW5kbGVyKGUsdCl7cmV0dXJuIHRoaXMucmVnaXN0ZXJFc2NIYW5kbGVyKGUsdCl9cmVnaXN0ZXJPc2NIYW5kbGVyKGUsdCl7cmV0dXJuIHRoaXMuX2NvcmUucmVnaXN0ZXJPc2NIYW5kbGVyKGUsdCl9YWRkT3NjSGFuZGxlcihlLHQpe3JldHVybiB0aGlzLnJlZ2lzdGVyT3NjSGFuZGxlcihlLHQpfX19LDcwOTA6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LlVuaWNvZGVBcGk9dm9pZCAwLHQuVW5pY29kZUFwaT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9jb3JlPWV9cmVnaXN0ZXIoZSl7dGhpcy5fY29yZS51bmljb2RlU2VydmljZS5yZWdpc3RlcihlKX1nZXQgdmVyc2lvbnMoKXtyZXR1cm4gdGhpcy5fY29yZS51bmljb2RlU2VydmljZS52ZXJzaW9uc31nZXQgYWN0aXZlVmVyc2lvbigpe3JldHVybiB0aGlzLl9jb3JlLnVuaWNvZGVTZXJ2aWNlLmFjdGl2ZVZlcnNpb259c2V0IGFjdGl2ZVZlcnNpb24oZSl7dGhpcy5fY29yZS51bmljb2RlU2VydmljZS5hY3RpdmVWZXJzaW9uPWV9fX0sNzQ0OmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz10aGlzJiZ0aGlzLl9fZGVjb3JhdGV8fGZ1bmN0aW9uKGUsdCxpLHMpe3ZhciByLG49YXJndW1lbnRzLmxlbmd0aCxvPW48Mz90Om51bGw9PT1zP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGkpOnM7aWYoXCJvYmplY3RcIj09dHlwZW9mIFJlZmxlY3QmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpbz1SZWZsZWN0LmRlY29yYXRlKGUsdCxpLHMpO2Vsc2UgZm9yKHZhciBhPWUubGVuZ3RoLTE7YT49MDthLS0pKHI9ZVthXSkmJihvPShuPDM/cihvKTpuPjM/cih0LGksbyk6cih0LGkpKXx8byk7cmV0dXJuIG4+MyYmbyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSxvKSxvfSxyPXRoaXMmJnRoaXMuX19wYXJhbXx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oaSxzKXt0KGkscyxlKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuQnVmZmVyU2VydmljZT10Lk1JTklNVU1fUk9XUz10Lk1JTklNVU1fQ09MUz12b2lkIDA7Y29uc3Qgbj1pKDg0NjApLG89aSg4NDQpLGE9aSg1Mjk1KSxoPWkoMjU4NSk7dC5NSU5JTVVNX0NPTFM9Mix0Lk1JTklNVU1fUk9XUz0xO2xldCBjPXQuQnVmZmVyU2VydmljZT1jbGFzcyBleHRlbmRzIG8uRGlzcG9zYWJsZXtnZXQgYnVmZmVyKCl7cmV0dXJuIHRoaXMuYnVmZmVycy5hY3RpdmV9Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzVXNlclNjcm9sbGluZz0hMSx0aGlzLl9vblJlc2l6ZT10aGlzLnJlZ2lzdGVyKG5ldyBuLkV2ZW50RW1pdHRlciksdGhpcy5vblJlc2l6ZT10aGlzLl9vblJlc2l6ZS5ldmVudCx0aGlzLl9vblNjcm9sbD10aGlzLnJlZ2lzdGVyKG5ldyBuLkV2ZW50RW1pdHRlciksdGhpcy5vblNjcm9sbD10aGlzLl9vblNjcm9sbC5ldmVudCx0aGlzLmNvbHM9TWF0aC5tYXgoZS5yYXdPcHRpb25zLmNvbHN8fDAsdC5NSU5JTVVNX0NPTFMpLHRoaXMucm93cz1NYXRoLm1heChlLnJhd09wdGlvbnMucm93c3x8MCx0Lk1JTklNVU1fUk9XUyksdGhpcy5idWZmZXJzPXRoaXMucmVnaXN0ZXIobmV3IGEuQnVmZmVyU2V0KGUsdGhpcykpfXJlc2l6ZShlLHQpe3RoaXMuY29scz1lLHRoaXMucm93cz10LHRoaXMuYnVmZmVycy5yZXNpemUoZSx0KSx0aGlzLl9vblJlc2l6ZS5maXJlKHtjb2xzOmUscm93czp0fSl9cmVzZXQoKXt0aGlzLmJ1ZmZlcnMucmVzZXQoKSx0aGlzLmlzVXNlclNjcm9sbGluZz0hMX1zY3JvbGwoZSx0PSExKXtjb25zdCBpPXRoaXMuYnVmZmVyO2xldCBzO3M9dGhpcy5fY2FjaGVkQmxhbmtMaW5lLHMmJnMubGVuZ3RoPT09dGhpcy5jb2xzJiZzLmdldEZnKDApPT09ZS5mZyYmcy5nZXRCZygwKT09PWUuYmd8fChzPWkuZ2V0QmxhbmtMaW5lKGUsdCksdGhpcy5fY2FjaGVkQmxhbmtMaW5lPXMpLHMuaXNXcmFwcGVkPXQ7Y29uc3Qgcj1pLnliYXNlK2kuc2Nyb2xsVG9wLG49aS55YmFzZStpLnNjcm9sbEJvdHRvbTtpZigwPT09aS5zY3JvbGxUb3Ape2NvbnN0IGU9aS5saW5lcy5pc0Z1bGw7bj09PWkubGluZXMubGVuZ3RoLTE/ZT9pLmxpbmVzLnJlY3ljbGUoKS5jb3B5RnJvbShzKTppLmxpbmVzLnB1c2gocy5jbG9uZSgpKTppLmxpbmVzLnNwbGljZShuKzEsMCxzLmNsb25lKCkpLGU/dGhpcy5pc1VzZXJTY3JvbGxpbmcmJihpLnlkaXNwPU1hdGgubWF4KGkueWRpc3AtMSwwKSk6KGkueWJhc2UrKyx0aGlzLmlzVXNlclNjcm9sbGluZ3x8aS55ZGlzcCsrKX1lbHNle2NvbnN0IGU9bi1yKzE7aS5saW5lcy5zaGlmdEVsZW1lbnRzKHIrMSxlLTEsLTEpLGkubGluZXMuc2V0KG4scy5jbG9uZSgpKX10aGlzLmlzVXNlclNjcm9sbGluZ3x8KGkueWRpc3A9aS55YmFzZSksdGhpcy5fb25TY3JvbGwuZmlyZShpLnlkaXNwKX1zY3JvbGxMaW5lcyhlLHQsaSl7Y29uc3Qgcz10aGlzLmJ1ZmZlcjtpZihlPDApe2lmKDA9PT1zLnlkaXNwKXJldHVybjt0aGlzLmlzVXNlclNjcm9sbGluZz0hMH1lbHNlIGUrcy55ZGlzcD49cy55YmFzZSYmKHRoaXMuaXNVc2VyU2Nyb2xsaW5nPSExKTtjb25zdCByPXMueWRpc3A7cy55ZGlzcD1NYXRoLm1heChNYXRoLm1pbihzLnlkaXNwK2Uscy55YmFzZSksMCksciE9PXMueWRpc3AmJih0fHx0aGlzLl9vblNjcm9sbC5maXJlKHMueWRpc3ApKX19O3QuQnVmZmVyU2VydmljZT1jPXMoW3IoMCxoLklPcHRpb25zU2VydmljZSldLGMpfSw3OTk0OihlLHQpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5DaGFyc2V0U2VydmljZT12b2lkIDAsdC5DaGFyc2V0U2VydmljZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuZ2xldmVsPTAsdGhpcy5fY2hhcnNldHM9W119cmVzZXQoKXt0aGlzLmNoYXJzZXQ9dm9pZCAwLHRoaXMuX2NoYXJzZXRzPVtdLHRoaXMuZ2xldmVsPTB9c2V0Z0xldmVsKGUpe3RoaXMuZ2xldmVsPWUsdGhpcy5jaGFyc2V0PXRoaXMuX2NoYXJzZXRzW2VdfXNldGdDaGFyc2V0KGUsdCl7dGhpcy5fY2hhcnNldHNbZV09dCx0aGlzLmdsZXZlbD09PWUmJih0aGlzLmNoYXJzZXQ9dCl9fX0sMTc1MzpmdW5jdGlvbihlLHQsaSl7dmFyIHM9dGhpcyYmdGhpcy5fX2RlY29yYXRlfHxmdW5jdGlvbihlLHQsaSxzKXt2YXIgcixuPWFyZ3VtZW50cy5sZW5ndGgsbz1uPDM/dDpudWxsPT09cz9zPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxpKTpzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBSZWZsZWN0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKW89UmVmbGVjdC5kZWNvcmF0ZShlLHQsaSxzKTtlbHNlIGZvcih2YXIgYT1lLmxlbmd0aC0xO2E+PTA7YS0tKShyPWVbYV0pJiYobz0objwzP3Iobyk6bj4zP3IodCxpLG8pOnIodCxpKSl8fG8pO3JldHVybiBuPjMmJm8mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGksbyksb30scj10aGlzJiZ0aGlzLl9fcGFyYW18fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGkscyl7dChpLHMsZSl9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkNvcmVNb3VzZVNlcnZpY2U9dm9pZCAwO2NvbnN0IG49aSgyNTg1KSxvPWkoODQ2MCksYT1pKDg0NCksaD17Tk9ORTp7ZXZlbnRzOjAscmVzdHJpY3Q6KCk9PiExfSxYMTA6e2V2ZW50czoxLHJlc3RyaWN0OmU9PjQhPT1lLmJ1dHRvbiYmMT09PWUuYWN0aW9uJiYoZS5jdHJsPSExLGUuYWx0PSExLGUuc2hpZnQ9ITEsITApfSxWVDIwMDp7ZXZlbnRzOjE5LHJlc3RyaWN0OmU9PjMyIT09ZS5hY3Rpb259LERSQUc6e2V2ZW50czoyMyxyZXN0cmljdDplPT4zMiE9PWUuYWN0aW9ufHwzIT09ZS5idXR0b259LEFOWTp7ZXZlbnRzOjMxLHJlc3RyaWN0OmU9PiEwfX07ZnVuY3Rpb24gYyhlLHQpe2xldCBpPShlLmN0cmw/MTY6MCl8KGUuc2hpZnQ/NDowKXwoZS5hbHQ/ODowKTtyZXR1cm4gND09PWUuYnV0dG9uPyhpfD02NCxpfD1lLmFjdGlvbik6KGl8PTMmZS5idXR0b24sNCZlLmJ1dHRvbiYmKGl8PTY0KSw4JmUuYnV0dG9uJiYoaXw9MTI4KSwzMj09PWUuYWN0aW9uP2l8PTMyOjAhPT1lLmFjdGlvbnx8dHx8KGl8PTMpKSxpfWNvbnN0IGw9U3RyaW5nLmZyb21DaGFyQ29kZSxkPXtERUZBVUxUOmU9Pntjb25zdCB0PVtjKGUsITEpKzMyLGUuY29sKzMyLGUucm93KzMyXTtyZXR1cm4gdFswXT4yNTV8fHRbMV0+MjU1fHx0WzJdPjI1NT9cIlwiOmBcdTAwMWJbTSR7bCh0WzBdKX0ke2wodFsxXSl9JHtsKHRbMl0pfWB9LFNHUjplPT57Y29uc3QgdD0wPT09ZS5hY3Rpb24mJjQhPT1lLmJ1dHRvbj9cIm1cIjpcIk1cIjtyZXR1cm5gXHUwMDFiWzwke2MoZSwhMCl9OyR7ZS5jb2x9OyR7ZS5yb3d9JHt0fWB9LFNHUl9QSVhFTFM6ZT0+e2NvbnN0IHQ9MD09PWUuYWN0aW9uJiY0IT09ZS5idXR0b24/XCJtXCI6XCJNXCI7cmV0dXJuYFx1MDAxYls8JHtjKGUsITApfTske2UueH07JHtlLnl9JHt0fWB9fTtsZXQgXz10LkNvcmVNb3VzZVNlcnZpY2U9Y2xhc3MgZXh0ZW5kcyBhLkRpc3Bvc2FibGV7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuX2J1ZmZlclNlcnZpY2U9ZSx0aGlzLl9jb3JlU2VydmljZT10LHRoaXMuX3Byb3RvY29scz17fSx0aGlzLl9lbmNvZGluZ3M9e30sdGhpcy5fYWN0aXZlUHJvdG9jb2w9XCJcIix0aGlzLl9hY3RpdmVFbmNvZGluZz1cIlwiLHRoaXMuX2xhc3RFdmVudD1udWxsLHRoaXMuX29uUHJvdG9jb2xDaGFuZ2U9dGhpcy5yZWdpc3RlcihuZXcgby5FdmVudEVtaXR0ZXIpLHRoaXMub25Qcm90b2NvbENoYW5nZT10aGlzLl9vblByb3RvY29sQ2hhbmdlLmV2ZW50O2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKGgpKXRoaXMuYWRkUHJvdG9jb2woZSxoW2VdKTtmb3IoY29uc3QgZSBvZiBPYmplY3Qua2V5cyhkKSl0aGlzLmFkZEVuY29kaW5nKGUsZFtlXSk7dGhpcy5yZXNldCgpfWFkZFByb3RvY29sKGUsdCl7dGhpcy5fcHJvdG9jb2xzW2VdPXR9YWRkRW5jb2RpbmcoZSx0KXt0aGlzLl9lbmNvZGluZ3NbZV09dH1nZXQgYWN0aXZlUHJvdG9jb2woKXtyZXR1cm4gdGhpcy5fYWN0aXZlUHJvdG9jb2x9Z2V0IGFyZU1vdXNlRXZlbnRzQWN0aXZlKCl7cmV0dXJuIDAhPT10aGlzLl9wcm90b2NvbHNbdGhpcy5fYWN0aXZlUHJvdG9jb2xdLmV2ZW50c31zZXQgYWN0aXZlUHJvdG9jb2woZSl7aWYoIXRoaXMuX3Byb3RvY29sc1tlXSl0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gcHJvdG9jb2wgXCIke2V9XCJgKTt0aGlzLl9hY3RpdmVQcm90b2NvbD1lLHRoaXMuX29uUHJvdG9jb2xDaGFuZ2UuZmlyZSh0aGlzLl9wcm90b2NvbHNbZV0uZXZlbnRzKX1nZXQgYWN0aXZlRW5jb2RpbmcoKXtyZXR1cm4gdGhpcy5fYWN0aXZlRW5jb2Rpbmd9c2V0IGFjdGl2ZUVuY29kaW5nKGUpe2lmKCF0aGlzLl9lbmNvZGluZ3NbZV0pdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIGVuY29kaW5nIFwiJHtlfVwiYCk7dGhpcy5fYWN0aXZlRW5jb2Rpbmc9ZX1yZXNldCgpe3RoaXMuYWN0aXZlUHJvdG9jb2w9XCJOT05FXCIsdGhpcy5hY3RpdmVFbmNvZGluZz1cIkRFRkFVTFRcIix0aGlzLl9sYXN0RXZlbnQ9bnVsbH10cmlnZ2VyTW91c2VFdmVudChlKXtpZihlLmNvbDwwfHxlLmNvbD49dGhpcy5fYnVmZmVyU2VydmljZS5jb2xzfHxlLnJvdzwwfHxlLnJvdz49dGhpcy5fYnVmZmVyU2VydmljZS5yb3dzKXJldHVybiExO2lmKDQ9PT1lLmJ1dHRvbiYmMzI9PT1lLmFjdGlvbilyZXR1cm4hMTtpZigzPT09ZS5idXR0b24mJjMyIT09ZS5hY3Rpb24pcmV0dXJuITE7aWYoNCE9PWUuYnV0dG9uJiYoMj09PWUuYWN0aW9ufHwzPT09ZS5hY3Rpb24pKXJldHVybiExO2lmKGUuY29sKyssZS5yb3crKywzMj09PWUuYWN0aW9uJiZ0aGlzLl9sYXN0RXZlbnQmJnRoaXMuX2VxdWFsRXZlbnRzKHRoaXMuX2xhc3RFdmVudCxlLFwiU0dSX1BJWEVMU1wiPT09dGhpcy5fYWN0aXZlRW5jb2RpbmcpKXJldHVybiExO2lmKCF0aGlzLl9wcm90b2NvbHNbdGhpcy5fYWN0aXZlUHJvdG9jb2xdLnJlc3RyaWN0KGUpKXJldHVybiExO2NvbnN0IHQ9dGhpcy5fZW5jb2RpbmdzW3RoaXMuX2FjdGl2ZUVuY29kaW5nXShlKTtyZXR1cm4gdCYmKFwiREVGQVVMVFwiPT09dGhpcy5fYWN0aXZlRW5jb2Rpbmc/dGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckJpbmFyeUV2ZW50KHQpOnRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQodCwhMCkpLHRoaXMuX2xhc3RFdmVudD1lLCEwfWV4cGxhaW5FdmVudHMoZSl7cmV0dXJue2Rvd246ISEoMSZlKSx1cDohISgyJmUpLGRyYWc6ISEoNCZlKSxtb3ZlOiEhKDgmZSksd2hlZWw6ISEoMTYmZSl9fV9lcXVhbEV2ZW50cyhlLHQsaSl7aWYoaSl7aWYoZS54IT09dC54KXJldHVybiExO2lmKGUueSE9PXQueSlyZXR1cm4hMX1lbHNle2lmKGUuY29sIT09dC5jb2wpcmV0dXJuITE7aWYoZS5yb3chPT10LnJvdylyZXR1cm4hMX1yZXR1cm4gZS5idXR0b249PT10LmJ1dHRvbiYmZS5hY3Rpb249PT10LmFjdGlvbiYmZS5jdHJsPT09dC5jdHJsJiZlLmFsdD09PXQuYWx0JiZlLnNoaWZ0PT09dC5zaGlmdH19O3QuQ29yZU1vdXNlU2VydmljZT1fPXMoW3IoMCxuLklCdWZmZXJTZXJ2aWNlKSxyKDEsbi5JQ29yZVNlcnZpY2UpXSxfKX0sNjk3NTpmdW5jdGlvbihlLHQsaSl7dmFyIHM9dGhpcyYmdGhpcy5fX2RlY29yYXRlfHxmdW5jdGlvbihlLHQsaSxzKXt2YXIgcixuPWFyZ3VtZW50cy5sZW5ndGgsbz1uPDM/dDpudWxsPT09cz9zPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxpKTpzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBSZWZsZWN0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKW89UmVmbGVjdC5kZWNvcmF0ZShlLHQsaSxzKTtlbHNlIGZvcih2YXIgYT1lLmxlbmd0aC0xO2E+PTA7YS0tKShyPWVbYV0pJiYobz0objwzP3Iobyk6bj4zP3IodCxpLG8pOnIodCxpKSl8fG8pO3JldHVybiBuPjMmJm8mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGksbyksb30scj10aGlzJiZ0aGlzLl9fcGFyYW18fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGkscyl7dChpLHMsZSl9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkNvcmVTZXJ2aWNlPXZvaWQgMDtjb25zdCBuPWkoMTQzOSksbz1pKDg0NjApLGE9aSg4NDQpLGg9aSgyNTg1KSxjPU9iamVjdC5mcmVlemUoe2luc2VydE1vZGU6ITF9KSxsPU9iamVjdC5mcmVlemUoe2FwcGxpY2F0aW9uQ3Vyc29yS2V5czohMSxhcHBsaWNhdGlvbktleXBhZDohMSxicmFja2V0ZWRQYXN0ZU1vZGU6ITEsb3JpZ2luOiExLHJldmVyc2VXcmFwYXJvdW5kOiExLHNlbmRGb2N1czohMSx3cmFwYXJvdW5kOiEwfSk7bGV0IGQ9dC5Db3JlU2VydmljZT1jbGFzcyBleHRlbmRzIGEuRGlzcG9zYWJsZXtjb25zdHJ1Y3RvcihlLHQsaSl7c3VwZXIoKSx0aGlzLl9idWZmZXJTZXJ2aWNlPWUsdGhpcy5fbG9nU2VydmljZT10LHRoaXMuX29wdGlvbnNTZXJ2aWNlPWksdGhpcy5pc0N1cnNvckluaXRpYWxpemVkPSExLHRoaXMuaXNDdXJzb3JIaWRkZW49ITEsdGhpcy5fb25EYXRhPXRoaXMucmVnaXN0ZXIobmV3IG8uRXZlbnRFbWl0dGVyKSx0aGlzLm9uRGF0YT10aGlzLl9vbkRhdGEuZXZlbnQsdGhpcy5fb25Vc2VySW5wdXQ9dGhpcy5yZWdpc3RlcihuZXcgby5FdmVudEVtaXR0ZXIpLHRoaXMub25Vc2VySW5wdXQ9dGhpcy5fb25Vc2VySW5wdXQuZXZlbnQsdGhpcy5fb25CaW5hcnk9dGhpcy5yZWdpc3RlcihuZXcgby5FdmVudEVtaXR0ZXIpLHRoaXMub25CaW5hcnk9dGhpcy5fb25CaW5hcnkuZXZlbnQsdGhpcy5fb25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b209dGhpcy5yZWdpc3RlcihuZXcgby5FdmVudEVtaXR0ZXIpLHRoaXMub25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b209dGhpcy5fb25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b20uZXZlbnQsdGhpcy5tb2Rlcz0oMCxuLmNsb25lKShjKSx0aGlzLmRlY1ByaXZhdGVNb2Rlcz0oMCxuLmNsb25lKShsKX1yZXNldCgpe3RoaXMubW9kZXM9KDAsbi5jbG9uZSkoYyksdGhpcy5kZWNQcml2YXRlTW9kZXM9KDAsbi5jbG9uZSkobCl9dHJpZ2dlckRhdGFFdmVudChlLHQ9ITEpe2lmKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZGlzYWJsZVN0ZGluKXJldHVybjtjb25zdCBpPXRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO3QmJnRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuc2Nyb2xsT25Vc2VySW5wdXQmJmkueWJhc2UhPT1pLnlkaXNwJiZ0aGlzLl9vblJlcXVlc3RTY3JvbGxUb0JvdHRvbS5maXJlKCksdCYmdGhpcy5fb25Vc2VySW5wdXQuZmlyZSgpLHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoYHNlbmRpbmcgZGF0YSBcIiR7ZX1cImAsKCgpPT5lLnNwbGl0KFwiXCIpLm1hcCgoZT0+ZS5jaGFyQ29kZUF0KDApKSkpKSx0aGlzLl9vbkRhdGEuZmlyZShlKX10cmlnZ2VyQmluYXJ5RXZlbnQoZSl7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5kaXNhYmxlU3RkaW58fCh0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKGBzZW5kaW5nIGJpbmFyeSBcIiR7ZX1cImAsKCgpPT5lLnNwbGl0KFwiXCIpLm1hcCgoZT0+ZS5jaGFyQ29kZUF0KDApKSkpKSx0aGlzLl9vbkJpbmFyeS5maXJlKGUpKX19O3QuQ29yZVNlcnZpY2U9ZD1zKFtyKDAsaC5JQnVmZmVyU2VydmljZSkscigxLGguSUxvZ1NlcnZpY2UpLHIoMixoLklPcHRpb25zU2VydmljZSldLGQpfSw5MDc0OihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LkRlY29yYXRpb25TZXJ2aWNlPXZvaWQgMDtjb25zdCBzPWkoODA1NSkscj1pKDg0NjApLG49aSg4NDQpLG89aSg2MTA2KTtsZXQgYT0wLGg9MDtjbGFzcyBjIGV4dGVuZHMgbi5EaXNwb3NhYmxle2dldCBkZWNvcmF0aW9ucygpe3JldHVybiB0aGlzLl9kZWNvcmF0aW9ucy52YWx1ZXMoKX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5fZGVjb3JhdGlvbnM9bmV3IG8uU29ydGVkTGlzdCgoZT0+ZT8ubWFya2VyLmxpbmUpKSx0aGlzLl9vbkRlY29yYXRpb25SZWdpc3RlcmVkPXRoaXMucmVnaXN0ZXIobmV3IHIuRXZlbnRFbWl0dGVyKSx0aGlzLm9uRGVjb3JhdGlvblJlZ2lzdGVyZWQ9dGhpcy5fb25EZWNvcmF0aW9uUmVnaXN0ZXJlZC5ldmVudCx0aGlzLl9vbkRlY29yYXRpb25SZW1vdmVkPXRoaXMucmVnaXN0ZXIobmV3IHIuRXZlbnRFbWl0dGVyKSx0aGlzLm9uRGVjb3JhdGlvblJlbW92ZWQ9dGhpcy5fb25EZWNvcmF0aW9uUmVtb3ZlZC5ldmVudCx0aGlzLnJlZ2lzdGVyKCgwLG4udG9EaXNwb3NhYmxlKSgoKCk9PnRoaXMucmVzZXQoKSkpKX1yZWdpc3RlckRlY29yYXRpb24oZSl7aWYoZS5tYXJrZXIuaXNEaXNwb3NlZClyZXR1cm47Y29uc3QgdD1uZXcgbChlKTtpZih0KXtjb25zdCBlPXQubWFya2VyLm9uRGlzcG9zZSgoKCk9PnQuZGlzcG9zZSgpKSk7dC5vbkRpc3Bvc2UoKCgpPT57dCYmKHRoaXMuX2RlY29yYXRpb25zLmRlbGV0ZSh0KSYmdGhpcy5fb25EZWNvcmF0aW9uUmVtb3ZlZC5maXJlKHQpLGUuZGlzcG9zZSgpKX0pKSx0aGlzLl9kZWNvcmF0aW9ucy5pbnNlcnQodCksdGhpcy5fb25EZWNvcmF0aW9uUmVnaXN0ZXJlZC5maXJlKHQpfXJldHVybiB0fXJlc2V0KCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5fZGVjb3JhdGlvbnMudmFsdWVzKCkpZS5kaXNwb3NlKCk7dGhpcy5fZGVjb3JhdGlvbnMuY2xlYXIoKX0qZ2V0RGVjb3JhdGlvbnNBdENlbGwoZSx0LGkpe2xldCBzPTAscj0wO2Zvcihjb25zdCBuIG9mIHRoaXMuX2RlY29yYXRpb25zLmdldEtleUl0ZXJhdG9yKHQpKXM9bi5vcHRpb25zLng/PzAscj1zKyhuLm9wdGlvbnMud2lkdGg/PzEpLGU+PXMmJmU8ciYmKCFpfHwobi5vcHRpb25zLmxheWVyPz9cImJvdHRvbVwiKT09PWkpJiYoeWllbGQgbil9Zm9yRWFjaERlY29yYXRpb25BdENlbGwoZSx0LGkscyl7dGhpcy5fZGVjb3JhdGlvbnMuZm9yRWFjaEJ5S2V5KHQsKHQ9PnthPXQub3B0aW9ucy54Pz8wLGg9YSsodC5vcHRpb25zLndpZHRoPz8xKSxlPj1hJiZlPGgmJighaXx8KHQub3B0aW9ucy5sYXllcj8/XCJib3R0b21cIik9PT1pKSYmcyh0KX0pKX19dC5EZWNvcmF0aW9uU2VydmljZT1jO2NsYXNzIGwgZXh0ZW5kcyBuLkRpc3Bvc2FibGV7Z2V0IGlzRGlzcG9zZWQoKXtyZXR1cm4gdGhpcy5faXNEaXNwb3NlZH1nZXQgYmFja2dyb3VuZENvbG9yUkdCKCl7cmV0dXJuIG51bGw9PT10aGlzLl9jYWNoZWRCZyYmKHRoaXMub3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3I/dGhpcy5fY2FjaGVkQmc9cy5jc3MudG9Db2xvcih0aGlzLm9wdGlvbnMuYmFja2dyb3VuZENvbG9yKTp0aGlzLl9jYWNoZWRCZz12b2lkIDApLHRoaXMuX2NhY2hlZEJnfWdldCBmb3JlZ3JvdW5kQ29sb3JSR0IoKXtyZXR1cm4gbnVsbD09PXRoaXMuX2NhY2hlZEZnJiYodGhpcy5vcHRpb25zLmZvcmVncm91bmRDb2xvcj90aGlzLl9jYWNoZWRGZz1zLmNzcy50b0NvbG9yKHRoaXMub3B0aW9ucy5mb3JlZ3JvdW5kQ29sb3IpOnRoaXMuX2NhY2hlZEZnPXZvaWQgMCksdGhpcy5fY2FjaGVkRmd9Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLm9wdGlvbnM9ZSx0aGlzLm9uUmVuZGVyRW1pdHRlcj10aGlzLnJlZ2lzdGVyKG5ldyByLkV2ZW50RW1pdHRlciksdGhpcy5vblJlbmRlcj10aGlzLm9uUmVuZGVyRW1pdHRlci5ldmVudCx0aGlzLl9vbkRpc3Bvc2U9dGhpcy5yZWdpc3RlcihuZXcgci5FdmVudEVtaXR0ZXIpLHRoaXMub25EaXNwb3NlPXRoaXMuX29uRGlzcG9zZS5ldmVudCx0aGlzLl9jYWNoZWRCZz1udWxsLHRoaXMuX2NhY2hlZEZnPW51bGwsdGhpcy5tYXJrZXI9ZS5tYXJrZXIsdGhpcy5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zJiYhdGhpcy5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLnBvc2l0aW9uJiYodGhpcy5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLnBvc2l0aW9uPVwiZnVsbFwiKX1kaXNwb3NlKCl7dGhpcy5fb25EaXNwb3NlLmZpcmUoKSxzdXBlci5kaXNwb3NlKCl9fX0sNDM0ODooZSx0LGkpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5JbnN0YW50aWF0aW9uU2VydmljZT10LlNlcnZpY2VDb2xsZWN0aW9uPXZvaWQgMDtjb25zdCBzPWkoMjU4NSkscj1pKDgzNDMpO2NsYXNzIG57Y29uc3RydWN0b3IoLi4uZSl7dGhpcy5fZW50cmllcz1uZXcgTWFwO2Zvcihjb25zdFt0LGldb2YgZSl0aGlzLnNldCh0LGkpfXNldChlLHQpe2NvbnN0IGk9dGhpcy5fZW50cmllcy5nZXQoZSk7cmV0dXJuIHRoaXMuX2VudHJpZXMuc2V0KGUsdCksaX1mb3JFYWNoKGUpe2Zvcihjb25zdFt0LGldb2YgdGhpcy5fZW50cmllcy5lbnRyaWVzKCkpZSh0LGkpfWhhcyhlKXtyZXR1cm4gdGhpcy5fZW50cmllcy5oYXMoZSl9Z2V0KGUpe3JldHVybiB0aGlzLl9lbnRyaWVzLmdldChlKX19dC5TZXJ2aWNlQ29sbGVjdGlvbj1uLHQuSW5zdGFudGlhdGlvblNlcnZpY2U9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9zZXJ2aWNlcz1uZXcgbix0aGlzLl9zZXJ2aWNlcy5zZXQocy5JSW5zdGFudGlhdGlvblNlcnZpY2UsdGhpcyl9c2V0U2VydmljZShlLHQpe3RoaXMuX3NlcnZpY2VzLnNldChlLHQpfWdldFNlcnZpY2UoZSl7cmV0dXJuIHRoaXMuX3NlcnZpY2VzLmdldChlKX1jcmVhdGVJbnN0YW5jZShlLC4uLnQpe2NvbnN0IGk9KDAsci5nZXRTZXJ2aWNlRGVwZW5kZW5jaWVzKShlKS5zb3J0KCgoZSx0KT0+ZS5pbmRleC10LmluZGV4KSkscz1bXTtmb3IoY29uc3QgdCBvZiBpKXtjb25zdCBpPXRoaXMuX3NlcnZpY2VzLmdldCh0LmlkKTtpZighaSl0aHJvdyBuZXcgRXJyb3IoYFtjcmVhdGVJbnN0YW5jZV0gJHtlLm5hbWV9IGRlcGVuZHMgb24gVU5LTk9XTiBzZXJ2aWNlICR7dC5pZH0uYCk7cy5wdXNoKGkpfWNvbnN0IG49aS5sZW5ndGg+MD9pWzBdLmluZGV4OnQubGVuZ3RoO2lmKHQubGVuZ3RoIT09bil0aHJvdyBuZXcgRXJyb3IoYFtjcmVhdGVJbnN0YW5jZV0gRmlyc3Qgc2VydmljZSBkZXBlbmRlbmN5IG9mICR7ZS5uYW1lfSBhdCBwb3NpdGlvbiAke24rMX0gY29uZmxpY3RzIHdpdGggJHt0Lmxlbmd0aH0gc3RhdGljIGFyZ3VtZW50c2ApO3JldHVybiBuZXcgZSguLi5bLi4udCwuLi5zXSl9fX0sNzg2NjpmdW5jdGlvbihlLHQsaSl7dmFyIHM9dGhpcyYmdGhpcy5fX2RlY29yYXRlfHxmdW5jdGlvbihlLHQsaSxzKXt2YXIgcixuPWFyZ3VtZW50cy5sZW5ndGgsbz1uPDM/dDpudWxsPT09cz9zPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxpKTpzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBSZWZsZWN0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKW89UmVmbGVjdC5kZWNvcmF0ZShlLHQsaSxzKTtlbHNlIGZvcih2YXIgYT1lLmxlbmd0aC0xO2E+PTA7YS0tKShyPWVbYV0pJiYobz0objwzP3Iobyk6bj4zP3IodCxpLG8pOnIodCxpKSl8fG8pO3JldHVybiBuPjMmJm8mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGksbyksb30scj10aGlzJiZ0aGlzLl9fcGFyYW18fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGkscyl7dChpLHMsZSl9fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LnRyYWNlQ2FsbD10LnNldFRyYWNlTG9nZ2VyPXQuTG9nU2VydmljZT12b2lkIDA7Y29uc3Qgbj1pKDg0NCksbz1pKDI1ODUpLGE9e3RyYWNlOm8uTG9nTGV2ZWxFbnVtLlRSQUNFLGRlYnVnOm8uTG9nTGV2ZWxFbnVtLkRFQlVHLGluZm86by5Mb2dMZXZlbEVudW0uSU5GTyx3YXJuOm8uTG9nTGV2ZWxFbnVtLldBUk4sZXJyb3I6by5Mb2dMZXZlbEVudW0uRVJST1Isb2ZmOm8uTG9nTGV2ZWxFbnVtLk9GRn07bGV0IGgsYz10LkxvZ1NlcnZpY2U9Y2xhc3MgZXh0ZW5kcyBuLkRpc3Bvc2FibGV7Z2V0IGxvZ0xldmVsKCl7cmV0dXJuIHRoaXMuX2xvZ0xldmVsfWNvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5fb3B0aW9uc1NlcnZpY2U9ZSx0aGlzLl9sb2dMZXZlbD1vLkxvZ0xldmVsRW51bS5PRkYsdGhpcy5fdXBkYXRlTG9nTGV2ZWwoKSx0aGlzLnJlZ2lzdGVyKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoXCJsb2dMZXZlbFwiLCgoKT0+dGhpcy5fdXBkYXRlTG9nTGV2ZWwoKSkpKSxoPXRoaXN9X3VwZGF0ZUxvZ0xldmVsKCl7dGhpcy5fbG9nTGV2ZWw9YVt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxvZ0xldmVsXX1fZXZhbExhenlPcHRpb25hbFBhcmFtcyhlKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylcImZ1bmN0aW9uXCI9PXR5cGVvZiBlW3RdJiYoZVt0XT1lW3RdKCkpfV9sb2coZSx0LGkpe3RoaXMuX2V2YWxMYXp5T3B0aW9uYWxQYXJhbXMoaSksZS5jYWxsKGNvbnNvbGUsKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyP1wiXCI6XCJ4dGVybS5qczogXCIpK3QsLi4uaSl9dHJhY2UoZSwuLi50KXt0aGlzLl9sb2dMZXZlbDw9by5Mb2dMZXZlbEVudW0uVFJBQ0UmJnRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8udHJhY2UuYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcik/P2NvbnNvbGUubG9nLGUsdCl9ZGVidWcoZSwuLi50KXt0aGlzLl9sb2dMZXZlbDw9by5Mb2dMZXZlbEVudW0uREVCVUcmJnRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8uZGVidWcuYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcik/P2NvbnNvbGUubG9nLGUsdCl9aW5mbyhlLC4uLnQpe3RoaXMuX2xvZ0xldmVsPD1vLkxvZ0xldmVsRW51bS5JTkZPJiZ0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/LmluZm8uYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcik/P2NvbnNvbGUuaW5mbyxlLHQpfXdhcm4oZSwuLi50KXt0aGlzLl9sb2dMZXZlbDw9by5Mb2dMZXZlbEVudW0uV0FSTiYmdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy53YXJuLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpPz9jb25zb2xlLndhcm4sZSx0KX1lcnJvcihlLC4uLnQpe3RoaXMuX2xvZ0xldmVsPD1vLkxvZ0xldmVsRW51bS5FUlJPUiYmdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy5lcnJvci5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKT8/Y29uc29sZS5lcnJvcixlLHQpfX07dC5Mb2dTZXJ2aWNlPWM9cyhbcigwLG8uSU9wdGlvbnNTZXJ2aWNlKV0sYyksdC5zZXRUcmFjZUxvZ2dlcj1mdW5jdGlvbihlKXtoPWV9LHQudHJhY2VDYWxsPWZ1bmN0aW9uKGUsdCxpKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBpLnZhbHVlKXRocm93IG5ldyBFcnJvcihcIm5vdCBzdXBwb3J0ZWRcIik7Y29uc3Qgcz1pLnZhbHVlO2kudmFsdWU9ZnVuY3Rpb24oLi4uZSl7aWYoaC5sb2dMZXZlbCE9PW8uTG9nTGV2ZWxFbnVtLlRSQUNFKXJldHVybiBzLmFwcGx5KHRoaXMsZSk7aC50cmFjZShgR2x5cGhSZW5kZXJlciMke3MubmFtZX0oJHtlLm1hcCgoZT0+SlNPTi5zdHJpbmdpZnkoZSkpKS5qb2luKFwiLCBcIil9KWApO2NvbnN0IHQ9cy5hcHBseSh0aGlzLGUpO3JldHVybiBoLnRyYWNlKGBHbHlwaFJlbmRlcmVyIyR7cy5uYW1lfSByZXR1cm5gLHQpLHR9fX0sNzMwMjooZSx0LGkpPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5PcHRpb25zU2VydmljZT10LkRFRkFVTFRfT1BUSU9OUz12b2lkIDA7Y29uc3Qgcz1pKDg0NjApLHI9aSg4NDQpLG49aSg2MTE0KTt0LkRFRkFVTFRfT1BUSU9OUz17Y29sczo4MCxyb3dzOjI0LGN1cnNvckJsaW5rOiExLGN1cnNvclN0eWxlOlwiYmxvY2tcIixjdXJzb3JXaWR0aDoxLGN1cnNvckluYWN0aXZlU3R5bGU6XCJvdXRsaW5lXCIsY3VzdG9tR2x5cGhzOiEwLGRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzOiEwLGRvY3VtZW50T3ZlcnJpZGU6bnVsbCxmYXN0U2Nyb2xsTW9kaWZpZXI6XCJhbHRcIixmYXN0U2Nyb2xsU2Vuc2l0aXZpdHk6NSxmb250RmFtaWx5OlwiY291cmllci1uZXcsIGNvdXJpZXIsIG1vbm9zcGFjZVwiLGZvbnRTaXplOjE1LGZvbnRXZWlnaHQ6XCJub3JtYWxcIixmb250V2VpZ2h0Qm9sZDpcImJvbGRcIixpZ25vcmVCcmFja2V0ZWRQYXN0ZU1vZGU6ITEsbGluZUhlaWdodDoxLGxldHRlclNwYWNpbmc6MCxsaW5rSGFuZGxlcjpudWxsLGxvZ0xldmVsOlwiaW5mb1wiLGxvZ2dlcjpudWxsLHNjcm9sbGJhY2s6MWUzLHNjcm9sbE9uVXNlcklucHV0OiEwLHNjcm9sbFNlbnNpdGl2aXR5OjEsc2NyZWVuUmVhZGVyTW9kZTohMSxzbW9vdGhTY3JvbGxEdXJhdGlvbjowLG1hY09wdGlvbklzTWV0YTohMSxtYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbjohMSxtaW5pbXVtQ29udHJhc3RSYXRpbzoxLGRpc2FibGVTdGRpbjohMSxhbGxvd1Byb3Bvc2VkQXBpOiExLGFsbG93VHJhbnNwYXJlbmN5OiExLHRhYlN0b3BXaWR0aDo4LHRoZW1lOnt9LHJlc2NhbGVPdmVybGFwcGluZ0dseXBoczohMSxyaWdodENsaWNrU2VsZWN0c1dvcmQ6bi5pc01hYyx3aW5kb3dPcHRpb25zOnt9LHdpbmRvd3NNb2RlOiExLHdpbmRvd3NQdHk6e30sd29yZFNlcGFyYXRvcjpcIiAoKVtde30nLFxcXCJgXCIsYWx0Q2xpY2tNb3Zlc0N1cnNvcjohMCxjb252ZXJ0RW9sOiExLHRlcm1OYW1lOlwieHRlcm1cIixjYW5jZWxFdmVudHM6ITEsb3ZlcnZpZXdSdWxlcldpZHRoOjB9O2NvbnN0IG89W1wibm9ybWFsXCIsXCJib2xkXCIsXCIxMDBcIixcIjIwMFwiLFwiMzAwXCIsXCI0MDBcIixcIjUwMFwiLFwiNjAwXCIsXCI3MDBcIixcIjgwMFwiLFwiOTAwXCJdO2NsYXNzIGEgZXh0ZW5kcyByLkRpc3Bvc2FibGV7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLl9vbk9wdGlvbkNoYW5nZT10aGlzLnJlZ2lzdGVyKG5ldyBzLkV2ZW50RW1pdHRlciksdGhpcy5vbk9wdGlvbkNoYW5nZT10aGlzLl9vbk9wdGlvbkNoYW5nZS5ldmVudDtjb25zdCBpPXsuLi50LkRFRkFVTFRfT1BUSU9OU307Zm9yKGNvbnN0IHQgaW4gZSlpZih0IGluIGkpdHJ5e2NvbnN0IHM9ZVt0XTtpW3RdPXRoaXMuX3Nhbml0aXplQW5kVmFsaWRhdGVPcHRpb24odCxzKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfXRoaXMucmF3T3B0aW9ucz1pLHRoaXMub3B0aW9ucz17Li4uaX0sdGhpcy5fc2V0dXBPcHRpb25zKCksdGhpcy5yZWdpc3RlcigoMCxyLnRvRGlzcG9zYWJsZSkoKCgpPT57dGhpcy5yYXdPcHRpb25zLmxpbmtIYW5kbGVyPW51bGwsdGhpcy5yYXdPcHRpb25zLmRvY3VtZW50T3ZlcnJpZGU9bnVsbH0pKSl9b25TcGVjaWZpY09wdGlvbkNoYW5nZShlLHQpe3JldHVybiB0aGlzLm9uT3B0aW9uQ2hhbmdlKChpPT57aT09PWUmJnQodGhpcy5yYXdPcHRpb25zW2VdKX0pKX1vbk11bHRpcGxlT3B0aW9uQ2hhbmdlKGUsdCl7cmV0dXJuIHRoaXMub25PcHRpb25DaGFuZ2UoKGk9PnstMSE9PWUuaW5kZXhPZihpKSYmdCgpfSkpfV9zZXR1cE9wdGlvbnMoKXtjb25zdCBlPWU9PntpZighKGUgaW4gdC5ERUZBVUxUX09QVElPTlMpKXRocm93IG5ldyBFcnJvcihgTm8gb3B0aW9uIHdpdGgga2V5IFwiJHtlfVwiYCk7cmV0dXJuIHRoaXMucmF3T3B0aW9uc1tlXX0saT0oZSxpKT0+e2lmKCEoZSBpbiB0LkRFRkFVTFRfT1BUSU9OUykpdGhyb3cgbmV3IEVycm9yKGBObyBvcHRpb24gd2l0aCBrZXkgXCIke2V9XCJgKTtpPXRoaXMuX3Nhbml0aXplQW5kVmFsaWRhdGVPcHRpb24oZSxpKSx0aGlzLnJhd09wdGlvbnNbZV0hPT1pJiYodGhpcy5yYXdPcHRpb25zW2VdPWksdGhpcy5fb25PcHRpb25DaGFuZ2UuZmlyZShlKSl9O2Zvcihjb25zdCB0IGluIHRoaXMucmF3T3B0aW9ucyl7Y29uc3Qgcz17Z2V0OmUuYmluZCh0aGlzLHQpLHNldDppLmJpbmQodGhpcyx0KX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMub3B0aW9ucyx0LHMpfX1fc2FuaXRpemVBbmRWYWxpZGF0ZU9wdGlvbihlLGkpe3N3aXRjaChlKXtjYXNlXCJjdXJzb3JTdHlsZVwiOmlmKGl8fChpPXQuREVGQVVMVF9PUFRJT05TW2VdKSwhZnVuY3Rpb24oZSl7cmV0dXJuXCJibG9ja1wiPT09ZXx8XCJ1bmRlcmxpbmVcIj09PWV8fFwiYmFyXCI9PT1lfShpKSl0aHJvdyBuZXcgRXJyb3IoYFwiJHtpfVwiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciAke2V9YCk7YnJlYWs7Y2FzZVwid29yZFNlcGFyYXRvclwiOml8fChpPXQuREVGQVVMVF9PUFRJT05TW2VdKTticmVhaztjYXNlXCJmb250V2VpZ2h0XCI6Y2FzZVwiZm9udFdlaWdodEJvbGRcIjppZihcIm51bWJlclwiPT10eXBlb2YgaSYmMTw9aSYmaTw9MWUzKWJyZWFrO2k9by5pbmNsdWRlcyhpKT9pOnQuREVGQVVMVF9PUFRJT05TW2VdO2JyZWFrO2Nhc2VcImN1cnNvcldpZHRoXCI6aT1NYXRoLmZsb29yKGkpO2Nhc2VcImxpbmVIZWlnaHRcIjpjYXNlXCJ0YWJTdG9wV2lkdGhcIjppZihpPDEpdGhyb3cgbmV3IEVycm9yKGAke2V9IGNhbm5vdCBiZSBsZXNzIHRoYW4gMSwgdmFsdWU6ICR7aX1gKTticmVhaztjYXNlXCJtaW5pbXVtQ29udHJhc3RSYXRpb1wiOmk9TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxNYXRoLnJvdW5kKDEwKmkpLzEwKSk7YnJlYWs7Y2FzZVwic2Nyb2xsYmFja1wiOmlmKChpPU1hdGgubWluKGksNDI5NDk2NzI5NSkpPDApdGhyb3cgbmV3IEVycm9yKGAke2V9IGNhbm5vdCBiZSBsZXNzIHRoYW4gMCwgdmFsdWU6ICR7aX1gKTticmVhaztjYXNlXCJmYXN0U2Nyb2xsU2Vuc2l0aXZpdHlcIjpjYXNlXCJzY3JvbGxTZW5zaXRpdml0eVwiOmlmKGk8PTApdGhyb3cgbmV3IEVycm9yKGAke2V9IGNhbm5vdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMCwgdmFsdWU6ICR7aX1gKTticmVhaztjYXNlXCJyb3dzXCI6Y2FzZVwiY29sc1wiOmlmKCFpJiYwIT09aSl0aHJvdyBuZXcgRXJyb3IoYCR7ZX0gbXVzdCBiZSBudW1lcmljLCB2YWx1ZTogJHtpfWApO2JyZWFrO2Nhc2VcIndpbmRvd3NQdHlcIjppPWk/P3t9fXJldHVybiBpfX10Lk9wdGlvbnNTZXJ2aWNlPWF9LDI2NjA6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzPXRoaXMmJnRoaXMuX19kZWNvcmF0ZXx8ZnVuY3Rpb24oZSx0LGkscyl7dmFyIHIsbj1hcmd1bWVudHMubGVuZ3RoLG89bjwzP3Q6bnVsbD09PXM/cz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsaSk6cztpZihcIm9iamVjdFwiPT10eXBlb2YgUmVmbGVjdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlvPVJlZmxlY3QuZGVjb3JhdGUoZSx0LGkscyk7ZWxzZSBmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSkocj1lW2FdKSYmKG89KG48Mz9yKG8pOm4+Mz9yKHQsaSxvKTpyKHQsaSkpfHxvKTtyZXR1cm4gbj4zJiZvJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLG8pLG99LHI9dGhpcyYmdGhpcy5fX3BhcmFtfHxmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihpLHMpe3QoaSxzLGUpfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSksdC5Pc2NMaW5rU2VydmljZT12b2lkIDA7Y29uc3Qgbj1pKDI1ODUpO2xldCBvPXQuT3NjTGlua1NlcnZpY2U9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fYnVmZmVyU2VydmljZT1lLHRoaXMuX25leHRJZD0xLHRoaXMuX2VudHJpZXNXaXRoSWQ9bmV3IE1hcCx0aGlzLl9kYXRhQnlMaW5rSWQ9bmV3IE1hcH1yZWdpc3RlckxpbmsoZSl7Y29uc3QgdD10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcjtpZih2b2lkIDA9PT1lLmlkKXtjb25zdCBpPXQuYWRkTWFya2VyKHQueWJhc2UrdC55KSxzPXtkYXRhOmUsaWQ6dGhpcy5fbmV4dElkKyssbGluZXM6W2ldfTtyZXR1cm4gaS5vbkRpc3Bvc2UoKCgpPT50aGlzLl9yZW1vdmVNYXJrZXJGcm9tTGluayhzLGkpKSksdGhpcy5fZGF0YUJ5TGlua0lkLnNldChzLmlkLHMpLHMuaWR9Y29uc3QgaT1lLHM9dGhpcy5fZ2V0RW50cnlJZEtleShpKSxyPXRoaXMuX2VudHJpZXNXaXRoSWQuZ2V0KHMpO2lmKHIpcmV0dXJuIHRoaXMuYWRkTGluZVRvTGluayhyLmlkLHQueWJhc2UrdC55KSxyLmlkO2NvbnN0IG49dC5hZGRNYXJrZXIodC55YmFzZSt0LnkpLG89e2lkOnRoaXMuX25leHRJZCsrLGtleTp0aGlzLl9nZXRFbnRyeUlkS2V5KGkpLGRhdGE6aSxsaW5lczpbbl19O3JldHVybiBuLm9uRGlzcG9zZSgoKCk9PnRoaXMuX3JlbW92ZU1hcmtlckZyb21MaW5rKG8sbikpKSx0aGlzLl9lbnRyaWVzV2l0aElkLnNldChvLmtleSxvKSx0aGlzLl9kYXRhQnlMaW5rSWQuc2V0KG8uaWQsbyksby5pZH1hZGRMaW5lVG9MaW5rKGUsdCl7Y29uc3QgaT10aGlzLl9kYXRhQnlMaW5rSWQuZ2V0KGUpO2lmKGkmJmkubGluZXMuZXZlcnkoKGU9PmUubGluZSE9PXQpKSl7Y29uc3QgZT10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5hZGRNYXJrZXIodCk7aS5saW5lcy5wdXNoKGUpLGUub25EaXNwb3NlKCgoKT0+dGhpcy5fcmVtb3ZlTWFya2VyRnJvbUxpbmsoaSxlKSkpfX1nZXRMaW5rRGF0YShlKXtyZXR1cm4gdGhpcy5fZGF0YUJ5TGlua0lkLmdldChlKT8uZGF0YX1fZ2V0RW50cnlJZEtleShlKXtyZXR1cm5gJHtlLmlkfTs7JHtlLnVyaX1gfV9yZW1vdmVNYXJrZXJGcm9tTGluayhlLHQpe2NvbnN0IGk9ZS5saW5lcy5pbmRleE9mKHQpOy0xIT09aSYmKGUubGluZXMuc3BsaWNlKGksMSksMD09PWUubGluZXMubGVuZ3RoJiYodm9pZCAwIT09ZS5kYXRhLmlkJiZ0aGlzLl9lbnRyaWVzV2l0aElkLmRlbGV0ZShlLmtleSksdGhpcy5fZGF0YUJ5TGlua0lkLmRlbGV0ZShlLmlkKSkpfX07dC5Pc2NMaW5rU2VydmljZT1vPXMoW3IoMCxuLklCdWZmZXJTZXJ2aWNlKV0sbyl9LDgzNDM6KGUsdCk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LmNyZWF0ZURlY29yYXRvcj10LmdldFNlcnZpY2VEZXBlbmRlbmNpZXM9dC5zZXJ2aWNlUmVnaXN0cnk9dm9pZCAwO2NvbnN0IGk9XCJkaSR0YXJnZXRcIixzPVwiZGkkZGVwZW5kZW5jaWVzXCI7dC5zZXJ2aWNlUmVnaXN0cnk9bmV3IE1hcCx0LmdldFNlcnZpY2VEZXBlbmRlbmNpZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGVbc118fFtdfSx0LmNyZWF0ZURlY29yYXRvcj1mdW5jdGlvbihlKXtpZih0LnNlcnZpY2VSZWdpc3RyeS5oYXMoZSkpcmV0dXJuIHQuc2VydmljZVJlZ2lzdHJ5LmdldChlKTtjb25zdCByPWZ1bmN0aW9uKGUsdCxuKXtpZigzIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJASVNlcnZpY2VOYW1lLWRlY29yYXRvciBjYW4gb25seSBiZSB1c2VkIHRvIGRlY29yYXRlIGEgcGFyYW1ldGVyXCIpOyFmdW5jdGlvbihlLHQscil7dFtpXT09PXQ/dFtzXS5wdXNoKHtpZDplLGluZGV4OnJ9KToodFtzXT1be2lkOmUsaW5kZXg6cn1dLHRbaV09dCl9KHIsZSxuKX07cmV0dXJuIHIudG9TdHJpbmc9KCk9PmUsdC5zZXJ2aWNlUmVnaXN0cnkuc2V0KGUscikscn19LDI1ODU6KGUsdCxpKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLHQuSURlY29yYXRpb25TZXJ2aWNlPXQuSVVuaWNvZGVTZXJ2aWNlPXQuSU9zY0xpbmtTZXJ2aWNlPXQuSU9wdGlvbnNTZXJ2aWNlPXQuSUxvZ1NlcnZpY2U9dC5Mb2dMZXZlbEVudW09dC5JSW5zdGFudGlhdGlvblNlcnZpY2U9dC5JQ2hhcnNldFNlcnZpY2U9dC5JQ29yZVNlcnZpY2U9dC5JQ29yZU1vdXNlU2VydmljZT10LklCdWZmZXJTZXJ2aWNlPXZvaWQgMDtjb25zdCBzPWkoODM0Myk7dmFyIHI7dC5JQnVmZmVyU2VydmljZT0oMCxzLmNyZWF0ZURlY29yYXRvcikoXCJCdWZmZXJTZXJ2aWNlXCIpLHQuSUNvcmVNb3VzZVNlcnZpY2U9KDAscy5jcmVhdGVEZWNvcmF0b3IpKFwiQ29yZU1vdXNlU2VydmljZVwiKSx0LklDb3JlU2VydmljZT0oMCxzLmNyZWF0ZURlY29yYXRvcikoXCJDb3JlU2VydmljZVwiKSx0LklDaGFyc2V0U2VydmljZT0oMCxzLmNyZWF0ZURlY29yYXRvcikoXCJDaGFyc2V0U2VydmljZVwiKSx0LklJbnN0YW50aWF0aW9uU2VydmljZT0oMCxzLmNyZWF0ZURlY29yYXRvcikoXCJJbnN0YW50aWF0aW9uU2VydmljZVwiKSxmdW5jdGlvbihlKXtlW2UuVFJBQ0U9MF09XCJUUkFDRVwiLGVbZS5ERUJVRz0xXT1cIkRFQlVHXCIsZVtlLklORk89Ml09XCJJTkZPXCIsZVtlLldBUk49M109XCJXQVJOXCIsZVtlLkVSUk9SPTRdPVwiRVJST1JcIixlW2UuT0ZGPTVdPVwiT0ZGXCJ9KHJ8fCh0LkxvZ0xldmVsRW51bT1yPXt9KSksdC5JTG9nU2VydmljZT0oMCxzLmNyZWF0ZURlY29yYXRvcikoXCJMb2dTZXJ2aWNlXCIpLHQuSU9wdGlvbnNTZXJ2aWNlPSgwLHMuY3JlYXRlRGVjb3JhdG9yKShcIk9wdGlvbnNTZXJ2aWNlXCIpLHQuSU9zY0xpbmtTZXJ2aWNlPSgwLHMuY3JlYXRlRGVjb3JhdG9yKShcIk9zY0xpbmtTZXJ2aWNlXCIpLHQuSVVuaWNvZGVTZXJ2aWNlPSgwLHMuY3JlYXRlRGVjb3JhdG9yKShcIlVuaWNvZGVTZXJ2aWNlXCIpLHQuSURlY29yYXRpb25TZXJ2aWNlPSgwLHMuY3JlYXRlRGVjb3JhdG9yKShcIkRlY29yYXRpb25TZXJ2aWNlXCIpfSwxNDgwOihlLHQsaSk9PntPYmplY3QuZGVmaW5lUHJvcGVydHkodCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSx0LlVuaWNvZGVTZXJ2aWNlPXZvaWQgMDtjb25zdCBzPWkoODQ2MCkscj1pKDIyNSk7Y2xhc3MgbntzdGF0aWMgZXh0cmFjdFNob3VsZEpvaW4oZSl7cmV0dXJuIDAhPSgxJmUpfXN0YXRpYyBleHRyYWN0V2lkdGgoZSl7cmV0dXJuIGU+PjEmM31zdGF0aWMgZXh0cmFjdENoYXJLaW5kKGUpe3JldHVybiBlPj4zfXN0YXRpYyBjcmVhdGVQcm9wZXJ0eVZhbHVlKGUsdCxpPSExKXtyZXR1cm4oMTY3NzcyMTUmZSk8PDN8KDMmdCk8PDF8KGk/MTowKX1jb25zdHJ1Y3Rvcigpe3RoaXMuX3Byb3ZpZGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2FjdGl2ZT1cIlwiLHRoaXMuX29uQ2hhbmdlPW5ldyBzLkV2ZW50RW1pdHRlcix0aGlzLm9uQ2hhbmdlPXRoaXMuX29uQ2hhbmdlLmV2ZW50O2NvbnN0IGU9bmV3IHIuVW5pY29kZVY2O3RoaXMucmVnaXN0ZXIoZSksdGhpcy5fYWN0aXZlPWUudmVyc2lvbix0aGlzLl9hY3RpdmVQcm92aWRlcj1lfWRpc3Bvc2UoKXt0aGlzLl9vbkNoYW5nZS5kaXNwb3NlKCl9Z2V0IHZlcnNpb25zKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3Byb3ZpZGVycyl9Z2V0IGFjdGl2ZVZlcnNpb24oKXtyZXR1cm4gdGhpcy5fYWN0aXZlfXNldCBhY3RpdmVWZXJzaW9uKGUpe2lmKCF0aGlzLl9wcm92aWRlcnNbZV0pdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIFVuaWNvZGUgdmVyc2lvbiBcIiR7ZX1cImApO3RoaXMuX2FjdGl2ZT1lLHRoaXMuX2FjdGl2ZVByb3ZpZGVyPXRoaXMuX3Byb3ZpZGVyc1tlXSx0aGlzLl9vbkNoYW5nZS5maXJlKGUpfXJlZ2lzdGVyKGUpe3RoaXMuX3Byb3ZpZGVyc1tlLnZlcnNpb25dPWV9d2N3aWR0aChlKXtyZXR1cm4gdGhpcy5fYWN0aXZlUHJvdmlkZXIud2N3aWR0aChlKX1nZXRTdHJpbmdDZWxsV2lkdGgoZSl7bGV0IHQ9MCxpPTA7Y29uc3Qgcz1lLmxlbmd0aDtmb3IobGV0IHI9MDtyPHM7KytyKXtsZXQgbz1lLmNoYXJDb2RlQXQocik7aWYoNTUyOTY8PW8mJm88PTU2MzE5KXtpZigrK3I+PXMpcmV0dXJuIHQrdGhpcy53Y3dpZHRoKG8pO2NvbnN0IGk9ZS5jaGFyQ29kZUF0KHIpOzU2MzIwPD1pJiZpPD01NzM0Mz9vPTEwMjQqKG8tNTUyOTYpK2ktNTYzMjArNjU1MzY6dCs9dGhpcy53Y3dpZHRoKGkpfWNvbnN0IGE9dGhpcy5jaGFyUHJvcGVydGllcyhvLGkpO2xldCBoPW4uZXh0cmFjdFdpZHRoKGEpO24uZXh0cmFjdFNob3VsZEpvaW4oYSkmJihoLT1uLmV4dHJhY3RXaWR0aChpKSksdCs9aCxpPWF9cmV0dXJuIHR9Y2hhclByb3BlcnRpZXMoZSx0KXtyZXR1cm4gdGhpcy5fYWN0aXZlUHJvdmlkZXIuY2hhclByb3BlcnRpZXMoZSx0KX19dC5Vbmljb2RlU2VydmljZT1ufX0sdD17fTtmdW5jdGlvbiBpKHMpe3ZhciByPXRbc107aWYodm9pZCAwIT09cilyZXR1cm4gci5leHBvcnRzO3ZhciBuPXRbc109e2V4cG9ydHM6e319O3JldHVybiBlW3NdLmNhbGwobi5leHBvcnRzLG4sbi5leHBvcnRzLGkpLG4uZXhwb3J0c312YXIgcz17fTtyZXR1cm4oKCk9Pnt2YXIgZT1zO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUuVGVybWluYWw9dm9pZCAwO2NvbnN0IHQ9aSg5MDQyKSxyPWkoMzIzNiksbj1pKDg0NCksbz1pKDU3NDEpLGE9aSg4Mjg1KSxoPWkoNzk3NSksYz1pKDcwOTApLGw9W1wiY29sc1wiLFwicm93c1wiXTtjbGFzcyBkIGV4dGVuZHMgbi5EaXNwb3NhYmxle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5fY29yZT10aGlzLnJlZ2lzdGVyKG5ldyByLlRlcm1pbmFsKGUpKSx0aGlzLl9hZGRvbk1hbmFnZXI9dGhpcy5yZWdpc3RlcihuZXcgby5BZGRvbk1hbmFnZXIpLHRoaXMuX3B1YmxpY09wdGlvbnM9ey4uLnRoaXMuX2NvcmUub3B0aW9uc307Y29uc3QgdD1lPT50aGlzLl9jb3JlLm9wdGlvbnNbZV0saT0oZSx0KT0+e3RoaXMuX2NoZWNrUmVhZG9ubHlPcHRpb25zKGUpLHRoaXMuX2NvcmUub3B0aW9uc1tlXT10fTtmb3IoY29uc3QgZSBpbiB0aGlzLl9jb3JlLm9wdGlvbnMpe2NvbnN0IHM9e2dldDp0LmJpbmQodGhpcyxlKSxzZXQ6aS5iaW5kKHRoaXMsZSl9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLl9wdWJsaWNPcHRpb25zLGUscyl9fV9jaGVja1JlYWRvbmx5T3B0aW9ucyhlKXtpZihsLmluY2x1ZGVzKGUpKXRocm93IG5ldyBFcnJvcihgT3B0aW9uIFwiJHtlfVwiIGNhbiBvbmx5IGJlIHNldCBpbiB0aGUgY29uc3RydWN0b3JgKX1fY2hlY2tQcm9wb3NlZEFwaSgpe2lmKCF0aGlzLl9jb3JlLm9wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuYWxsb3dQcm9wb3NlZEFwaSl0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBzZXQgdGhlIGFsbG93UHJvcG9zZWRBcGkgb3B0aW9uIHRvIHRydWUgdG8gdXNlIHByb3Bvc2VkIEFQSVwiKX1nZXQgb25CZWxsKCl7cmV0dXJuIHRoaXMuX2NvcmUub25CZWxsfWdldCBvbkJpbmFyeSgpe3JldHVybiB0aGlzLl9jb3JlLm9uQmluYXJ5fWdldCBvbkN1cnNvck1vdmUoKXtyZXR1cm4gdGhpcy5fY29yZS5vbkN1cnNvck1vdmV9Z2V0IG9uRGF0YSgpe3JldHVybiB0aGlzLl9jb3JlLm9uRGF0YX1nZXQgb25LZXkoKXtyZXR1cm4gdGhpcy5fY29yZS5vbktleX1nZXQgb25MaW5lRmVlZCgpe3JldHVybiB0aGlzLl9jb3JlLm9uTGluZUZlZWR9Z2V0IG9uUmVuZGVyKCl7cmV0dXJuIHRoaXMuX2NvcmUub25SZW5kZXJ9Z2V0IG9uUmVzaXplKCl7cmV0dXJuIHRoaXMuX2NvcmUub25SZXNpemV9Z2V0IG9uU2Nyb2xsKCl7cmV0dXJuIHRoaXMuX2NvcmUub25TY3JvbGx9Z2V0IG9uU2VsZWN0aW9uQ2hhbmdlKCl7cmV0dXJuIHRoaXMuX2NvcmUub25TZWxlY3Rpb25DaGFuZ2V9Z2V0IG9uVGl0bGVDaGFuZ2UoKXtyZXR1cm4gdGhpcy5fY29yZS5vblRpdGxlQ2hhbmdlfWdldCBvbldyaXRlUGFyc2VkKCl7cmV0dXJuIHRoaXMuX2NvcmUub25Xcml0ZVBhcnNlZH1nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9jb3JlLmVsZW1lbnR9Z2V0IHBhcnNlcigpe3JldHVybiB0aGlzLl9wYXJzZXJ8fCh0aGlzLl9wYXJzZXI9bmV3IGguUGFyc2VyQXBpKHRoaXMuX2NvcmUpKSx0aGlzLl9wYXJzZXJ9Z2V0IHVuaWNvZGUoKXtyZXR1cm4gdGhpcy5fY2hlY2tQcm9wb3NlZEFwaSgpLG5ldyBjLlVuaWNvZGVBcGkodGhpcy5fY29yZSl9Z2V0IHRleHRhcmVhKCl7cmV0dXJuIHRoaXMuX2NvcmUudGV4dGFyZWF9Z2V0IHJvd3MoKXtyZXR1cm4gdGhpcy5fY29yZS5yb3dzfWdldCBjb2xzKCl7cmV0dXJuIHRoaXMuX2NvcmUuY29sc31nZXQgYnVmZmVyKCl7cmV0dXJuIHRoaXMuX2J1ZmZlcnx8KHRoaXMuX2J1ZmZlcj10aGlzLnJlZ2lzdGVyKG5ldyBhLkJ1ZmZlck5hbWVzcGFjZUFwaSh0aGlzLl9jb3JlKSkpLHRoaXMuX2J1ZmZlcn1nZXQgbWFya2Vycygpe3JldHVybiB0aGlzLl9jaGVja1Byb3Bvc2VkQXBpKCksdGhpcy5fY29yZS5tYXJrZXJzfWdldCBtb2Rlcygpe2NvbnN0IGU9dGhpcy5fY29yZS5jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXM7bGV0IHQ9XCJub25lXCI7c3dpdGNoKHRoaXMuX2NvcmUuY29yZU1vdXNlU2VydmljZS5hY3RpdmVQcm90b2NvbCl7Y2FzZVwiWDEwXCI6dD1cIngxMFwiO2JyZWFrO2Nhc2VcIlZUMjAwXCI6dD1cInZ0MjAwXCI7YnJlYWs7Y2FzZVwiRFJBR1wiOnQ9XCJkcmFnXCI7YnJlYWs7Y2FzZVwiQU5ZXCI6dD1cImFueVwifXJldHVybnthcHBsaWNhdGlvbkN1cnNvcktleXNNb2RlOmUuYXBwbGljYXRpb25DdXJzb3JLZXlzLGFwcGxpY2F0aW9uS2V5cGFkTW9kZTplLmFwcGxpY2F0aW9uS2V5cGFkLGJyYWNrZXRlZFBhc3RlTW9kZTplLmJyYWNrZXRlZFBhc3RlTW9kZSxpbnNlcnRNb2RlOnRoaXMuX2NvcmUuY29yZVNlcnZpY2UubW9kZXMuaW5zZXJ0TW9kZSxtb3VzZVRyYWNraW5nTW9kZTp0LG9yaWdpbk1vZGU6ZS5vcmlnaW4scmV2ZXJzZVdyYXBhcm91bmRNb2RlOmUucmV2ZXJzZVdyYXBhcm91bmQsc2VuZEZvY3VzTW9kZTplLnNlbmRGb2N1cyx3cmFwYXJvdW5kTW9kZTplLndyYXBhcm91bmR9fWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX3B1YmxpY09wdGlvbnN9c2V0IG9wdGlvbnMoZSl7Zm9yKGNvbnN0IHQgaW4gZSl0aGlzLl9wdWJsaWNPcHRpb25zW3RdPWVbdF19Ymx1cigpe3RoaXMuX2NvcmUuYmx1cigpfWZvY3VzKCl7dGhpcy5fY29yZS5mb2N1cygpfWlucHV0KGUsdD0hMCl7dGhpcy5fY29yZS5pbnB1dChlLHQpfXJlc2l6ZShlLHQpe3RoaXMuX3ZlcmlmeUludGVnZXJzKGUsdCksdGhpcy5fY29yZS5yZXNpemUoZSx0KX1vcGVuKGUpe3RoaXMuX2NvcmUub3BlbihlKX1hdHRhY2hDdXN0b21LZXlFdmVudEhhbmRsZXIoZSl7dGhpcy5fY29yZS5hdHRhY2hDdXN0b21LZXlFdmVudEhhbmRsZXIoZSl9YXR0YWNoQ3VzdG9tV2hlZWxFdmVudEhhbmRsZXIoZSl7dGhpcy5fY29yZS5hdHRhY2hDdXN0b21XaGVlbEV2ZW50SGFuZGxlcihlKX1yZWdpc3RlckxpbmtQcm92aWRlcihlKXtyZXR1cm4gdGhpcy5fY29yZS5yZWdpc3RlckxpbmtQcm92aWRlcihlKX1yZWdpc3RlckNoYXJhY3RlckpvaW5lcihlKXtyZXR1cm4gdGhpcy5fY2hlY2tQcm9wb3NlZEFwaSgpLHRoaXMuX2NvcmUucmVnaXN0ZXJDaGFyYWN0ZXJKb2luZXIoZSl9ZGVyZWdpc3RlckNoYXJhY3RlckpvaW5lcihlKXt0aGlzLl9jaGVja1Byb3Bvc2VkQXBpKCksdGhpcy5fY29yZS5kZXJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyKGUpfXJlZ2lzdGVyTWFya2VyKGU9MCl7cmV0dXJuIHRoaXMuX3ZlcmlmeUludGVnZXJzKGUpLHRoaXMuX2NvcmUucmVnaXN0ZXJNYXJrZXIoZSl9cmVnaXN0ZXJEZWNvcmF0aW9uKGUpe3JldHVybiB0aGlzLl9jaGVja1Byb3Bvc2VkQXBpKCksdGhpcy5fdmVyaWZ5UG9zaXRpdmVJbnRlZ2VycyhlLng/PzAsZS53aWR0aD8/MCxlLmhlaWdodD8/MCksdGhpcy5fY29yZS5yZWdpc3RlckRlY29yYXRpb24oZSl9aGFzU2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvcmUuaGFzU2VsZWN0aW9uKCl9c2VsZWN0KGUsdCxpKXt0aGlzLl92ZXJpZnlJbnRlZ2VycyhlLHQsaSksdGhpcy5fY29yZS5zZWxlY3QoZSx0LGkpfWdldFNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9jb3JlLmdldFNlbGVjdGlvbigpfWdldFNlbGVjdGlvblBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX2NvcmUuZ2V0U2VsZWN0aW9uUG9zaXRpb24oKX1jbGVhclNlbGVjdGlvbigpe3RoaXMuX2NvcmUuY2xlYXJTZWxlY3Rpb24oKX1zZWxlY3RBbGwoKXt0aGlzLl9jb3JlLnNlbGVjdEFsbCgpfXNlbGVjdExpbmVzKGUsdCl7dGhpcy5fdmVyaWZ5SW50ZWdlcnMoZSx0KSx0aGlzLl9jb3JlLnNlbGVjdExpbmVzKGUsdCl9ZGlzcG9zZSgpe3N1cGVyLmRpc3Bvc2UoKX1zY3JvbGxMaW5lcyhlKXt0aGlzLl92ZXJpZnlJbnRlZ2VycyhlKSx0aGlzLl9jb3JlLnNjcm9sbExpbmVzKGUpfXNjcm9sbFBhZ2VzKGUpe3RoaXMuX3ZlcmlmeUludGVnZXJzKGUpLHRoaXMuX2NvcmUuc2Nyb2xsUGFnZXMoZSl9c2Nyb2xsVG9Ub3AoKXt0aGlzLl9jb3JlLnNjcm9sbFRvVG9wKCl9c2Nyb2xsVG9Cb3R0b20oKXt0aGlzLl9jb3JlLnNjcm9sbFRvQm90dG9tKCl9c2Nyb2xsVG9MaW5lKGUpe3RoaXMuX3ZlcmlmeUludGVnZXJzKGUpLHRoaXMuX2NvcmUuc2Nyb2xsVG9MaW5lKGUpfWNsZWFyKCl7dGhpcy5fY29yZS5jbGVhcigpfXdyaXRlKGUsdCl7dGhpcy5fY29yZS53cml0ZShlLHQpfXdyaXRlbG4oZSx0KXt0aGlzLl9jb3JlLndyaXRlKGUpLHRoaXMuX2NvcmUud3JpdGUoXCJcXHJcXG5cIix0KX1wYXN0ZShlKXt0aGlzLl9jb3JlLnBhc3RlKGUpfXJlZnJlc2goZSx0KXt0aGlzLl92ZXJpZnlJbnRlZ2VycyhlLHQpLHRoaXMuX2NvcmUucmVmcmVzaChlLHQpfXJlc2V0KCl7dGhpcy5fY29yZS5yZXNldCgpfWNsZWFyVGV4dHVyZUF0bGFzKCl7dGhpcy5fY29yZS5jbGVhclRleHR1cmVBdGxhcygpfWxvYWRBZGRvbihlKXt0aGlzLl9hZGRvbk1hbmFnZXIubG9hZEFkZG9uKHRoaXMsZSl9c3RhdGljIGdldCBzdHJpbmdzKCl7cmV0dXJuIHR9X3ZlcmlmeUludGVnZXJzKC4uLmUpe2Zvcihjb25zdCB0IG9mIGUpaWYodD09PTEvMHx8aXNOYU4odCl8fHQlMSE9MCl0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIEFQSSBvbmx5IGFjY2VwdHMgaW50ZWdlcnNcIil9X3ZlcmlmeVBvc2l0aXZlSW50ZWdlcnMoLi4uZSl7Zm9yKGNvbnN0IHQgb2YgZSlpZih0JiYodD09PTEvMHx8aXNOYU4odCl8fHQlMSE9MHx8dDwwKSl0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIEFQSSBvbmx5IGFjY2VwdHMgcG9zaXRpdmUgaW50ZWdlcnNcIil9fWUuVGVybWluYWw9ZH0pKCksc30pKCkpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXh0ZXJtLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///856\n\n}"); /***/ }), /***/ 985: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("{/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ $x: () => (/* binding */ executeJq)\n/* harmony export */ });\n/* unused harmony exports getJqHelp, processJqExpression, evaluateJqExpression, processDotExpression, processPipeExpression, isJqFunction, processJqFunction, processMathExpression, processComparisonExpression, processLogicalExpression, evaluateJavaScriptExpression */\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, _regeneratorDefine2(e, r, n, t); }\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _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.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\nfunction _createForOfIteratorHelper(r, e) { var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && \"number\" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, 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 o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t[\"return\"] || t[\"return\"](); } finally { if (u) throw o; } } }; }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n/**\n * Утилиты для работы с JSON (jq)\n */\n/**\n * Выполняет команду jq\n * @param args - аргументы команды jq\n * @returns результат выполнения\n */\nfunction executeJq(_x) {\n return _executeJq.apply(this, arguments);\n}\n/**\n * Возвращает справку по команде jq\n * @returns справка\n */\nfunction _executeJq() {\n _executeJq = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(args) {\n var commandLine, parts, expression, objectInput, lastValidJsonIndex, i, _object, object, result, _t, _t2, _t3, _t4;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n _context.p = 0;\n // Если args начинается с 'jq', убираем это\n commandLine = args;\n if (commandLine.startsWith('jq')) {\n commandLine = commandLine.substring(2).trim();\n }\n // Парсим аргументы\n parts = commandLine.trim().split(/\\s+/);\n if (!(parts.length === 0 || parts[0] === '')) {\n _context.n = 1;\n break;\n }\n return _context.a(2, getJqHelp());\n case 1:\n expression = '.';\n objectInput = ''; // Ищем последний валидный JSON объект в аргументах\n lastValidJsonIndex = -1;\n i = parts.length - 1;\n case 2:\n if (!(i >= 0)) {\n _context.n = 6;\n break;\n }\n _context.p = 3;\n JSON.parse(parts[i]);\n lastValidJsonIndex = i;\n return _context.a(3, 6);\n case 4:\n _context.p = 4;\n _t = _context.v;\n case 5:\n i--;\n _context.n = 2;\n break;\n case 6:\n if (!(lastValidJsonIndex === -1)) {\n _context.n = 9;\n break;\n }\n _context.p = 7;\n _object = eval(commandLine);\n return _context.a(2, processJqExpression('.', _object));\n case 8:\n _context.p = 8;\n _t2 = _context.v;\n return _context.a(2, \"Error: Could not parse input as JSON or JavaScript expression.\\nEval error: \".concat(_t2.message));\n case 9:\n // Разделяем на выражение и объект\n if (lastValidJsonIndex === 0) {\n // Только объект\n objectInput = parts[0];\n } else {\n // Выражение + объект\n expression = parts.slice(0, lastValidJsonIndex).join(' ');\n objectInput = parts[lastValidJsonIndex];\n }\n // Парсим объект\n _context.p = 10;\n object = JSON.parse(objectInput);\n _context.n = 12;\n break;\n case 11:\n _context.p = 11;\n _t3 = _context.v;\n return _context.a(2, \"Error: Could not parse object as JSON: \".concat(_t3.message));\n case 12:\n // Выполняем jq выражение\n result = processJqExpression(expression, object);\n return _context.a(2, result);\n case 13:\n _context.p = 13;\n _t4 = _context.v;\n return _context.a(2, \"Error executing jq: \".concat(_t4.message));\n }\n }, _callee, null, [[10, 11], [7, 8], [3, 4], [0, 13]]);\n }));\n return _executeJq.apply(this, arguments);\n}\nfunction getJqHelp() {\n return \"jq - JSON processor\\n\\nUsage:\\n jq [object] Process object with expression\\n jq Pretty print object (default expression: .)\\n\\nExpressions:\\n . Identity (output unchanged)\\n .key Object key access\\n .key1.key2 Nested key access\\n .[0] Array index access\\n .[1:3] Array slice\\n .[] Array iteration\\n .key[] Array iteration on object key\\n . | .key Pipe operator\\n .key1 + .key2 Addition\\n .key1 * .key2 Multiplication\\n .key1 == .key2 Equality comparison\\n .key1 != .key2 Inequality comparison\\n .key > 5 Greater than\\n .key < 5 Less than\\n .key >= 5 Greater than or equal\\n .key <= 5 Less than or equal\\n .key and .key2 Logical AND\\n .key or .key2 Logical OR\\n not .key Logical NOT\\n .key | length Function: length\\n .key | keys Function: keys\\n .key | values Function: values\\n .key | okeys Function: okeys (object keys)\\n .key | has(\\\"subkey\\\") Function: has\\n .key | type Function: type\\n .key | tostring Function: tostring\\n .key | tonumber Function: tonumber\\n .key | sort Function: sort\\n .key | reverse Function: reverse\\n .key | unique Function: unique\\n .key | map(.subkey) Function: map\\n .key | select(.subkey > 5) Function: select\\n .key | group_by(.category) Function: group_by\\n\\nExamples:\\n jq '{\\\"name\\\": \\\"John\\\", \\\"age\\\": 30}' # Pretty print\\n jq .name '{\\\"name\\\": \\\"John\\\", \\\"age\\\": 30}' # Get name\\n jq .age '{\\\"name\\\": \\\"John\\\", \\\"age\\\": 30}' # Get age\\n jq '.[0]' '[1, 2, 3, 4, 5]' # Get first element\\n jq '.[1:3]' '[1, 2, 3, 4, 5]' # Get slice\\n jq '.users[]' '{\\\"users\\\": [{\\\"name\\\": \\\"John\\\"}, {\\\"name\\\": \\\"Jane\\\"}]}' # Iterate array\\n jq '.users[].name' '{\\\"users\\\": [{\\\"name\\\": \\\"John\\\"}, {\\\"name\\\": \\\"Jane\\\"}]}' # Get names\\n jq '.users | map(.name)' '{\\\"users\\\": [{\\\"name\\\": \\\"John\\\"}, {\\\"name\\\": \\\"Jane\\\"}]}' # Map names\\n jq '.users | select(.age > 25)' '{\\\"users\\\": [{\\\"name\\\": \\\"John\\\", \\\"age\\\": 30}, {\\\"name\\\": \\\"Jane\\\", \\\"age\\\": 20}]}' # Filter\\n jq '.count + 1' '{\\\"count\\\": 5}' # Math operation\\n jq '.items | length' '{\\\"items\\\": [1, 2, 3]}' # Array length\\n jq '.data | keys' '{\\\"data\\\": {\\\"name\\\": \\\"John\\\", \\\"age\\\": 30}}' # Get keys\\n jq '.data | okeys' '{\\\"data\\\": {\\\"name\\\": \\\"John\\\", \\\"age\\\": 30}}' # Get object keys\\n jq '.data | values' '{\\\"data\\\": {\\\"name\\\": \\\"John\\\", \\\"age\\\": 30}}' # Get values\\n\\nJavaScript objects can also be used:\\n jq .length [1, 2, 3, 4, 5] # Array length\\n jq .name {name: \\\"John\\\", age: 30} # Object property\\n jq .toString() new Date() # Method call\";\n}\n/**\n * Обрабатывает jq выражение\n * @param expression - jq выражение\n * @param object - объект для обработки\n * @returns результат\n */\nfunction processJqExpression(expression, object) {\n try {\n // Упрощенная реализация jq для основных операций\n var result = evaluateJqExpression(expression, object);\n // Форматируем результат\n if (_typeof(result) === 'object' && result !== null) {\n return JSON.stringify(result, null, 2);\n } else {\n return String(result);\n }\n } catch (error) {\n return \"Error processing jq expression: \".concat(error.message);\n }\n}\n/**\n * Выполняет jq выражение\n * @param expression - jq выражение\n * @param object - объект для обработки\n * @returns результат\n */\nfunction evaluateJqExpression(expression, object) {\n // Убираем лишние пробелы и кавычки\n expression = expression.trim().replace(/^[\"']|[\"']$/g, '');\n // Если выражение пустое или '.', возвращаем объект как есть\n if (!expression || expression === '.') {\n return object;\n }\n // Обрабатываем различные типы выражений\n if (expression.startsWith('.')) {\n return processDotExpression(expression, object);\n } else if (expression.includes('|')) {\n return processPipeExpression(expression, object);\n } else if (isJqFunction(expression)) {\n return processJqFunction(expression, object);\n } else if (expression.includes('+') || expression.includes('-') || expression.includes('*') || expression.includes('/')) {\n return processMathExpression(expression, object);\n } else if (expression.includes('==') || expression.includes('!=') || expression.includes('>') || expression.includes('<') || expression.includes('>=') || expression.includes('<=')) {\n return processComparisonExpression(expression, object);\n } else if (expression.includes(' and ') || expression.includes(' or ') || expression.startsWith('not ')) {\n return processLogicalExpression(expression, object);\n } else {\n // Пытаемся выполнить как JavaScript выражение\n return evaluateJavaScriptExpression(expression, object);\n }\n}\n/**\n * Обрабатывает выражения с точкой (доступ к свойствам)\n * @param expression - выражение\n * @param object - объект\n * @returns результат\n */\nfunction processDotExpression(expression, object) {\n var parts = expression.split('.');\n var current = object;\n for (var i = 1; i < parts.length; i++) {\n var part = parts[i];\n if (part === '') continue;\n // Проверяем, является ли это функцией jq\n if (isJqFunction(part)) {\n return processJqFunction(part, current);\n }\n // Обработка индексов массива\n if (part.includes('[') && part.includes(']')) {\n var bracketMatch = part.match(/^([^\\[]+)\\[([^\\]]+)\\]$/);\n if (bracketMatch) {\n var key = bracketMatch[1];\n var index = bracketMatch[2];\n if (key && current && _typeof(current) === 'object') {\n current = current[key];\n }\n if (current && Array.isArray(current)) {\n if (index.includes(':')) {\n // Срез массива\n var sliceParts = index.split(':').map(function (p) {\n return p.trim();\n });\n var start = sliceParts[0] ? parseInt(sliceParts[0]) : 0;\n var end = sliceParts[1] ? parseInt(sliceParts[1]) : current.length;\n current = current.slice(start, end);\n } else {\n // Индекс элемента\n var idx = parseInt(index);\n if (!isNaN(idx) && idx >= 0 && idx < current.length) {\n current = current[idx];\n } else {\n return undefined;\n }\n }\n }\n }\n } else if (part === '[]') {\n // Итерация по массиву\n if (Array.isArray(current)) {\n return current;\n } else {\n return [];\n }\n } else {\n // Обычный доступ к свойству\n if (current && _typeof(current) === 'object' && part in current) {\n current = current[part];\n } else {\n return undefined;\n }\n }\n }\n return current;\n}\n/**\n * Обрабатывает выражения с pipe оператором\n * @param expression - выражение\n * @param object - объект\n * @returns результат\n */\nfunction processPipeExpression(expression, object) {\n var parts = expression.split('|').map(function (p) {\n return p.trim();\n });\n var current = object;\n var _iterator = _createForOfIteratorHelper(parts),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var part = _step.value;\n if (part.startsWith('.')) {\n current = processDotExpression(part, current);\n } else if (isJqFunction(part)) {\n current = processJqFunction(part, current);\n } else {\n current = evaluateJavaScriptExpression(part, current);\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n return current;\n}\n/**\n * Проверяет, является ли выражение встроенной функцией jq\n * @param expression - выражение\n * @returns true если это встроенная функция\n */\nfunction isJqFunction(expression) {\n var functions = ['length', 'keys', 'values', 'okeys', 'has', 'type', 'tostring', 'tonumber', 'sort', 'reverse', 'unique', 'map', 'select', 'group_by'];\n return functions.includes(expression.trim());\n}\n/**\n * Обрабатывает встроенные функции jq\n * @param functionName - название функции\n * @param object - объект для обработки\n * @returns результат\n */\nfunction processJqFunction(functionName, object) {\n switch (functionName) {\n case 'length':\n if (Array.isArray(object)) {\n return object.length;\n } else if (_typeof(object) === 'object' && object !== null) {\n return Object.keys(object).length;\n } else if (typeof object === 'string') {\n return object.length;\n }\n return 0;\n case 'keys':\n if (_typeof(object) === 'object' && object !== null && !Array.isArray(object)) {\n return Object.keys(object);\n }\n return [];\n case 'values':\n if (_typeof(object) === 'object' && object !== null && !Array.isArray(object)) {\n return Object.values(object);\n }\n return [];\n case 'okeys':\n if (_typeof(object) === 'object' && object !== null && !Array.isArray(object)) {\n return Object.keys(object);\n }\n return [];\n case 'has':\n // Для has нужен дополнительный параметр, возвращаем функцию\n return function (key) {\n if (_typeof(object) === 'object' && object !== null) {\n return key in object;\n }\n return false;\n };\n case 'type':\n if (object === null) return 'null';\n if (Array.isArray(object)) return 'array';\n if (_typeof(object) === 'object') return 'object';\n return _typeof(object);\n case 'tostring':\n return String(object);\n case 'tonumber':\n var num = Number(object);\n return isNaN(num) ? null : num;\n case 'sort':\n if (Array.isArray(object)) {\n return _toConsumableArray(object).sort();\n }\n return object;\n case 'reverse':\n if (Array.isArray(object)) {\n return _toConsumableArray(object).reverse();\n }\n return object;\n case 'unique':\n if (Array.isArray(object)) {\n return _toConsumableArray(new Set(object));\n }\n return object;\n case 'map':\n // Для map нужен дополнительный параметр, возвращаем функцию\n return function (expression) {\n if (Array.isArray(object)) {\n return object.map(function (item) {\n // Упрощенная обработка выражения для map\n if (expression.startsWith('.')) {\n return processDotExpression(expression, item);\n }\n return item;\n });\n }\n return object;\n };\n case 'select':\n // Для select нужен дополнительный параметр, возвращаем функцию\n return function (expression) {\n if (Array.isArray(object)) {\n return object.filter(function (item) {\n // Упрощенная обработка выражения для select\n if (expression.startsWith('.')) {\n var value = processDotExpression(expression, item);\n return Boolean(value);\n }\n return true;\n });\n }\n return object;\n };\n case 'group_by':\n // Для group_by нужен дополнительный параметр, возвращаем функцию\n return function (expression) {\n if (Array.isArray(object)) {\n var groups = {};\n object.forEach(function (item) {\n var groupKey = processDotExpression(expression, item);\n if (!groups[groupKey]) {\n groups[groupKey] = [];\n }\n groups[groupKey].push(item);\n });\n return groups;\n }\n return object;\n };\n default:\n return object;\n }\n}\n/**\n * Обрабатывает математические выражения\n * @param expression - выражение\n * @param object - объект\n * @returns результат\n */\nfunction processMathExpression(expression, object) {\n // Заменяем ссылки на свойства на их значения\n var processedExpression = expression;\n var propertyMatches = expression.match(/\\.\\w+/g);\n if (propertyMatches) {\n var _iterator2 = _createForOfIteratorHelper(propertyMatches),\n _step2;\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var match = _step2.value;\n var value = processDotExpression(match, object);\n if (typeof value === 'number') {\n processedExpression = processedExpression.replace(match, value.toString());\n }\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n }\n try {\n return eval(processedExpression);\n } catch (error) {\n throw new Error(\"Math expression error: \".concat(error.message));\n }\n}\n/**\n * Обрабатывает выражения сравнения\n * @param expression - выражение\n * @param object - объект\n * @returns результат\n */\nfunction processComparisonExpression(expression, object) {\n // Заменяем ссылки на свойства на их значения\n var processedExpression = expression;\n var propertyMatches = expression.match(/\\.\\w+/g);\n if (propertyMatches) {\n var _iterator3 = _createForOfIteratorHelper(propertyMatches),\n _step3;\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var match = _step3.value;\n var value = processDotExpression(match, object);\n processedExpression = processedExpression.replace(match, JSON.stringify(value));\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n }\n try {\n return eval(processedExpression);\n } catch (error) {\n throw new Error(\"Comparison expression error: \".concat(error.message));\n }\n}\n/**\n * Обрабатывает логические выражения\n * @param expression - выражение\n * @param object - объект\n * @returns результат\n */\nfunction processLogicalExpression(expression, object) {\n // Заменяем ссылки на свойства на их значения\n var processedExpression = expression;\n var propertyMatches = expression.match(/\\.\\w+/g);\n if (propertyMatches) {\n var _iterator4 = _createForOfIteratorHelper(propertyMatches),\n _step4;\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var match = _step4.value;\n var value = processDotExpression(match, object);\n processedExpression = processedExpression.replace(match, JSON.stringify(value));\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n }\n try {\n return eval(processedExpression);\n } catch (error) {\n throw new Error(\"Logical expression error: \".concat(error.message));\n }\n}\n/**\n * Выполняет JavaScript выражение\n * @param expression - выражение\n * @param object - объект\n * @returns результат\n */\nfunction evaluateJavaScriptExpression(expression, object) {\n try {\n // Создаем функцию с доступом к объекту\n var func = new Function('obj', \"return \".concat(expression));\n return func(object);\n } catch (error) {\n throw new Error(\"JavaScript expression error: \".concat(error.message));\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTg1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7O0FBSUE7Ozs7O0FBS08sU0FBZUEsU0FBU0EsQ0FBQUMsRUFBQTtFQUFBLE9BQUFDLFVBQUEsQ0FBQUMsS0FBQSxPQUFBQyxTQUFBO0FBQUE7QUFtRS9COzs7O0FBQUEsU0FBQUYsV0FBQTtFQUFBQSxVQUFBLEdBQUFHLGlCQUFBLGNBQUFDLFlBQUEsR0FBQUMsQ0FBQSxDQW5FTyxTQUFBQyxRQUF5QkMsSUFBWTtJQUFBLElBQUFDLFdBQUEsRUFBQUMsS0FBQSxFQUFBQyxVQUFBLEVBQUFDLFdBQUEsRUFBQUMsa0JBQUEsRUFBQUMsQ0FBQSxFQUFBQyxPQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxFQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQSxFQUFBQyxHQUFBO0lBQUEsT0FBQWhCLFlBQUEsR0FBQWlCLENBQUEsV0FBQUMsUUFBQTtNQUFBLGtCQUFBQSxRQUFBLENBQUFDLENBQUEsR0FBQUQsUUFBQSxDQUFBRSxDQUFBO1FBQUE7VUFBQUYsUUFBQSxDQUFBQyxDQUFBO1VBRXBDO1VBQ0lmLFdBQVcsR0FBR0QsSUFBSTtVQUN0QixJQUFJQyxXQUFXLENBQUNpQixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDOUJqQixXQUFXLEdBQUdBLFdBQVcsQ0FBQ2tCLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxFQUFFO1VBQ2pEO1VBRUE7VUFDTWxCLEtBQUssR0FBR0QsV0FBVyxDQUFDbUIsSUFBSSxFQUFFLENBQUNDLEtBQUssQ0FBQyxLQUFLLENBQUM7VUFBQSxNQUV6Q25CLEtBQUssQ0FBQ29CLE1BQU0sS0FBSyxDQUFDLElBQUlwQixLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtZQUFBYSxRQUFBLENBQUFFLENBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQUYsUUFBQSxDQUFBUSxDQUFBLElBQzlCQyxTQUFTLEVBQUU7UUFBQTtVQUdsQnJCLFVBQVUsR0FBRyxHQUFHO1VBQ2hCQyxXQUFXLEdBQUcsRUFBRSxFQUVwQjtVQUNJQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7VUFDbEJDLENBQUMsR0FBR0osS0FBSyxDQUFDb0IsTUFBTSxHQUFHLENBQUM7UUFBQTtVQUFBLE1BQUVoQixDQUFDLElBQUksQ0FBQztZQUFBUyxRQUFBLENBQUFFLENBQUE7WUFBQTtVQUFBO1VBQUFGLFFBQUEsQ0FBQUMsQ0FBQTtVQUU3QlMsSUFBSSxDQUFDQyxLQUFLLENBQUN4QixLQUFLLENBQUNJLENBQUMsQ0FBQyxDQUFDO1VBQ3BCRCxrQkFBa0IsR0FBR0MsQ0FBQztVQUFDLE9BQUFTLFFBQUEsQ0FBQVEsQ0FBQTtRQUFBO1VBQUFSLFFBQUEsQ0FBQUMsQ0FBQTtVQUFBTixFQUFBLEdBQUFLLFFBQUEsQ0FBQVksQ0FBQTtRQUFBO1VBSFFyQixDQUFDLEVBQUU7VUFBQVMsUUFBQSxDQUFBRSxDQUFBO1VBQUE7UUFBQTtVQUFBLE1BVXRDWixrQkFBa0IsS0FBSyxDQUFDLENBQUM7WUFBQVUsUUFBQSxDQUFBRSxDQUFBO1lBQUE7VUFBQTtVQUFBRixRQUFBLENBQUFDLENBQUE7VUFHZlIsT0FBTSxHQUFHb0IsSUFBSSxDQUFDM0IsV0FBVyxDQUFDO1VBQUEsT0FBQWMsUUFBQSxDQUFBUSxDQUFBLElBQ3pCTSxtQkFBbUIsQ0FBQyxHQUFHLEVBQUVyQixPQUFNLENBQUM7UUFBQTtVQUFBTyxRQUFBLENBQUFDLENBQUE7VUFBQUwsR0FBQSxHQUFBSSxRQUFBLENBQUFZLENBQUE7VUFBQSxPQUFBWixRQUFBLENBQUFRLENBQUEsbUZBQUFPLE1BQUEsQ0FFK0NuQixHQUFBLENBQVVvQixPQUFPO1FBQUE7VUFJL0c7VUFDQSxJQUFJMUIsa0JBQWtCLEtBQUssQ0FBQyxFQUFFO1lBQzFCO1lBQ0FELFdBQVcsR0FBR0YsS0FBSyxDQUFDLENBQUMsQ0FBQztVQUMxQixDQUFDLE1BQU07WUFDSDtZQUNBQyxVQUFVLEdBQUdELEtBQUssQ0FBQzhCLEtBQUssQ0FBQyxDQUFDLEVBQUUzQixrQkFBa0IsQ0FBQyxDQUFDNEIsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUN6RDdCLFdBQVcsR0FBR0YsS0FBSyxDQUFDRyxrQkFBa0IsQ0FBQztVQUMzQztVQUVBO1VBQUFVLFFBQUEsQ0FBQUMsQ0FBQTtVQUdJUixNQUFNLEdBQUdpQixJQUFJLENBQUNDLEtBQUssQ0FBQ3RCLFdBQVcsQ0FBQztVQUFDVyxRQUFBLENBQUFFLENBQUE7VUFBQTtRQUFBO1VBQUFGLFFBQUEsQ0FBQUMsQ0FBQTtVQUFBSixHQUFBLEdBQUFHLFFBQUEsQ0FBQVksQ0FBQTtVQUFBLE9BQUFaLFFBQUEsQ0FBQVEsQ0FBQSw4Q0FBQU8sTUFBQSxDQUVnQmxCLEdBQUEsQ0FBVW1CLE9BQU87UUFBQTtVQUd0RTtVQUNNdEIsTUFBTSxHQUFHb0IsbUJBQW1CLENBQUMxQixVQUFVLEVBQUVLLE1BQU0sQ0FBQztVQUFBLE9BQUFPLFFBQUEsQ0FBQVEsQ0FBQSxJQUMvQ2QsTUFBTTtRQUFBO1VBQUFNLFFBQUEsQ0FBQUMsQ0FBQTtVQUFBSCxHQUFBLEdBQUFFLFFBQUEsQ0FBQVksQ0FBQTtVQUFBLE9BQUFaLFFBQUEsQ0FBQVEsQ0FBQSwyQkFBQU8sTUFBQSxDQUdpQmpCLEdBQUEsQ0FBTWtCLE9BQU87TUFBQTtJQUFBLEdBQUFoQyxPQUFBO0VBQUEsQ0FFbEQ7RUFBQSxPQUFBTixVQUFBLENBQUFDLEtBQUEsT0FBQUMsU0FBQTtBQUFBO0FBTUssU0FBVTZCLFNBQVNBLENBQUE7RUFDckI7QUE2REo7QUFFQTs7Ozs7O0FBTU0sU0FBVUssbUJBQW1CQSxDQUFDMUIsVUFBa0IsRUFBRUssTUFBVztFQUMvRCxJQUFJO0lBQ0E7SUFDQSxJQUFNQyxNQUFNLEdBQUd5QixvQkFBb0IsQ0FBQy9CLFVBQVUsRUFBRUssTUFBTSxDQUFDO0lBRXZEO0lBQ0EsSUFBSTJCLE9BQUEsQ0FBTzFCLE1BQU0sTUFBSyxRQUFRLElBQUlBLE1BQU0sS0FBSyxJQUFJLEVBQUU7TUFDL0MsT0FBT2dCLElBQUksQ0FBQ1csU0FBUyxDQUFDM0IsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQyxNQUFNO01BQ0gsT0FBTzRCLE1BQU0sQ0FBQzVCLE1BQU0sQ0FBQztJQUN6QjtFQUVKLENBQUMsQ0FBQyxPQUFPNkIsS0FBVSxFQUFFO0lBQ2pCLDBDQUFBUixNQUFBLENBQTBDUSxLQUFLLENBQUNQLE9BQU87RUFDM0Q7QUFDSjtBQUVBOzs7Ozs7QUFNTSxTQUFVRyxvQkFBb0JBLENBQUMvQixVQUFrQixFQUFFSyxNQUFXO0VBQ2hFO0VBQ0FMLFVBQVUsR0FBR0EsVUFBVSxDQUFDaUIsSUFBSSxFQUFFLENBQUNtQixPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztFQUUxRDtFQUNBLElBQUksQ0FBQ3BDLFVBQVUsSUFBSUEsVUFBVSxLQUFLLEdBQUcsRUFBRTtJQUNuQyxPQUFPSyxNQUFNO0VBQ2pCO0VBRUE7RUFDQSxJQUFJTCxVQUFVLENBQUNlLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUM1QixPQUFPc0Isb0JBQW9CLENBQUNyQyxVQUFVLEVBQUVLLE1BQU0sQ0FBQztFQUNuRCxDQUFDLE1BQU0sSUFBSUwsVUFBVSxDQUFDc0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ2pDLE9BQU9DLHFCQUFxQixDQUFDdkMsVUFBVSxFQUFFSyxNQUFNLENBQUM7RUFDcEQsQ0FBQyxNQUFNLElBQUltQyxZQUFZLENBQUN4QyxVQUFVLENBQUMsRUFBRTtJQUNqQyxPQUFPeUMsaUJBQWlCLENBQUN6QyxVQUFVLEVBQUVLLE1BQU0sQ0FBQztFQUNoRCxDQUFDLE1BQU0sSUFBSUwsVUFBVSxDQUFDc0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJdEMsVUFBVSxDQUFDc0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUNwRHRDLFVBQVUsQ0FBQ3NDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSXRDLFVBQVUsQ0FBQ3NDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUM3RCxPQUFPSSxxQkFBcUIsQ0FBQzFDLFVBQVUsRUFBRUssTUFBTSxDQUFDO0VBQ3BELENBQUMsTUFBTSxJQUFJTCxVQUFVLENBQUNzQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUl0QyxVQUFVLENBQUNzQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQ3REdEMsVUFBVSxDQUFDc0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJdEMsVUFBVSxDQUFDc0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUNwRHRDLFVBQVUsQ0FBQ3NDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSXRDLFVBQVUsQ0FBQ3NDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUMvRCxPQUFPSywyQkFBMkIsQ0FBQzNDLFVBQVUsRUFBRUssTUFBTSxDQUFDO0VBQzFELENBQUMsTUFBTSxJQUFJTCxVQUFVLENBQUNzQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUl0QyxVQUFVLENBQUNzQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQzNEdEMsVUFBVSxDQUFDZSxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7SUFDdEMsT0FBTzZCLHdCQUF3QixDQUFDNUMsVUFBVSxFQUFFSyxNQUFNLENBQUM7RUFDdkQsQ0FBQyxNQUFNO0lBQ0g7SUFDQSxPQUFPd0MsNEJBQTRCLENBQUM3QyxVQUFVLEVBQUVLLE1BQU0sQ0FBQztFQUMzRDtBQUNKO0FBRUE7Ozs7OztBQU1NLFNBQVVnQyxvQkFBb0JBLENBQUNyQyxVQUFrQixFQUFFSyxNQUFXO0VBQ2hFLElBQU1OLEtBQUssR0FBR0MsVUFBVSxDQUFDa0IsS0FBSyxDQUFDLEdBQUcsQ0FBQztFQUNuQyxJQUFJNEIsT0FBTyxHQUFHekMsTUFBTTtFQUVwQixLQUFLLElBQUlGLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0osS0FBSyxDQUFDb0IsTUFBTSxFQUFFaEIsQ0FBQyxFQUFFLEVBQUU7SUFDbkMsSUFBTTRDLElBQUksR0FBR2hELEtBQUssQ0FBQ0ksQ0FBQyxDQUFDO0lBRXJCLElBQUk0QyxJQUFJLEtBQUssRUFBRSxFQUFFO0lBRWpCO0lBQ0EsSUFBSVAsWUFBWSxDQUFDTyxJQUFJLENBQUMsRUFBRTtNQUNwQixPQUFPTixpQkFBaUIsQ0FBQ00sSUFBSSxFQUFFRCxPQUFPLENBQUM7SUFDM0M7SUFFQTtJQUNBLElBQUlDLElBQUksQ0FBQ1QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJUyxJQUFJLENBQUNULFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtNQUMxQyxJQUFNVSxZQUFZLEdBQUdELElBQUksQ0FBQ0UsS0FBSyxDQUFDLHdCQUF3QixDQUFDO01BQ3pELElBQUlELFlBQVksRUFBRTtRQUNkLElBQU1FLEdBQUcsR0FBR0YsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUMzQixJQUFNRyxLQUFLLEdBQUdILFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFN0IsSUFBSUUsR0FBRyxJQUFJSixPQUFPLElBQUlkLE9BQUEsQ0FBT2MsT0FBTyxNQUFLLFFBQVEsRUFBRTtVQUMvQ0EsT0FBTyxHQUFHQSxPQUFPLENBQUNJLEdBQUcsQ0FBQztRQUMxQjtRQUVBLElBQUlKLE9BQU8sSUFBSU0sS0FBSyxDQUFDQyxPQUFPLENBQUNQLE9BQU8sQ0FBQyxFQUFFO1VBQ25DLElBQUlLLEtBQUssQ0FBQ2IsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCO1lBQ0EsSUFBTWdCLFVBQVUsR0FBR0gsS0FBSyxDQUFDakMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDcUMsR0FBRyxDQUFDLFVBQUExQyxDQUFDO2NBQUEsT0FBSUEsQ0FBQyxDQUFDSSxJQUFJLEVBQUU7WUFBQSxFQUFDO1lBQ3RELElBQU11QyxLQUFLLEdBQUdGLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBR0csUUFBUSxDQUFDSCxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3pELElBQU1JLEdBQUcsR0FBR0osVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHRyxRQUFRLENBQUNILFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHUixPQUFPLENBQUMzQixNQUFNO1lBQ3BFMkIsT0FBTyxHQUFHQSxPQUFPLENBQUNqQixLQUFLLENBQUMyQixLQUFLLEVBQUVFLEdBQUcsQ0FBQztVQUN2QyxDQUFDLE1BQU07WUFDSDtZQUNBLElBQU1DLEdBQUcsR0FBR0YsUUFBUSxDQUFDTixLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDUyxLQUFLLENBQUNELEdBQUcsQ0FBQyxJQUFJQSxHQUFHLElBQUksQ0FBQyxJQUFJQSxHQUFHLEdBQUdiLE9BQU8sQ0FBQzNCLE1BQU0sRUFBRTtjQUNqRDJCLE9BQU8sR0FBR0EsT0FBTyxDQUFDYSxHQUFHLENBQUM7WUFDMUIsQ0FBQyxNQUFNO2NBQ0gsT0FBT0UsU0FBUztZQUNwQjtVQUNKO1FBQ0o7TUFDSjtJQUNKLENBQUMsTUFBTSxJQUFJZCxJQUFJLEtBQUssSUFBSSxFQUFFO01BQ3RCO01BQ0EsSUFBSUssS0FBSyxDQUFDQyxPQUFPLENBQUNQLE9BQU8sQ0FBQyxFQUFFO1FBQ3hCLE9BQU9BLE9BQU87TUFDbEIsQ0FBQyxNQUFNO1FBQ0gsT0FBTyxFQUFFO01BQ2I7SUFDSixDQUFDLE1BQU07TUFDSDtNQUNBLElBQUlBLE9BQU8sSUFBSWQsT0FBQSxDQUFPYyxPQUFPLE1BQUssUUFBUSxJQUFJQyxJQUFJLElBQUlELE9BQU8sRUFBRTtRQUMzREEsT0FBTyxHQUFHQSxPQUFPLENBQUNDLElBQUksQ0FBQztNQUMzQixDQUFDLE1BQU07UUFDSCxPQUFPYyxTQUFTO01BQ3BCO0lBQ0o7RUFDSjtFQUVBLE9BQU9mLE9BQU87QUFDbEI7QUFFQTs7Ozs7O0FBTU0sU0FBVVAscUJBQXFCQSxDQUFDdkMsVUFBa0IsRUFBRUssTUFBVztFQUNqRSxJQUFNTixLQUFLLEdBQUdDLFVBQVUsQ0FBQ2tCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ3FDLEdBQUcsQ0FBQyxVQUFBMUMsQ0FBQztJQUFBLE9BQUlBLENBQUMsQ0FBQ0ksSUFBSSxFQUFFO0VBQUEsRUFBQztFQUN0RCxJQUFJNkIsT0FBTyxHQUFHekMsTUFBTTtFQUFDLElBQUF5RCxTQUFBLEdBQUFDLDBCQUFBLENBRUZoRSxLQUFLO0lBQUFpRSxLQUFBO0VBQUE7SUFBeEIsS0FBQUYsU0FBQSxDQUFBRyxDQUFBLE1BQUFELEtBQUEsR0FBQUYsU0FBQSxDQUFBaEQsQ0FBQSxJQUFBb0QsSUFBQSxHQUEwQjtNQUFBLElBQWZuQixJQUFJLEdBQUFpQixLQUFBLENBQUFHLEtBQUE7TUFDWCxJQUFJcEIsSUFBSSxDQUFDaEMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3RCK0IsT0FBTyxHQUFHVCxvQkFBb0IsQ0FBQ1UsSUFBSSxFQUFFRCxPQUFPLENBQUM7TUFDakQsQ0FBQyxNQUFNLElBQUlOLFlBQVksQ0FBQ08sSUFBSSxDQUFDLEVBQUU7UUFDM0JELE9BQU8sR0FBR0wsaUJBQWlCLENBQUNNLElBQUksRUFBRUQsT0FBTyxDQUFDO01BQzlDLENBQUMsTUFBTTtRQUNIQSxPQUFPLEdBQUdELDRCQUE0QixDQUFDRSxJQUFJLEVBQUVELE9BQU8sQ0FBQztNQUN6RDtJQUNKO0VBQUMsU0FBQXNCLEdBQUE7SUFBQU4sU0FBQSxDQUFBTyxDQUFBLENBQUFELEdBQUE7RUFBQTtJQUFBTixTQUFBLENBQUFRLENBQUE7RUFBQTtFQUVELE9BQU94QixPQUFPO0FBQ2xCO0FBRUE7Ozs7O0FBS00sU0FBVU4sWUFBWUEsQ0FBQ3hDLFVBQWtCO0VBQzNDLElBQU11RSxTQUFTLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO0VBQ3hKLE9BQU9BLFNBQVMsQ0FBQ2pDLFFBQVEsQ0FBQ3RDLFVBQVUsQ0FBQ2lCLElBQUksRUFBRSxDQUFDO0FBQ2hEO0FBRUE7Ozs7OztBQU1NLFNBQVV3QixpQkFBaUJBLENBQUMrQixZQUFvQixFQUFFbkUsTUFBVztFQUMvRCxRQUFRbUUsWUFBWTtJQUNoQixLQUFLLFFBQVE7TUFDVCxJQUFJcEIsS0FBSyxDQUFDQyxPQUFPLENBQUNoRCxNQUFNLENBQUMsRUFBRTtRQUN2QixPQUFPQSxNQUFNLENBQUNjLE1BQU07TUFDeEIsQ0FBQyxNQUFNLElBQUlhLE9BQUEsQ0FBTzNCLE1BQU0sTUFBSyxRQUFRLElBQUlBLE1BQU0sS0FBSyxJQUFJLEVBQUU7UUFDdEQsT0FBT29FLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDckUsTUFBTSxDQUFDLENBQUNjLE1BQU07TUFDckMsQ0FBQyxNQUFNLElBQUksT0FBT2QsTUFBTSxLQUFLLFFBQVEsRUFBRTtRQUNuQyxPQUFPQSxNQUFNLENBQUNjLE1BQU07TUFDeEI7TUFDQSxPQUFPLENBQUM7SUFFWixLQUFLLE1BQU07TUFDUCxJQUFJYSxPQUFBLENBQU8zQixNQUFNLE1BQUssUUFBUSxJQUFJQSxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMrQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ2hELE1BQU0sQ0FBQyxFQUFFO1FBQ3pFLE9BQU9vRSxNQUFNLENBQUNDLElBQUksQ0FBQ3JFLE1BQU0sQ0FBQztNQUM5QjtNQUNBLE9BQU8sRUFBRTtJQUViLEtBQUssUUFBUTtNQUNULElBQUkyQixPQUFBLENBQU8zQixNQUFNLE1BQUssUUFBUSxJQUFJQSxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMrQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ2hELE1BQU0sQ0FBQyxFQUFFO1FBQ3pFLE9BQU9vRSxNQUFNLENBQUNFLE1BQU0sQ0FBQ3RFLE1BQU0sQ0FBQztNQUNoQztNQUNBLE9BQU8sRUFBRTtJQUViLEtBQUssT0FBTztNQUNSLElBQUkyQixPQUFBLENBQU8zQixNQUFNLE1BQUssUUFBUSxJQUFJQSxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMrQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ2hELE1BQU0sQ0FBQyxFQUFFO1FBQ3pFLE9BQU9vRSxNQUFNLENBQUNDLElBQUksQ0FBQ3JFLE1BQU0sQ0FBQztNQUM5QjtNQUNBLE9BQU8sRUFBRTtJQUViLEtBQUssS0FBSztNQUNOO01BQ0EsT0FBTyxVQUFDNkMsR0FBVyxFQUFJO1FBQ25CLElBQUlsQixPQUFBLENBQU8zQixNQUFNLE1BQUssUUFBUSxJQUFJQSxNQUFNLEtBQUssSUFBSSxFQUFFO1VBQy9DLE9BQU82QyxHQUFHLElBQUk3QyxNQUFNO1FBQ3hCO1FBQ0EsT0FBTyxLQUFLO01BQ2hCLENBQUM7SUFFTCxLQUFLLE1BQU07TUFDUCxJQUFJQSxNQUFNLEtBQUssSUFBSSxFQUFFLE9BQU8sTUFBTTtNQUNsQyxJQUFJK0MsS0FBSyxDQUFDQyxPQUFPLENBQUNoRCxNQUFNLENBQUMsRUFBRSxPQUFPLE9BQU87TUFDekMsSUFBSTJCLE9BQUEsQ0FBTzNCLE1BQU0sTUFBSyxRQUFRLEVBQUUsT0FBTyxRQUFRO01BQy9DLE9BQUEyQixPQUFBLENBQWMzQixNQUFNO0lBRXhCLEtBQUssVUFBVTtNQUNYLE9BQU82QixNQUFNLENBQUM3QixNQUFNLENBQUM7SUFFekIsS0FBSyxVQUFVO01BQ1gsSUFBTXVFLEdBQUcsR0FBR0MsTUFBTSxDQUFDeEUsTUFBTSxDQUFDO01BQzFCLE9BQU91RCxLQUFLLENBQUNnQixHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUdBLEdBQUc7SUFFbEMsS0FBSyxNQUFNO01BQ1AsSUFBSXhCLEtBQUssQ0FBQ0MsT0FBTyxDQUFDaEQsTUFBTSxDQUFDLEVBQUU7UUFDdkIsT0FBT3lFLGtCQUFBLENBQUl6RSxNQUFNLEVBQUUwRSxJQUFJLEVBQUU7TUFDN0I7TUFDQSxPQUFPMUUsTUFBTTtJQUVqQixLQUFLLFNBQVM7TUFDVixJQUFJK0MsS0FBSyxDQUFDQyxPQUFPLENBQUNoRCxNQUFNLENBQUMsRUFBRTtRQUN2QixPQUFPeUUsa0JBQUEsQ0FBSXpFLE1BQU0sRUFBRTJFLE9BQU8sRUFBRTtNQUNoQztNQUNBLE9BQU8zRSxNQUFNO0lBRWpCLEtBQUssUUFBUTtNQUNULElBQUkrQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ2hELE1BQU0sQ0FBQyxFQUFFO1FBQ3ZCLE9BQUF5RSxrQkFBQSxDQUFXLElBQUlHLEdBQUcsQ0FBQzVFLE1BQU0sQ0FBQztNQUM5QjtNQUNBLE9BQU9BLE1BQU07SUFFakIsS0FBSyxLQUFLO01BQ047TUFDQSxPQUFPLFVBQUNMLFVBQWtCLEVBQUk7UUFDMUIsSUFBSW9ELEtBQUssQ0FBQ0MsT0FBTyxDQUFDaEQsTUFBTSxDQUFDLEVBQUU7VUFDdkIsT0FBT0EsTUFBTSxDQUFDa0QsR0FBRyxDQUFDLFVBQUMyQixJQUFTLEVBQUk7WUFDNUI7WUFDQSxJQUFJbEYsVUFBVSxDQUFDZSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7Y0FDNUIsT0FBT3NCLG9CQUFvQixDQUFDckMsVUFBVSxFQUFFa0YsSUFBSSxDQUFDO1lBQ2pEO1lBQ0EsT0FBT0EsSUFBSTtVQUNmLENBQUMsQ0FBQztRQUNOO1FBQ0EsT0FBTzdFLE1BQU07TUFDakIsQ0FBQztJQUVMLEtBQUssUUFBUTtNQUNUO01BQ0EsT0FBTyxVQUFDTCxVQUFrQixFQUFJO1FBQzFCLElBQUlvRCxLQUFLLENBQUNDLE9BQU8sQ0FBQ2hELE1BQU0sQ0FBQyxFQUFFO1VBQ3ZCLE9BQU9BLE1BQU0sQ0FBQzhFLE1BQU0sQ0FBQyxVQUFDRCxJQUFTLEVBQUk7WUFDL0I7WUFDQSxJQUFJbEYsVUFBVSxDQUFDZSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7Y0FDNUIsSUFBTW9ELEtBQUssR0FBRzlCLG9CQUFvQixDQUFDckMsVUFBVSxFQUFFa0YsSUFBSSxDQUFDO2NBQ3BELE9BQU9FLE9BQU8sQ0FBQ2pCLEtBQUssQ0FBQztZQUN6QjtZQUNBLE9BQU8sSUFBSTtVQUNmLENBQUMsQ0FBQztRQUNOO1FBQ0EsT0FBTzlELE1BQU07TUFDakIsQ0FBQztJQUVMLEtBQUssVUFBVTtNQUNYO01BQ0EsT0FBTyxVQUFDTCxVQUFrQixFQUFJO1FBQzFCLElBQUlvRCxLQUFLLENBQUNDLE9BQU8sQ0FBQ2hELE1BQU0sQ0FBQyxFQUFFO1VBQ3ZCLElBQU1nRixNQUFNLEdBQVEsRUFBRTtVQUN0QmhGLE1BQU0sQ0FBQ2lGLE9BQU8sQ0FBQyxVQUFDSixJQUFTLEVBQUk7WUFDekIsSUFBTUssUUFBUSxHQUFHbEQsb0JBQW9CLENBQUNyQyxVQUFVLEVBQUVrRixJQUFJLENBQUM7WUFDdkQsSUFBSSxDQUFDRyxNQUFNLENBQUNFLFFBQVEsQ0FBQyxFQUFFO2NBQ25CRixNQUFNLENBQUNFLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDekI7WUFDQUYsTUFBTSxDQUFDRSxRQUFRLENBQUMsQ0FBQ0MsSUFBSSxDQUFDTixJQUFJLENBQUM7VUFDL0IsQ0FBQyxDQUFDO1VBQ0YsT0FBT0csTUFBTTtRQUNqQjtRQUNBLE9BQU9oRixNQUFNO01BQ2pCLENBQUM7SUFFTDtNQUNJLE9BQU9BLE1BQU07RUFDckI7QUFDSjtBQUVBOzs7Ozs7QUFNTSxTQUFVcUMscUJBQXFCQSxDQUFDMUMsVUFBa0IsRUFBRUssTUFBVztFQUNqRTtFQUNBLElBQUlvRixtQkFBbUIsR0FBR3pGLFVBQVU7RUFDcEMsSUFBTTBGLGVBQWUsR0FBRzFGLFVBQVUsQ0FBQ2lELEtBQUssQ0FBQyxRQUFRLENBQUM7RUFFbEQsSUFBSXlDLGVBQWUsRUFBRTtJQUFBLElBQUFDLFVBQUEsR0FBQTVCLDBCQUFBLENBQ0cyQixlQUFlO01BQUFFLE1BQUE7SUFBQTtNQUFuQyxLQUFBRCxVQUFBLENBQUExQixDQUFBLE1BQUEyQixNQUFBLEdBQUFELFVBQUEsQ0FBQTdFLENBQUEsSUFBQW9ELElBQUEsR0FBcUM7UUFBQSxJQUExQmpCLEtBQUssR0FBQTJDLE1BQUEsQ0FBQXpCLEtBQUE7UUFDWixJQUFNQSxLQUFLLEdBQUc5QixvQkFBb0IsQ0FBQ1ksS0FBSyxFQUFFNUMsTUFBTSxDQUFDO1FBQ2pELElBQUksT0FBTzhELEtBQUssS0FBSyxRQUFRLEVBQUU7VUFDM0JzQixtQkFBbUIsR0FBR0EsbUJBQW1CLENBQUNyRCxPQUFPLENBQUNhLEtBQUssRUFBRWtCLEtBQUssQ0FBQzBCLFFBQVEsRUFBRSxDQUFDO1FBQzlFO01BQ0o7SUFBQyxTQUFBekIsR0FBQTtNQUFBdUIsVUFBQSxDQUFBdEIsQ0FBQSxDQUFBRCxHQUFBO0lBQUE7TUFBQXVCLFVBQUEsQ0FBQXJCLENBQUE7SUFBQTtFQUNMO0VBRUEsSUFBSTtJQUNBLE9BQU83QyxJQUFJLENBQUNnRSxtQkFBbUIsQ0FBQztFQUNwQyxDQUFDLENBQUMsT0FBT3RELEtBQVUsRUFBRTtJQUNqQixNQUFNLElBQUkyRCxLQUFLLDJCQUFBbkUsTUFBQSxDQUEyQlEsS0FBSyxDQUFDUCxPQUFPLENBQUUsQ0FBQztFQUM5RDtBQUNKO0FBRUE7Ozs7OztBQU1NLFNBQVVlLDJCQUEyQkEsQ0FBQzNDLFVBQWtCLEVBQUVLLE1BQVc7RUFDdkU7RUFDQSxJQUFJb0YsbUJBQW1CLEdBQUd6RixVQUFVO0VBQ3BDLElBQU0wRixlQUFlLEdBQUcxRixVQUFVLENBQUNpRCxLQUFLLENBQUMsUUFBUSxDQUFDO0VBRWxELElBQUl5QyxlQUFlLEVBQUU7SUFBQSxJQUFBSyxVQUFBLEdBQUFoQywwQkFBQSxDQUNHMkIsZUFBZTtNQUFBTSxNQUFBO0lBQUE7TUFBbkMsS0FBQUQsVUFBQSxDQUFBOUIsQ0FBQSxNQUFBK0IsTUFBQSxHQUFBRCxVQUFBLENBQUFqRixDQUFBLElBQUFvRCxJQUFBLEdBQXFDO1FBQUEsSUFBMUJqQixLQUFLLEdBQUErQyxNQUFBLENBQUE3QixLQUFBO1FBQ1osSUFBTUEsS0FBSyxHQUFHOUIsb0JBQW9CLENBQUNZLEtBQUssRUFBRTVDLE1BQU0sQ0FBQztRQUNqRG9GLG1CQUFtQixHQUFHQSxtQkFBbUIsQ0FBQ3JELE9BQU8sQ0FBQ2EsS0FBSyxFQUFFM0IsSUFBSSxDQUFDVyxTQUFTLENBQUNrQyxLQUFLLENBQUMsQ0FBQztNQUNuRjtJQUFDLFNBQUFDLEdBQUE7TUFBQTJCLFVBQUEsQ0FBQTFCLENBQUEsQ0FBQUQsR0FBQTtJQUFBO01BQUEyQixVQUFBLENBQUF6QixDQUFBO0lBQUE7RUFDTDtFQUVBLElBQUk7SUFDQSxPQUFPN0MsSUFBSSxDQUFDZ0UsbUJBQW1CLENBQUM7RUFDcEMsQ0FBQyxDQUFDLE9BQU90RCxLQUFVLEVBQUU7SUFDakIsTUFBTSxJQUFJMkQsS0FBSyxpQ0FBQW5FLE1BQUEsQ0FBaUNRLEtBQUssQ0FBQ1AsT0FBTyxDQUFFLENBQUM7RUFDcEU7QUFDSjtBQUVBOzs7Ozs7QUFNTSxTQUFVZ0Isd0JBQXdCQSxDQUFDNUMsVUFBa0IsRUFBRUssTUFBVztFQUNwRTtFQUNBLElBQUlvRixtQkFBbUIsR0FBR3pGLFVBQVU7RUFDcEMsSUFBTTBGLGVBQWUsR0FBRzFGLFVBQVUsQ0FBQ2lELEtBQUssQ0FBQyxRQUFRLENBQUM7RUFFbEQsSUFBSXlDLGVBQWUsRUFBRTtJQUFBLElBQUFPLFVBQUEsR0FBQWxDLDBCQUFBLENBQ0cyQixlQUFlO01BQUFRLE1BQUE7SUFBQTtNQUFuQyxLQUFBRCxVQUFBLENBQUFoQyxDQUFBLE1BQUFpQyxNQUFBLEdBQUFELFVBQUEsQ0FBQW5GLENBQUEsSUFBQW9ELElBQUEsR0FBcUM7UUFBQSxJQUExQmpCLEtBQUssR0FBQWlELE1BQUEsQ0FBQS9CLEtBQUE7UUFDWixJQUFNQSxLQUFLLEdBQUc5QixvQkFBb0IsQ0FBQ1ksS0FBSyxFQUFFNUMsTUFBTSxDQUFDO1FBQ2pEb0YsbUJBQW1CLEdBQUdBLG1CQUFtQixDQUFDckQsT0FBTyxDQUFDYSxLQUFLLEVBQUUzQixJQUFJLENBQUNXLFNBQVMsQ0FBQ2tDLEtBQUssQ0FBQyxDQUFDO01BQ25GO0lBQUMsU0FBQUMsR0FBQTtNQUFBNkIsVUFBQSxDQUFBNUIsQ0FBQSxDQUFBRCxHQUFBO0lBQUE7TUFBQTZCLFVBQUEsQ0FBQTNCLENBQUE7SUFBQTtFQUNMO0VBRUEsSUFBSTtJQUNBLE9BQU83QyxJQUFJLENBQUNnRSxtQkFBbUIsQ0FBQztFQUNwQyxDQUFDLENBQUMsT0FBT3RELEtBQVUsRUFBRTtJQUNqQixNQUFNLElBQUkyRCxLQUFLLDhCQUFBbkUsTUFBQSxDQUE4QlEsS0FBSyxDQUFDUCxPQUFPLENBQUUsQ0FBQztFQUNqRTtBQUNKO0FBRUE7Ozs7OztBQU1NLFNBQVVpQiw0QkFBNEJBLENBQUM3QyxVQUFrQixFQUFFSyxNQUFXO0VBQ3hFLElBQUk7SUFDQTtJQUNBLElBQU04RixJQUFJLEdBQUcsSUFBSUMsUUFBUSxDQUFDLEtBQUssWUFBQXpFLE1BQUEsQ0FBWTNCLFVBQVUsQ0FBRSxDQUFDO0lBQ3hELE9BQU9tRyxJQUFJLENBQUM5RixNQUFNLENBQUM7RUFDdkIsQ0FBQyxDQUFDLE9BQU84QixLQUFVLEVBQUU7SUFDakIsTUFBTSxJQUFJMkQsS0FBSyxpQ0FBQW5FLE1BQUEsQ0FBaUNRLEtBQUssQ0FBQ1AsT0FBTyxDQUFFLENBQUM7RUFDcEU7QUFDSiIsInNvdXJjZXMiOlsid2VicGFjazovL3J0dHktd2VicGFjay8uL3NyYy90cy91dGlscy9qcS11dGlscy50cz82MzNjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog0KPRgtC40LvQuNGC0Ysg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSBKU09OIChqcSlcbiAqL1xuXG4vKipcbiAqINCS0YvQv9C+0LvQvdGP0LXRgiDQutC+0LzQsNC90LTRgyBqcVxuICogQHBhcmFtIGFyZ3MgLSDQsNGA0LPRg9C80LXQvdGC0Ysg0LrQvtC80LDQvdC00YsganFcbiAqIEByZXR1cm5zINGA0LXQt9GD0LvRjNGC0LDRgiDQstGL0L/QvtC70L3QtdC90LjRj1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUpxKGFyZ3M6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8g0JXRgdC70LggYXJncyDQvdCw0YfQuNC90LDQtdGC0YHRjyDRgSAnanEnLCDRg9Cx0LjRgNCw0LXQvCDRjdGC0L5cbiAgICAgICAgbGV0IGNvbW1hbmRMaW5lID0gYXJncztcbiAgICAgICAgaWYgKGNvbW1hbmRMaW5lLnN0YXJ0c1dpdGgoJ2pxJykpIHtcbiAgICAgICAgICAgIGNvbW1hbmRMaW5lID0gY29tbWFuZExpbmUuc3Vic3RyaW5nKDIpLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8g0J/QsNGA0YHQuNC8INCw0YDQs9GD0LzQtdC90YLRi1xuICAgICAgICBjb25zdCBwYXJ0cyA9IGNvbW1hbmRMaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICBcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCB8fCBwYXJ0c1swXSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRKcUhlbHAoKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IGV4cHJlc3Npb24gPSAnLic7XG4gICAgICAgIGxldCBvYmplY3RJbnB1dCA9ICcnO1xuICAgICAgICBcbiAgICAgICAgLy8g0JjRidC10Lwg0L/QvtGB0LvQtdC00L3QuNC5INCy0LDQu9C40LTQvdGL0LkgSlNPTiDQvtCx0YrQtdC60YIg0LIg0LDRgNCz0YPQvNC10L3RgtCw0YVcbiAgICAgICAgbGV0IGxhc3RWYWxpZEpzb25JbmRleCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgSlNPTi5wYXJzZShwYXJ0c1tpXSk7XG4gICAgICAgICAgICAgICAgbGFzdFZhbGlkSnNvbkluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyDQn9GA0L7QtNC+0LvQttCw0LXQvCDQv9C+0LjRgdC6XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChsYXN0VmFsaWRKc29uSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAvLyDQldGB0LvQuCDQvdC1INC90LDRiNC70LggSlNPTiwg0L/RgNC+0LHRg9C10Lwg0LLQtdGB0YwgaW5wdXQg0LrQsNC6IEphdmFTY3JpcHRcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0gZXZhbChjb21tYW5kTGluZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NKcUV4cHJlc3Npb24oJy4nLCBvYmplY3QpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXZhbEVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYEVycm9yOiBDb3VsZCBub3QgcGFyc2UgaW5wdXQgYXMgSlNPTiBvciBKYXZhU2NyaXB0IGV4cHJlc3Npb24uXFxuRXZhbCBlcnJvcjogJHtldmFsRXJyb3IubWVzc2FnZX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyDQoNCw0LfQtNC10LvRj9C10Lwg0L3QsCDQstGL0YDQsNC20LXQvdC40LUg0Lgg0L7QsdGK0LXQutGCXG4gICAgICAgIGlmIChsYXN0VmFsaWRKc29uSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIC8vINCi0L7Qu9GM0LrQviDQvtCx0YrQtdC60YJcbiAgICAgICAgICAgIG9iamVjdElucHV0ID0gcGFydHNbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDQktGL0YDQsNC20LXQvdC40LUgKyDQvtCx0YrQtdC60YJcbiAgICAgICAgICAgIGV4cHJlc3Npb24gPSBwYXJ0cy5zbGljZSgwLCBsYXN0VmFsaWRKc29uSW5kZXgpLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIG9iamVjdElucHV0ID0gcGFydHNbbGFzdFZhbGlkSnNvbkluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8g0J/QsNGA0YHQuNC8INC+0LHRitC10LrRglxuICAgICAgICBsZXQgb2JqZWN0OiBhbnk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvYmplY3QgPSBKU09OLnBhcnNlKG9iamVjdElucHV0KTtcbiAgICAgICAgfSBjYXRjaCAoanNvbkVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIHJldHVybiBgRXJyb3I6IENvdWxkIG5vdCBwYXJzZSBvYmplY3QgYXMgSlNPTjogJHtqc29uRXJyb3IubWVzc2FnZX1gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyDQktGL0L/QvtC70L3Rj9C10LwganEg0LLRi9GA0LDQttC10L3QuNC1XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHByb2Nlc3NKcUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgb2JqZWN0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICByZXR1cm4gYEVycm9yIGV4ZWN1dGluZyBqcTogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgfVxufVxuXG4vKipcbiAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0L/RgNCw0LLQutGDINC/0L4g0LrQvtC80LDQvdC00LUganFcbiAqIEByZXR1cm5zINGB0L/RgNCw0LLQutCwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRKcUhlbHAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGpxIC0gSlNPTiBwcm9jZXNzb3JcblxuVXNhZ2U6XG4gIGpxIDxleHByZXNzaW9uPiBbb2JqZWN0XSAgICBQcm9jZXNzIG9iamVjdCB3aXRoIGV4cHJlc3Npb25cbiAganEgPG9iamVjdD4gICAgICAgICAgICAgICAgIFByZXR0eSBwcmludCBvYmplY3QgKGRlZmF1bHQgZXhwcmVzc2lvbjogLilcblxuRXhwcmVzc2lvbnM6XG4gIC4gICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGl0eSAob3V0cHV0IHVuY2hhbmdlZClcbiAgLmtleSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgYWNjZXNzXG4gIC5rZXkxLmtleTIgICAgICAgICAgICAgICAgICBOZXN0ZWQga2V5IGFjY2Vzc1xuICAuWzBdICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkgaW5kZXggYWNjZXNzXG4gIC5bMTozXSAgICAgICAgICAgICAgICAgICAgICBBcnJheSBzbGljZVxuICAuW10gICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkgaXRlcmF0aW9uXG4gIC5rZXlbXSAgICAgICAgICAgICAgICAgICAgICBBcnJheSBpdGVyYXRpb24gb24gb2JqZWN0IGtleVxuICAuIHwgLmtleSAgICAgICAgICAgICAgICAgICAgUGlwZSBvcGVyYXRvclxuICAua2V5MSArIC5rZXkyICAgICAgICAgICAgICAgQWRkaXRpb25cbiAgLmtleTEgKiAua2V5MiAgICAgICAgICAgICAgIE11bHRpcGxpY2F0aW9uXG4gIC5rZXkxID09IC5rZXkyICAgICAgICAgICAgICBFcXVhbGl0eSBjb21wYXJpc29uXG4gIC5rZXkxICE9IC5rZXkyICAgICAgICAgICAgICBJbmVxdWFsaXR5IGNvbXBhcmlzb25cbiAgLmtleSA+IDUgICAgICAgICAgICAgICAgICAgIEdyZWF0ZXIgdGhhblxuICAua2V5IDwgNSAgICAgICAgICAgICAgICAgICAgTGVzcyB0aGFuXG4gIC5rZXkgPj0gNSAgICAgICAgICAgICAgICAgICBHcmVhdGVyIHRoYW4gb3IgZXF1YWxcbiAgLmtleSA8PSA1ICAgICAgICAgICAgICAgICAgIExlc3MgdGhhbiBvciBlcXVhbFxuICAua2V5IGFuZCAua2V5MiAgICAgICAgICAgICAgTG9naWNhbCBBTkRcbiAgLmtleSBvciAua2V5MiAgICAgICAgICAgICAgIExvZ2ljYWwgT1JcbiAgbm90IC5rZXkgICAgICAgICAgICAgICAgICAgIExvZ2ljYWwgTk9UXG4gIC5rZXkgfCBsZW5ndGggICAgICAgICAgICAgICBGdW5jdGlvbjogbGVuZ3RoXG4gIC5rZXkgfCBrZXlzICAgICAgICAgICAgICAgICBGdW5jdGlvbjoga2V5c1xuICAua2V5IHwgdmFsdWVzICAgICAgICAgICAgICAgRnVuY3Rpb246IHZhbHVlc1xuICAua2V5IHwgb2tleXMgICAgICAgICAgICAgICAgRnVuY3Rpb246IG9rZXlzIChvYmplY3Qga2V5cylcbiAgLmtleSB8IGhhcyhcInN1YmtleVwiKSAgICAgICAgRnVuY3Rpb246IGhhc1xuICAua2V5IHwgdHlwZSAgICAgICAgICAgICAgICAgRnVuY3Rpb246IHR5cGVcbiAgLmtleSB8IHRvc3RyaW5nICAgICAgICAgICAgIEZ1bmN0aW9uOiB0b3N0cmluZ1xuICAua2V5IHwgdG9udW1iZXIgICAgICAgICAgICAgRnVuY3Rpb246IHRvbnVtYmVyXG4gIC5rZXkgfCBzb3J0ICAgICAgICAgICAgICAgICBGdW5jdGlvbjogc29ydFxuICAua2V5IHwgcmV2ZXJzZSAgICAgICAgICAgICAgRnVuY3Rpb246IHJldmVyc2VcbiAgLmtleSB8IHVuaXF1ZSAgICAgICAgICAgICAgIEZ1bmN0aW9uOiB1bmlxdWVcbiAgLmtleSB8IG1hcCguc3Via2V5KSAgICAgICAgIEZ1bmN0aW9uOiBtYXBcbiAgLmtleSB8IHNlbGVjdCguc3Via2V5ID4gNSkgIEZ1bmN0aW9uOiBzZWxlY3RcbiAgLmtleSB8IGdyb3VwX2J5KC5jYXRlZ29yeSkgIEZ1bmN0aW9uOiBncm91cF9ieVxuXG5FeGFtcGxlczpcbiAganEgJ3tcIm5hbWVcIjogXCJKb2huXCIsIFwiYWdlXCI6IDMwfScgICAgICAgICAgICAgICAgICAgICMgUHJldHR5IHByaW50XG4gIGpxIC5uYW1lICd7XCJuYW1lXCI6IFwiSm9oblwiLCBcImFnZVwiOiAzMH0nICAgICAgICAgICAgICAjIEdldCBuYW1lXG4gIGpxIC5hZ2UgJ3tcIm5hbWVcIjogXCJKb2huXCIsIFwiYWdlXCI6IDMwfScgICAgICAgICAgICAgICAjIEdldCBhZ2VcbiAganEgJy5bMF0nICdbMSwgMiwgMywgNCwgNV0nICAgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgZmlyc3QgZWxlbWVudFxuICBqcSAnLlsxOjNdJyAnWzEsIDIsIDMsIDQsIDVdJyAgICAgICAgICAgICAgICAgICAgICAjIEdldCBzbGljZVxuICBqcSAnLnVzZXJzW10nICd7XCJ1c2Vyc1wiOiBbe1wibmFtZVwiOiBcIkpvaG5cIn0sIHtcIm5hbWVcIjogXCJKYW5lXCJ9XX0nICAjIEl0ZXJhdGUgYXJyYXlcbiAganEgJy51c2Vyc1tdLm5hbWUnICd7XCJ1c2Vyc1wiOiBbe1wibmFtZVwiOiBcIkpvaG5cIn0sIHtcIm5hbWVcIjogXCJKYW5lXCJ9XX0nICAjIEdldCBuYW1lc1xuICBqcSAnLnVzZXJzIHwgbWFwKC5uYW1lKScgJ3tcInVzZXJzXCI6IFt7XCJuYW1lXCI6IFwiSm9oblwifSwge1wibmFtZVwiOiBcIkphbmVcIn1dfScgICMgTWFwIG5hbWVzXG4gIGpxICcudXNlcnMgfCBzZWxlY3QoLmFnZSA+IDI1KScgJ3tcInVzZXJzXCI6IFt7XCJuYW1lXCI6IFwiSm9oblwiLCBcImFnZVwiOiAzMH0sIHtcIm5hbWVcIjogXCJKYW5lXCIsIFwiYWdlXCI6IDIwfV19JyAgIyBGaWx0ZXJcbiAganEgJy5jb3VudCArIDEnICd7XCJjb3VudFwiOiA1fScgICAgICAgICAgICAgICAgICAgICAgIyBNYXRoIG9wZXJhdGlvblxuICBqcSAnLml0ZW1zIHwgbGVuZ3RoJyAne1wiaXRlbXNcIjogWzEsIDIsIDNdfScgICAgICAgICAjIEFycmF5IGxlbmd0aFxuICBqcSAnLmRhdGEgfCBrZXlzJyAne1wiZGF0YVwiOiB7XCJuYW1lXCI6IFwiSm9oblwiLCBcImFnZVwiOiAzMH19JyAgIyBHZXQga2V5c1xuICBqcSAnLmRhdGEgfCBva2V5cycgJ3tcImRhdGFcIjoge1wibmFtZVwiOiBcIkpvaG5cIiwgXCJhZ2VcIjogMzB9fScgICMgR2V0IG9iamVjdCBrZXlzXG4gIGpxICcuZGF0YSB8IHZhbHVlcycgJ3tcImRhdGFcIjoge1wibmFtZVwiOiBcIkpvaG5cIiwgXCJhZ2VcIjogMzB9fScgICMgR2V0IHZhbHVlc1xuXG5KYXZhU2NyaXB0IG9iamVjdHMgY2FuIGFsc28gYmUgdXNlZDpcbiAganEgLmxlbmd0aCBbMSwgMiwgMywgNCwgNV0gICAgICAgICAgICAgICAgICAgICAgICAgICMgQXJyYXkgbGVuZ3RoXG4gIGpxIC5uYW1lIHtuYW1lOiBcIkpvaG5cIiwgYWdlOiAzMH0gICAgICAgICAgICAgICAgICAgICAjIE9iamVjdCBwcm9wZXJ0eVxuICBqcSAudG9TdHJpbmcoKSBuZXcgRGF0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1ldGhvZCBjYWxsYDtcbn1cblxuLyoqXG4gKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIganEg0LLRi9GA0LDQttC10L3QuNC1XG4gKiBAcGFyYW0gZXhwcmVzc2lvbiAtIGpxINCy0YvRgNCw0LbQtdC90LjQtVxuICogQHBhcmFtIG9iamVjdCAtINC+0LHRitC10LrRgiDQtNC70Y8g0L7QsdGA0LDQsdC+0YLQutC4XG4gKiBAcmV0dXJucyDRgNC10LfRg9C70YzRgtCw0YJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NKcUV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nLCBvYmplY3Q6IGFueSk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8g0KPQv9GA0L7RidC10L3QvdCw0Y8g0YDQtdCw0LvQuNC30LDRhtC40Y8ganEg0LTQu9GPINC+0YHQvdC+0LLQvdGL0YUg0L7Qv9C10YDQsNGG0LjQuVxuICAgICAgICBjb25zdCByZXN1bHQgPSBldmFsdWF0ZUpxRXhwcmVzc2lvbihleHByZXNzaW9uLCBvYmplY3QpO1xuICAgICAgICBcbiAgICAgICAgLy8g0KTQvtGA0LzQsNGC0LjRgNGD0LXQvCDRgNC10LfRg9C70YzRgtCw0YJcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICByZXR1cm4gYEVycm9yIHByb2Nlc3NpbmcganEgZXhwcmVzc2lvbjogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgfVxufVxuXG4vKipcbiAqINCS0YvQv9C+0LvQvdGP0LXRgiBqcSDQstGL0YDQsNC20LXQvdC40LVcbiAqIEBwYXJhbSBleHByZXNzaW9uIC0ganEg0LLRi9GA0LDQttC10L3QuNC1XG4gKiBAcGFyYW0gb2JqZWN0IC0g0L7QsdGK0LXQutGCINC00LvRjyDQvtCx0YDQsNCx0L7RgtC60LhcbiAqIEByZXR1cm5zINGA0LXQt9GD0LvRjNGC0LDRglxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVKcUV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nLCBvYmplY3Q6IGFueSk6IGFueSB7XG4gICAgLy8g0KPQsdC40YDQsNC10Lwg0LvQuNGI0L3QuNC1INC/0YDQvtCx0LXQu9GLINC4INC60LDQstGL0YfQutC4XG4gICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24udHJpbSgpLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpO1xuICAgIFxuICAgIC8vINCV0YHQu9C4INCy0YvRgNCw0LbQtdC90LjQtSDQv9GD0YHRgtC+0LUg0LjQu9C4ICcuJywg0LLQvtC30LLRgNCw0YnQsNC10Lwg0L7QsdGK0LXQutGCINC60LDQuiDQtdGB0YLRjFxuICAgIGlmICghZXhwcmVzc2lvbiB8fCBleHByZXNzaW9uID09PSAnLicpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG4gICAgXG4gICAgLy8g0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdC8INGA0LDQt9C70LjRh9C90YvQtSDRgtC40L/RiyDQstGL0YDQsNC20LXQvdC40LlcbiAgICBpZiAoZXhwcmVzc2lvbi5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NEb3RFeHByZXNzaW9uKGV4cHJlc3Npb24sIG9iamVjdCk7XG4gICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmluY2x1ZGVzKCd8JykpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NQaXBlRXhwcmVzc2lvbihleHByZXNzaW9uLCBvYmplY3QpO1xuICAgIH0gZWxzZSBpZiAoaXNKcUZ1bmN0aW9uKGV4cHJlc3Npb24pKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzSnFGdW5jdGlvbihleHByZXNzaW9uLCBvYmplY3QpO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5pbmNsdWRlcygnKycpIHx8IGV4cHJlc3Npb24uaW5jbHVkZXMoJy0nKSB8fCBcbiAgICAgICAgICAgICAgIGV4cHJlc3Npb24uaW5jbHVkZXMoJyonKSB8fCBleHByZXNzaW9uLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NNYXRoRXhwcmVzc2lvbihleHByZXNzaW9uLCBvYmplY3QpO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5pbmNsdWRlcygnPT0nKSB8fCBleHByZXNzaW9uLmluY2x1ZGVzKCchPScpIHx8XG4gICAgICAgICAgICAgICBleHByZXNzaW9uLmluY2x1ZGVzKCc+JykgfHwgZXhwcmVzc2lvbi5pbmNsdWRlcygnPCcpIHx8XG4gICAgICAgICAgICAgICBleHByZXNzaW9uLmluY2x1ZGVzKCc+PScpIHx8IGV4cHJlc3Npb24uaW5jbHVkZXMoJzw9JykpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NDb21wYXJpc29uRXhwcmVzc2lvbihleHByZXNzaW9uLCBvYmplY3QpO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5pbmNsdWRlcygnIGFuZCAnKSB8fCBleHByZXNzaW9uLmluY2x1ZGVzKCcgb3IgJykgfHxcbiAgICAgICAgICAgICAgIGV4cHJlc3Npb24uc3RhcnRzV2l0aCgnbm90ICcpKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzTG9naWNhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgb2JqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyDQn9GL0YLQsNC10LzRgdGPINCy0YvQv9C+0LvQvdC40YLRjCDQutCw0LogSmF2YVNjcmlwdCDQstGL0YDQsNC20LXQvdC40LVcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlSmF2YVNjcmlwdEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgb2JqZWN0KTtcbiAgICB9XG59XG5cbi8qKlxuICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCINCy0YvRgNCw0LbQtdC90LjRjyDRgSDRgtC+0YfQutC+0LkgKNC00L7RgdGC0YPQvyDQuiDRgdCy0L7QudGB0YLQstCw0LwpXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiAtINCy0YvRgNCw0LbQtdC90LjQtVxuICogQHBhcmFtIG9iamVjdCAtINC+0LHRitC10LrRglxuICogQHJldHVybnMg0YDQtdC30YPQu9GM0YLQsNGCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzRG90RXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcsIG9iamVjdDogYW55KTogYW55IHtcbiAgICBjb25zdCBwYXJ0cyA9IGV4cHJlc3Npb24uc3BsaXQoJy4nKTtcbiAgICBsZXQgY3VycmVudCA9IG9iamVjdDtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgXG4gICAgICAgIGlmIChwYXJ0ID09PSAnJykgY29udGludWU7XG4gICAgICAgIFxuICAgICAgICAvLyDQn9GA0L7QstC10YDRj9C10LwsINGP0LLQu9GP0LXRgtGB0Y8g0LvQuCDRjdGC0L4g0YTRg9C90LrRhtC40LXQuSBqcVxuICAgICAgICBpZiAoaXNKcUZ1bmN0aW9uKHBhcnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc0pxRnVuY3Rpb24ocGFydCwgY3VycmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vINCe0LHRgNCw0LHQvtGC0LrQsCDQuNC90LTQtdC60YHQvtCyINC80LDRgdGB0LjQstCwXG4gICAgICAgIGlmIChwYXJ0LmluY2x1ZGVzKCdbJykgJiYgcGFydC5pbmNsdWRlcygnXScpKSB7XG4gICAgICAgICAgICBjb25zdCBicmFja2V0TWF0Y2ggPSBwYXJ0Lm1hdGNoKC9eKFteXFxbXSspXFxbKFteXFxdXSspXFxdJC8pO1xuICAgICAgICAgICAgaWYgKGJyYWNrZXRNYXRjaCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGJyYWNrZXRNYXRjaFsxXTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGJyYWNrZXRNYXRjaFsyXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICYmIGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ICYmIEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4LmluY2x1ZGVzKCc6JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vINCh0YDQtdC3INC80LDRgdGB0LjQstCwXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbGljZVBhcnRzID0gaW5kZXguc3BsaXQoJzonKS5tYXAocCA9PiBwLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IHNsaWNlUGFydHNbMF0gPyBwYXJzZUludChzbGljZVBhcnRzWzBdKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBzbGljZVBhcnRzWzFdID8gcGFyc2VJbnQoc2xpY2VQYXJ0c1sxXSkgOiBjdXJyZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8g0JjQvdC00LXQutGBINGN0LvQtdC80LXQvdGC0LBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oaWR4KSAmJiBpZHggPj0gMCAmJiBpZHggPCBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJ1tdJykge1xuICAgICAgICAgICAgLy8g0JjRgtC10YDQsNGG0LjRjyDQv9C+INC80LDRgdGB0LjQstGDXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDQntCx0YvRh9C90YvQuSDQtNC+0YHRgtGD0L8g0Log0YHQstC+0LnRgdGC0LLRg1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnICYmIHBhcnQgaW4gY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjdXJyZW50O1xufVxuXG4vKipcbiAqINCe0LHRgNCw0LHQsNGC0YvQstCw0LXRgiDQstGL0YDQsNC20LXQvdC40Y8g0YEgcGlwZSDQvtC/0LXRgNCw0YLQvtGA0L7QvFxuICogQHBhcmFtIGV4cHJlc3Npb24gLSDQstGL0YDQsNC20LXQvdC40LVcbiAqIEBwYXJhbSBvYmplY3QgLSDQvtCx0YrQtdC60YJcbiAqIEByZXR1cm5zINGA0LXQt9GD0LvRjNGC0LDRglxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1BpcGVFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZywgb2JqZWN0OiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHBhcnRzID0gZXhwcmVzc2lvbi5zcGxpdCgnfCcpLm1hcChwID0+IHAudHJpbSgpKTtcbiAgICBsZXQgY3VycmVudCA9IG9iamVjdDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgaWYgKHBhcnQuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgICBjdXJyZW50ID0gcHJvY2Vzc0RvdEV4cHJlc3Npb24ocGFydCwgY3VycmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNKcUZ1bmN0aW9uKHBhcnQpKSB7XG4gICAgICAgICAgICBjdXJyZW50ID0gcHJvY2Vzc0pxRnVuY3Rpb24ocGFydCwgY3VycmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50ID0gZXZhbHVhdGVKYXZhU2NyaXB0RXhwcmVzc2lvbihwYXJ0LCBjdXJyZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiDQn9GA0L7QstC10YDRj9C10YIsINGP0LLQu9GP0LXRgtGB0Y8g0LvQuCDQstGL0YDQsNC20LXQvdC40LUg0LLRgdGC0YDQvtC10L3QvdC+0Lkg0YTRg9C90LrRhtC40LXQuSBqcVxuICogQHBhcmFtIGV4cHJlc3Npb24gLSDQstGL0YDQsNC20LXQvdC40LVcbiAqIEByZXR1cm5zIHRydWUg0LXRgdC70Lgg0Y3RgtC+INCy0YHRgtGA0L7QtdC90L3QsNGPINGE0YPQvdC60YbQuNGPXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0pxRnVuY3Rpb24oZXhwcmVzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZnVuY3Rpb25zID0gWydsZW5ndGgnLCAna2V5cycsICd2YWx1ZXMnLCAnb2tleXMnLCAnaGFzJywgJ3R5cGUnLCAndG9zdHJpbmcnLCAndG9udW1iZXInLCAnc29ydCcsICdyZXZlcnNlJywgJ3VuaXF1ZScsICdtYXAnLCAnc2VsZWN0JywgJ2dyb3VwX2J5J107XG4gICAgcmV0dXJuIGZ1bmN0aW9ucy5pbmNsdWRlcyhleHByZXNzaW9uLnRyaW0oKSk7XG59XG5cbi8qKlxuICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCINCy0YHRgtGA0L7QtdC90L3Ri9C1INGE0YPQvdC60YbQuNC4IGpxXG4gKiBAcGFyYW0gZnVuY3Rpb25OYW1lIC0g0L3QsNC30LLQsNC90LjQtSDRhNGD0L3QutGG0LjQuFxuICogQHBhcmFtIG9iamVjdCAtINC+0LHRitC10LrRgiDQtNC70Y8g0L7QsdGA0LDQsdC+0YLQutC4XG4gKiBAcmV0dXJucyDRgNC10LfRg9C70YzRgtCw0YJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NKcUZ1bmN0aW9uKGZ1bmN0aW9uTmFtZTogc3RyaW5nLCBvYmplY3Q6IGFueSk6IGFueSB7XG4gICAgc3dpdGNoIChmdW5jdGlvbk5hbWUpIHtcbiAgICAgICAgY2FzZSAnbGVuZ3RoJzpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Lmxlbmd0aDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkubGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICBcbiAgICAgICAgY2FzZSAna2V5cyc6XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICBjYXNlICd2YWx1ZXMnOlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMob2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICBjYXNlICdva2V5cyc6XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICBjYXNlICdoYXMnOlxuICAgICAgICAgICAgLy8g0JTQu9GPIGhhcyDQvdGD0LbQtdC9INC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0Lkg0L/QsNGA0LDQvNC10YLRgCwg0LLQvtC30LLRgNCw0YnQsNC10Lwg0YTRg9C90LrRhtC40Y5cbiAgICAgICAgICAgIHJldHVybiAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkgaW4gb2JqZWN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgIGNhc2UgJ3R5cGUnOlxuICAgICAgICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgcmV0dXJuICdudWxsJztcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHJldHVybiAnYXJyYXknO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnKSByZXR1cm4gJ29iamVjdCc7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIG9iamVjdDtcbiAgICAgICAgICAgIFxuICAgICAgICBjYXNlICd0b3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKG9iamVjdCk7XG4gICAgICAgICAgICBcbiAgICAgICAgY2FzZSAndG9udW1iZXInOlxuICAgICAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKG9iamVjdCk7XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4obnVtKSA/IG51bGwgOiBudW07XG4gICAgICAgICAgICBcbiAgICAgICAgY2FzZSAnc29ydCc6XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5vYmplY3RdLnNvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICAgICAgICBcbiAgICAgICAgY2FzZSAncmV2ZXJzZSc6XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5vYmplY3RdLnJldmVyc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICAgICAgICBcbiAgICAgICAgY2FzZSAndW5pcXVlJzpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWy4uLm5ldyBTZXQob2JqZWN0KV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICAgICAgXG4gICAgICAgIGNhc2UgJ21hcCc6XG4gICAgICAgICAgICAvLyDQlNC70Y8gbWFwINC90YPQttC10L0g0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQuSDQv9Cw0YDQsNC80LXRgtGALCDQstC+0LfQstGA0LDRidCw0LXQvCDRhNGD0L3QutGG0LjRjlxuICAgICAgICAgICAgcmV0dXJuIChleHByZXNzaW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QubWFwKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vINCj0L/RgNC+0YnQtdC90L3QsNGPINC+0LHRgNCw0LHQvtGC0LrQsCDQstGL0YDQsNC20LXQvdC40Y8g0LTQu9GPIG1hcFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24uc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NEb3RFeHByZXNzaW9uKGV4cHJlc3Npb24sIGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFxuICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgLy8g0JTQu9GPIHNlbGVjdCDQvdGD0LbQtdC9INC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0Lkg0L/QsNGA0LDQvNC10YLRgCwg0LLQvtC30LLRgNCw0YnQsNC10Lwg0YTRg9C90LrRhtC40Y5cbiAgICAgICAgICAgIHJldHVybiAoZXhwcmVzc2lvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDQo9C/0YDQvtGJ0LXQvdC90LDRjyDQvtCx0YDQsNCx0L7RgtC60LAg0LLRi9GA0LDQttC10L3QuNGPINC00LvRjyBzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHByZXNzaW9uLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvY2Vzc0RvdEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFxuICAgICAgICBjYXNlICdncm91cF9ieSc6XG4gICAgICAgICAgICAvLyDQlNC70Y8gZ3JvdXBfYnkg0L3Rg9C20LXQvSDQtNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C5INC/0LDRgNCw0LzQtdGC0YAsINCy0L7Qt9Cy0YDQsNGJ0LDQtdC8INGE0YPQvdC60YbQuNGOXG4gICAgICAgICAgICByZXR1cm4gKGV4cHJlc3Npb246IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBzOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBLZXkgPSBwcm9jZXNzRG90RXhwcmVzc2lvbihleHByZXNzaW9uLCBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JvdXBzW2dyb3VwS2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tncm91cEtleV0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tncm91cEtleV0ucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cbn1cblxuLyoqXG4gKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIg0LzQsNGC0LXQvNCw0YLQuNGH0LXRgdC60LjQtSDQstGL0YDQsNC20LXQvdC40Y9cbiAqIEBwYXJhbSBleHByZXNzaW9uIC0g0LLRi9GA0LDQttC10L3QuNC1XG4gKiBAcGFyYW0gb2JqZWN0IC0g0L7QsdGK0LXQutGCXG4gKiBAcmV0dXJucyDRgNC10LfRg9C70YzRgtCw0YJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NNYXRoRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcsIG9iamVjdDogYW55KTogYW55IHtcbiAgICAvLyDQl9Cw0LzQtdC90Y/QtdC8INGB0YHRi9C70LrQuCDQvdCwINGB0LLQvtC50YHRgtCy0LAg0L3QsCDQuNGFINC30L3QsNGH0LXQvdC40Y9cbiAgICBsZXQgcHJvY2Vzc2VkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgY29uc3QgcHJvcGVydHlNYXRjaGVzID0gZXhwcmVzc2lvbi5tYXRjaCgvXFwuXFx3Ky9nKTtcbiAgICBcbiAgICBpZiAocHJvcGVydHlNYXRjaGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgcHJvcGVydHlNYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHByb2Nlc3NEb3RFeHByZXNzaW9uKG1hdGNoLCBvYmplY3QpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRFeHByZXNzaW9uID0gcHJvY2Vzc2VkRXhwcmVzc2lvbi5yZXBsYWNlKG1hdGNoLCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZhbChwcm9jZXNzZWRFeHByZXNzaW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWF0aCBleHByZXNzaW9uIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxufVxuXG4vKipcbiAqINCe0LHRgNCw0LHQsNGC0YvQstCw0LXRgiDQstGL0YDQsNC20LXQvdC40Y8g0YHRgNCw0LLQvdC10L3QuNGPXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiAtINCy0YvRgNCw0LbQtdC90LjQtVxuICogQHBhcmFtIG9iamVjdCAtINC+0LHRitC10LrRglxuICogQHJldHVybnMg0YDQtdC30YPQu9GM0YLQsNGCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ29tcGFyaXNvbkV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nLCBvYmplY3Q6IGFueSk6IGFueSB7XG4gICAgLy8g0JfQsNC80LXQvdGP0LXQvCDRgdGB0YvQu9C60Lgg0L3QsCDRgdCy0L7QudGB0YLQstCwINC90LAg0LjRhSDQt9C90LDRh9C10L3QuNGPXG4gICAgbGV0IHByb2Nlc3NlZEV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIGNvbnN0IHByb3BlcnR5TWF0Y2hlcyA9IGV4cHJlc3Npb24ubWF0Y2goL1xcLlxcdysvZyk7XG4gICAgXG4gICAgaWYgKHByb3BlcnR5TWF0Y2hlcykge1xuICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHByb3BlcnR5TWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwcm9jZXNzRG90RXhwcmVzc2lvbihtYXRjaCwgb2JqZWN0KTtcbiAgICAgICAgICAgIHByb2Nlc3NlZEV4cHJlc3Npb24gPSBwcm9jZXNzZWRFeHByZXNzaW9uLnJlcGxhY2UobWF0Y2gsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2YWwocHJvY2Vzc2VkRXhwcmVzc2lvbik7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbXBhcmlzb24gZXhwcmVzc2lvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbn1cblxuLyoqXG4gKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIg0LvQvtCz0LjRh9C10YHQutC40LUg0LLRi9GA0LDQttC10L3QuNGPXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiAtINCy0YvRgNCw0LbQtdC90LjQtVxuICogQHBhcmFtIG9iamVjdCAtINC+0LHRitC10LrRglxuICogQHJldHVybnMg0YDQtdC30YPQu9GM0YLQsNGCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzTG9naWNhbEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nLCBvYmplY3Q6IGFueSk6IGFueSB7XG4gICAgLy8g0JfQsNC80LXQvdGP0LXQvCDRgdGB0YvQu9C60Lgg0L3QsCDRgdCy0L7QudGB0YLQstCwINC90LAg0LjRhSDQt9C90LDRh9C10L3QuNGPXG4gICAgbGV0IHByb2Nlc3NlZEV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIGNvbnN0IHByb3BlcnR5TWF0Y2hlcyA9IGV4cHJlc3Npb24ubWF0Y2goL1xcLlxcdysvZyk7XG4gICAgXG4gICAgaWYgKHByb3BlcnR5TWF0Y2hlcykge1xuICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHByb3BlcnR5TWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwcm9jZXNzRG90RXhwcmVzc2lvbihtYXRjaCwgb2JqZWN0KTtcbiAgICAgICAgICAgIHByb2Nlc3NlZEV4cHJlc3Npb24gPSBwcm9jZXNzZWRFeHByZXNzaW9uLnJlcGxhY2UobWF0Y2gsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2YWwocHJvY2Vzc2VkRXhwcmVzc2lvbik7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExvZ2ljYWwgZXhwcmVzc2lvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbn1cblxuLyoqXG4gKiDQktGL0L/QvtC70L3Rj9C10YIgSmF2YVNjcmlwdCDQstGL0YDQsNC20LXQvdC40LVcbiAqIEBwYXJhbSBleHByZXNzaW9uIC0g0LLRi9GA0LDQttC10L3QuNC1XG4gKiBAcGFyYW0gb2JqZWN0IC0g0L7QsdGK0LXQutGCXG4gKiBAcmV0dXJucyDRgNC10LfRg9C70YzRgtCw0YJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlSmF2YVNjcmlwdEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nLCBvYmplY3Q6IGFueSk6IGFueSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8g0KHQvtC30LTQsNC10Lwg0YTRg9C90LrRhtC40Y4g0YEg0LTQvtGB0YLRg9C/0L7QvCDQuiDQvtCx0YrQtdC60YLRg1xuICAgICAgICBjb25zdCBmdW5jID0gbmV3IEZ1bmN0aW9uKCdvYmonLCBgcmV0dXJuICR7ZXhwcmVzc2lvbn1gKTtcbiAgICAgICAgcmV0dXJuIGZ1bmMob2JqZWN0KTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSmF2YVNjcmlwdCBleHByZXNzaW9uIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbImV4ZWN1dGVKcSIsIl94IiwiX2V4ZWN1dGVKcSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3IiLCJtIiwiX2NhbGxlZSIsImFyZ3MiLCJjb21tYW5kTGluZSIsInBhcnRzIiwiZXhwcmVzc2lvbiIsIm9iamVjdElucHV0IiwibGFzdFZhbGlkSnNvbkluZGV4IiwiaSIsIl9vYmplY3QiLCJvYmplY3QiLCJyZXN1bHQiLCJfdCIsIl90MiIsIl90MyIsIl90NCIsInciLCJfY29udGV4dCIsInAiLCJuIiwic3RhcnRzV2l0aCIsInN1YnN0cmluZyIsInRyaW0iLCJzcGxpdCIsImxlbmd0aCIsImEiLCJnZXRKcUhlbHAiLCJKU09OIiwicGFyc2UiLCJ2IiwiZXZhbCIsInByb2Nlc3NKcUV4cHJlc3Npb24iLCJjb25jYXQiLCJtZXNzYWdlIiwic2xpY2UiLCJqb2luIiwiZXZhbHVhdGVKcUV4cHJlc3Npb24iLCJfdHlwZW9mIiwic3RyaW5naWZ5IiwiU3RyaW5nIiwiZXJyb3IiLCJyZXBsYWNlIiwicHJvY2Vzc0RvdEV4cHJlc3Npb24iLCJpbmNsdWRlcyIsInByb2Nlc3NQaXBlRXhwcmVzc2lvbiIsImlzSnFGdW5jdGlvbiIsInByb2Nlc3NKcUZ1bmN0aW9uIiwicHJvY2Vzc01hdGhFeHByZXNzaW9uIiwicHJvY2Vzc0NvbXBhcmlzb25FeHByZXNzaW9uIiwicHJvY2Vzc0xvZ2ljYWxFeHByZXNzaW9uIiwiZXZhbHVhdGVKYXZhU2NyaXB0RXhwcmVzc2lvbiIsImN1cnJlbnQiLCJwYXJ0IiwiYnJhY2tldE1hdGNoIiwibWF0Y2giLCJrZXkiLCJpbmRleCIsIkFycmF5IiwiaXNBcnJheSIsInNsaWNlUGFydHMiLCJtYXAiLCJzdGFydCIsInBhcnNlSW50IiwiZW5kIiwiaWR4IiwiaXNOYU4iLCJ1bmRlZmluZWQiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsImRvbmUiLCJ2YWx1ZSIsImVyciIsImUiLCJmIiwiZnVuY3Rpb25zIiwiZnVuY3Rpb25OYW1lIiwiT2JqZWN0Iiwia2V5cyIsInZhbHVlcyIsIm51bSIsIk51bWJlciIsIl90b0NvbnN1bWFibGVBcnJheSIsInNvcnQiLCJyZXZlcnNlIiwiU2V0IiwiaXRlbSIsImZpbHRlciIsIkJvb2xlYW4iLCJncm91cHMiLCJmb3JFYWNoIiwiZ3JvdXBLZXkiLCJwdXNoIiwicHJvY2Vzc2VkRXhwcmVzc2lvbiIsInByb3BlcnR5TWF0Y2hlcyIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJ0b1N0cmluZyIsIkVycm9yIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsIl9pdGVyYXRvcjQiLCJfc3RlcDQiLCJmdW5jIiwiRnVuY3Rpb24iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///985\n\n}"); /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.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 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /************************************************************************/ /******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module can't be inlined because the eval-source-map devtool is used. /******/ var __webpack_exports__ = __webpack_require__(222); /******/ /******/ })() ;