PageSourceSearch

https://blueberrysgrill.com/_next/static/chunks/5754-076b72224c146f46.js

js blueberrysgrill.com collected 2026-10-04 04:37:21 UTC 680,198 bytes, 1 lines download raw bytes

1!function(){try{var n="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},e=(new n.Error).stack;e&&(n._sentryDebugIds=n._sentryDebugIds||{},n._sentryDebugIds[e]="d7de52a2-11c7-45b9-a64e-95260eb1ff85",n._sentryDebugIdIdentifier="sentry-dbid-d7de52a2-11c7-45b9-a64e-95260eb1ff85")}catch(n){}}();"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5754],{1925:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval(__webpack_require__.ts('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_createSvgIcon_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6273);\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7876);\n/* __next_internal_client_entry_do_not_use__ default auto */ \n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils_createSvgIcon_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A)(/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path", {\n    d: "M19 13H5v-2h14z"\n}), \'Remove\'));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkyNS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs2REFFcUQ7QUFDTDtBQUNoRCxpRUFBZUEsNEVBQWFBLENBQUMsV0FBVyxHQUFFRSxzREFBSUEsQ0FBQyxRQUFRO0lBQ3JEQyxHQUFHO0FBQ0wsSUFBSSxTQUFTLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvaWNvbnMtbWF0ZXJpYWwvZXNtL1JlbW92ZS5qcz9jZmNkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgY3JlYXRlU3ZnSWNvbiBmcm9tIFwiLi91dGlscy9jcmVhdGVTdmdJY29uLmpzXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3ZnSWNvbigvKiNfX1BVUkVfXyovX2pzeChcInBhdGhcIiwge1xuICBkOiBcIk0xOSAxM0g1di0yaDE0elwiXG59KSwgJ1JlbW92ZScpOyJdLCJuYW1lcyI6WyJjcmVhdGVTdmdJY29uIiwianN4IiwiX2pzeCIsImQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1925\n'))},6273:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval(__webpack_require__.ts("\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n  A: () => (/* binding */ createSvgIcon)\n});\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(4232);\nvar react_namespaceObject = /*#__PURE__*/__webpack_require__.t(react, 2);\n// EXTERNAL MODULE: ./node_modules/clsx/dist/clsx.mjs\nvar clsx = __webpack_require__(9241);\n;// ./node_modules/@mui/utils/esm/composeClasses/composeClasses.js\n/* eslint no-restricted-syntax: 0, prefer-template: 0, guard-for-in: 0\n   ---\n   These rules are preventing the performance optimizations below.\n */\n\n/**\n * Compose classes from multiple sources.\n *\n * @example\n * ```tsx\n * const slots = {\n *  root: ['root', 'primary'],\n *  label: ['label'],\n * };\n *\n * const getUtilityClass = (slot) => `MuiButton-${slot}`;\n *\n * const classes = {\n *   root: 'my-root-class',\n * };\n *\n * const output = composeClasses(slots, getUtilityClass, classes);\n * // {\n * //   root: 'MuiButton-root MuiButton-primary my-root-class',\n * //   label: 'MuiButton-label',\n * // }\n * ```\n *\n * @param slots a list of classes for each possible slot\n * @param getUtilityClass a function to resolve the class based on the slot name\n * @param classes the input classes from props\n * @returns the resolved classes for all slots\n */\nfunction composeClasses(slots, getUtilityClass, classes = undefined) {\n  const output = {};\n  for (const slotName in slots) {\n    const slot = slots[slotName];\n    let buffer = '';\n    let start = true;\n    for (let i = 0; i < slot.length; i += 1) {\n      const value = slot[i];\n      if (value) {\n        buffer += (start === true ? '' : ' ') + getUtilityClass(value);\n        start = false;\n        if (classes && classes[value]) {\n          buffer += ' ' + classes[value];\n        }\n      }\n    }\n    output[slotName] = buffer;\n  }\n  return output;\n}\n;// ./node_modules/@mui/utils/esm/formatMuiErrorMessage/formatMuiErrorMessage.js\n/**\n * WARNING: Don't import this directly. It's imported by the code generated by\n * `@mui/interal-babel-plugin-minify-errors`. Make sure to always use string literals in `Error`\n * constructors to ensure the plugin works as expected. Supported patterns include:\n *   throw new Error('My message');\n *   throw new Error(`My message: ${foo}`);\n *   throw new Error(`My message: ${foo}` + 'another string');\n *   ...\n * @param {number} code\n */\nfunction formatMuiErrorMessage(code, ...args) {\n  const url = new URL(`https://mui.com/production-error/?code=${code}`);
1\n  args.forEach(arg => url.searchParams.append('args[]', arg));\n  return `Minified MUI error #${code}; visit ${url} for the full message.`;\n}\n;// ./node_modules/@mui/utils/esm/capitalize/capitalize.js\n\n// It should to be noted that this function isn't equivalent to `text-transform: capitalize`.\n//\n// A strict capitalization should uppercase the first letter of each word in the sentence.\n// We only handle the first word.\nfunction capitalize_capitalize(string) {\n  if (typeof string !== 'string') {\n    throw new Error( false ? 0 : formatMuiErrorMessage(7));\n  }\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n;// ./node_modules/@mui/material/esm/utils/capitalize.js\n\n/* harmony default export */ const utils_capitalize = (capitalize_capitalize);\n\n;// ./node_modules/@babel/runtime/helpers/esm/extends.js\nfunction extends_extends() {\n  return extends_extends = Object.assign ? Object.assign.bind() : function (n) {\n    for (var e = 1; e < arguments.length; e++) {\n      var t = arguments[e];\n      for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n    }\n    return n;\n  }, extends_extends.apply(null, arguments);\n}\n\n;// ./node_modules/@emotion/sheet/dist/emotion-sheet.esm.js\nvar isDevelopment = false;\n\n/*\n\nBased off glamor's StyleSheet, thanks Sunil ❤️\n\nhigh performance StyleSheet for css-in-js systems\n\n- uses multiple style tags behind the scenes for millions of rules\n- uses `insertRule` for appending in production for *much* faster performance\n\n// usage\n\nimport { StyleSheet } from '@emotion/sheet'\n\nlet styleSheet = new StyleSheet({ key: '', container: document.head })\n\nstyleSheet.insert('#box { border: 1px solid red; }')\n- appends a css rule into the stylesheet\n\nstyleSheet.flush()\n- empties the stylesheet of all its contents\n\n*/\n\nfunction sheetForTag(tag) {\n  if (tag.sheet) {\n    return tag.sheet;\n  } // this weirdness brought to you by firefox\n\n  /* istanbul ignore next */\n\n\n  for (var i = 0; i < document.styleSheets.length; i++) {\n    if (document.styleSheets[i].ownerNode === tag) {\n      return document.styleSheets[i];\n    }\n  } // this function should always return with a value\n  // TS can't understand it though so we make it stop complaining here\n\n\n  return undefined;\n}\n\nfunction createStyleElement(options) {\n  var tag = document.createElement('style');\n  tag.setAttribute('data-emotion', options.key);\n\n  if (options.nonce !== undefined) {\n    tag.setAttribute('nonce', options.nonce);\n  }\n\n  tag.appendChild(document.createTextNode(''));\n  tag.setAttribute('data-s', '');\n  return tag;\n}\n\nvar StyleSheet = /*#__PURE__*/function () {\n  // Using Node instead of HTMLElement since container may be a ShadowRoot\n  function StyleSheet(options) {\n    var _this = this;\n\n    this._insertTag = function (tag) {\n      var before;\n\n      if (_this.tags.length === 0) {\n        if (_this.insertionPoint) {\n          before = _this.insertionPoint.nextSibling;\n        } else if (_this.prepend) {\n          before = _this.container.firstChild;\n        } else {\n          before = _this.before;\n        }\n      } else {\n        before = _this.tags[_this.tags.length - 1].nextSibling;\n      }\n\n      _this.container.insertBefore(tag, before);\n\n      _this.tags.push(tag);\n    };\n\n    this.isSpeedy = options.speedy === undefined ? !isDevelopment : options.speedy;\n    this.tags = [];\n    this.ctr = 0;\n    this.nonce = options.nonce; // key is the value of the data-emotion attribute, it's used to identify different sheets\n\n    this.key = options.key;\n    this.container = options.container;\n    this.prepend = options.prepend;\n    this.insertionPoint = options.insertionPoint;\n    this.before = null;\n  }\n\n  var _proto = StyleSheet.prototype;\n\n  _proto.hydrate = function hydrate(nodes) {\n    nodes.forEach(this._insertTag);\n  };\n\n  _proto.insert = function insert(rule) {\n    // the max length is how many rules we have per style tag, it's 65000 in speedy mode\n    // it's 1 in dev because we insert source maps that map a single rule to a location\n    // and you can only have one source map per style tag\n    if (this.ctr % (this.isSpeedy ? 65000 : 1) === 0) {\n      this._insertTag(createStyleElement(this));\n    }\n\n    var tag = this.tags[this.tags.length - 1];\n\n    if (this.isSpeedy) {\n      var sheet = sheetForTag(tag);
1\n\n      try {\n        // this is the ultrafast version, works across browsers\n        // the big drawback is that the css won't be editable in devtools\n        sheet.insertRule(rule, sheet.cssRules.length);\n      } catch (e) {\n      }\n    } else {\n      tag.appendChild(document.createTextNode(rule));\n    }\n\n    this.ctr++;\n  };\n\n  _proto.flush = function flush() {\n    this.tags.forEach(function (tag) {\n      var _tag$parentNode;\n\n      return (_tag$parentNode = tag.parentNode) == null ? void 0 : _tag$parentNode.removeChild(tag);\n    });\n    this.tags = [];\n    this.ctr = 0;\n  };\n\n  return StyleSheet;\n}();\n\n\n\n;// ./node_modules/stylis/src/Utility.js\n/**\n * @param {number}\n * @return {number}\n */\nvar abs = Math.abs\n\n/**\n * @param {number}\n * @return {string}\n */\nvar Utility_from = String.fromCharCode\n\n/**\n * @param {object}\n * @return {object}\n */\nvar Utility_assign = Object.assign\n\n/**\n * @param {string} value\n * @param {number} length\n * @return {number}\n */\nfunction hash (value, length) {\n	return Utility_charat(value, 0) ^ 45 ? (((((((length << 2) ^ Utility_charat(value, 0)) << 2) ^ Utility_charat(value, 1)) << 2) ^ Utility_charat(value, 2)) << 2) ^ Utility_charat(value, 3) : 0\n}\n\n/**\n * @param {string} value\n * @return {string}\n */\nfunction trim (value) {\n	return value.trim()\n}\n\n/**\n * @param {string} value\n * @param {RegExp} pattern\n * @return {string?}\n */\nfunction Utility_match (value, pattern) {\n	return (value = pattern.exec(value)) ? value[0] : value\n}\n\n/**\n * @param {string} value\n * @param {(string|RegExp)} pattern\n * @param {string} replacement\n * @return {string}\n */\nfunction Utility_replace (value, pattern, replacement) {\n	return value.replace(pattern, replacement)\n}\n\n/**\n * @param {string} value\n * @param {string} search\n * @return {number}\n */\nfunction indexof (value, search) {\n	return value.indexOf(search)\n}\n\n/**\n * @param {string} value\n * @param {number} index\n * @return {number}\n */\nfunction Utility_charat (value, index) {\n	return value.charCodeAt(index) | 0\n}\n\n/**\n * @param {string} value\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nfunction Utility_substr (value, begin, end) {\n	return value.slice(begin, end)\n}\n\n/**\n * @param {string} value\n * @return {number}\n */\nfunction Utility_strlen (value) {\n	return value.length\n}\n\n/**\n * @param {any[]} value\n * @return {number}\n */\nfunction Utility_sizeof (value) {\n	return value.length\n}\n\n/**\n * @param {any} value\n * @param {any[]} array\n * @return {any}\n */\nfunction Utility_append (value, array) {\n	return array.push(value), value\n}\n\n/**\n * @param {string[]} array\n * @param {function} callback\n * @return {string}\n */\nfunction Utility_combine (array, callback) {\n	return array.map(callback).join('')\n}\n\n;// ./node_modules/stylis/src/Tokenizer.js\n\n\nvar line = 1\nvar column = 1\nvar Tokenizer_length = 0\nvar position = 0\nvar character = 0\nvar characters = ''\n\n/**\n * @param {string} value\n * @param {object | null} root\n * @param {object | null} parent\n * @param {string} type\n * @param {string[] | string} props\n * @param {object[] | string} children\n * @param {number} length\n */\nfunction node (value, root, parent, type, props, children, length) {\n	return {value: value, root: root, parent: parent, type: type, props: props, children: children, line: line, column: column, length: length, return: ''}\n}\n\n/**\n * @param {object} root\n * @param {object} props\n * @return {object}\n */\nfunction Tokenizer_copy (root, props) {\n	return Utility_assign(node('', null, null, '', null, null, 0), root, {length: -root.length}, props)\n}\n\n/**\n * @return {number}\n */\nfunction Tokenizer_char () {\n	return character\n}\n\n/**\n * @return {number}\n */\nfunction prev () {\n	character = position > 0 ? Utility_charat(characters, --position) : 0\n\n	if (column--, character === 10)\n		column = 1, line--\n\n	return character\n}\n\n/**\n * @return {number}\n */\nfunction next () {\n	character = position < Tokenizer_length ? Utility_charat(characters, position++) : 0\n\n	if (column++, character === 10)\n		column = 1, line++\n\n	return character\n}\n\n/**\n * @return {number}\n */\nfunction peek () {\n	return Utility_charat(characters, position)\n}\n\n/**\n * @return {number}\n */\nfunction caret () {\n	return position\n}\n\n/**\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nfunction slice (begin, end) {\n	return Utility_substr(characters, begin, end)\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nfunction token (type) {\n	switch (type) {\n		// \\0 \\t \\n \\r \\s whitespace token\n		case 0: case 9: case 10: case 13: case 32:\n			return 5\n		// ! + , / > @ ~ isolate token\n		case 33: case 43: case 44: case 47: case 62: case 64: case 126:\n		// ; { } breakpoint token\n		case 59: case 123: case 125:\n			return 4\n		// : accompanied token\n		case 58:\n			return 3\n		// \" ' ( [ opening delimit token\n		case 34: case 39: case 40: case 91:\n			return 2\n		// ) ] closing delimit token\n		case 41: case 93:\n			return 1\n	}\n\n	return 0\n}\n\n/**\n * @param {string}
1 value\n * @return {any[]}\n */\nfunction alloc (value) {\n	return line = column = 1, Tokenizer_length = Utility_strlen(characters = value), position = 0, []\n}\n\n/**\n * @param {any} value\n * @return {any}\n */\nfunction dealloc (value) {\n	return characters = '', value\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nfunction delimit (type) {\n	return trim(slice(position - 1, delimiter(type === 91 ? type + 2 : type === 40 ? type + 1 : type)))\n}\n\n/**\n * @param {string} value\n * @return {string[]}\n */\nfunction Tokenizer_tokenize (value) {\n	return dealloc(tokenizer(alloc(value)))\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nfunction whitespace (type) {\n	while (character = peek())\n		if (character < 33)\n			next()\n		else\n			break\n\n	return token(type) > 2 || token(character) > 3 ? '' : ' '\n}\n\n/**\n * @param {string[]} children\n * @return {string[]}\n */\nfunction tokenizer (children) {\n	while (next())\n		switch (token(character)) {\n			case 0: append(identifier(position - 1), children)\n				break\n			case 2: append(delimit(character), children)\n				break\n			default: append(from(character), children)\n		}\n\n	return children\n}\n\n/**\n * @param {number} index\n * @param {number} count\n * @return {string}\n */\nfunction escaping (index, count) {\n	while (--count && next())\n		// not 0-9 A-F a-f\n		if (character < 48 || character > 102 || (character > 57 && character < 65) || (character > 70 && character < 97))\n			break\n\n	return slice(index, caret() + (count < 6 && peek() == 32 && next() == 32))\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nfunction delimiter (type) {\n	while (next())\n		switch (character) {\n			// ] ) \" '\n			case type:\n				return position\n			// \" '\n			case 34: case 39:\n				if (type !== 34 && type !== 39)\n					delimiter(character)\n				break\n			// (\n			case 40:\n				if (type === 41)\n					delimiter(type)\n				break\n			// \\\n			case 92:\n				next()\n				break\n		}\n\n	return position\n}\n\n/**\n * @param {number} type\n * @param {number} index\n * @return {number}\n */\nfunction commenter (type, index) {\n	while (next())\n		// //\n		if (type + character === 47 + 10)\n			break\n		// /*\n		else if (type + character === 42 + 42 && peek() === 47)\n			break\n\n	return '/*' + slice(index, position - 1) + '*' + Utility_from(type === 47 ? type : next())\n}\n\n/**\n * @param {number} index\n * @return {string}\n */\nfunction identifier (index) {\n	while (!token(peek()))\n		next()\n\n	return slice(index, position)\n}\n\n;// ./node_modules/stylis/src/Enum.js\nvar Enum_MS = '-ms-'\nvar Enum_MOZ = '-moz-'\nvar Enum_WEBKIT = '-webkit-'\n\nvar COMMENT = 'comm'\nvar Enum_RULESET = 'rule'\nvar Enum_DECLARATION = 'decl'\n\nvar PAGE = '@page'\nvar MEDIA = '@media'\nvar IMPORT = '@import'\nvar CHARSET = '@charset'\nvar VIEWPORT = '@viewport'\nvar SUPPORTS = '@supports'\nvar DOCUMENT = '@document'\nvar NAMESPACE = '@namespace'\nvar Enum_KEYFRAMES = '@keyframes'\nvar FONT_FACE = '@font-face'\nvar COUNTER_STYLE = '@counter-style'\nvar FONT_FEATURE_VALUES = '@font-feature-values'\nvar LAYER = '@layer'\n\n;// ./node_modules/stylis/src/Serializer.js\n\n\n\n/**\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nfunction Serializer_serialize (children, callback) {\n	var output = ''\n	var length = Utility_sizeof(children)\n\n	for (var i = 0; i < length; i++)\n		output += callback(children[i], i, children, callback) || ''\n\n	return output\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nfunction stringify (element, index, children, callback) {\n	switch (element.type) {\n		case LAYER: if (element.children.length) break\n		case IMPORT: case Enum_DECLARATION: return element.return = element.return || element.value\n		case COMMENT: return ''\n		case Enum_KEYFRAMES: return element.return = element.value + '{' + Serializer_serialize(element.children, callback) + '}'\n		case Enum_RULESET: element.value = element.props.join(',')\n	}
1\n\n	return Utility_strlen(children = Serializer_serialize(element.children, callback)) ? element.return = element.value + '{' + children + '}' : ''\n}\n\n;// ./node_modules/stylis/src/Middleware.js\n\n\n\n\n\n\n/**\n * @param {function[]} collection\n * @return {function}\n */\nfunction middleware (collection) {\n	var length = Utility_sizeof(collection)\n\n	return function (element, index, children, callback) {\n		var output = ''\n\n		for (var i = 0; i < length; i++)\n			output += collection[i](element, index, children, callback) || ''\n\n		return output\n	}\n}\n\n/**\n * @param {function} callback\n * @return {function}\n */\nfunction rulesheet (callback) {\n	return function (element) {\n		if (!element.root)\n			if (element = element.return)\n				callback(element)\n	}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n */\nfunction prefixer (element, index, children, callback) {\n	if (element.length > -1)\n		if (!element.return)\n			switch (element.type) {\n				case DECLARATION: element.return = prefix(element.value, element.length, children)\n					return\n				case KEYFRAMES:\n					return serialize([copy(element, {value: replace(element.value, '@', '@' + WEBKIT)})], callback)\n				case RULESET:\n					if (element.length)\n						return combine(element.props, function (value) {\n							switch (match(value, /(::plac\\w+|:read-\\w+)/)) {\n								// :read-(only|write)\n								case ':read-only': case ':read-write':\n									return serialize([copy(element, {props: [replace(value, /:(read-\\w+)/, ':' + MOZ + '$1')]})], callback)\n								// :placeholder\n								case '::placeholder':\n									return serialize([\n										copy(element, {props: [replace(value, /:(plac\\w+)/, ':' + WEBKIT + 'input-$1')]}),\n										copy(element, {props: [replace(value, /:(plac\\w+)/, ':' + MOZ + '$1')]}),\n										copy(element, {props: [replace(value, /:(plac\\w+)/, MS + 'input-$1')]})\n									], callback)\n							}\n\n							return ''\n						})\n			}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n */\nfunction namespace (element) {\n	switch (element.type) {\n		case RULESET:\n			element.props = element.props.map(function (value) {\n				return combine(tokenize(value), function (value, index, children) {\n					switch (charat(value, 0)) {\n						// \\f\n						case 12:\n							return substr(value, 1, strlen(value))\n						// \\0 ( + > ~\n						case 0: case 40: case 43: case 62: case 126:\n							return value\n						// :\n						case 58:\n							if (children[++index] === 'global')\n								children[index] = '', children[++index] = '\\f' + substr(children[index], index = 1, -1)\n						// \\s\n						case 32:\n							return index === 1 ? '' : value\n						default:\n							switch (index) {\n								case 0: element = value\n									return sizeof(children) > 1 ? '' : value\n								case index = sizeof(children) - 1: case 2:\n									return index === 2 ? value + element + element : value + element\n								default:\n									return value\n							}\n					}\n				})\n			})\n	}\n}\n\n;// ./node_modules/stylis/src/Parser.js\n\n\n\n\n/**\n * @param {string} value\n * @return {object[]}\n */\nfunction compile (value) {\n	return dealloc(parse('', null, null, null, [''], value = alloc(value), 0, [0], value))\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {string[]} rule\n * @param {string[]} rules\n * @param {string[]} rulesets\n * @param {number[]} pseudo\n * @param {number[]} points\n * @param {string[]} declarations\n * @return {object}\n */\nfunction parse (value, root, parent, rule, rules, rulesets, pseudo, points, declarations) {\n	var index = 0\n	var offset = 0\n	var length = pseudo\n	var atrule = 0\n	var property = 0\n	var previous = 0\n	var variable = 1\n	var scanning = 1\n	var ampersand = 1\n	var character = 0\n	var type = ''\n	var props = rules\n	var children = rulesets\n	var reference = rule\n	var characters = type\n\n	while (scanning)\n		switch (previous = character, character = next()) {\n			// (\n			case 40:\n				if (previous != 108 && Utility_charat(characters, length - 1) == 58) {\n					if (indexof(characters += Utility_replace(delimit(character), '&', '&\\f'), '&\\f') != -1)\n						ampersand = -1\n					break\n				}\n			// \" ' [\n			case 34: case 39: case 91:\n				characters += delimit(character)\n				break\n			// \\t \\n \\r \\s\n			case 9: case 10: case 13: case 32:\n				characters += whitespace(previous)\n				break\n			// \\\n			case 92:\n				characters += escaping(caret() - 1, 7)\n				continue\n			// /\n			case 47:\n				switch (peek()) {\n					case 42: case 47:\n						Utility_append(comment(commenter(next(), caret()), root, parent), declarations)\n						break\n					default:\n						characters += '/'\
1n				}\n				break\n			// {\n			case 123 * variable:\n				points[index++] = Utility_strlen(characters) * ampersand\n			// } ; \\0\n			case 125 * variable: case 59: case 0:\n				switch (character) {\n					// \\0 }\n					case 0: case 125: scanning = 0\n					// ;\n					case 59 + offset: if (ampersand == -1) characters = Utility_replace(characters, /\\f/g, '')\n						if (property > 0 && (Utility_strlen(characters) - length))\n							Utility_append(property > 32 ? declaration(characters + ';', rule, parent, length - 1) : declaration(Utility_replace(characters, ' ', '') + ';', rule, parent, length - 2), declarations)\n						break\n					// @ ;\n					case 59: characters += ';'\n					// { rule/at-rule\n					default:\n						Utility_append(reference = ruleset(characters, root, parent, index, offset, rules, points, type, props = [], children = [], length), rulesets)\n\n						if (character === 123)\n							if (offset === 0)\n								parse(characters, root, reference, reference, props, rulesets, length, points, children)\n							else\n								switch (atrule === 99 && Utility_charat(characters, 3) === 110 ? 100 : atrule) {\n									// d l m s\n									case 100: case 108: case 109: case 115:\n										parse(value, reference, reference, rule && Utility_append(ruleset(value, reference, reference, 0, 0, rules, points, type, rules, props = [], length), children), rules, children, length, points, rule ? props : children)\n										break\n									default:\n										parse(characters, reference, reference, reference, [''], children, 0, points, children)\n								}\n				}\n\n				index = offset = property = 0, variable = ampersand = 1, type = characters = '', length = pseudo\n				break\n			// :\n			case 58:\n				length = 1 + Utility_strlen(characters), property = previous\n			default:\n				if (variable < 1)\n					if (character == 123)\n						--variable\n					else if (character == 125 && variable++ == 0 && prev() == 125)\n						continue\n\n				switch (characters += Utility_from(character), character * variable) {\n					// &\n					case 38:\n						ampersand = offset > 0 ? 1 : (characters += '\\f', -1)\n						break\n					// ,\n					case 44:\n						points[index++] = (Utility_strlen(characters) - 1) * ampersand, ampersand = 1\n						break\n					// @\n					case 64:\n						// -\n						if (peek() === 45)\n							characters += delimit(next())\n\n						atrule = peek(), offset = length = Utility_strlen(type = characters += identifier(caret())), character++\n						break\n					// -\n					case 45:\n						if (previous === 45 && Utility_strlen(characters) == 2)\n							variable = 0\n				}\n		}\n\n	return rulesets\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} index\n * @param {number} offset\n * @param {string[]} rules\n * @param {number[]} points\n * @param {string} type\n * @param {string[]} props\n * @param {string[]} children\n * @param {number} length\n * @return {object}\n */\nfunction ruleset (value, root, parent, index, offset, rules, points, type, props, children, length) {\n	var post = offset - 1\n	var rule = offset === 0 ? rules : ['']\n	var size = Utility_sizeof(rule)\n\n	for (var i = 0, j = 0, k = 0; i < index; ++i)\n		for (var x = 0, y = Utility_substr(value, post + 1, post = abs(j = points[i])), z = value; x < size; ++x)\n			if (z = trim(j > 0 ? rule[x] + ' ' + y : Utility_replace(y, /&\\f/g, rule[x])))\n				props[k++] = z\n\n	return node(value, root, parent, offset === 0 ? Enum_RULESET : type, props, children, length)\n}\n\n/**\n * @param {number} value\n * @param {object} root\n * @param {object?} parent\n * @return {object}\n */\nfunction comment (value, root, parent) {\n	return node(value, root, parent, COMMENT, Utility_from(Tokenizer_char()), Utility_substr(value, 2, -2), 0)\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} length\n * @return {object}\n */\nfunction declaration (value, root, parent, length) {\n	return node(value, root, parent, Enum_DECLARATION, Utility_substr(value, 0, length), Utility_substr(value, length + 1, -1), length)\n}\n\n;// ./node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js\n\n\n\n\n\nvar identifierWithPointTracking = function identifierWithPointTracking(begin, points, index) {\n  var previous = 0;\n  var character = 0;\n\n  while (true) {\n    previous = character;\n    character = peek(); // &\\f\n\n    if (previous === 38 && character === 12) {\n      points[index] = 1;\n    }\n\n    if (token(character)) {\n      break;\n    }\n\n    next();\n  }\n\n  return slice(begin, position);\n};\n\nvar toRules = function toRules(parsed, points) {\n  // pretend we've started with a comma\n  var index = -1;\n  var character = 44;
1\n\n  do {\n    switch (token(character)) {\n      case 0:\n        // &\\f\n        if (character === 38 && peek() === 12) {\n          // this is not 100% correct, we don't account for literal sequences here - like for example quoted strings\n          // stylis inserts \\f after & to know when & where it should replace this sequence with the context selector\n          // and when it should just concatenate the outer and inner selectors\n          // it's very unlikely for this sequence to actually appear in a different context, so we just leverage this fact here\n          points[index] = 1;\n        }\n\n        parsed[index] += identifierWithPointTracking(position - 1, points, index);\n        break;\n\n      case 2:\n        parsed[index] += delimit(character);\n        break;\n\n      case 4:\n        // comma\n        if (character === 44) {\n          // colon\n          parsed[++index] = peek() === 58 ? '&\\f' : '';\n          points[index] = parsed[index].length;\n          break;\n        }\n\n      // fallthrough\n\n      default:\n        parsed[index] += Utility_from(character);\n    }\n  } while (character = next());\n\n  return parsed;\n};\n\nvar getRules = function getRules(value, points) {\n  return dealloc(toRules(alloc(value), points));\n}; // WeakSet would be more appropriate, but only WeakMap is supported in IE11\n\n\nvar fixedElements = /* #__PURE__ */new WeakMap();\nvar compat = function compat(element) {\n  if (element.type !== 'rule' || !element.parent || // positive .length indicates that this rule contains pseudo\n  // negative .length indicates that this rule has been already prefixed\n  element.length < 1) {\n    return;\n  }\n\n  var value = element.value;\n  var parent = element.parent;\n  var isImplicitRule = element.column === parent.column && element.line === parent.line;\n\n  while (parent.type !== 'rule') {\n    parent = parent.parent;\n    if (!parent) return;\n  } // short-circuit for the simplest case\n\n\n  if (element.props.length === 1 && value.charCodeAt(0) !== 58\n  /* colon */\n  && !fixedElements.get(parent)) {\n    return;\n  } // if this is an implicitly inserted rule (the one eagerly inserted at the each new nested level)\n  // then the props has already been manipulated beforehand as they that array is shared between it and its \"rule parent\"\n\n\n  if (isImplicitRule) {\n    return;\n  }\n\n  fixedElements.set(element, true);\n  var points = [];\n  var rules = getRules(value, points);\n  var parentRules = parent.props;\n\n  for (var i = 0, k = 0; i < rules.length; i++) {\n    for (var j = 0; j < parentRules.length; j++, k++) {\n      element.props[k] = points[i] ? rules[i].replace(/&\\f/g, parentRules[j]) : parentRules[j] + \" \" + rules[i];\n    }\n  }\n};\nvar removeLabel = function removeLabel(element) {\n  if (element.type === 'decl') {\n    var value = element.value;\n\n    if ( // charcode for l\n    value.charCodeAt(0) === 108 && // charcode for b\n    value.charCodeAt(2) === 98) {\n      // this ignores label\n      element[\"return\"] = '';\n      element.value = '';\n    }\n  }\n};\n\n/* eslint-disable no-fallthrough */\n\nfunction emotion_cache_browser_esm_prefix(value, length) {\n  switch (hash(value, length)) {\n    // color-adjust\n    case 5103:\n      return Enum_WEBKIT + 'print-' + value + value;\n    // animation, animation-(delay|direction|duration|fill-mode|iteration-count|name|play-state|timing-function)\n\n    case 5737:\n    case 4201:\n    case 3177:\n    case 3433:\n    case 1641:\n    case 4457:\n    case 2921: // text-decoration, filter, clip-path, backface-visibility, column, box-decoration-break\n\n    case 5572:\n    case 6356:\n    case 5844:\n    case 3191:\n    case 6645:\n    case 3005: // mask, mask-image, mask-(mode|clip|size), mask-(repeat|origin), mask-position, mask-composite,\n\n    case 6391:\n    case 5879:\n    case 5623:\n    case 6135:\n    case 4599:\n    case 4855: // background-clip, columns, column-(count|fill|gap|rule|rule-color|rule-style|rule-width|span|width)\n\n    case 4215:\n    case 6389:\n    case 5109:\n    case 5365:\n    case 5621:\n    case 3829:\n      return Enum_WEBKIT + value + value;\n    // appearance, user-select, transform, hyphens, text-size-adjust\n\n    case 5349:\n    case 4246:\n    case 4810:\n    case 6968:\n    case 2756:\n      return Enum_WEBKIT + value + Enum_MOZ + value + Enum_MS + value + value;\n    // flex, flex-direction\n\n    case 6828:\n    case 4268:\n      return Enum_WEBKIT + value + Enum_MS + value + value;\n    // order\n\n    case 6165:\n      return Enum_WEBKIT + value + Enum_MS + 'flex-' + value + value;\n    // align-items\n\n    case 5187:\n      return Enum_WEBKIT + value + Utility_replace(value, /(\\w+).+(:[^]+)/, Enum_WEBKIT + 'box-$1$2' + Enum_MS + 'flex-$1$2') + value;\n    // align-self\n\n    case 5443:\n      return Enum_WEBKIT + value + Enum_MS + 'flex-item-' + Utility_replace(value, /flex-|-self/, '') + value;\n    // align-content\n\n    case 4675:\n      return Enum_WEBKIT + value + Enum_MS + 'flex-line-pack' 
1+ Utility_replace(value, /align-content|flex-|-self/, '') + value;\n    // flex-shrink\n\n    case 5548:\n      return Enum_WEBKIT + value + Enum_MS + Utility_replace(value, 'shrink', 'negative') + value;\n    // flex-basis\n\n    case 5292:\n      return Enum_WEBKIT + value + Enum_MS + Utility_replace(value, 'basis', 'preferred-size') + value;\n    // flex-grow\n\n    case 6060:\n      return Enum_WEBKIT + 'box-' + Utility_replace(value, '-grow', '') + Enum_WEBKIT + value + Enum_MS + Utility_replace(value, 'grow', 'positive') + value;\n    // transition\n\n    case 4554:\n      return Enum_WEBKIT + Utility_replace(value, /([^-])(transform)/g, '$1' + Enum_WEBKIT + '$2') + value;\n    // cursor\n\n    case 6187:\n      return Utility_replace(Utility_replace(Utility_replace(value, /(zoom-|grab)/, Enum_WEBKIT + '$1'), /(image-set)/, Enum_WEBKIT + '$1'), value, '') + value;\n    // background, background-image\n\n    case 5495:\n    case 3959:\n      return Utility_replace(value, /(image-set\\([^]*)/, Enum_WEBKIT + '$1' + '$`$1');\n    // justify-content\n\n    case 4968:\n      return Utility_replace(Utility_replace(value, /(.+:)(flex-)?(.*)/, Enum_WEBKIT + 'box-pack:$3' + Enum_MS + 'flex-pack:$3'), /s.+-b[^;]+/, 'justify') + Enum_WEBKIT + value + value;\n    // (margin|padding)-inline-(start|end)\n\n    case 4095:\n    case 3583:\n    case 4068:\n    case 2532:\n      return Utility_replace(value, /(.+)-inline(.+)/, Enum_WEBKIT + '$1$2') + value;\n    // (min|max)?(width|height|inline-size|block-size)\n\n    case 8116:\n    case 7059:\n    case 5753:\n    case 5535:\n    case 5445:\n    case 5701:\n    case 4933:\n    case 4677:\n    case 5533:\n    case 5789:\n    case 5021:\n    case 4765:\n      // stretch, max-content, min-content, fill-available\n      if (Utility_strlen(value) - 1 - length > 6) switch (Utility_charat(value, length + 1)) {\n        // (m)ax-content, (m)in-content\n        case 109:\n          // -\n          if (Utility_charat(value, length + 4) !== 45) break;\n        // (f)ill-available, (f)it-content\n\n        case 102:\n          return Utility_replace(value, /(.+:)(.+)-([^]+)/, '$1' + Enum_WEBKIT + '$2-$3' + '$1' + Enum_MOZ + (Utility_charat(value, length + 3) == 108 ? '$3' : '$2-$3')) + value;\n        // (s)tretch\n\n        case 115:\n          return ~indexof(value, 'stretch') ? emotion_cache_browser_esm_prefix(Utility_replace(value, 'stretch', 'fill-available'), length) + value : value;\n      }\n      break;\n    // position: sticky\n\n    case 4949:\n      // (s)ticky?\n      if (Utility_charat(value, length + 1) !== 115) break;\n    // display: (flex|inline-flex)\n\n    case 6444:\n      switch (Utility_charat(value, Utility_strlen(value) - 3 - (~indexof(value, '!important') && 10))) {\n        // stic(k)y\n        case 107:\n          return Utility_replace(value, ':', ':' + Enum_WEBKIT) + value;\n        // (inline-)?fl(e)x\n\n        case 101:\n          return Utility_replace(value, /(.+:)([^;!]+)(;|!.+)?/, '$1' + Enum_WEBKIT + (Utility_charat(value, 14) === 45 ? 'inline-' : '') + 'box$3' + '$1' + Enum_WEBKIT + '$2$3' + '$1' + Enum_MS + '$2box$3') + value;\n      }\n\n      break;\n    // writing-mode\n\n    case 5936:\n      switch (Utility_charat(value, length + 11)) {\n        // vertical-l(r)\n        case 114:\n          return Enum_WEBKIT + value + Enum_MS + Utility_replace(value, /[svh]\\w+-[tblr]{2}/, 'tb') + value;\n        // vertical-r(l)\n\n        case 108:\n          return Enum_WEBKIT + value + Enum_MS + Utility_replace(value, /[svh]\\w+-[tblr]{2}/, 'tb-rl') + value;\n        // horizontal(-)tb\n\n        case 45:\n          return Enum_WEBKIT + value + Enum_MS + Utility_replace(value, /[svh]\\w+-[tblr]{2}/, 'lr') + value;\n      }\n\n      return Enum_WEBKIT + value + Enum_MS + value + value;\n  }\n\n  return value;\n}\n\nvar emotion_cache_browser_esm_prefixer = function prefixer(element, index, children, callback) {\n  if (element.length > -1) if (!element[\"return\"]) switch (element.type) {\n    case Enum_DECLARATION:\n      element[\"return\"] = emotion_cache_browser_esm_prefix(element.value, element.length);\n      break;
1\n\n    case Enum_KEYFRAMES:\n      return Serializer_serialize([Tokenizer_copy(element, {\n        value: Utility_replace(element.value, '@', '@' + Enum_WEBKIT)\n      })], callback);\n\n    case Enum_RULESET:\n      if (element.length) return Utility_combine(element.props, function (value) {\n        switch (Utility_match(value, /(::plac\\w+|:read-\\w+)/)) {\n          // :read-(only|write)\n          case ':read-only':\n          case ':read-write':\n            return Serializer_serialize([Tokenizer_copy(element, {\n              props: [Utility_replace(value, /:(read-\\w+)/, ':' + Enum_MOZ + '$1')]\n            })], callback);\n          // :placeholder\n\n          case '::placeholder':\n            return Serializer_serialize([Tokenizer_copy(element, {\n              props: [Utility_replace(value, /:(plac\\w+)/, ':' + Enum_WEBKIT + 'input-$1')]\n            }), Tokenizer_copy(element, {\n              props: [Utility_replace(value, /:(plac\\w+)/, ':' + Enum_MOZ + '$1')]\n            }), Tokenizer_copy(element, {\n              props: [Utility_replace(value, /:(plac\\w+)/, Enum_MS + 'input-$1')]\n            })], callback);\n        }\n\n        return '';\n      });\n  }\n};\n\nvar defaultStylisPlugins = [emotion_cache_browser_esm_prefixer];\n\nvar createCache = function createCache(options) {\n  var key = options.key;\n\n  if (key === 'css') {\n    var ssrStyles = document.querySelectorAll(\"style[data-emotion]:not([data-s])\"); // get SSRed styles out of the way of React's hydration\n    // document.head is a safe place to move them to(though note document.head is not necessarily the last place they will be)\n    // note this very very intentionally targets all style elements regardless of the key to ensure\n    // that creating a cache works inside of render of a React component\n\n    Array.prototype.forEach.call(ssrStyles, function (node) {\n      // we want to only move elements which have a space in the data-emotion attribute value\n      // because that indicates that it is an Emotion 11 server-side rendered style elements\n      // while we will already ignore Emotion 11 client-side inserted styles because of the :not([data-s]) part in the selector\n      // Emotion 10 client-side inserted styles did not have data-s (but importantly did not have a space in their data-emotion attributes)\n      // so checking for the space ensures that loading Emotion 11 after Emotion 10 has inserted some styles\n      // will not result in the Emotion 10 styles being destroyed\n      var dataEmotionAttribute = node.getAttribute('data-emotion');\n\n      if (dataEmotionAttribute.indexOf(' ') === -1) {\n        return;\n      }\n\n      document.head.appendChild(node);\n      node.setAttribute('data-s', '');\n    });\n  }\n\n  var stylisPlugins = options.stylisPlugins || defaultStylisPlugins;\n\n  var inserted = {};\n  var container;\n  var nodesToHydrate = [];\n\n  {\n    container = options.container || document.head;\n    Array.prototype.forEach.call( // this means we will ignore elements which don't have a space in them which\n    // means that the style elements we're looking at are only Emotion 11 server-rendered style elements\n    document.querySelectorAll(\"style[data-emotion^=\\\"\" + key + \" \\\"]\"), function (node) {\n      var attrib = node.getAttribute(\"data-emotion\").split(' ');\n\n      for (var i = 1; i < attrib.length; i++) {\n        inserted[attrib[i]] = true;\n      }\n\n      nodesToHydrate.push(node);\n    });\n  }\n\n  var _insert;\n\n  var omnipresentPlugins = [compat, removeLabel];\n\n  {\n    var currentSheet;\n    var finalizingPlugins = [stringify, rulesheet(function (rule) {\n      currentSheet.insert(rule);\n    })];\n    var serializer = middleware(omnipresentPlugins.concat(stylisPlugins, finalizingPlugins));\n\n    var stylis = function stylis(styles) {\n      return Serializer_serialize(compile(styles), serializer);\n    };\n\n    _insert = function insert(selector, serialized, sheet, shouldCache) {\n      currentSheet = sheet;\n\n      stylis(selector ? selector + \"{\" + serialized.styles + \"}\" : serialized.styles);\n\n      if (shouldCache) {\n        cache.inserted[serialized.name] = true;\n      }\n    };\n  }\n\n  var cache = {\n    key: key,\n    sheet: new StyleSheet({\n      key: key,\n      container: container,\n      nonce: options.nonce,\n      speedy: options.speedy,\n      prepend: options.prepend,\n      insertionPoint: options.insertionPoint\n    }),\n    nonce: options.nonce,\n    inserted: inserted,\n    registered: {},\n    insert: _insert\n  };\n  cache.sheet.hydrate(nodesToHydrate);\n  return cache;\n};\n\n\n\n;// ./node_modules/@emotion/hash/dist/emotion-hash.esm.js\n/* eslint-disable */\n// Inspired by https://github.com/garycourt/murmurhash-js\n// Ported from https://github.com/aappleby/smhasher/blob/61a0530f28277f2e850bfc39600ce61d02b518de/src/MurmurHash2.cpp#L37-L86\nfunction murmur2(str) {\n  // 'm' and 'r' are mixing constants generated offline.\n  // They're not really 'magic', they just happen to work well.\n  // const m = 0x5bd1e995;\n  // const r = 24;
1\n  // Initialize the hash\n  var h = 0; // Mix 4 bytes at a time into the hash\n\n  var k,\n      i = 0,\n      len = str.length;\n\n  for (; len >= 4; ++i, len -= 4) {\n    k = str.charCodeAt(i) & 0xff | (str.charCodeAt(++i) & 0xff) << 8 | (str.charCodeAt(++i) & 0xff) << 16 | (str.charCodeAt(++i) & 0xff) << 24;\n    k =\n    /* Math.imul(k, m): */\n    (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16);\n    k ^=\n    /* k >>> r: */\n    k >>> 24;\n    h =\n    /* Math.imul(k, m): */\n    (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16) ^\n    /* Math.imul(h, m): */\n    (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n  } // Handle the last few bytes of the input array\n\n\n  switch (len) {\n    case 3:\n      h ^= (str.charCodeAt(i + 2) & 0xff) << 16;\n\n    case 2:\n      h ^= (str.charCodeAt(i + 1) & 0xff) << 8;\n\n    case 1:\n      h ^= str.charCodeAt(i) & 0xff;\n      h =\n      /* Math.imul(h, m): */\n      (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n  } // Do a few final mixes of the hash to ensure the last few\n  // bytes are well-incorporated.\n\n\n  h ^= h >>> 13;\n  h =\n  /* Math.imul(h, m): */\n  (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n  return ((h ^ h >>> 15) >>> 0).toString(36);\n}\n\n\n\n;// ./node_modules/@emotion/unitless/dist/emotion-unitless.esm.js\nvar unitlessKeys = {\n  animationIterationCount: 1,\n  aspectRatio: 1,\n  borderImageOutset: 1,\n  borderImageSlice: 1,\n  borderImageWidth: 1,\n  boxFlex: 1,\n  boxFlexGroup: 1,\n  boxOrdinalGroup: 1,\n  columnCount: 1,\n  columns: 1,\n  flex: 1,\n  flexGrow: 1,\n  flexPositive: 1,\n  flexShrink: 1,\n  flexNegative: 1,\n  flexOrder: 1,\n  gridRow: 1,\n  gridRowEnd: 1,\n  gridRowSpan: 1,\n  gridRowStart: 1,\n  gridColumn: 1,\n  gridColumnEnd: 1,\n  gridColumnSpan: 1,\n  gridColumnStart: 1,\n  msGridRow: 1,\n  msGridRowSpan: 1,\n  msGridColumn: 1,\n  msGridColumnSpan: 1,\n  fontWeight: 1,\n  lineHeight: 1,\n  opacity: 1,\n  order: 1,\n  orphans: 1,\n  scale: 1,\n  tabSize: 1,\n  widows: 1,\n  zIndex: 1,\n  zoom: 1,\n  WebkitLineClamp: 1,\n  // SVG-related properties\n  fillOpacity: 1,\n  floodOpacity: 1,\n  stopOpacity: 1,\n  strokeDasharray: 1,\n  strokeDashoffset: 1,\n  strokeMiterlimit: 1,\n  strokeOpacity: 1,\n  strokeWidth: 1\n};\n\n\n\n;// ./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js\nfunction memoize(fn) {\n  var cache = Object.create(null);\n  return function (arg) {\n    if (cache[arg] === undefined) cache[arg] = fn(arg);\n    return cache[arg];\n  };\n}\n\n\n\n;// ./node_modules/@emotion/serialize/dist/emotion-serialize.esm.js\n\n\n\n\nvar emotion_serialize_esm_isDevelopment = false;\n\nvar hyphenateRegex = /[A-Z]|^ms/g;\nvar animationRegex = /_EMO_([^_]+?)_([^]*?)_EMO_/g;\n\nvar isCustomProperty = function isCustomProperty(property) {\n  return property.charCodeAt(1) === 45;\n};\n\nvar isProcessableValue = function isProcessableValue(value) {\n  return value != null && typeof value !== 'boolean';\n};\n\nvar processStyleName = /* #__PURE__ */memoize(function (styleName) {\n  return isCustomProperty(styleName) ? styleName : styleName.replace(hyphenateRegex, '-$&').toLowerCase();\n});\n\nvar processStyleValue = function processStyleValue(key, value) {\n  switch (key) {\n    case 'animation':\n    case 'animationName':\n      {\n        if (typeof value === 'string') {\n          return value.replace(animationRegex, function (match, p1, p2) {\n            cursor = {\n              name: p1,\n              styles: p2,\n              next: cursor\n            };\n            return p1;\n          });\n        }\n      }\n  }\n\n  if (unitlessKeys[key] !== 1 && !isCustomProperty(key) && typeof value === 'number' && value !== 0) {\n    return value + 'px';\n  }\n\n  return value;\n};\n\nvar noComponentSelectorMessage = 'Component selectors can only be used in conjunction with ' + '@emotion/babel-plugin, the swc Emotion plugin, or another Emotion-aware ' + 'compiler transform.';\n\nfunction handleInterpolation(mergedProps, registered, interpolation) {\n  if (interpolation == null) {\n    return '';\n  }\n\n  var componentSelector = interpolation;\n\n  if (componentSelector.__emotion_styles !== undefined) {\n\n    return componentSelector;\n  }\n\n  switch (typeof interpolation) {\n    case 'boolean':\n      {\n        return '';\n      }\n\n    case 'object':\n      {\n        var keyframes = interpolation;\n\n        if (keyframes.anim === 1) {\n          cursor = {\n            name: keyframes.name,\n            styles: keyframes.styles,\n            next: curs
1or\n          };\n          return keyframes.name;\n        }\n\n        var serializedStyles = interpolation;\n\n        if (serializedStyles.styles !== undefined) {\n          var next = serializedStyles.next;\n\n          if (next !== undefined) {\n            // not the most efficient thing ever but this is a pretty rare case\n            // and there will be very few iterations of this generally\n            while (next !== undefined) {\n              cursor = {\n                name: next.name,\n                styles: next.styles,\n                next: cursor\n              };\n              next = next.next;\n            }\n          }\n\n          var styles = serializedStyles.styles + \";\";\n          return styles;\n        }\n\n        return createStringFromObject(mergedProps, registered, interpolation);\n      }\n\n    case 'function':\n      {\n        if (mergedProps !== undefined) {\n          var previousCursor = cursor;\n          var result = interpolation(mergedProps);\n          cursor = previousCursor;\n          return handleInterpolation(mergedProps, registered, result);\n        }\n\n        break;\n      }\n  } // finalize string values (regular strings and functions interpolated into css calls)\n\n\n  var asString = interpolation;\n\n  if (registered == null) {\n    return asString;\n  }\n\n  var cached = registered[asString];\n  return cached !== undefined ? cached : asString;\n}\n\nfunction createStringFromObject(mergedProps, registered, obj) {\n  var string = '';\n\n  if (Array.isArray(obj)) {\n    for (var i = 0; i < obj.length; i++) {\n      string += handleInterpolation(mergedProps, registered, obj[i]) + \";\";\n    }\n  } else {\n    for (var key in obj) {\n      var value = obj[key];\n\n      if (typeof value !== 'object') {\n        var asString = value;\n\n        if (registered != null && registered[asString] !== undefined) {\n          string += key + \"{\" + registered[asString] + \"}\";\n        } else if (isProcessableValue(asString)) {\n          string += processStyleName(key) + \":\" + processStyleValue(key, asString) + \";\";\n        }\n      } else {\n        if (key === 'NO_COMPONENT_SELECTOR' && emotion_serialize_esm_isDevelopment) {\n          throw new Error(noComponentSelectorMessage);\n        }\n\n        if (Array.isArray(value) && typeof value[0] === 'string' && (registered == null || registered[value[0]] === undefined)) {\n          for (var _i = 0; _i < value.length;
1 _i++) {\n            if (isProcessableValue(value[_i])) {\n              string += processStyleName(key) + \":\" + processStyleValue(key, value[_i]) + \";\";\n            }\n          }\n        } else {\n          var interpolated = handleInterpolation(mergedProps, registered, value);\n\n          switch (key) {\n            case 'animation':\n            case 'animationName':\n              {\n                string += processStyleName(key) + \":\" + interpolated + \";\";\n                break;\n              }\n\n            default:\n              {\n\n                string += key + \"{\" + interpolated + \"}\";\n              }\n          }\n        }\n      }\n    }\n  }\n\n  return string;\n}\n\nvar labelPattern = /label:\\s*([^\\s;{]+)\\s*(;|$)/g; // this is the cursor for keyframes\n// keyframes are stored on the SerializedStyles object as a linked list\n\nvar cursor;\nfunction emotion_serialize_esm_serializeStyles(args, registered, mergedProps) {\n  if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null && args[0].styles !== undefined) {\n    return args[0];\n  }\n\n  var stringMode = true;\n  var styles = '';\n  cursor = undefined;\n  var strings = args[0];\n\n  if (strings == null || strings.raw === undefined) {\n    stringMode = false;\n    styles += handleInterpolation(mergedProps, registered, strings);\n  } else {\n    var asTemplateStringsArr = strings;\n\n    styles += asTemplateStringsArr[0];\n  } // we start at 1 since we've already handled the first arg\n\n\n  for (var i = 1; i < args.length; i++) {\n    styles += handleInterpolation(mergedProps, registered, args[i]);\n\n    if (stringMode) {\n      var templateStringsArr = strings;\n\n      styles += templateStringsArr[i];\n    }\n  } // using a global regex with .exec is stateful so lastIndex has to be reset each time\n\n\n  labelPattern.lastIndex = 0;\n  var identifierName = '';\n  var match; // https://esbench.com/bench/5b809c2cf2949800a0f61fb5\n\n  while ((match = labelPattern.exec(styles)) !== null) {\n    identifierName += '-' + match[1];\n  }\n\n  var name = murmur2(styles) + identifierName;\n\n  return {\n    name: name,\n    styles: styles,\n    next: cursor\n  };\n}\n\n\n\n;// ./node_modules/@emotion/use-insertion-effect-with-fallbacks/dist/emotion-use-insertion-effect-with-fallbacks.browser.esm.js\n\n\nvar syncFallback = function syncFallback(create) {\n  return create();\n};\n\nvar useInsertionEffect = react_namespaceObject['useInsertion' + 'Effect'] ? react_namespaceObject['useInsertion' + 'Effect'] : false;\nvar emotion_use_insertion_effect_with_fallbacks_browser_esm_useInsertionEffectAlwaysWithSyncFallback = useInsertionEffect || syncFallback;\nvar useInsertionEffectWithLayoutFallback = useInsertionEffect || react.useLayoutEffect;\n\n\n\n;// ./node_modules/@emotion/react/dist/emotion-element-f0de968e.browser.esm.js\n\n\n\n\n\n\n\n\n\n\nvar emotion_element_f0de968e_browser_esm_isDevelopment = false;\n\nvar EmotionCacheContext = /* #__PURE__ */react.createContext( // we're doing this to avoid preconstruct's dead code elimination in this one case\n// because this module is primarily intended for the browser and node\n// but it's also required in react native and similar environments sometimes\n// and we could have a special build just for that\n// but this is much easier and the native packages\n// might use a different theme context in the future anyway\ntypeof HTMLElement !== 'undefined' ? /* #__PURE__ */createCache({\n  key: 'css'\n}) : null);\n\nvar CacheProvider = EmotionCacheContext.Provider;\nvar __unsafe_useEmotionCache = function useEmotionCache() {\n  return useContext(EmotionCacheContext);\n};\n\nvar withEmotionCache = function withEmotionCache(func) {\n  return /*#__PURE__*/(0,react.forwardRef)(function (props, ref) {\n    // the cache will never be null in the browser\n    var cache = (0,react.useContext)(EmotionCacheContext);\n    return func(props, cache, ref);\n  });\n};\n\nvar ThemeContext = /* #__PURE__ */react.createContext({});\n\nvar useTheme = function useTheme() {\n  return React.useContext(ThemeContext);\n};\n\nvar getTheme = function getTheme(outerTheme, theme) {\n  if (typeof theme === 'function') {\n    var mergedTheme = theme(outerTheme);\n\n    return mergedTheme;\n  }\n\n  return _extends({}, outerTheme, theme);\n};\n\nvar createCacheWithTheme = /* #__PURE__ */(/* unused pure expression or super */ null && (weakMemoize(function (outerTheme) {\n  return weakMemoize(function (theme) {\n    return getTheme(outerTheme, theme);\n  });\n})));\nvar ThemeProvider = function ThemeProvider(props) {\n  var theme = React.useContext(ThemeContext);\n\n  if (props.theme !== theme) {\n    theme = createCacheWithTheme(theme)(props.theme);\n  }\n\n  return /*#__PURE__*/React.createElement(ThemeContext.Provider, {\n    value: theme\n  }, props.children);\n};\nfunction withTheme(Component) {\n  var componentName = Component.displayName || Component.name || 'Component';\n  var WithTheme = /*#__PURE__*/React.forwardRef(function render(props, ref) {\n    var theme = React.useContext(ThemeContext);\n    return /*#__PURE__*/React.createElement(Component, _extends({\n      theme: theme,\n      ref: ref\n    }, props));\n  });\n  WithTheme.displayName = \"WithTheme(\" + componentName + \")\";\n  return hoistNonReactStatics(WithTheme, Component);\n}\n\nvar hasOwn = {}.hasOwnProperty;\n\nvar typePropName = '__EMOTION_TYPE_PLEASE_DO_NOT_USE__';\nvar createEmotionProps = function createEmotionProps(type, props) {\n\n  var newProps = {};\n\n  for (var _key in props) {\n    if (hasOwn.call(props, _key)) {\n      newProps[_key] = props[_key];\n    }\n  }\n\n  newProps[typePropName] = type; // Runtime labeling is an opt-in feature because:\n\n  return newProps;\n};\n\nvar Insertion = function Insertion(_ref) {\n  var cache = _ref.cac
1he,\n      serialized = _ref.serialized,\n      isStringTag = _ref.isStringTag;\n  registerStyles(cache, serialized, isStringTag);\n  useInsertionEffectAlwaysWithSyncFallback(function () {\n    return insertStyles(cache, serialized, isStringTag);\n  });\n\n  return null;\n};\n\nvar Emotion = /* #__PURE__ */(/* unused pure expression or super */ null && (withEmotionCache(function (props, cache, ref) {\n  var cssProp = props.css; // so that using `css` from `emotion` and passing the result to the css prop works\n  // not passing the registered cache to serializeStyles because it would\n  // make certain babel optimisations not possible\n\n  if (typeof cssProp === 'string' && cache.registered[cssProp] !== undefined) {\n    cssProp = cache.registered[cssProp];\n  }\n\n  var WrappedComponent = props[typePropName];\n  var registeredStyles = [cssProp];\n  var className = '';\n\n  if (typeof props.className === 'string') {\n    className = getRegisteredStyles(cache.registered, registeredStyles, props.className);\n  } else if (props.className != null) {\n    className = props.className + \" \";\n  }\n\n  var serialized = serializeStyles(registeredStyles, undefined, React.useContext(ThemeContext));\n\n  className += cache.key + \"-\" + serialized.name;\n  var newProps = {};\n\n  for (var _key2 in props) {\n    if (hasOwn.call(props, _key2) && _key2 !== 'css' && _key2 !== typePropName && (!emotion_element_f0de968e_browser_esm_isDevelopment )) {\n      newProps[_key2] = props[_key2];\n    }\n  }\n\n  newProps.className = className;\n\n  if (ref) {\n    newProps.ref = ref;\n  }\n\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Insertion, {\n    cache: cache,\n    serialized: serialized,\n    isStringTag: typeof WrappedComponent === 'string'\n  }), /*#__PURE__*/React.createElement(WrappedComponent, newProps));\n})));\n\nvar Emotion$1 = (/* unused pure expression or super */ null && (Emotion));\n\n\n\n;// ./node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js\nvar isBrowser = true;\n\nfunction emotion_utils_browser_esm_getRegisteredStyles(registered, registeredStyles, classNames) {\n  var rawClassName = '';\n  classNames.split(' ').forEach(function (className) {\n    if (registered[className] !== undefined) {\n      registeredStyles.push(registered[className] + \";\");\n    } else if (className) {\n      rawClassName += className + \" \";\n    }\n  });\n  return rawClassName;\n}\nvar emotion_utils_browser_esm_registerStyles = function registerStyles(cache, serialized, isStringTag) {\n  var className = cache.key + \"-\" + serialized.name;\n\n  if ( // we only need to add the styles to the registered cache if the\n  // class name could be used further down\n  // the tree but if it's a string tag, we know it won't\n  // so we don't have to add it to registered cache.\n  // this improves memory usage since we can avoid storing the whole style string\n  (isStringTag === false || // we need to always store it if we're in compat mode and\n  // in node since emotion-server relies on whether a style is in\n  // the registered cache to know whether a style is global or not\n  // also, note that this check will be dead code eliminated in the browser\n  isBrowser === false ) && cache.registered[className] === undefined) {\n    cache.registered[className] = serialized.styles;\n  }\n};\nvar emotion_utils_browser_esm_insertStyles = function insertStyles(cache, serialized, isStringTag) {\n  emotion_utils_browser_esm_registerStyles(cache, serialized, isStringTag);\n  var className = cache.key + \"-\" + serialized.name;\n\n  if (cache.inserted[serialized.name] === undefined) {\n    var current = serialized;\n\n    do {\n      cache.insert(serialized === current ? \".\" + className : '', current, cache.sheet, true);\n\n      current = current.next;\n    } while (current !== undefined);\n  }\n};\n\n\n\n;// ./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js\n\n\n// eslint-disable-next-line no-undef\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|disableRemotePlayback|download|draggable|encType|enterKeyHint|fetchpriority|fetchPriority|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInl
1ine|popover|popoverTarget|popoverTargetAction|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar isPropValid = /* #__PURE__ */memoize(function (prop) {\n  return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n  /* o */\n  && prop.charCodeAt(1) === 110\n  /* n */\n  && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\n\n\n;// ./node_modules/@emotion/styled/base/dist/emotion-styled-base.browser.esm.js\n\n\n\n\n\n\n\n\nvar emotion_styled_base_browser_esm_isDevelopment = false;\n\nvar testOmitPropsOnStringTag = isPropValid;\n\nvar testOmitPropsOnComponent = function testOmitPropsOnComponent(key) {\n  return key !== 'theme';\n};\n\nvar getDefaultShouldForwardProp = function getDefaultShouldForwardProp(tag) {\n  return typeof tag === 'string' && // 96 is one less than the char code\n  // for \"a\" so this is checking that\n  // it's a lowercase character\n  tag.charCodeAt(0) > 96 ? testOmitPropsOnStringTag : testOmitPropsOnComponent;\n};\nvar composeShouldForwardProps = function composeShouldForwardProps(tag, options, isReal) {\n  var shouldForwardProp;\n\n  if (options) {\n    var optionsShouldForwardProp = options.shouldForwardProp;\n    shouldForwardProp = tag.__emotion_forwardProp && optionsShouldForwardProp ? function (propName) {\n      return tag.__emotion_forwardProp(propName) && optionsShouldForwardProp(propName);\n    } : optionsShouldForwardProp;\n  }\n\n  if (typeof shouldForwardProp !== 'function' && isReal) {\n    shouldForwardProp = tag.__emotion_forwardProp;\n  }\n\n  return shouldForwardProp;\n};\n\nvar emotion_styled_base_browser_esm_Insertion = function Insertion(_ref) {\n  var cache = _ref.cac
1he,\n      serialized = _ref.serialized,\n      isStringTag = _ref.isStringTag;\n  emotion_utils_browser_esm_registerStyles(cache, serialized, isStringTag);\n  emotion_use_insertion_effect_with_fallbacks_browser_esm_useInsertionEffectAlwaysWithSyncFallback(function () {\n    return emotion_utils_browser_esm_insertStyles(cache, serialized, isStringTag);\n  });\n\n  return null;\n};\n\nvar createStyled = function createStyled(tag, options) {\n\n  var isReal = tag.__emotion_real === tag;\n  var baseTag = isReal && tag.__emotion_base || tag;\n  var identifierName;\n  var targetClassName;\n\n  if (options !== undefined) {\n    identifierName = options.label;\n    targetClassName = options.target;\n  }\n\n  var shouldForwardProp = composeShouldForwardProps(tag, options, isReal);\n  var defaultShouldForwardProp = shouldForwardProp || getDefaultShouldForwardProp(baseTag);\n  var shouldUseAs = !defaultShouldForwardProp('as');\n  return function () {\n    // eslint-disable-next-line prefer-rest-params\n    var args = arguments;\n    var styles = isReal && tag.__emotion_styles !== undefined ? tag.__emotion_styles.slice(0) : [];\n\n    if (identifierName !== undefined) {\n      styles.push(\"label:\" + identifierName + \";\");\n    }\n\n    if (args[0] == null || args[0].raw === undefined) {\n      // eslint-disable-next-line prefer-spread\n      styles.push.apply(styles, args);\n    } else {\n      var templateStringsArr = args[0];\n\n      styles.push(templateStringsArr[0]);\n      var len = args.length;\n      var i = 1;\n\n      for (; i < len; i++) {\n\n        styles.push(args[i], templateStringsArr[i]);\n      }\n    }\n\n    var Styled = withEmotionCache(function (props, cache, ref) {\n      var FinalTag = shouldUseAs && props.as || baseTag;\n      var className = '';\n      var classInterpolations = [];\n      var mergedProps = props;\n\n      if (props.theme == null) {\n        mergedProps = {};\n\n        for (var key in props) {\n          mergedProps[key] = props[key];\n        }\n\n        mergedProps.theme = react.useContext(ThemeContext);\n      }\n\n      if (typeof props.className === 'string') {\n        className = emotion_utils_browser_esm_getRegisteredStyles(cache.registered, classInterpolations, props.className);\n      } else if (props.className != null) {\n        className = props.className + \" \";\n      }\n\n      var serialized = emotion_serialize_esm_serializeStyles(styles.concat(classInterpolations), cache.registered, mergedProps);\n      className += cache.key + \"-\" + serialized.name;\n\n      if (targetClassName !== undefined) {\n        className += \" \" + targetClassName;\n      }\n\n      var finalShouldForwardProp = shouldUseAs && shouldForwardProp === undefined ? getDefaultShouldForwardProp(FinalTag) : defaultShouldForwardProp;\n      var newProps = {};\n\n      for (var _key in props) {\n        if (shouldUseAs && _key === 'as') continue;\n\n        if (finalShouldForwardProp(_key)) {\n          newProps[_key] = props[_key];\n        }\n      }\n\n      newProps.className = className;\n\n      if (ref) {\n        newProps.ref = ref;\n      }\n\n      return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(emotion_styled_base_browser_esm_Insertion, {\n        cache: cache,\n        serialized: serialized,\n        isStringTag: typeof FinalTag === 'string'\n      }), /*#__PURE__*/react.createElement(FinalTag, newProps));\n    });\n    Styled.displayName = identifierName !== undefined ? identifierName : \"Styled(\" + (typeof baseTag === 'string' ? baseTag : baseTag.displayName || baseTag.name || 'Component') + \")\";\n    Styled.defaultProps = tag.defaultProps;\n    Styled.__emotion_real = Styled;\n    Styled.__emotion_base = baseTag;\n    Styled.__emotion_styles = styles;\n    Styled.__emotion_forwardProp = shouldForwardProp;\n    Object.defineProperty(Styled, 'toString', {\n      value: function value() {\n        if (targetClassName === undefined && emotion_styled_base_browser_esm_isDevelopment) {\n          return 'NO_COMPONENT_SELECTOR';\n        }\n\n        return \".\" + targetClassName;
1\n      }\n    });\n\n    Styled.withComponent = function (nextTag, nextOptions) {\n      var newStyled = createStyled(nextTag, extends_extends({}, options, nextOptions, {\n        shouldForwardProp: composeShouldForwardProps(Styled, nextOptions, true)\n      }));\n      return newStyled.apply(void 0, styles);\n    };\n\n    return Styled;\n  };\n};\n\n\n\n;// ./node_modules/@emotion/styled/dist/emotion-styled.browser.esm.js\n\n\n\n\n\n\n\n\n\nvar tags = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr', // SVG\n'circle', 'clipPath', 'defs', 'ellipse', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'text', 'tspan'];\n\n// bind it to avoid mutating the original function\nvar styled = createStyled.bind(null);\ntags.forEach(function (tagName) {\n  styled[tagName] = styled(tagName);\n});\n\n\n\n;// ./node_modules/@mui/styled-engine/esm/index.js\n/**\n * @mui/styled-engine v7.3.7\n *\n * @license MIT\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use client';\n\n/* eslint-disable no-underscore-dangle */\n\n\nfunction esm_styled(tag, options) {\n  const stylesFactory = styled(tag, options);\n  if (false) {}\n  return stylesFactory;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction internal_mutateStyles(tag, processor) {\n  // Emotion attaches all the styles as `__emotion_styles`.\n  // Ref: https://github.com/emotion-js/emotion/blob/16d971d0da229596d6bcc39d282ba9753c9ee7cf/packages/styled/src/base.js#L186\n  if (Array.isArray(tag.__emotion_styles)) {\n    tag.__emotion_styles = processor(tag.__emotion_styles);\n  }\n}\n\n// Emotion only accepts an array, but we want to avoid allocations\nconst wrapper = [];\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction internal_serializeStyles(styles) {\n  wrapper[0] = styles;\n  return emotion_serialize_esm_serializeStyles(wrapper);\n}\n\n\n\n// EXTERNAL MODULE: ./node_modules/react-is/cjs/react-is.production.js\nvar react_is_production = __webpack_require__(7639);\n;// ./node_modules/@mui/utils/esm/deepmerge/deepmerge.js\n\n\n\n// https://github.com/sindresorhus/is-plain-obj/blob/main/index.js\nfunction isPlainObject(item) {\n  if (typeof item !== 'object' || item === null) {\n    return false;\n  }\n  const prototype = Object.getPrototypeOf(item);\n  return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in item) && !(Symbol.iterator in item);\n}\nfunction deepClone(source) {\n  if (/*#__PURE__*/react.isValidElement(source) || (0,react_is_production/* isValidElementType */.Hy)(source) || !isPlainObject(source)) {\n    return source;\n  }\n  const output = {};\n  Object.keys(source).forEach(key => {\n    output[key] = deepClone(source[key]);\n  });\n  return output;\n}\n\n/**\n * Merge objects deeply.\n * It will shallow copy React elements.\n *\n * If `options.clone` is set to `false` the source object will be merged directly into the target object.\n *\n * @example\n * ```ts\n * deepmerge({ a: { b: 1 }, d: 2 }, { a: { c: 2 }, d: 4 });\n * // => { a: { b: 1, c: 2 }, d: 4 }\n * ````\n *\n * @param target The target object.\n * @param source The source object.\n * @param options The merge options.\n * @param options.clone Set to `false` to merge the source object directly into the target object.\n * @returns The merged object.\n */\nfunction deepmerge_deepmerge(target, source, options = {\n  clone: true\n}) {\n  const output = options.clone ? {\n    ...target\n  } : target;\n  if (isPlainObject(target) && isPlainObject(source)) {\n    Object.keys(source).forEach(key => {\n      if (/*#__PURE__*/react.isValidElement(source[key]) || (0,react_is_production/* isValidElementType */.Hy)(source[key])) {\n        output[key] = source[key];\n      } else if (isPlainObject(source[key]) &&\n      // Avoid prototype pollution\n      Object.prototype.hasOwnProperty.call(target, key) && isPlainObject(target[key])) {\n        // Since `output` is a clone of `target` and we have narrowed `target` in this block we can cast to the same type.\n        output[key] = deepmerge_deepmerge(target[key], source[key], options);\n      } else if (options.clone) {\n        output[key] = isPlainObject(source[key]) ? deepClone(source[key]) : source[key];\n      } else {\n        output[key] = source[key];\n      }\n    });\n  }\n  return output;\n}\n;// ./node_modules/@mui/system/esm/createBreakpoints/createBreakpoints.js\n// Sorted ASC by size. That's important.\n// It can't be configured as it's used statically for propTypes.\nconst breakpointKeys = (/* unused pure expression or super */ null && (['xs', 'sm', 'md', 'lg', 'xl']));
1\nconst sortBreakpointsValues = values => {\n  const breakpointsAsArray = Object.keys(values).map(key => ({\n    key,\n    val: values[key]\n  })) || [];\n  // Sort in ascending order\n  breakpointsAsArray.sort((breakpoint1, breakpoint2) => breakpoint1.val - breakpoint2.val);\n  return breakpointsAsArray.reduce((acc, obj) => {\n    return {\n      ...acc,\n      [obj.key]: obj.val\n    };\n  }, {});\n};\n\n// Keep in mind that @media is inclusive by the CSS specification.\nfunction createBreakpoints(breakpoints) {\n  const {\n    // The breakpoint **start** at this value.\n    // For instance with the first breakpoint xs: [xs, sm).\n    values = {\n      xs: 0,\n      // phone\n      sm: 600,\n      // tablet\n      md: 900,\n      // small laptop\n      lg: 1200,\n      // desktop\n      xl: 1536 // large screen\n    },\n    unit = 'px',\n    step = 5,\n    ...other\n  } = breakpoints;\n  const sortedValues = sortBreakpointsValues(values);\n  const keys = Object.keys(sortedValues);\n  function up(key) {\n    const value = typeof values[key] === 'number' ? values[key] : key;\n    return `@media (min-width:${value}${unit})`;\n  }\n  function down(key) {\n    const value = typeof values[key] === 'number' ? values[key] : key;\n    return `@media (max-width:${value - step / 100}${unit})`;\n  }\n  function between(start, end) {\n    const endIndex = keys.indexOf(end);\n    return `@media (min-width:${typeof values[start] === 'number' ? values[start] : start}${unit}) and ` + `(max-width:${(endIndex !== -1 && typeof values[keys[endIndex]] === 'number' ? values[keys[endIndex]] : end) - step / 100}${unit})`;\n  }\n  function only(key) {\n    if (keys.indexOf(key) + 1 < keys.length) {\n      return between(key, keys[keys.indexOf(key) + 1]);\n    }\n    return up(key);\n  }\n  function not(key) {\n    // handle first and last key separately, for better readability\n    const keyIndex = keys.indexOf(key);\n    if (keyIndex === 0) {\n      return up(keys[1]);\n    }\n    if (keyIndex === keys.length - 1) {\n      return down(keys[keyIndex]);\n    }\n    return between(key, keys[keys.indexOf(key) + 1]).replace('@media', '@media not all and');\n  }\n  return {\n    keys,\n    values: sortedValues,\n    up,\n    down,\n    between,\n    only,\n    not,\n    unit,\n    ...other\n  };\n}\n;// ./node_modules/@mui/system/esm/cssContainerQueries/cssContainerQueries.js\n\n/**\n * For using in `sx` prop to sort the breakpoint from low to high.\n * Note: this function does not work and will not support multiple units.\n *       e.g. input: { '@container (min-width:300px)': '1rem', '@container (min-width:40rem)': '2rem' }\n *            output: { '@container (min-width:40rem)': '2rem', '@container (min-width:300px)': '1rem' } // since 40 < 300 even though 40rem > 300px\n */\nfunction sortContainerQueries(theme, css) {\n  if (!theme.containerQueries) {\n    return css;\n  }\n  const sorted = Object.keys(css).filter(key => key.startsWith('@container')).sort((a, b) => {\n    const regex = /min-width:\\s*([0-9.]+)/;\n    return +(a.match(regex)?.[1] || 0) - +(b.match(regex)?.[1] || 0);\n  });\n  if (!sorted.length) {\n    return css;\n  }\n  return sorted.reduce((acc, key) => {\n    const value = css[key];\n    delete acc[key];\n    acc[key] = value;\n    return acc;\n  }, {\n    ...css\n  });\n}\nfunction isCqShorthand(breakpointKeys, value) {\n  return value === '@' || value.startsWith('@') && (breakpointKeys.some(key => value.startsWith(`@${key}`)) || !!value.match(/^@\\d/));\n}\nfunction getContainerQuery(theme, shorthand) {\n  const matches = shorthand.match(/^@([^/]+)?\\/?(.+)?$/);\n  if (!matches) {\n    if (false) {}\n    return null;\n  }\n  const [, containerQuery, containerName] = matches;\n  const value = Number.isNaN(+containerQuery) ? containerQuery || 0 : +containerQuery;\n  return theme.containerQueries(containerName).up(value);\n}\nfunction cssContainerQueries(themeInput) {\n  const toContainerQuery = (mediaQuery, name) => mediaQuery.replace('@media', name ? `@container ${name}` : '@container');\n  function attachCq(node, name) {\n    node.up = (...args) => toContainerQuery(themeInput.breakpoints.up(...args), name);\n    node.down = (...args) => toContainerQuery(themeInput.breakpoints.down(...args), name);\n    node.between = (...args) => toContainerQuery(themeInput.breakpoints.between(...args), name);\n    node.only = (...args) => toContainerQuery(themeInput.breakpoints.only(...args), name);\n    node.not = (...args) => {\n      const result = toContainerQuery(themeInput.breakpoints.not(...args), name);\n      if (result.includes('not all and')) {\n        // `@container` does not work with `not all and`, so need to invert the logic\n        return result.replace('not all and ', '').replace('min-width:', 'width<').replace('max-width:', 'width>').replace('and', 'or');\n      }\n      return result;\n    };\n  }\n  const node = {};\n  const containerQueries = name => {\n    attachCq(node, name);\n    return node;\n  };\n  attachCq(containerQueries);\n  return {\n    ...themeInput,\n    containerQueries\n  };\n}\n;// ./node_modules/@mui/system/esm/createTheme/shape.js\nconst shape = {\
1n  borderRadius: 4\n};\n/* harmony default export */ const createTheme_shape = (shape);\n;// ./node_modules/@mui/system/esm/breakpoints/breakpoints.js\n\n\n\n\n\n// The breakpoint **start** at this value.\n// For instance with the first breakpoint xs: [xs, sm[.\nconst values = {\n  xs: 0,\n  // phone\n  sm: 600,\n  // tablet\n  md: 900,\n  // small laptop\n  lg: 1200,\n  // desktop\n  xl: 1536 // large screen\n};\nconst defaultBreakpoints = {\n  // Sorted ASC by size. That's important.\n  // It can't be configured as it's used statically for propTypes.\n  keys: ['xs', 'sm', 'md', 'lg', 'xl'],\n  up: key => `@media (min-width:${values[key]}px)`\n};\nconst defaultContainerQueries = {\n  containerQueries: containerName => ({\n    up: key => {\n      let result = typeof key === 'number' ? key : values[key] || key;\n      if (typeof result === 'number') {\n        result = `${result}px`;\n      }\n      return containerName ? `@container ${containerName} (min-width:${result})` : `@container (min-width:${result})`;\n    }\n  })\n};\nfunction handleBreakpoints(props, propValue, styleFromPropValue) {\n  const theme = props.theme || {};\n  if (Array.isArray(propValue)) {\n    const themeBreakpoints = theme.breakpoints || defaultBreakpoints;\n    return propValue.reduce((acc, item, index) => {\n      acc[themeBreakpoints.up(themeBreakpoints.keys[index])] = styleFromPropValue(propValue[index]);\n      return acc;\n    }, {});\n  }\n  if (typeof propValue === 'object') {\n    const themeBreakpoints = theme.breakpoints || defaultBreakpoints;\n    return Object.keys(propValue).reduce((acc, breakpoint) => {\n      if (isCqShorthand(themeBreakpoints.keys, breakpoint)) {\n        const containerKey = getContainerQuery(theme.containerQueries ? theme : defaultContainerQueries, breakpoint);\n        if (containerKey) {\n          acc[containerKey] = styleFromPropValue(propValue[breakpoint], breakpoint);\n        }\n      }\n      // key is breakpoint\n      else if (Object.keys(themeBreakpoints.values || values).includes(breakpoint)) {\n        const mediaKey = themeBreakpoints.up(breakpoint);\n        acc[mediaKey] = styleFromPropValue(propValue[breakpoint], breakpoint);\n      } else {\n        const cssKey = breakpoint;\n        acc[cssKey] = propValue[cssKey];\n      }\n      return acc;\n    }, {});\n  }\n  const output = styleFromPropValue(propValue);\n  return output;\n}\nfunction breakpoints(styleFunction) {\n  // false positive\n  // eslint-disable-next-line react/function-component-definition\n  const newStyleFunction = props => {\n    const theme = props.theme || {};\n    const base = styleFunction(props);\n    const themeBreakpoints = theme.breakpoints || defaultBreakpoints;\n    const extended = themeBreakpoints.keys.reduce((acc, key) => {\n      if (props[key]) {\n        acc = acc || {};\n        acc[themeBreakpoints.up(key)] = styleFunction({\n          theme,\n          ...props[key]\n        });\n      }\n      return acc;\n    }, null);\n    return merge(base, extended);\n  };\n  newStyleFunction.propTypes =  false ? 0 : {};\n  newStyleFunction.filterProps = ['xs', 'sm', 'md', 'lg', 'xl', ...styleFunction.filterProps];\n  return newStyleFunction;\n}\nfunction createEmptyBreakpointObject(breakpointsInput = {}) {\n  const breakpointsInOrder = breakpointsInput.keys?.reduce((acc, key) => {\n    const breakpointStyleKey = breakpointsInput.up(key);\n    acc[breakpointStyleKey] = {};\n    return acc;\n  }, {});\n  return breakpointsInOrder || {};\n}\nfunction removeUnusedBreakpoints(breakpointKeys, style) {\n  return breakpointKeys.reduce((acc, key) => {\n    const breakpointOutput = acc[key];\n    const isBreakpointUnused = !breakpointOutput || Object.keys(breakpointOutput).length === 0;\n    if (isBreakpointUnused) {\n      delete acc[key];\n    }\n    return acc;\n  }, style);\n}\nfunction mergeBreakpointsInOrder(breakpointsInput, ...styles) {\n  const emptyBreakpoints = createEmptyBreakpointObject(breakpointsInput);\n  const mergedOutput = [emptyBreakpoints, ...styles].reduce((prev, next) => deepmerge(prev, next), {});\n  return removeUnusedBreakpoints(Object.keys(emptyBreakpoints), mergedOutput);\n}\n\n// compute base for responsive values; e.g.,\n// [1,2,3] => {xs: true, sm: true, md: true}\n// {xs: 1, sm: 2, md: 3} => {xs: true, sm: true, md: true}\nfunction computeBreakpointsBase(breakpointValues, themeBreakpoints) {\n  // f
1ixed value\n  if (typeof breakpointValues !== 'object') {\n    return {};\n  }\n  const base = {};\n  const breakpointsKeys = Object.keys(themeBreakpoints);\n  if (Array.isArray(breakpointValues)) {\n    breakpointsKeys.forEach((breakpoint, i) => {\n      if (i < breakpointValues.length) {\n        base[breakpoint] = true;\n      }\n    });\n  } else {\n    breakpointsKeys.forEach(breakpoint => {\n      if (breakpointValues[breakpoint] != null) {\n        base[breakpoint] = true;\n      }\n    });\n  }\n  return base;\n}\nfunction resolveBreakpointValues({\n  values: breakpointValues,\n  breakpoints: themeBreakpoints,\n  base: customBase\n}) {\n  const base = customBase || computeBreakpointsBase(breakpointValues, themeBreakpoints);\n  const keys = Object.keys(base);\n  if (keys.length === 0) {\n    return breakpointValues;\n  }\n  let previous;\n  return keys.reduce((acc, breakpoint, i) => {\n    if (Array.isArray(breakpointValues)) {\n      acc[breakpoint] = breakpointValues[i] != null ? breakpointValues[i] : breakpointValues[previous];\n      previous = i;\n    } else if (typeof breakpointValues === 'object') {\n      acc[breakpoint] = breakpointValues[breakpoint] != null ? breakpointValues[breakpoint] : breakpointValues[previous];\n      previous = breakpoint;\n    } else {\n      acc[breakpoint] = breakpointValues;\n    }\n    return acc;\n  }, {});\n}\n/* harmony default export */ const breakpoints_breakpoints = ((/* unused pure expression or super */ null && (breakpoints)));\n;// ./node_modules/@mui/system/esm/style/style.js\n\n\n\nfunction getPath(obj, path, checkVars = true) {\n  if (!path || typeof path !== 'string') {\n    return null;\n  }\n\n  // Check if CSS variables are used\n  if (obj && obj.vars && checkVars) {\n    const val = `vars.${path}`.split('.').reduce((acc, item) => acc && acc[item] ? acc[item] : null, obj);\n    if (val != null) {\n      return val;\n    }\n  }\n  return path.split('.').reduce((acc, item) => {\n    if (acc && acc[item] != null) {\n      return acc[item];\n    }\n    return null;\n  }, obj);\n}\nfunction getStyleValue(themeMapping, transform, propValueFinal, userValue = propValueFinal) {\n  let value;\n  if (typeof themeMapping === 'function') {\n    value = themeMapping(propValueFinal);\n  } else if (Array.isArray(themeMapping)) {\n    value = themeMapping[propValueFinal] || userValue;\n  } else {\n    value = getPath(themeMapping, propValueFinal) || userValue;\n  }\n  if (transform) {\n    value = transform(value, userValue, themeMapping);\n  }\n  return value;\n}\nfunction style(options) {\n  const {\n    prop,\n    cssProperty = options.prop,\n    themeKey,\n    transform\n  } = options;\n\n  // false positive\n  // eslint-disable-next-line react/function-component-definition\n  const fn = props => {\n    if (props[prop] == null) {\n      return null;\n    }\n    const propValue = props[prop];\n    const theme = props.theme;\n    const themeMapping = getPath(theme, themeKey) || {};\n    const styleFromPropValue = propValueFinal => {\n      let value = getStyleValue(themeMapping, transform, propValueFinal);\n      if (propValueFinal === value && typeof propValueFinal === 'string') {\n        // Haven't found value\n        value = getStyleValue(themeMapping, transform, `${prop}${propValueFinal === 'default' ? '' : capitalize_capitalize(propValueFinal)}`, propValueFinal);\n      }\n      if (cssProperty === false) {\n        return value;\n      }\n      return {\n        [cssProperty]: value\n      };\n    };\n    return handleBreakpoints(props, propValue, styleFromPropValue);\n  };\n  fn.propTypes =  false ? 0 : {};\n  fn.filterProps = [prop];\n  return fn;\n}\n/* harmony default export */ const style_style = (style);\n;// ./node_modules/@mui/system/esm/merge/merge.js\n\nfunction merge_merge(acc, item) {\n  if (!item) {\n    return acc;\n  }\n  return deepmerge_deepmerge(acc, item, {\n    clone: false // No need to clone deep, it's way faster.\n  });\n}\n/* harmony default export */ const esm_merge_merge = (merge_merge);\n;// ./node_modules/@mui/system/esm/memoize/memoize.js\nfunction memoize_memoize(fn) {\n  const cache = {};\n  return arg => {\n    if (cache[arg] === undefined) {\n      cache[arg] = fn(arg);\n    }\n    return cache[arg];\n  };\n}\n;// ./node_modules/@mui/system/esm/spacing/spacing.js\n\n\n\n\n\nconst properties = {\n  m: 'margin',\n  p: 'padding'\n};\nconst directions = {\n  t: 'Top',\n  r: 'Right',\n  b: 'Bottom',\n  l: 'Left',\n  x: ['Left', 'Right'],\n  y: ['Top', 'Bottom']\n};
1\nconst aliases = {\n  marginX: 'mx',\n  marginY: 'my',\n  paddingX: 'px',\n  paddingY: 'py'\n};\n\n// memoize() impact:\n// From 300,000 ops/sec\n// To 350,000 ops/sec\nconst getCssProperties = memoize_memoize(prop => {\n  // It's not a shorthand notation.\n  if (prop.length > 2) {\n    if (aliases[prop]) {\n      prop = aliases[prop];\n    } else {\n      return [prop];\n    }\n  }\n  const [a, b] = prop.split('');\n  const property = properties[a];\n  const direction = directions[b] || '';\n  return Array.isArray(direction) ? direction.map(dir => property + dir) : [property + direction];\n});\nconst marginKeys = ['m', 'mt', 'mr', 'mb', 'ml', 'mx', 'my', 'margin', 'marginTop', 'marginRight', 'marginBottom', 'marginLeft', 'marginX', 'marginY', 'marginInline', 'marginInlineStart', 'marginInlineEnd', 'marginBlock', 'marginBlockStart', 'marginBlockEnd'];\nconst paddingKeys = ['p', 'pt', 'pr', 'pb', 'pl', 'px', 'py', 'padding', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'paddingX', 'paddingY', 'paddingInline', 'paddingInlineStart', 'paddingInlineEnd', 'paddingBlock', 'paddingBlockStart', 'paddingBlockEnd'];\nconst spacingKeys = [...marginKeys, ...paddingKeys];\nfunction createUnaryUnit(theme, themeKey, defaultValue, propName) {\n  const themeSpacing = getPath(theme, themeKey, true) ?? defaultValue;\n  if (typeof themeSpacing === 'number' || typeof themeSpacing === 'string') {\n    return val => {\n      if (typeof val === 'string') {\n        return val;\n      }\n      if (false) {}\n      if (typeof themeSpacing === 'string') {\n        if (themeSpacing.startsWith('var(') && val === 0) {\n          return 0;\n        }\n        if (themeSpacing.startsWith('var(') && val === 1) {\n          return themeSpacing;\n        }\n        return `calc(${val} * ${themeSpacing})`;\n      }\n      return themeSpacing * val;\n    };\n  }\n  if (Array.isArray(themeSpacing)) {\n    return val => {\n      if (typeof val === 'string') {\n        return val;\n      }\n      const abs = Math.abs(val);\n      if (false) {}\n      const transformed = themeSpacing[abs];\n      if (val >= 0) {\n        return transformed;\n      }\n      if (typeof transformed === 'number') {\n        return -transformed;\n      }\n      if (typeof transformed === 'string' && transformed.startsWith('var(')) {\n        return `calc(-1 * ${transformed})`;\n      }\n      return `-${transformed}`;\n    };\n  }\n  if (typeof themeSpacing === 'function') {\n    return themeSpacing;\n  }\n  if (false) {}\n  return () => undefined;\n}\nfunction createUnarySpacing(theme) {\n  return createUnaryUnit(theme, 'spacing', 8, 'spacing');\n}\nfunction getValue(transformer, propValue) {\n  if (typeof propValue === 'string' || propValue == null) {\n    return propValue;\n  }\n  return transformer(propValue);\n}\nfunction getStyleFromPropValue(cssProperties, transformer) {\n  return propValue => cssProperties.reduce((acc, cssProperty) => {\n    acc[cssProperty] = getValue(transformer, propValue);\n    return acc;\n  }, {});\n}\nfunction resolveCssProperty(props, keys, prop, transformer) {\n  // Using a hash computation over an array iteration could be faster, but with only 28 items,\n  // it's doesn't worth the bundle size.\n  if (!keys.includes(prop)) {\n    return null;\n  }\n  const cssProperties = getCssProperties(prop);\n  const styleFromPropValue = getStyleFromPropValue(cssProperties, transformer);\n  const propValue = props[prop];\n  return handleBreakpoints(props, propValue, styleFromPropValue);\n}\nfunction spacing_style(props, keys) {\n  const transformer = createUnarySpacing(props.theme);\n  return Object.keys(props).map(prop => resolveCssProperty(props, keys, prop, transformer)).reduce(esm_merge_merge, {});\n}\nfunction margin(props) {\n  return spacing_style(props, marginKeys);\n}\nmargin.propTypes =  false ? 0 : {};\nmargin.filterProps = marginKeys;\nfunction padding(props) {\n  return spacing_style(props, paddingKeys);\n}\npadding.propTypes =  false ? 0 : {};\npadding.filterProps = paddingKeys;\nfunction spacing(props) {\n  return spacing_style(props, spacingKeys);\n}\nspacing.propTypes =  false ? 0 : {};
1\nspacing.filterProps = spacingKeys;\n/* harmony default export */ const spacing_spacing = ((/* unused pure expression or super */ null && (spacing)));\n;// ./node_modules/@mui/system/esm/createTheme/createSpacing.js\n\n\n// The different signatures imply different meaning for their arguments that can't be expressed structurally.\n// We express the difference with variable names.\n\nfunction createSpacing(spacingInput = 8,\n// Material Design layouts are visually balanced. Most measurements align to an 8dp grid, which aligns both spacing and the overall layout.\n// Smaller components, such as icons, can align to a 4dp grid.\n// https://m2.material.io/design/layout/understanding-layout.html\ntransform = createUnarySpacing({\n  spacing: spacingInput\n})) {\n  // Already transformed.\n  if (spacingInput.mui) {\n    return spacingInput;\n  }\n  const spacing = (...argsInput) => {\n    if (false) {}\n    const args = argsInput.length === 0 ? [1] : argsInput;\n    return args.map(argument => {\n      const output = transform(argument);\n      return typeof output === 'number' ? `${output}px` : output;\n    }).join(' ');\n  };\n  spacing.mui = true;\n  return spacing;\n}\n;// ./node_modules/@mui/system/esm/compose/compose.js\n\nfunction compose(...styles) {\n  const handlers = styles.reduce((acc, style) => {\n    style.filterProps.forEach(prop => {\n      acc[prop] = style;\n    });\n    return acc;\n  }, {});\n\n  // false positive\n  // eslint-disable-next-line react/function-component-definition\n  const fn = props => {\n    return Object.keys(props).reduce((acc, prop) => {\n      if (handlers[prop]) {\n        return esm_merge_merge(acc, handlers[prop](props));\n      }\n      return acc;\n    }, {});\n  };\n  fn.propTypes =  false ? 0 : {};\n  fn.filterProps = styles.reduce((acc, style) => acc.concat(style.filterProps), []);\n  return fn;\n}\n/* harmony default export */ const compose_compose = (compose);\n;// ./node_modules/@mui/system/esm/borders/borders.js\n\n\n\n\n\nfunction borderTransform(value) {\n  if (typeof value !== 'number') {\n    return value;\n  }\n  return `${value}px solid`;\n}\nfunction createBorderStyle(prop, transform) {\n  return style_style({\n    prop,\n    themeKey: 'borders',\n    transform\n  });\n}\nconst border = createBorderStyle('border', borderTransform);\nconst borderTop = createBorderStyle('borderTop', borderTransform);\nconst borderRight = createBorderStyle('borderRight', borderTransform);\nconst borderBottom = createBorderStyle('borderBottom', borderTransform);\nconst borderLeft = createBorderStyle('borderLeft', borderTransform);\nconst borderColor = createBorderStyle('borderColor');\nconst borderTopColor = createBorderStyle('borderTopColor');\nconst borderRightColor = createBorderStyle('borderRightColor');\nconst borderBottomColor = createBorderStyle('borderBottomColor');\nconst borderLeftColor = createBorderStyle('borderLeftColor');\nconst outline = createBorderStyle('outline', borderTransform);\nconst outlineColor = createBorderStyle('outlineColor');\n\n// false positive\n// eslint-disable-next-line react/function-component-definition\nconst borderRadius = props => {\n  if (props.borderRadius !== undefined && props.borderRadius !== null) {\n    const transformer = createUnaryUnit(props.theme, 'shape.borderRadius', 4, 'borderRadius');\n    const styleFromPropValue = propValue => ({\n      borderRadius: getValue(transformer, propValue)\n    });\n    return handleBreakpoints(props, props.borderRadius, styleFromPropValue);\n  }\n  return null;\n};\nborderRadius.propTypes =  false ? 0 : {};\nborderRadius.filterProps = ['borderRadius'];\nconst borders = compose_compose(border, borderTop, borderRight, borderBottom, borderLeft, borderColor, borderTopColor, borderRightColor, borderBottomColor, borderLeftColor, borderRadius, outline, outlineColor);\n/* harmony default export */ const borders_borders = ((/* unused pure expression or super */ null && (borders)));\n;// ./node_modules/@mui/system/esm/cssGrid/cssGrid.js\n\n\n\n\n\n\n// false positive\n// eslint-disable-next-line react/function-component-definition\nconst gap = props => {\n  if (props.gap !== undefined && props.gap !== null) {\n    const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'gap');\n    const styleFromPropValue = propValue => ({\n      gap: getValue(transformer, propValue)\n    });\n    return handleBreakpoints(props, props.gap, styleFromPropValue);\n  }\n  return null;\n};\ngap.propTypes =  false ? 0 : {};\ngap.filterProps = ['gap'];\n\n// false positive\n// eslint-disable-next-line react/function-component-definition\nconst columnGap = props => {\n  if (props.columnGap !== undefined && props.columnGap !== null) {\n    const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'columnGap');\n    const styleFromPropValue = propValue => ({\n      columnGap: getValue(transformer, propValue)\n    });\n    return handleBreakpoints(props, props.columnGap, styleFromPropValue);\n  }\n  return null;\n};\ncolumnGap.propTypes =  false ? 0 : {};\ncolumnGap.filterProps = ['columnGap'];\n\n// false positive\n// eslint-disable-next-line react/function-component-definition\nconst rowGap = props => {\n  if (props.rowGap !== undefined && props.rowGap !== null) {\n    const transformer = createUnaryUnit(props.theme, 'spacing', 8, 'rowGap');\n    const styleFromPropValue = propValue => ({\n      rowGap: getValue(transformer, propValue)\n    });\n    return handleBreakpoints(props, props.rowGap, styleFromPropValue);\n  }\n  return null;\n};\nrowGap.propTypes =  false ? 0 : {};\nrowGap.filterProps = ['rowGap'];\nconst gridColumn = style_style({\n  prop: 'gridColumn'\n});\nconst gridRow = style_style({\n  prop: 'gridRow'\n});\nconst gridAutoFlow = style_style({\n  prop: 'gridAutoFlow'\n});\nconst gridAutoColumns = style_style({\n  prop: 'gridAutoColumns'\n});\nconst gridAutoRows = style_style({\n  prop: 'gridAutoRows'\n});\nconst gridTemplateColumns = style_style({\n  prop: 'gridTemplateColumns'\n});\nconst gridTemplateRows = style_style({\n  prop: 'gridTemplateRows'\n});\nconst gridTemplateAreas = style_style({\n  prop: 'gridTemplateAreas'\n});\nconst gridArea = style_style({\n  prop: 'gridArea'\n});\nconst grid = compose_compose(gap, columnGap, rowGap, gridColumn, gridRow, gridAutoFlow, gridAutoColumns, gridAutoRows, gridTemplateColumns, gridTemplateRows, gridTemplateAreas, gridArea);\n/* harmony default export */ const cssGrid = ((/* unused pure expression or super */ null && (grid)));\n;// ./node_modules/@mui/system/esm/palette/palette.js\n\n\nfunction paletteTransform(value, userValue) {\n  if (userValue === 'grey') {\n    return userValue;\n  }\n  return value;\n}\nconst color = style_style({\n  prop: 'color',\n  themeKey: 'palette',\n  transform: paletteTransform\n});\nconst bgcolor = style_style({\n  prop: 'bgcolor',\n  cssProperty: 'backgroundColor',\n  themeKey: 'palette',\n  transform: paletteTransform\n});\nconst backgroundColor = style_style({\n  prop: 'backgroundColor',\n  themeKey: 'palette',\n  transform: paletteTransform\n});\nconst palette = compose_compose(color, bgcolor, backgroundColor);\n/* harmony default export */ const palette_palette = ((/* unused pure expression or super */ null && (palette)));\n;// ./node_modules/@mui/system/esm/sizing/sizing.js\n\n\n\nfunction sizingTransform(value) {\n  return value <= 1 && value !== 0 ? `${value * 100}%` : value;\n}\nconst width = style_style({\n  prop: 'width',\n  transform: sizingTransform\n});\nconst maxWidth = props => {\n  if (props.maxWidth !== undefined && props.maxWidth !== null) {\n    const styleFromPropValue = propValue => {\n      const breakpoint = props.theme?.breakpoints?.values?.[propValue] || values[propValue];\n      if (!breakpoint) {\n        return {\n          maxWidth: sizingTransform(propValue)\n        };\n      }\n      if (props.theme?.breakpoints?.unit !== 'px') {\n        return {\n          maxWidth: `${breakpoint}${props.theme.breakpoints.unit}`\n        };\n      }\n      return {\n        maxWidth: breakpoint\n      };\n    };\n    return handleBreakpoints(props, props.maxWidth, styleFromPropValue);\n  }\n  return null;\n};\nmaxWidth.filterProps = ['maxWidth'];\nconst minWidth = style_style({\n  prop: 'minWidth',\n  transform: sizingTransform\n});\nconst height = style_style({\n  prop: 'height',\n  transform: sizingTransform\n});\nconst maxHeight = style_style({\n  prop: 'maxHeight',\n  transform: sizingTransform\n});\nconst minHeight = style_style({\n  prop: 'minHeight',\n  transform: sizingTransform\n});\nconst sizeWidth = style_style({\n  prop: 'size',\n  cssProperty: 'width',\n  transform: sizingTransform\n});\nconst sizeHeight = style_style({\n  prop: 'size',\n  cssProperty: 'height',\n  transform: sizingTransform\n});\nconst boxSizing = style_style({\n  prop: 'boxSizing'\n});\nconst sizing = compose_compose(width, maxWidth, minWidth, height, maxHeight, minHeight, boxSizing);\n/* harmony default export */ const sizing_sizing = ((/* unused pure expression or super */ null && (sizing)));\n;// ./node_modules/@mui/system/esm/styleFunctionSx/defaultSxConfig.js\n\n\n\n\n\nconst defaultSxConfig = {\n  // borders\n  border: {\n    themeKey: 'borders',\n    transform: borderTransform\n  },\n  borderTop: {\n    themeKey: 'borders',\n    transform: borderTransform\n  },\n  borderRight: {\n    themeKey: 'borders',\n    transform: borderTransform\n  },\n  borderBottom: {\n    themeKey: 'borders',\n    transform: borderTransform\n  },\n  borderLeft: {\n    themeKey: 'borders',\n    transform: borderTransform\n  },\n  borderColor: {\n    themeKey: 'palette'\n  },\n  borderTopColor: {\n    themeKey: 'palette'\n  },\n  borderRightColor: {\n    themeKey: 'palette'\n  },\n  borderBottomColor: {\n    themeKey: 'palette'\n  },\n  borderLeftColor: {\n    themeKey: 'palette'\n  },\n  outline: {\n    themeKey: 'borders',\n    transform: borderTransform\n  },\n  outlineColor: {\n    themeKey: 'palette'\n  },\n  borderRadius: {\n    themeKey: 'shape.borderRadius',\n    style: borderRadius\n  }
1,\n  // palette\n  color: {\n    themeKey: 'palette',\n    transform: paletteTransform\n  },\n  bgcolor: {\n    themeKey: 'palette',\n    cssProperty: 'backgroundColor',\n    transform: paletteTransform\n  },\n  backgroundColor: {\n    themeKey: 'palette',\n    transform: paletteTransform\n  },\n  // spacing\n  p: {\n    style: padding\n  },\n  pt: {\n    style: padding\n  },\n  pr: {\n    style: padding\n  },\n  pb: {\n    style: padding\n  },\n  pl: {\n    style: padding\n  },\n  px: {\n    style: padding\n  },\n  py: {\n    style: padding\n  },\n  padding: {\n    style: padding\n  },\n  paddingTop: {\n    style: padding\n  },\n  paddingRight: {\n    style: padding\n  },\n  paddingBottom: {\n    style: padding\n  },\n  paddingLeft: {\n    style: padding\n  },\n  paddingX: {\n    style: padding\n  },\n  paddingY: {\n    style: padding\n  },\n  paddingInline: {\n    style: padding\n  },\n  paddingInlineStart: {\n    style: padding\n  },\n  paddingInlineEnd: {\n    style: padding\n  },\n  paddingBlock: {\n    style: padding\n  },\n  paddingBlockStart: {\n    style: padding\n  },\n  paddingBlockEnd: {\n    style: padding\n  },\n  m: {\n    style: margin\n  },\n  mt: {\n    style: margin\n  },\n  mr: {\n    style: margin\n  },\n  mb: {\n    style: margin\n  },\n  ml: {\n    style: margin\n  },\n  mx: {\n    style: margin\n  },\n  my: {\n    style: margin\n  },\n  margin: {\n    style: margin\n  },\n  marginTop: {\n    style: margin\n  },\n  marginRight: {\n    style: margin\n  },\n  marginBottom: {\n    style: margin\n  },\n  marginLeft: {\n    style: margin\n  },\n  marginX: {\n    style: margin\n  },\n  marginY: {\n    style: margin\n  },\n  marginInline: {\n    style: margin\n  },\n  marginInlineStart: {\n    style: margin\n  },\n  marginInlineEnd: {\n    style: margin\n  },\n  marginBlock: {\n    style: margin\n  },\n  marginBlockStart: {\n    style: margin\n  },\n  marginBlockEnd: {\n    style: margin\n  },\n  // display\n  displayPrint: {\n    cssProperty: false,\n    transform: value => ({\n      '@media print': {\n        display: value\n      }\n    })\n  },\n  display: {},\n  overflow: {},\n  textOverflow: {},\n  visibility: {},\n  whiteSpace: {},\n  // flexbox\n  flexBasis: {},\n  flexDirection: {},\n  flexWrap: {},\n  justifyContent: {},\n  alignItems: {},\n  alignContent: {},\n  order: {},\n  flex: {},\n  flexGrow: {},\n  flexShrink: {},\n  alignSelf: {},\n  justifyItems: {},\n  justifySelf: {},\n  // grid\n  gap: {\n    style: gap\n  },\n  rowGap: {\n    style: rowGap\n  },\n  columnGap: {\n    style: columnGap\n  },\n  gridColumn: {},\n  gridRow: {},\n  gridAutoFlow: {},\n  gridAutoColumns: {},\n  gridAutoRows: {},\n  gridTemplateColumns: {},\n  gridTemplateRows: {},\n  gridTemplateAreas: {},\n  gridArea: {},\n  // positions\n  position: {},\n  zIndex: {\n    themeKey: 'zIndex'\n  },\n  top: {},\n  right: {},\n  bottom: {},\n  left: {},\n  // shadows\n  boxShadow: {\n    themeKey: 'shadows'\n  },\n  // sizing\n  width: {\n    transform: sizingTransform\n  },\n  maxWidth: {\n    style: maxWidth\n  },\n  minWidth: {\n    transform: sizingTransform\n  },\n  height: {\n    transform: sizingTransform\n  },\n  maxHeight: {\n    transform: sizingTransform\n  },\n  minHeight: {\n    transform: sizingTransform\n  },\n  boxSizing: {},\n  // typography\n  font: {\n    themeKey: 'font'\n  },\n  fontFamily: {\n    themeKey: 'typography'\n  },\n  fontSize: {\n    themeKey: 'typography'\n  },\n  fontStyle: {\n    themeKey: 'typography'\n  },\n  fontWeight: {\n    themeKey: 'typography'\n  },\n  letterSpacing: {},\n  textTransform: {},\n  lineHeight: {},\n  textAlign: {},\n  typography: {\n    cssProperty: false,\n    themeKey: 'typography'\n  }\n};\n/* harmony default export */ const styleFunctionSx_defaultSxConfig = (defaultSxConfig);\n;// ./node_modules/@mui/system/esm/styleFunctionSx/styleFunctionSx.js\n\n\n\n\n\n\nfunction objectsHaveSameKeys(...objects) {\n  const allKeys = objects.reduce((keys, object) => keys.concat(Object.keys(object)), []);\n  const union = new Set(allKeys);\n  return objects.every(object => union.size === Object.keys(object).length);\n}\nfunction callIfFn(maybeFn, arg) {\n  return typeof maybeFn === 'function' ? maybeFn(arg) : maybeFn;\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction unstable_createStyleFunctionSx() {\n  function getThemeValue(prop, val, theme, config) {\n    const props = {\n      [prop]: val,\n      theme\n    };\n    const options = config[prop];\n    if (!options) {\n      return {\n        [prop]: val\n      };\n    }\n    const {\n      cssProperty = prop,\n      themeKey,\n      transform,\n      style\n    } = options;\n    if (val == null) {\n      return null;\n    }\n\n    // TODO v6: remove, see https://github.com/mui/material-ui/pull/38123\n    if (themeKey === 'typography' && val === 'inherit') {\n      return {\n        [prop]: val\n      };\n    }\n    const themeMapping = getPath(theme, themeKey) || {};\n    if (style) {\n      return style(props);\n    }\n    const styleFromPropValue = propValueFinal => {\n      let value = getStyleValue(themeMapping, transform, propValueFinal);\n      if (propValueFinal === value && typeof propValueFinal === 'string') {\n        // Haven't found value\n        value = getStyleValue(themeMapping, transform, `${prop}${propValueFinal === 'default' ? '' : capitalize_capitalize(propValueFinal)}`, propValueFinal);\n      }\n      if (cssProperty === false) {\n        return value;\n      }
1\n      return {\n        [cssProperty]: value\n      };\n    };\n    return handleBreakpoints(props, val, styleFromPropValue);\n  }\n  function styleFunctionSx(props) {\n    const {\n      sx,\n      theme = {},\n      nested\n    } = props || {};\n    if (!sx) {\n      return null; // Emotion & styled-components will neglect null\n    }\n    const config = theme.unstable_sxConfig ?? styleFunctionSx_defaultSxConfig;\n\n    /*\n     * Receive `sxInput` as object or callback\n     * and then recursively check keys & values to create media query object styles.\n     * (the result will be used in `styled`)\n     */\n    function traverse(sxInput) {\n      let sxObject = sxInput;\n      if (typeof sxInput === 'function') {\n        sxObject = sxInput(theme);\n      } else if (typeof sxInput !== 'object') {\n        // value\n        return sxInput;\n      }\n      if (!sxObject) {\n        return null;\n      }\n      const emptyBreakpoints = createEmptyBreakpointObject(theme.breakpoints);\n      const breakpointsKeys = Object.keys(emptyBreakpoints);\n      let css = emptyBreakpoints;\n      Object.keys(sxObject).forEach(styleKey => {\n        const value = callIfFn(sxObject[styleKey], theme);\n        if (value !== null && value !== undefined) {\n          if (typeof value === 'object') {\n            if (config[styleKey]) {\n              css = esm_merge_merge(css, getThemeValue(styleKey, value, theme, config));\n            } else {\n              const breakpointsValues = handleBreakpoints({\n                theme\n              }, value, x => ({\n                [styleKey]: x\n              }));\n              if (objectsHaveSameKeys(breakpointsValues, value)) {\n                css[styleKey] = styleFunctionSx({\n                  sx: value,\n                  theme,\n                  nested: true\n                });\n              } else {\n                css = esm_merge_merge(css, breakpointsValues);\n              }\n            }\n          } else {\n            css = esm_merge_merge(css, getThemeValue(styleKey, value, theme, config));\n          }\n        }\n      });\n      if (!nested && theme.modularCssLayers) {\n        return {\n          '@layer sx': sortContainerQueries(theme, removeUnusedBreakpoints(breakpointsKeys, css))\n        };\n      }\n      return sortContainerQueries(theme, removeUnusedBreakpoints(breakpointsKeys, css));\n    }\n    return Array.isArray(sx) ? sx.map(traverse) : traverse(sx);\n  }\n  return styleFunctionSx;\n}\nconst styleFunctionSx = unstable_createStyleFunctionSx();\nstyleFunctionSx.filterProps = ['sx'];\n/* harmony default export */ const styleFunctionSx_styleFunctionSx = (styleFunctionSx);\n;// ./node_modules/@mui/system/esm/createTheme/applyStyles.js\n/**\n * A universal utility to style components with multiple color modes. Always use it from the theme object.\n * It works with:\n *  - [Basic theme](https://mui.com/material-ui/customization/dark-mode/)\n *  - [CSS theme variables](https://mui.com/material-ui/customization/css-theme-variables/overview/)\n *  - Zero-runtime engine\n *\n * Tips: Use an array over object spread and place `theme.applyStyles()` last.\n *\n * With the styled function:\n * ✅ [{ background: '#e5e5e5' }, theme.applyStyles('dark', { background: '#1c1c1c' })]\n * \uD83D\uDEAB { background: '#e5e5e5', ...theme.applyStyles('dark', { background: '#1c1c1c' })}\n *\n * With the sx prop:\n * ✅ [{ background: '#e5e5e5' }, theme => theme.applyStyles('dark', { background: '#1c1c1c' })]\n * \uD83D\uDEAB { background: '#e5e5e5', ...theme => theme.applyStyles('dark', { background: '#1c1c1c' })}\n *\n * @example\n * 1. using with `styled`:\n * ```jsx\n *   const Component = styled('div')(({ theme }) => [\n *     { background: '#e5e5e5' },\n *     theme.applyStyles('dark', {\n *       background: '#1c1c1c',\n *       color: '#fff',\n *     }),\n *   ]);\n * ```\n *\n * @example\n * 2. using with `sx` prop:\n * ```jsx\n *   <Box sx={[\n *     { background: '#e5e5e5' },\n *     theme => theme.applyStyles('dark', {\n *        background: '#1c1c1c',\n *        color: '#fff',\n *      }),\n *     ]}\n *   />\n * ```\n *\n * @example\n * 3. theming a component:\n * ```jsx\n *   extendTheme({\n *     components: {\n *       MuiButton: {\n *         styleOverrides: {\n *           root: ({ theme }) => [\n *             { background: '#e5e5e5' },\n *             theme.applyStyles('dark', {\n *               background: '#1c1c1c',\n *               color: '#fff',\n *             }),\n *           ],\n *         },\n *       }\n *     }\n *   })\n *```\n */\nfunction applyStyles(key, styles) {\n  // @ts-expect-error this is 'any' type\n  const theme = this;\n  if (theme.vars) {\n    if (!theme.colorSchemes?.[key] || typeof theme.getColorSchemeSelector !== 'function') {\n      return {};\n    }
1\n    // If CssVarsProvider is used as a provider, returns '*:where({selector}) &'\n    let selector = theme.getColorSchemeSelector(key);\n    if (selector === '&') {\n      return styles;\n    }\n    if (selector.includes('data-') || selector.includes('.')) {\n      // '*' is required as a workaround for Emotion issue (https://github.com/emotion-js/emotion/issues/2836)\n      selector = `*:where(${selector.replace(/\\s*&$/, '')}) &`;\n    }\n    return {\n      [selector]: styles\n    };\n  }\n  if (theme.palette.mode === key) {\n    return styles;\n  }\n  return {};\n}\n;// ./node_modules/@mui/system/esm/createTheme/createTheme.js\n\n\n\n\n\n\n\n\nfunction createTheme(options = {}, ...args) {\n  const {\n    breakpoints: breakpointsInput = {},\n    palette: paletteInput = {},\n    spacing: spacingInput,\n    shape: shapeInput = {},\n    ...other\n  } = options;\n  const breakpoints = createBreakpoints(breakpointsInput);\n  const spacing = createSpacing(spacingInput);\n  let muiTheme = deepmerge_deepmerge({\n    breakpoints,\n    direction: 'ltr',\n    components: {},\n    // Inject component definitions.\n    palette: {\n      mode: 'light',\n      ...paletteInput\n    },\n    spacing,\n    shape: {\n      ...createTheme_shape,\n      ...shapeInput\n    }\n  }, other);\n  muiTheme = cssContainerQueries(muiTheme);\n  muiTheme.applyStyles = applyStyles;\n  muiTheme = args.reduce((acc, argument) => deepmerge_deepmerge(acc, argument), muiTheme);\n  muiTheme.unstable_sxConfig = {\n    ...styleFunctionSx_defaultSxConfig,\n    ...other?.unstable_sxConfig\n  };\n  muiTheme.unstable_sx = function sx(props) {\n    return styleFunctionSx_styleFunctionSx({\n      sx: props,\n      theme: this\n    });\n  };\n  return muiTheme;\n}\n/* harmony default export */ const createTheme_createTheme = (createTheme);\n;// ./node_modules/@mui/system/esm/preprocessStyles.js\n\nfunction preprocessStyles(input) {\n  const {\n    variants,\n    ...style\n  } = input;\n  const result = {\n    variants,\n    style: internal_serializeStyles(style),\n    isProcessed: true\n  };\n\n  // Not supported on styled-components\n  if (result.style === style) {\n    return result;\n  }
1\n  if (variants) {\n    variants.forEach(variant => {\n      if (typeof variant.style !== 'function') {\n        variant.style = internal_serializeStyles(variant.style);\n      }\n    });\n  }\n  return result;\n}\n;// ./node_modules/@mui/system/esm/createStyled/createStyled.js\n\n\n\n\n\n\n\n\n/* eslint-disable no-underscore-dangle */\n/* eslint-disable no-labels */\n/* eslint-disable no-lone-blocks */\n\nconst systemDefaultTheme = createTheme_createTheme();\n\n// Update /system/styled/#api in case if this changes\nfunction shouldForwardProp(prop) {\n  return prop !== 'ownerState' && prop !== 'theme' && prop !== 'sx' && prop !== 'as';\n}\nfunction shallowLayer(serialized, layerName) {\n  if (layerName && serialized && typeof serialized === 'object' && serialized.styles && !serialized.styles.startsWith('@layer') // only add the layer if it is not already there.\n  ) {\n    serialized.styles = `@layer ${layerName}{${String(serialized.styles)}}`;\n  }\n  return serialized;\n}\nfunction defaultOverridesResolver(slot) {\n  if (!slot) {\n    return null;\n  }\n  return (_props, styles) => styles[slot];\n}\nfunction attachTheme(props, themeId, defaultTheme) {\n  props.theme = isObjectEmpty(props.theme) ? defaultTheme : props.theme[themeId] || props.theme;\n}\nfunction processStyle(props, style, layerName) {\n  /*\n   * Style types:\n   *  - null/undefined\n   *  - string\n   *  - CSS style object: { [cssKey]: [cssValue], variants }\n   *  - Processed style object: { style, variants, isProcessed: true }\n   *  - Array of any of the above\n   */\n\n  const resolvedStyle = typeof style === 'function' ? style(props) : style;\n  if (Array.isArray(resolvedStyle)) {\n    return resolvedStyle.flatMap(subStyle => processStyle(props, subStyle, layerName));\n  }\n  if (Array.isArray(resolvedStyle?.variants)) {\n    let rootStyle;\n    if (resolvedStyle.isProcessed) {\n      rootStyle = layerName ? shallowLayer(resolvedStyle.style, layerName) : resolvedStyle.style;\n    } else {\n      const {\n        variants,\n        ...otherStyles\n      } = resolvedStyle;\n      rootStyle = layerName ? shallowLayer(internal_serializeStyles(otherStyles), layerName) : otherStyles;\n    }\n    return processStyleVariants(props, resolvedStyle.variants, [rootStyle], layerName);\n  }\n  if (resolvedStyle?.isProcessed) {\n    return layerName ? shallowLayer(internal_serializeStyles(resolvedStyle.style), layerName) : resolvedStyle.style;\n  }\n  return layerName ? shallowLayer(internal_serializeStyles(resolvedStyle), layerName) : resolvedStyle;\n}\nfunction processStyleVariants(props, variants, results = [], layerName = undefined) {\n  let mergedState; // We might not need it, initialized lazily\n\n  variantLoop: for (let i = 0; i < variants.length; i += 1) {\n    const variant = variants[i];\n    if (typeof variant.props === 'function') {\n      mergedState ??= {\n        ...props,\n        ...props.ownerState,\n        ownerState: props.ownerState\n      };\n      if (!variant.props(mergedState)) {\n        continue;\n      }\n    } else {\n      for (const key in variant.props) {\n        if (props[key] !== variant.props[key] && props.ownerState?.[key] !== variant.props[key]) {\n          continue variantLoop;\n        }\n      }\n    }\n    if (typeof variant.style === 'function') {\n      mergedState ??= {\n        ...props,\n        ...props.ownerState,\n        ownerState: props.ownerState\n      };\n      results.push(layerName ? shallowLayer(internal_serializeStyles(variant.style(mergedState)), layerName) : variant.style(mergedState));\n    } else {\n      results.push(layerName ? shallowLayer(internal_serializeStyles(variant.style), layerName) : variant.style);\n    }\n  }\n  return results;\n}\nfunction createStyled_createStyled(input = {}) {\n  const {\n    themeId,\n    defaultTheme = systemDefaultTheme,\n    rootShouldForwardProp = shouldForwardProp,\n    slotShouldForwardProp = shouldForwardProp\n  } = input;\n  function styleAttachTheme(props) {\n    attachTheme(props, themeId, defaultTheme);\n  }\n  const styled = (tag, inputOptions = {}) =>
1 {\n    // If `tag` is already a styled component, filter out the `sx` style function\n    // to prevent unnecessary styles generated by the composite components.\n    internal_mutateStyles(tag, styles => styles.filter(style => style !== styleFunctionSx_styleFunctionSx));\n    const {\n      name: componentName,\n      slot: componentSlot,\n      skipVariantsResolver: inputSkipVariantsResolver,\n      skipSx: inputSkipSx,\n      // TODO v6: remove `lowercaseFirstLetter()` in the next major release\n      // For more details: https://github.com/mui/material-ui/pull/37908\n      overridesResolver = defaultOverridesResolver(lowercaseFirstLetter(componentSlot)),\n      ...options\n    } = inputOptions;\n    const layerName = componentName && componentName.startsWith('Mui') || !!componentSlot ? 'components' : 'custom';\n\n    // if skipVariantsResolver option is defined, take the value, otherwise, true for root and false for other slots.\n    const skipVariantsResolver = inputSkipVariantsResolver !== undefined ? inputSkipVariantsResolver :\n    // TODO v6: remove `Root` in the next major release\n    // For more details: https://github.com/mui/material-ui/pull/37908\n    componentSlot && componentSlot !== 'Root' && componentSlot !== 'root' || false;\n    const skipSx = inputSkipSx || false;\n    let shouldForwardPropOption = shouldForwardProp;\n\n    // TODO v6: remove `Root` in the next major release\n    // For more details: https://github.com/mui/material-ui/pull/37908\n    if (componentSlot === 'Root' || componentSlot === 'root') {\n      shouldForwardPropOption = rootShouldForwardProp;\n    } else if (componentSlot) {\n      // any other slot specified\n      shouldForwardPropOption = slotShouldForwardProp;\n    } else if (isStringTag(tag)) {\n      // for string (html) tag, preserve the behavior in emotion & styled-components.\n      shouldForwardPropOption = undefined;\n    }\n    const defaultStyledResolver = esm_styled(tag, {\n      shouldForwardProp: shouldForwardPropOption,\n      label: generateStyledLabel(componentName, componentSlot),\n      ...options\n    });\n    const transformStyle = style => {\n      // - On the server Emotion doesn't use React.forwardRef for creating components, so the created\n      //   component stays as a function. This condition makes sure that we do not interpolate functions\n      //   which are basically components used as a selectors.\n      // - `style` could be a styled component from a babel plugin for component selectors, This condition\n      //   makes sure that we do not interpolate them.\n      if (style.__emotion_real === style) {\n        return style;\n      }\n      if (typeof style === 'function') {\n        return function styleFunctionProcessor(props) {\n          return processStyle(props, style, props.theme.modularCssLayers ? layerName : undefined);\n        };\n      }\n      if (isPlainObject(style)) {\n        const serialized = preprocessStyles(style);\n        return function styleObjectProcessor(props) {\n          if (!serialized.variants) {\n            return props.theme.modularCssLayers ? shallowLayer(serialized.style, layerName) : serialized.style;\n          }\n          return processStyle(props, serialized, props.theme.modularCssLayers ? layerName : undefined);\n        };\n      }\n      return style;\n    };\n    const muiStyledResolver = (...expressionsInput) => {\n      const expressionsHead = [];\n      const expressionsBody = expressionsInput.map(transformStyle);\n      const expressionsTail = [];\n\n      // Preprocess `props` to set the scoped theme value.\n      // This must run before any other expression.\n      expressionsHead.push(styleAttachTheme);\n      if (componentName && overridesResolver) {\n        expressionsTail.push(function styleThemeOverrides(props) {\n          const theme = props.theme;\n          const styleOverrides = theme.components?.[componentName]?.styleOverrides;\n          if (!styleOverrides) {\n            return null;\n          }\n          const resolvedStyleOverrides = {};\n\n          // TODO: v7 remove iteration and use `resolveStyleArg(styleOverrides[slot])` directly\n          // eslint-disable-next-line guard-for-in\n          for (const slotKey in styleOverrides) {\n            resolvedStyleOverrides[slotKey] = processStyle(props, styleOverrides[slotKey], props.theme.modularCssLayers ? 'theme' : undefined);\n          }\n          return overridesResolver(props, resolvedStyleOverrides);\n        });\n      }\n      if (componentName && !skipVariantsResolver) {\n        expressionsTail.push(function styleThemeVariants(props) {\n          const theme = props.theme;\n          const themeVariants = theme?.components?.[componentName]?.variants;
1\n          if (!themeVariants) {\n            return null;\n          }\n          return processStyleVariants(props, themeVariants, [], props.theme.modularCssLayers ? 'theme' : undefined);\n        });\n      }\n      if (!skipSx) {\n        expressionsTail.push(styleFunctionSx_styleFunctionSx);\n      }\n\n      // This function can be called as a tagged template, so the first argument would contain\n      // CSS `string[]` values.\n      if (Array.isArray(expressionsBody[0])) {\n        const inputStrings = expressionsBody.shift();\n\n        // We need to add placeholders in the tagged template for the custom functions we have\n        // possibly added (attachTheme, overrides, variants, and sx).\n        const placeholdersHead = new Array(expressionsHead.length).fill('');\n        const placeholdersTail = new Array(expressionsTail.length).fill('');\n        let outputStrings;\n        // prettier-ignore\n        {\n          outputStrings = [...placeholdersHead, ...inputStrings, ...placeholdersTail];\n          outputStrings.raw = [...placeholdersHead, ...inputStrings.raw, ...placeholdersTail];\n        }\n\n        // The only case where we put something before `attachTheme`\n        expressionsHead.unshift(outputStrings);\n      }\n      const expressions = [...expressionsHead, ...expressionsBody, ...expressionsTail];\n      const Component = defaultStyledResolver(...expressions);\n      if (tag.muiName) {\n        Component.muiName = tag.muiName;\n      }\n      if (false) {}\n      return Component;\n    };\n    if (defaultStyledResolver.withConfig) {\n      muiStyledResolver.withConfig = defaultStyledResolver.withConfig;\n    }\n    return muiStyledResolver;\n  };\n  return styled;\n}\nfunction generateDisplayName(componentName, componentSlot, tag) {\n  if (componentName) {\n    return `${componentName}${capitalize(componentSlot || '')}`;\n  }\n  return `Styled(${getDisplayName(tag)})`;\n}\nfunction generateStyledLabel(componentName, componentSlot) {\n  let label;\n  if (false) {}\n  return label;\n}\nfunction isObjectEmpty(object) {\n  // eslint-disable-next-line\n  for (const _ in object) {\n    return false;\n  }\n  return true;\n}\n\n// https://github.com/emotion-js/emotion/blob/26ded6109fcd8ca9875cc2ce4564fee678a3f3c5/packages/styled/src/utils.js#L40\nfunction isStringTag(tag) {\n  return typeof tag === 'string' &&\n  // 96 is one less than the char code\n  // for \"a\" so this is checking that\n  // it's a lowercase character\n  tag.charCodeAt(0) > 96;\n}\nfunction lowercaseFirstLetter(string) {\n  if (!string) {\n    return string;\n  }\n  return string.charAt(0).toLowerCase() + string.slice(1);\n}\n;// ./node_modules/@mui/utils/esm/clamp/clamp.js\nfunction clamp(val, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) {\n  return Math.max(min, Math.min(val, max));\n}\n/* harmony default export */ const clamp_clamp = (clamp);\n;// ./node_modules/@mui/system/esm/colorManipulator/colorManipulator.js\n\n/* eslint-disable @typescript-eslint/naming-convention */\n\n\n/**\n * Returns a number whose value is limited to the given range.\n * @param {number} value The value to be clamped\n * @param {number} min The lower boundary of the output range\n * @param {number} max The upper boundary of the output range\n * @returns {number} A number in the range [min, max]\n */\nfunction clampWrapper(value, min = 0, max = 1) {\n  if (false) {}\n  return clamp_clamp(value, min, max);\n}\n\n/**\n * Converts a color from CSS hex format to CSS rgb format.\n * @param {string} color - Hex color, i.e. #nnn or #nnnnnn\n * @returns {string} A CSS rgb color string\n */\nfunction hexToRgb(color) {\n  color = color.slice(1);\n  const re = new RegExp(`.{1,${color.length >= 6 ? 2 : 1}}`, 'g');\n  let colors = color.match(re);\n  if (colors && colors[0].length === 1) {\n    colors = colors.map(n => n + n);\n  }\n  if (false) {}\n  return colors ? `rgb${colors.length === 4 ? 'a' : ''}(${colors.map((n, index) => {\n    return index < 3 ? parseInt(n, 16) : Math.round(parseInt(n, 16) / 255 * 1000) / 1000;\n  }).join(', ')})` : '';\n}\nfunction intToHex(int) {\n  const hex = int.toString(16);\n  return hex.length === 1 ? `0${hex}` : hex;\n}\n\n/**\n * Returns an object with the type and values of a color.\n *\n * Note: Does not support rgb % values.\
1n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @returns {object} - A MUI color object: {type: string, values: number[]}\n */\nfunction decomposeColor(color) {\n  // Idempotent\n  if (color.type) {\n    return color;\n  }\n  if (color.charAt(0) === '#') {\n    return decomposeColor(hexToRgb(color));\n  }\n  const marker = color.indexOf('(');\n  const type = color.substring(0, marker);\n  if (!['rgb', 'rgba', 'hsl', 'hsla', 'color'].includes(type)) {\n    throw new Error( false ? 0 : formatMuiErrorMessage(9, color));\n  }\n  let values = color.substring(marker + 1, color.length - 1);\n  let colorSpace;\n  if (type === 'color') {\n    values = values.split(' ');\n    colorSpace = values.shift();\n    if (values.length === 4 && values[3].charAt(0) === '/') {\n      values[3] = values[3].slice(1);\n    }\n    if (!['srgb', 'display-p3', 'a98-rgb', 'prophoto-rgb', 'rec-2020'].includes(colorSpace)) {\n      throw new Error( false ? 0 : formatMuiErrorMessage(10, colorSpace));\n    }\n  } else {\n    values = values.split(',');\n  }\n  values = values.map(value => parseFloat(value));\n  return {\n    type,\n    values,\n    colorSpace\n  };\n}\n\n/**\n * Returns a channel created from the input color.\n *\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @returns {string} - The channel for the color, that can be used in rgba or hsla colors\n */\nconst colorChannel = color => {\n  const decomposedColor = decomposeColor(color);\n  return decomposedColor.values.slice(0, 3).map((val, idx) => decomposedColor.type.includes('hsl') && idx !== 0 ? `${val}%` : val).join(' ');\n};\nconst private_safeColorChannel = (color, warning) => {\n  try {\n    return colorChannel(color);\n  } catch (error) {\n    if (warning && \"production\" !== 'production') {}\n    return color;\n  }\n};\n\n/**\n * Converts a color object with type and values to a string.\n * @param {object} color - Decomposed color\n * @param {string} color.type - One of: 'rgb', 'rgba', 'hsl', 'hsla', 'color'\n * @param {array} color.values - [n,n,n] or [n,n,n,n]\n * @returns {string} A CSS color string\n */\nfunction recomposeColor(color) {\n  const {\n    type,\n    colorSpace\n  } = color;\n  let {\n    values\n  } = color;\n  if (type.includes('rgb')) {\n    // Only convert the first 3 values to int (i.e. not alpha)\n    values = values.map((n, i) => i < 3 ? parseInt(n, 10) : n);\n  } else if (type.includes('hsl')) {\n    values[1] = `${values[1]}%`;\n    values[2] = `${values[2]}%`;\n  }\n  if (type.includes('color')) {\n    values = `${colorSpace} ${values.join(' ')}`;\n  } else {\n    values = `${values.join(', ')}`;\n  }\n  return `${type}(${values})`;\n}\n\n/**\n * Converts a color from CSS rgb format to CSS hex format.\n * @param {string} color - RGB color, i.e. rgb(n, n, n)\n * @returns {string} A CSS rgb color string, i.e. #nnnnnn\n */\nfunction rgbToHex(color) {\n  // Idempotent\n  if (color.startsWith('#')) {\n    return color;\n  }\n  const {\n    values\n  } = decomposeColor(color);\n  return `#${values.map((n, i) => intToHex(i === 3 ? Math.round(255 * n) : n)).join('')}`;\n}\n\n/**\n * Converts a color from hsl format to rgb format.\n * @param {string} color - HSL color values\n * @returns {string} rgb color values\n */\nfunction hslToRgb(color) {\n  color = decomposeColor(color);\n  const {\n    values\n  } = color;\n  const h = values[0];\n  const s = values[1] / 100;\n  const l = values[2] / 100;\n  const a = s * Math.min(l, 1 - l);\n  const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n  let type = 'rgb';\n  const rgb = [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n  if (color.type === 'hsla') {\n    type += 'a';\n    rgb.push(values[3]);\n  }\n  return recomposeColor({\n    type,\n    values: rgb\n  });\n}\n/**\n * The relative brightness of any point in a color space,\n * normalized to 0 for darkest black and 1 for lightest white.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @returns {number} The relative brightness of the color in the range 0 - 1\n */\nfunction getLuminance(color) {\n  color = decomposeColor(color);\n  let rgb = color.type === 'hsl' || color.type === 'hsla' ? decomposeColor(hslToRgb(color)).values : color.values;\n  rgb = rgb.map(val => {\n    if (color.type !== 'color') {\n      val /= 255; // normalized\n    }\n    return val <= 0.03928 ? val / 12.92 : ((val + 0.055) / 1.055) ** 2.4;\n  });\n\n  // Truncate at 3 digits\n  return Number((0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]).toFixed(3));\n}\n\n/**\n * Calculates the contrast ratio between two colors.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @param {string} foreground - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param {string} background - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {number} A contrast ratio value in the range 0 - 21.\n */\nfunction getContrastRatio(foreground, background) {\n  const lumA = getLuminance(foreground);\n  const lumB = getLuminance(background);\n  return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n\n/**\n * Sets the absolute transparency of a color.\n * Any existing alph
1a values are overwritten.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param {number} value - value to set the alpha channel to in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\nfunction alpha(color, value) {\n  color = decomposeColor(color);\n  value = clampWrapper(value);\n  if (color.type === 'rgb' || color.type === 'hsl') {\n    color.type += 'a';\n  }\n  if (color.type === 'color') {\n    color.values[3] = `/${value}`;\n  } else {\n    color.values[3] = value;\n  }\n  return recomposeColor(color);\n}\nfunction private_safeAlpha(color, value, warning) {\n  try {\n    return alpha(color, value);\n  } catch (error) {\n    if (warning && \"production\" !== 'production') {}\n    return color;\n  }\n}\n\n/**\n * Darkens a color.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param {number} coefficient - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\nfunction darken(color, coefficient) {\n  color = decomposeColor(color);\n  coefficient = clampWrapper(coefficient);\n  if (color.type.includes('hsl')) {\n    color.values[2] *= 1 - coefficient;\n  } else if (color.type.includes('rgb') || color.type.includes('color')) {\n    for (let i = 0; i < 3; i += 1) {\n      color.values[i] *= 1 - coefficient;\n    }\n  }\n  return recomposeColor(color);\n}\nfunction private_safeDarken(color, coefficient, warning) {\n  try {\n    return darken(color, coefficient);\n  } catch (error) {\n    if (warning && \"production\" !== 'production') {}\n    return color;\n  }\n}\n\n/**\n * Lightens a color.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param {number} coefficient - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\nfunction lighten(color, coefficient) {\n  color = decomposeColor(color);\n  coefficient = clampWrapper(coefficient);\n  if (color.type.includes('hsl')) {\n    color.values[2] += (100 - color.values[2]) * coefficient;\n  } else if (color.type.includes('rgb')) {\n    for (let i = 0; i < 3; i += 1) {\n      color.values[i] += (255 - color.values[i]) * coefficient;\n    }\n  } else if (color.type.includes('color')) {\n    for (let i = 0; i < 3; i += 1) {\n      color.values[i] += (1 - color.values[i]) * coefficient;\n    }\n  }\n  return recomposeColor(color);\n}\nfunction private_safeLighten(color, coefficient, warning) {\n  try {\n    return lighten(color, coefficient);\n  } catch (error) {\n    if (warning && \"production\" !== 'production') {}\n    return color;\n  }\n}\n\n/**\n * Darken or lighten a color, depending on its luminance.\n * Light colors are darkened, dark colors are lightened.\n * @param {string} color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param {number} coefficient=0.15 - multiplier in the range 0 - 1\n * @returns {string} A CSS color string. Hex input values are returned as rgb\n */\nfunction emphasize(color, coefficient = 0.15) {\n  return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\nfunction private_safeEmphasize(color, coefficient, warning) {\n  try {\n    return emphasize(color, coefficient);\n  } catch (error) {\n    if (warning && \"production\" !== 'production') {}\n    return color;\n  }\n}\n\n/**\n * Blend a transparent overlay color with a background color, resulting in a single\n * RGB color.\n * @param {string} background - CSS color\n * @param {string} overlay - CSS color\n * @param {number} opacity - Opacity multiplier in the range 0 - 1\n * @param {number} [gamma=1.0] - Gamma correction factor. For gamma-correct blending, 2.2 is usual.\n */\nfunction blend(background, overlay, opacity, gamma = 1.0) {\n  const blendChannel = (b, o) => Math.round((b ** (1 / gamma) * (1 - opacity) + o ** (1 / gamma) * opacity) ** gamma);\n  const backgroundColor = decomposeColor(background);\n  const overlayColor = decomposeColor(overlay);\n  const rgb = [blendChannel(backgroundColor.values[0], overlayColor.values[0]), blendChannel(backgroundColor.values[1], overlayColor.values[1]), blendChannel(backgroundColor.values[2], overlayColor.values[2])];\n  return recomposeColor({\n    type: 'rgb',\n    values: rgb\n  });\n}\n;// ./node_modules/@mui/material/esm/colors/common.js\nconst common = {\n    black: '#000',\n    white: '#fff'\n};\n/* harmony default export */ const colors_common = (common);\n\n;// ./node_modules/@mui/material/esm/colors/grey.js\nconst grey = {\n    50: '#fafafa',\n    100: '#f5f5f5',\n    200: '#eeeeee',\n    300: '#e0e0e0',\n    400: '#bdbdbd',\n    500: '#9e9e9e',\n    600: '#757575',\n    700: '#616161',\n    800: '#424242',\n    900: '#212121',\n    A100: '#f5f5f5',\n    A200: '#eeeeee',\n    A400: '#bdbdbd',\n    A700: '#616161'\n};\n/* harmony default export */ const colors_grey = (grey);\n\n;// ./node_modules/@mui/material/esm/colors/purple.js\nconst purple = {\n    50: '#f3e5f5',\n    100: '#e1bee7',\n    200: '#ce93d8',\n    300: '#ba68c8',\n    400: '#ab47bc',\n    500: '#9c27b0',\n    600: '#8e24aa',\n    700: '#7b1fa2',\n    800: '#6a1b9a',\n    900: '#4a148c',\n    A100: '#ea80fc',\n    A200: '#e040fb',\n    A400: '#d500f9',\n    A700: '#aa00ff'\n};\n/* harmony default export */ const colors_purple = (purple);\n\n;// ./node_modules/@mui/material/esm/colors/red.js\nconst red = {\n    50: '#ffebee',\n    100: '#ffcdd2',\n    200: '#ef9a9a',\n    300: '#e57373',\n    400: '#ef5350',\n    500: '#f44336',\n    600: '#e53935',\n    700: '#d32f2f',\n    800: '#c62828',\n    900: '#b71c1c',\n    A100: '#ff8a80',\n    A200: '#ff5252',\n    A400: '#ff1744',\n    A700: '#d50000'\n};\n/* harmony default export */ const colors_red = (red);\n\n;// ./node_modules/@mui/material/esm/colors/orange.js\nconst orange = {\n    50: '#fff3e0',\n    100: '#ffe0b2',\n    200: '#ffcc80',\n    300: '#ffb74d',\n    400: '#ffa726',\n    500: '#ff9800',\n    600: '#fb8c00',\n    700: '#f57c00',\n    800: '#ef6c00',\n    900: '#e65100',\n    A100: '#ffd180',\n    A200: '#ffab40',\n    A400: '#ff9100',\n    A700: '#ff6d00'\n};\n/* harmony default export */ const colors_orange = (orange);\n\n;// ./node_modules/@mui/material/esm/colors/blue.js\nconst blue = {\n    50: '#e3f2fd',\n    100: '#bbdefb',\n    200: '#90caf9',\n    300: '#64b5f6',\n    400: '#42a5f5',\n    500: '#2196f3',\n    600: '#1e88e5',\n    700: '#1976d2',\n    800: '#1565c0',\n    900: '#0d47a1',\n    A100: '#82b1ff',\n    A200: '#448aff',\n    A400: '#2979ff',\n    A700: '#2962ff'\n};\n/* harmony default export */ const colors_blue = (blue);\n\n;// ./node_modules/@mui/material/esm/colors/lightBlue.js\nconst lightBlue = {\n    50: '#e1f5fe',\n    100: '#b3e5fc',\n    200: '#81d4fa',\n    300: '#4fc3f7',\n    400: '#29b6f6',\n    500: '#03a9f4',\n    600: '#039be5',\n    700: '#0288d1',\n    800: '#0277bd',\n    900: '#01579b',\n    A100: '#80d8ff',\n    A200: '#40c4ff',\n    A400: '#00b0ff',\n    A700: '#0091ea'\n};\n/* harmony default export */ const colors_lightBlue = (lightBlue);\n\n;// ./node_modules/@mui/material/esm/colors/green.js\nconst green = {\n    50: '#e8f5e9',\n    100: '#c8e6c9',\n    200: '#a5d6a7',\n    300: '#81c784',\n    400: '#66bb6a',\n    500: '#4caf50',\n    600: '#43a047',\n    700: '#388e3c',\n    800: '#2e7d32',\n    900: '#1b5e20',\n    A100: '#b9f6ca',\n    A200: '#69f0ae',\n    A400: '#00e676',\n    A700: '#00c853'\n};\n/* harmony default export */ const colors_green = (green);\n\n;// ./node_modules/@mui/material/esm/styles/createPalette.js\n\n\n\n\n\n\n\n\n\n\n\nfunction getLight() {\n    return {\n        // The colors used to style the text.\n        text: {\n            // The most important text.\n            primary: 'rgba(0, 0, 0, 0.87)',\n            // Secondary text.\n            secondary: 'rgba(0, 0, 0, 0.6)',\n            // Disabled text have even lower visual prominence.\n            disabled: 'rgba(0, 0, 0, 0.38)'\n        },\n        // The color used to divide different elements.\n        divider: 'rgba(0, 0, 0, 0.12)',\n        // The background colors used to style the surfaces.\n        // Consistency between these values is important.\n        background: {\n            paper: colors_common.white,\n            default: colors_common.white\n        },\n        // The colors used to style the action elements.\n        action: {\n            // The color of an active action like an icon button.\n            active: 'rgba(0, 0, 0, 0.54)',\n            // The color of an hovered action.\n            hover: 'rgba(0, 0, 0, 0.04)',\n            hoverOpacity: 0.04,\n            // The color of a selected action.\n            selected: 'rgba(0, 0, 0, 0.08)',\n            selectedOpacity: 0.08,\n            // The color of a disabled action.\n            disabled: 'rgba(0, 0, 0, 0.26)',\n            // The background color of a disabled action.\n            disabledBackgroun
1d: 'rgba(0, 0, 0, 0.12)',\n            disabledOpacity: 0.38,\n            focus: 'rgba(0, 0, 0, 0.12)',\n            focusOpacity: 0.12,\n            activatedOpacity: 0.12\n        }\n    };\n}\nconst light = getLight();\nfunction getDark() {\n    return {\n        text: {\n            primary: colors_common.white,\n            secondary: 'rgba(255, 255, 255, 0.7)',\n            disabled: 'rgba(255, 255, 255, 0.5)',\n            icon: 'rgba(255, 255, 255, 0.5)'\n        },\n        divider: 'rgba(255, 255, 255, 0.12)',\n        background: {\n            paper: '#121212',\n            default: '#121212'\n        },\n        action: {\n            active: colors_common.white,\n            hover: 'rgba(255, 255, 255, 0.08)',\n            hoverOpacity: 0.08,\n            selected: 'rgba(255, 255, 255, 0.16)',\n            selectedOpacity: 0.16,\n            disabled: 'rgba(255, 255, 255, 0.3)',\n            disabledBackground: 'rgba(255, 255, 255, 0.12)',\n            disabledOpacity: 0.38,\n            focus: 'rgba(255, 255, 255, 0.12)',\n            focusOpacity: 0.12,\n            activatedOpacity: 0.24\n        }\n    };\n}\nconst dark = getDark();\nfunction addLightOrDark(intent, direction, shade, tonalOffset) {\n    const tonalOffsetLight = tonalOffset.light || tonalOffset;\n    const tonalOffsetDark = tonalOffset.dark || tonalOffset * 1.5;\n    if (!intent[direction]) {\n        if (intent.hasOwnProperty(shade)) {\n            intent[direction] = intent[shade];\n        } else if (direction === 'light') {\n            intent.light = lighten(intent.main, tonalOffsetLight);\n        } else if (direction === 'dark') {\n            intent.dark = darken(intent.main, tonalOffsetDark);\n        }\n    }\n}\nfunction mixLightOrDark(colorSpace, intent, direction, shade, tonalOffset) {\n    const tonalOffsetLight = tonalOffset.light || tonalOffset;\n    const tonalOffsetDark = tonalOffset.dark || tonalOffset * 1.5;\n    if (!intent[direction]) {\n        if (intent.hasOwnProperty(shade)) {\n            intent[direction] = intent[shade];\n        } else if (direction === 'light') {\n            intent.light = `
1color-mix(in ${colorSpace}, ${intent.main}, #fff ${(tonalOffsetLight * 100).toFixed(0)}%)`;\n        } else if (direction === 'dark') {\n            intent.dark = `color-mix(in ${colorSpace}, ${intent.main}, #000 ${(tonalOffsetDark * 100).toFixed(0)}%)`;\n        }\n    }\n}\nfunction getDefaultPrimary(mode = 'light') {\n    if (mode === 'dark') {\n        return {\n            main: colors_blue[200],\n            light: colors_blue[50],\n            dark: colors_blue[400]\n        };\n    }\n    return {\n        main: colors_blue[700],\n        light: colors_blue[400],\n        dark: colors_blue[800]\n    };\n}\nfunction getDefaultSecondary(mode = 'light') {\n    if (mode === 'dark') {\n        return {\n            main: colors_purple[200],\n            light: colors_purple[50],\n            dark: colors_purple[400]\n        };\n    }\n    return {\n        main: colors_purple[500],\n        light: colors_purple[300],\n        dark: colors_purple[700]\n    };\n}\nfunction getDefaultError(mode = 'light') {\n    if (mode === 'dark') {\n        return {\n            main: colors_red[500],\n            light: colors_red[300],\n            dark: colors_red[700]\n        };\n    }\n    return {\n        main: colors_red[700],\n        light: colors_red[400],\n        dark: colors_red[800]\n    };\n}\nfunction getDefaultInfo(mode = 'light') {\n    if (mode === 'dark') {\n        return {\n            main: colors_lightBlue[400],\n            light: colors_lightBlue[300],\n            dark: colors_lightBlue[700]\n        };\n    }\n    return {\n        main: colors_lightBlue[700],\n        light: colors_lightBlue[500],\n        dark: colors_lightBlue[900]\n    };\n}\nfunction getDefaultSuccess(mode = 'light') {\n    if (mode === 'dark') {\n        return {\n            main: colors_green[400],\n            light: colors_green[300],\n            dark: colors_green[700]\n        };\n    }\n    return {\n        main: colors_green[800],\n        light: colors_green[500],\n        dark: colors_green[900]\n    };\n}\nfunction getDefaultWarning(mode = 'light') {\n    if (mode === 'dark') {\n        return {\n            main: colors_orange[400],\n            light: colors_orange[300],\n            dark: colors_orange[700]\n        };\n    }\n    return {\n        main: '#ed6c02',\n        // closest to orange[800] that pass 3:1.\n        light: colors_orange[500],\n        dark: colors_orange[900]\n    };\n}\n// Use the same name as the experimental CSS `contrast-color` function.\nfunction contrastColor(background) {\n    return `oklch(from ${background} var(--__l) 0 h / var(--__a))`;\n}\nfunction createPalette(palette) {\n    const { mode = 'light', contrastThreshold = 3, tonalOffset = 0.2, colorSpace, ...other } = palette;\n    const primary = palette.primary || getDefaultPrimary(mode);\n    const secondary = palette.secondary || getDefaultSecondary(mode);\n    const error = palette.error || getDefaultError(mode);\n    const info = palette.info || getDefaultInfo(mode);\n    const success = palette.success || getDefaultSuccess(mode);\n    const warning = palette.warning || getDefaultWarning(mode);\n    // Use the same logic as\n    // Bootstrap: https://github.com/twbs/bootstrap/blob/1d6e3710dd447de1a200f29e8fa521f8a0908f70/scss/_functions.scss#L59\n    // and material-components-web https://github.com/material-components/material-components-web/blob/ac46b8863c4dab9fc22c4c662dc6bd1b65dd652f/packages/mdc-theme/_functions.scss#L54\n    function getContrastText(background) {\n        if (colorSpace) {\n            return contrastColor(background);\n        }\n        const contrastText = getContrastRatio(background, dark.text.primary) >= contrastThreshold ? dark.text.primary : light.text.primary;\n        if (false) {}\n        return contrastText;\n    }\n    const augmentColor = ({ color, name, mainShade = 500, lightShade = 300, darkShade = 700 })=>{\n        color = {\n            ...color\n        };\n        if (!color.main && color[mainShade]) {\n            color.main = color[mainShade];\n        }\n        if (!color.hasOwnProperty('main')) {\n            throw new Error( false ? 0 : formatMuiErrorMessage(11, name ? ` (${name})` : '', mainShade));\n        }\n        if (typeof color.main !== 'string') {\n            throw new Error( false ? 0 : formatMuiErrorMessage(12, name ? ` (${name})` : '', JSON.stringify(color.main)));\n        }\n        if (colorSpace) {\n            mixLightOrDark(colorSpace, color, 'light', lightShade, tonalOffset);\n            mixLightOrDark(colorSpace, color, 'dark', darkShade, tonalOffset);\n        } else {\n            addLightOrDark(color, 'light', lightShade, tonalOffset);\n            addLightOrDark(color, 'dark', darkShade, tonalOffset);\n        }\n        if (!color.contrastText) {\n            color.contrastText = getContrastText(color.main);\n        }\n        return color;\n    };\n    let modeHydrated;\n    if (mode === 'light') {\n        modeHydrated = getLight();\n    }
1 else if (mode === 'dark') {\n        modeHydrated = getDark();\n    }\n    if (false) {}\n    const paletteOutput = deepmerge_deepmerge({\n        // A collection of common colors.\n        common: {\n            ...colors_common\n        },\n        // prevent mutable object.\n        // The palette mode, can be light or dark.\n        mode,\n        // The colors used to represent primary interface elements for a user.\n        primary: augmentColor({\n            color: primary,\n            name: 'primary'\n        }),\n        // The colors used to represent secondary interface elements for a user.\n        secondary: augmentColor({\n            color: secondary,\n            name: 'secondary',\n            mainShade: 'A400',\n            lightShade: 'A200',\n            darkShade: 'A700'\n        }),\n        // The colors used to represent interface elements that the user should be made aware of.\n        error: augmentColor({\n            color: error,\n            name: 'error'\n        }),\n        // The colors used to represent potentially dangerous actions or important messages.\n        warning: augmentColor({\n            color: warning,\n            name: 'warning'\n        }),\n        // The colors used to present information to the user that is neutral and not necessarily important.\n        info: augmentColor({\n            color: info,\n            name: 'info'\n        }),\n        // The colors used to indicate the successful completion of an action that user triggered.\n        success: augmentColor({\n            color: success,\n            name: 'success'\n        }),\n        // The grey colors.\n        grey: colors_grey,\n        // Used by `getContrastText()` to maximize the contrast between\n        // the background and the text.\n        contrastThreshold,\n        // Takes a background color and returns the text color that maximizes the contrast.\n        getContrastText,\n        // Generate a rich color object.\n        augmentColor,\n        // Used by the functions below to shift a color's luminance by approximately\n        // two indexes within its tonal palette.\n        // E.g., shift from Red 500 to Red 300 or Red 700.\n        tonalOffset,\n        // The light and dark mode object.\n        ...modeHydrated\n    }, other);\n    return paletteOutput;\n}\n\n;// ./node_modules/@mui/system/esm/cssVars/createGetCssVar.js\n/**\n * The benefit of this function is to help developers get CSS var from theme without specifying the whole variable\n * and they does not need to remember the prefix (defined once).\n */\nfunction createGetCssVar(prefix = '') {\n  function appendVar(...vars) {\n    if (!vars.length) {\n      return '';\n    }\n    const value = vars[0];\n    if (typeof value === 'string' && !value.match(/(#|\\(|\\)|(-?(\\d*\\.)?\\d+)(px|em|%|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc))|^(-?(\\d*\\.)?\\d+)$|(\\d+ \\d+ \\d+)/)) {\n      return `, var(--${prefix ? `${prefix}-` : ''}${value}${appendVar(...vars.slice(1))})`;\n    }\n    return `, ${value}`;\n  }\n\n  // AdditionalVars makes `getCssVar` less strict, so it can be use like this `getCssVar('non-mui-variable')` without type error.\n  const getCssVar = (field, ...fallbacks) => {\n    return `var(--${prefix ? `${prefix}-` : ''}${field}${appendVar(...fallbacks)})`;\n  };\n  return getCssVar;\n}\n;// ./node_modules/@mui/system/esm/cssVars/prepareTypographyVars.js\nfunction prepareTypographyVars(typography) {\n  const vars = {};\n  const entries = Object.entries(typography);\n  entries.forEach(entry => {\n    const [key, value] = entry;\n    if (typeof value === 'object') {\n      vars[key] = `${value.fontStyle ? `${value.fontStyle} ` : ''}${value.fontVariant ? `${value.fontVariant} ` : ''}${value.fontWeight ? `${value.fontWeight} ` : ''}${value.fontStretch ? `${value.fontStretch} ` : ''}${value.fontSize || ''}${value.lineHeight ? `/${value.lineHeight} ` : ''}${value.fontFamily || ''}`;\n    }\n  });\n  return vars;\n}\n;// ./node_modules/@mui/system/esm/cssVars/cssVarsParser.js\n/**\n * This function create an object from keys, value and then assign to target\n *\n * @param {Object} obj : the target object to be assigned\n * @param {string[]} keys\n * @param {string | number}
1 value\n *\n * @example\n * const source = {}\n * assignNestedKeys(source, ['palette', 'primary'], 'var(--palette-primary)')\n * console.log(source) // { palette: { primary: 'var(--palette-primary)' } }\n *\n * @example\n * const source = { palette: { primary: 'var(--palette-primary)' } }\n * assignNestedKeys(source, ['palette', 'secondary'], 'var(--palette-secondary)')\n * console.log(source) // { palette: { primary: 'var(--palette-primary)', secondary: 'var(--palette-secondary)' } }\n */\nconst assignNestedKeys = (obj, keys, value, arrayKeys = []) => {\n  let temp = obj;\n  keys.forEach((k, index) => {\n    if (index === keys.length - 1) {\n      if (Array.isArray(temp)) {\n        temp[Number(k)] = value;\n      } else if (temp && typeof temp === 'object') {\n        temp[k] = value;\n      }\n    } else if (temp && typeof temp === 'object') {\n      if (!temp[k]) {\n        temp[k] = arrayKeys.includes(k) ? [] : {};\n      }\n      temp = temp[k];\n    }\n  });\n};\n\n/**\n *\n * @param {Object} obj : source object\n * @param {Function} callback : a function that will be called when\n *                   - the deepest key in source object is reached\n *                   - the value of the deepest key is NOT `undefined` | `null`\n *\n * @example\n * walkObjectDeep({ palette: { primary: { main: '#000000' } } }, console.log)\n * // ['palette', 'primary', 'main'] '#000000'\n */\nconst walkObjectDeep = (obj, callback, shouldSkipPaths) => {\n  function recurse(object, parentKeys = [], arrayKeys = []) {\n    Object.entries(object).forEach(([key, value]) => {\n      if (!shouldSkipPaths || shouldSkipPaths && !shouldSkipPaths([...parentKeys, key])) {\n        if (value !== undefined && value !== null) {\n          if (typeof value === 'object' && Object.keys(value).length > 0) {\n            recurse(value, [...parentKeys, key], Array.isArray(value) ? [...arrayKeys, key] : arrayKeys);\n          } else {\n            callback([...parentKeys, key], value, arrayKeys);\n          }\n        }\n      }\n    });\n  }\n  recurse(obj);\n};\nconst getCssValue = (keys, value) => {\n  if (typeof value === 'number') {\n    if (['lineHeight', 'fontWeight', 'opacity', 'zIndex'].some(prop => keys.includes(prop))) {\n      // CSS property that are unitless\n      return value;\n    }\n    const lastKey = keys[keys.length - 1];\n    if (lastKey.toLowerCase().includes('opacity')) {\n      // opacity values are unitless\n      return value;\n    }\n    return `${value}px`;\n  }\n  return value;\n};\n\n/**\n * a function that parse theme and return { css, vars }\n *\n * @param {Object} theme\n * @param {{\n *  prefix?: string,\n *  shouldSkipGeneratingVar?: (objectPathKeys: Array<string>, value: string | number) => boolean\n * }} options.\n *  `prefix`: The prefix of the generated CSS variables. This function does not change the value.\n *\n * @returns {{ css: Object, vars: Object }} `css` is the stylesheet, `vars` is an object to get css variable (same structure as theme).\n *\n * @example\n * const { css, vars } = parser({\n *   fontSize: 12,\n *   lineHeight: 1.2,\n *   palette: { primary: { 500: 'var(--color)' } }\n * }, { prefix: 'foo' })\n *\n * console.log(css) // { '--foo-fontSize': '12px', '--foo-lineHeight': 1.2, '--foo-palette-primary-500': 'var(--color)' }\n * console.log(vars) // { fontSize: 'var(--foo-fontSize)', lineHeight: 'var(--foo-lineHeight)', palette: { primary: { 500: 'var(--foo-palette-primary-500)' } } }\n */\nfunction cssVarsParser(theme, options) {\n  const {\n    prefix,\n    shouldSkipGeneratingVar\n  } = options || {};\n  const css = {};\n  const vars = {};\n  const varsWithDefaults = {};\n  walkObjectDeep(theme, (keys, value, arrayKeys) => {\n    if (typeof value === 'string' || typeof value === 'number') {\n      if (!shouldSkipGeneratingVar || !shouldSkipGeneratingVar(keys, value)) {\n        // only create css & var if `shouldSkipGeneratingVar` return false\n        const cssVar = `--${prefix ? `${prefix}-` : ''}${keys.join('-')}`;\n        const resolvedValue = getCssValue(keys, value);\n        Object.assign(css, {\n          [cssVar]: resolvedValue\n        });\n        assignNestedKeys(vars, keys, `var(${cssVar})`, arrayKeys);\n        assignNestedKeys(varsWithDefaults, keys, `var(${cssVar}, ${resolvedValue})`, arrayKeys);\n      }\n    }\n  }, keys => keys[0] === 'vars' // skip 'vars/*' paths\n  );\n  return {\n    css,\n    vars,\n    varsWithDefaults\n  };\n}\n;// ./node_modules/@mui/system/esm/cssVars/prepareCssVars.js\n\n\nfunction prepareCssVars(theme, parserConfig = {}) {\n  const {\n    getSelector = defaultGetSelector,\n    disableCssColorScheme,\n    colorSchemeSelector: selector,\n    enableContrastVars\n  } = parserConfig;\n  // @ts-ignore - ignore components do not exist\n  const {\n    colorSchemes = {},\n    components,\n    defaultColorScheme = 'light',\n    ...otherTheme\
1n  } = theme;\n  const {\n    vars: rootVars,\n    css: rootCss,\n    varsWithDefaults: rootVarsWithDefaults\n  } = cssVarsParser(otherTheme, parserConfig);\n  let themeVars = rootVarsWithDefaults;\n  const colorSchemesMap = {};\n  const {\n    [defaultColorScheme]: defaultScheme,\n    ...otherColorSchemes\n  } = colorSchemes;\n  Object.entries(otherColorSchemes || {}).forEach(([key, scheme]) => {\n    const {\n      vars,\n      css,\n      varsWithDefaults\n    } = cssVarsParser(scheme, parserConfig);\n    themeVars = deepmerge_deepmerge(themeVars, varsWithDefaults);\n    colorSchemesMap[key] = {\n      css,\n      vars\n    };\n  });\n  if (defaultScheme) {\n    // default color scheme vars should be merged last to set as default\n    const {\n      css,\n      vars,\n      varsWithDefaults\n    } = cssVarsParser(defaultScheme, parserConfig);\n    themeVars = deepmerge_deepmerge(themeVars, varsWithDefaults);\n    colorSchemesMap[defaultColorScheme] = {\n      css,\n      vars\n    };\n  }\n  function defaultGetSelector(colorScheme, cssObject) {\n    let rule = selector;\n    if (selector === 'class') {\n      rule = '.%s';\n    }\n    if (selector === 'data') {\n      rule = '[data-%s]';\n    }\n    if (selector?.startsWith('data-') && !selector.includes('%s')) {\n      // 'data-joy-color-scheme' -> '[data-joy-color-scheme=\"%s\"]'\n      rule = `[${selector}=\"%s\"]`;\n    }\n    if (colorScheme) {\n      if (rule === 'media') {\n        if (theme.defaultColorScheme === colorScheme) {\n          return ':root';\n        }\n        const mode = colorSchemes[colorScheme]?.palette?.mode || colorScheme;\n        return {\n          [`@media (prefers-color-scheme: ${mode})`]: {\n            ':root': cssObject\n          }\n        };\n      }\n      if (rule) {\n        if (theme.defaultColorScheme === colorScheme) {\n          return `:root, ${rule.replace('%s', String(colorScheme))}`;\n        }\n        return rule.replace('%s', String(colorScheme));\n      }\n    }\n    return ':root';\n  }\n  const generateThemeVars = () => {\n    let vars = {\n      ...rootVars\n    };\n    Object.entries(colorSchemesMap).forEach(([, {\n      vars: schemeVars\n    }]) => {\n      vars = deepmerge_deepmerge(vars, schemeVars);\n    });\n    return vars;\n  };\n  const generateStyleSheets = () => {\n    const stylesheets = [];\n    const colorScheme = theme.defaultColorScheme || 'light';\n    function insertStyleSheet(key, css) {\n      if (Object.keys(css).length) {\n        stylesheets.push(typeof key === 'string' ? {\n          [key]: {\n            ...css\n          }\n        } : key);\n      }\n    }\n    insertStyleSheet(getSelector(undefined, {\n      ...rootCss\n    }), rootCss);\n    const {\n      [colorScheme]: defaultSchemeVal,\n      ...other\n    } = colorSchemesMap;\n    if (defaultSchemeVal) {\n      // default color scheme has to come before other color schemes\n      const {\n        css\n      } = defaultSchemeVal;\n      const cssColorSheme = colorSchemes[colorScheme]?.palette?.mode;\n      const finalCss = !disableCssColorScheme && cssColorSheme ? {\n        colorScheme: cssColorSheme,\n        ...css\n      } : {\n        ...css\n      };\n      insertStyleSheet(getSelector(colorScheme, {\n        ...finalCss\n      }), finalCss);\n    }\n    Object.entries(other).forEach(([key, {\n      css\n    }]) => {\n      const cssColorSheme = colorSchemes[key]?.palette?.mode;\n      const finalCss = !disableCssColorScheme && cssColorSheme ? {\n        colorScheme: cssColorSheme,\n        ...css\n      } : {\n        ...css\n      };\n      insertStyleSheet(getSelector(key, {\n        ...finalCss\n      }), finalCss);\n    });\n    if (enableContrastVars) {\n      stylesheets.push({\n        ':root': {\n          // use double underscore to indicate that these are private variables\n          '--__l-threshold': '0.7',\n          '--__l': 'clamp(0, (l / var(--__l-threshold) - 1) * -infinity, 1)',\n          '--__a': 'clamp(0.87, (l / var(--__l-threshold) - 1) * -infinity, 1)' // 0.87 is the default alpha value for black text.\n        }\n      });\n    }\n    return stylesheets;\n  };
1\n  return {\n    vars: themeVars,\n    generateThemeVars,\n    generateStyleSheets\n  };\n}\n/* harmony default export */ const cssVars_prepareCssVars = (prepareCssVars);\n;// ./node_modules/@mui/system/esm/cssVars/getColorSchemeSelector.js\n/* eslint-disable import/prefer-default-export */\nfunction createGetColorSchemeSelector(selector) {\n  return function getColorSchemeSelector(colorScheme) {\n    if (selector === 'media') {\n      if (false) {}\n      return `@media (prefers-color-scheme: ${colorScheme})`;\n    }\n    if (selector) {\n      if (selector.startsWith('data-') && !selector.includes('%s')) {\n        return `[${selector}=\"${colorScheme}\"] &`;\n      }\n      if (selector === 'class') {\n        return `.${colorScheme} &`;\n      }\n      if (selector === 'data') {\n        return `[data-${colorScheme}] &`;\n      }\n      return `${selector.replace('%s', colorScheme)} &`;\n    }\n    return '&';\n  };\n}\n;// ./node_modules/@mui/material/esm/styles/createMixins.js\nfunction createMixins(breakpoints, mixins) {\n    return {\n        toolbar: {\n            minHeight: 56,\n            [breakpoints.up('xs')]: {\n                '@media (orientation: landscape)': {\n                    minHeight: 48\n                }\n            },\n            [breakpoints.up('sm')]: {\n                minHeight: 64\n            }\n        },\n        ...mixins\n    };\n}\n\n;// ./node_modules/@mui/material/esm/styles/createTypography.js\n\nfunction round(value) {\n    return Math.round(value * 1e5) / 1e5;\n}\nconst caseAllCaps = {\n    textTransform: 'uppercase'\n};\nconst defaultFontFamily = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\n/**\n * @see @link{https://m2.material.io/design/typography/the-type-system.html}\n * @see @link{https://m2.material.io/design/typography/understanding-typography.html}\n */ function createTypography(palette, typography) {\n    const { fontFamily = defaultFontFamily, // The default font size of the Material Specification.\n    fontSize = 14, // px\n    fontWeightLight = 300, fontWeightRegular = 400, fontWeightMedium = 500, fontWeightBold = 700, // Tell MUI what's the font-size on the html element.\n    // 16px is the default font-size used by browsers.\n    htmlFontSize = 16, // Apply the CSS properties to all the variants.\n    allVariants, pxToRem: pxToRem2, ...other } = typeof typography === 'function' ? typography(palette) : typography;\n    if (false) {}\n    const coef = fontSize / 14;\n    const pxToRem = pxToRem2 || ((size)=>`${size / htmlFontSize * coef}rem`);\n    const buildVariant = (fontWeight, size, lineHeight, letterSpacing, casing)=>({\n            fontFamily,\n            fontWeight,\n            fontSize: pxToRem(size),\n            // Unitless following https://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/\n            lineHeight,\n            // The letter spacing was designed for the Roboto font-family. Using the same letter-spacing\n            // across font-families can cause issues with the kerning.\n            ...fontFamily === defaultFontFamily ? {\n                letterSpacing: `${round(letterSpacing / size)}em`\n            } : {},\n            ...casing,\n            ...allVariants\n        });\n    const variants = {\n        h1: buildVariant(fontWeightLight, 96, 1.167, -1.5),\n        h2: buildVariant(fontWeightLight, 60, 1.2, -0.5),\n        h3: buildVariant(fontWeightRegular, 48, 1.167, 0),\n        h4: buildVariant(fontWeightRegular, 34, 1.235, 0.25),\n        h5: buildVariant(fontWeightRegular, 24, 1.334, 0),\n        h6: buildVariant(fontWeightMedium, 20, 1.6, 0.15),\n        subtitle1: buildVariant(fontWeightRegular, 16, 1.75, 0.15),\n        subtitle2: buildVariant(fontWeightMedium, 14, 1.57, 0.1),\n        body1: buildVariant(fontWeightRegular, 16, 1.5, 0.15),\n        body2: buildVariant(fontWeightRegular, 14, 1.43, 0.15),\n        button: buildVariant(fontWeightMedium, 14, 1.75, 0.4, caseAllCaps),\n        caption: buildVariant(fontWeightRegular, 12, 1.66, 0.4),\n        overline: buildVariant(fontWeightRegular, 12, 2.66, 1, caseAllCaps),\n        // TODO v6: Remove handling of 'inherit' variant from the theme as it is already handled in Material UI's Typography component. Also, remember to remove the associated types.\n        inherit: {\
1n            fontFamily: 'inherit',\n            fontWeight: 'inherit',\n            fontSize: 'inherit',\n            lineHeight: 'inherit',\n            letterSpacing: 'inherit'\n        }\n    };\n    return deepmerge_deepmerge({\n        htmlFontSize,\n        pxToRem,\n        fontFamily,\n        fontSize,\n        fontWeightLight,\n        fontWeightRegular,\n        fontWeightMedium,\n        fontWeightBold,\n        ...variants\n    }, other, {\n        clone: false // No need to clone deep\n    });\n}\n\n;// ./node_modules/@mui/material/esm/styles/shadows.js\nconst shadowKeyUmbraOpacity = 0.2;\nconst shadowKeyPenumbraOpacity = 0.14;\nconst shadowAmbientShadowOpacity = 0.12;\nfunction createShadow(...px) {\n    return [\n        `${px[0]}px ${px[1]}px ${px[2]}px ${px[3]}px rgba(0,0,0,${shadowKeyUmbraOpacity})`,\n        `${px[4]}px ${px[5]}px ${px[6]}px ${px[7]}px rgba(0,0,0,${shadowKeyPenumbraOpacity})`,\n        `${px[8]}px ${px[9]}px ${px[10]}px ${px[11]}px rgba(0,0,0,${shadowAmbientShadowOpacity})`\n    ].join(',');\n}\n// Values from https://github.com/material-components/material-components-web/blob/be8747f94574669cb5e7add1a7c54fa41a89cec7/packages/mdc-elevation/_variables.scss\nconst shadows = [\n    'none',\n    createShadow(0, 2, 1, -1, 0, 1, 1, 0, 0, 1, 3, 0),\n    createShadow(0, 3, 1, -2, 0, 2, 2, 0, 0, 1, 5, 0),\n    createShadow(0, 3, 3, -2, 0, 3, 4, 0, 0, 1, 8, 0),\n    createShadow(0, 2, 4, -1, 0, 4, 5, 0, 0, 1, 10, 0),\n    createShadow(0, 3, 5, -1, 0, 5, 8, 0, 0, 1, 14, 0),\n    createShadow(0, 3, 5, -1, 0, 6, 10, 0, 0, 1, 18, 0),\n    createShadow(0, 4, 5, -2, 0, 7, 10, 1, 0, 2, 16, 1),\n    createShadow(0, 5, 5, -3, 0, 8, 10, 1, 0, 3, 14, 2),\n    createShadow(0, 5, 6, -3, 0, 9, 12, 1, 0, 3, 16, 2),\n    createShadow(0, 6, 6, -3, 0, 10, 14, 1, 0, 4, 18, 3),\n    createShadow(0, 6, 7, -4, 0, 11, 15, 1, 0, 4, 20, 3),\n    createShadow(0, 7, 8, -4, 0, 12, 17, 2, 0, 5, 22, 4),\n    createShadow(0, 7, 8, -4, 0, 13, 19, 2, 0, 5, 24, 4),\n    createShadow(0, 7, 9, -4, 0, 14, 21, 2, 0, 5, 26, 4),\n    createShadow(0, 8, 9, -5, 0, 15, 22, 2, 0, 6, 28, 5),\n    createShadow(0, 8, 10, -5, 0, 16, 24, 2, 0, 6, 30, 5),\n    createShadow(0, 8, 11, -5, 0, 17, 26, 2, 0, 6, 32, 5),\n    createShadow(0, 9, 11, -5, 0, 18, 28, 2, 0, 7, 34, 6),\n    createShadow(0, 9, 12, -6, 0, 19, 29, 2, 0, 7, 36, 6),\n    createShadow(0, 10, 13, -6, 0, 20, 31, 3, 0, 8, 38, 7),\n    createShadow(0, 10, 13, -6, 0, 21, 33, 3, 0, 8, 40, 7),\n    createShadow(0, 10, 14, -6, 0, 22, 35, 3, 0, 8, 42, 7),\n    createShadow(0, 11, 14, -7, 0, 23, 36, 3, 0, 9, 44, 8),\n    createShadow(0, 11, 15, -7, 0, 24, 38, 3, 0, 9, 46, 8)\n];\n/* harmony default export */ const styles_shadows = (shadows);\n\n;// ./node_modules/@mui/material/esm/styles/createTransitions.js\n// Follow https://material.google.com/motion/duration-easing.html#duration-easing-natural-easing-curves\n// to learn the context in which each easing should be used.\nconst easing = {\n    // This is the most common easing curve.\n    easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n    // Objects enter the screen at full velocity from off-screen and\n    // slowly decelerate to a resting point.\n    easeOut: 'cubic-bezier(0.0, 0, 0.2, 1)',\n    // Objects leave the screen at full velocity. They do not decelerate when off-screen.\n    easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n    // The sharp curve is used by objects that may return to the screen at any time.\n    sharp: 'cubic-bezier(0.4, 0, 0.6, 1)'\n};\n// Follow https://m2.material.io/guidelines/motion/duration-easing.html#duration-easing-common-durations\n// to learn when use what timing\nconst duration = {\n    shortest: 150,\n    shorter: 200,\n    short: 250,\n    // most basic recommended timing\n    standard: 300,\n    // this is to be used in complex animations\n    complex: 375,\n    // recommended when something is entering screen\n    enteringScreen: 225,\n    // recommended when something is leaving screen\n    leavingScreen: 195\n};\nfunction formatMs(milliseconds) {\n    return `${Math.round(milliseconds)}ms`;\n}\nfunction getAutoHeightDuration(height) {\n    if (!height) {\n        return 0;\n    }\n    const constant = height / 36;\n    // https://www.desmos.com/calculator/vbrp3ggqet\n    return Math.min(Math.round((4 + 15 * constant ** 0.25 + constant / 5) * 10), 3000);\n}\nfunction createTransitions(inputTransitions) {\n    const mergedEasing = {\n        ...easing,\n        ...inputTransitions.easing\n    };\n    const mergedDuration = {\n        ...duration,\n        ...inputTransitions.duration\n    };\n    const create = (props = [\n        'all'\n    ], options = {})=>{\n        const { duration: durationOption = mergedDuration.standard, easing: easingOption = mergedEasing.easeInOut, delay = 0, ...other } = options;\n        if (false) {}\n        return (Array.isArray(props) ? props : [\n            props\n        ]).map((animatedProp)=>`${animatedProp} ${typeof durationOption === 'string' ? durationOption : formatMs(durationOption)} ${easingOption}
1 ${typeof delay === 'string' ? delay : formatMs(delay)}`).join(',');\n    };\n    return {\n        getAutoHeightDuration,\n        create,\n        ...inputTransitions,\n        easing: mergedEasing,\n        duration: mergedDuration\n    };\n}\n\n;// ./node_modules/@mui/material/esm/styles/zIndex.js\n// We need to centralize the zIndex definitions as they work\n// like global values in the browser.\nconst zIndex = {\n    mobileStepper: 1000,\n    fab: 1050,\n    speedDial: 1050,\n    appBar: 1100,\n    drawer: 1200,\n    modal: 1300,\n    snackbar: 1400,\n    tooltip: 1500\n};\n/* harmony default export */ const styles_zIndex = (zIndex);\n\n;// ./node_modules/@mui/material/esm/styles/stringifyTheme.js\n/* eslint-disable import/prefer-default-export */ \nfunction isSerializable(val) {\n    return isPlainObject(val) || typeof val === 'undefined' || typeof val === 'string' || typeof val === 'boolean' || typeof val === 'number' || Array.isArray(val);\n}\n/**\n * `baseTheme` usually comes from `createTheme()` or `extendTheme()`.\n *\n * This function is intended to be used with zero-runtime CSS-in-JS like Pigment CSS\n * For example, in a Next.js project:\n *\n * ```js\n * // next.config.js\n * const { extendTheme } = require('@mui/material/styles');\n *\n * const theme = extendTheme();\n * // `.toRuntimeSource` is Pigment CSS specific to create a theme that is available at runtime.\n * theme.toRuntimeSource = stringifyTheme;\n *\n * module.exports = withPigment({\n *  theme,\n * });\n * ```\n */ function stringifyTheme(baseTheme = {}) {\n    const serializableTheme = {\n        ...baseTheme\n    };\n    function serializeTheme(object) {\n        const array = Object.entries(object);\n        // eslint-disable-next-line no-plusplus\n        for(let index = 0; index < array.length; index++){\n            const [key, value] = array[index];\n            if (!isSerializable(value) || key.startsWith('unstable_')) {\n                delete object[key];\n            } else if (isPlainObject(value)) {\n                object[key] = {\n                    ...value\n                };\n                serializeTheme(object[key]);\n            }\n        }\n    }\n    serializeTheme(serializableTheme);\n    return `import { unstable_createBreakpoints as createBreakpoints, createTransitions } from '@mui/material/styles';\n\nconst theme = ${JSON.stringify(serializableTheme, null, 2)};\n\ntheme.breakpoints = createBreakpoints(theme.breakpoints || {});\ntheme.transitions = createTransitions(theme.transitions || {});\n\nexport default theme;`;\n}\n\n;// ./node_modules/@mui/material/esm/styles/createThemeNoVars.js\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction coefficientToPercentage(coefficient) {\n    if (typeof coefficient === 'number') {\n        return `${(coefficient * 100).toFixed(0)}%`;\n    }\n    return `calc((${coefficient}) * 100%)`;\n}\n// This can be removed when moved to `color-mix()` entirely.\nconst parseAddition = (str)=>{\n    if (!Number.isNaN(+str)) {\n        return +str;\n    }\n    const numbers = str.match(/\\d*\\.?\\d+/g);\n    if (!numbers) {\n        return 0;\n    }\n    let sum = 0;\n    for(let i = 0; i < numbers.length; i += 1){\n        sum += +numbers[i];\n    }\n    return sum;\n};\nfunction attachColorManipulators(theme) {\n    Object.assign(theme, {\n        alpha (color, coefficient) {\n            const obj = this || theme;\n            if (obj.colorSpace) {\n                return `oklch(from ${color} l c h / ${typeof coefficient === 'string' ? `calc(${coefficient})` : coefficient})`;\n            }\n            if (obj.vars) {\n                // To preserve the behavior of the CSS theme variables\n                // In the future, this could be replaced by `color-mix` (when https://caniuse.com/?search=color-mix reaches 95%).\n                return `rgba(${color.replace(/var\\(--([^,\\s)]+)(?:,[^)]+)?\\)+/g, 'var(--$1Channel)')} / ${typeof coefficient === 'string' ? `calc(${coefficient})` : coefficient})`;\n            }\n            return alpha(color, parseAddition(coefficient));\n        },\n        lighten (color, coefficient) {\n            const obj = this || theme;\n            if (obj.colorSpace) {\n                return `color-mix(in ${obj.colorSpace}
1, ${color}, #fff ${coefficientToPercentage(coefficient)})`;\n            }\n            return lighten(color, coefficient);\n        },\n        darken (color, coefficient) {\n            const obj = this || theme;\n            if (obj.colorSpace) {\n                return `color-mix(in ${obj.colorSpace}, ${color}, #000 ${coefficientToPercentage(coefficient)})`;\n            }\n            return darken(color, coefficient);\n        }\n    });\n}\nfunction createThemeNoVars(options = {}, ...args) {\n    const { breakpoints: breakpointsInput, mixins: mixinsInput = {}, spacing: spacingInput, palette: paletteInput = {}, transitions: transitionsInput = {}, typography: typographyInput = {}, shape: shapeInput, colorSpace, ...other } = options;\n    if (options.vars && // The error should throw only for the root theme creation because user is not allowed to use a custom node `vars`.\n    // `generateThemeVars` is the closest identifier for checking that the `options` is a result of `createTheme` with CSS variables so that user can create new theme for nested ThemeProvider.\n    options.generateThemeVars === undefined) {\n        throw new Error( false ? 0 : formatMuiErrorMessage(20));\n    }\n    const palette = createPalette({\n        ...paletteInput,\n        colorSpace\n    });\n    const systemTheme = createTheme_createTheme(options);\n    let muiTheme = deepmerge_deepmerge(systemTheme, {\n        mixins: createMixins(systemTheme.breakpoints, mixinsInput),\n        palette,\n        // Don't use [...shadows] until you've verified its transpiled code is not invoking the iterator protocol.\n        shadows: styles_shadows.slice(),\n        typography: createTypography(palette, typographyInput),\n        transitions: createTransitions(transitionsInput),\n        zIndex: {\n            ...styles_zIndex\n        }\n    });\n    muiTheme = deepmerge_deepmerge(muiTheme, other);\n    muiTheme = args.reduce((acc, argument)=>deepmerge_deepmerge(acc, argument), muiTheme);\n    if (false) {}\n    muiTheme.unstable_sxConfig = {\n        ...styleFunctionSx_defaultSxConfig,\n        ...other?.unstable_sxConfig\n    };\n    muiTheme.unstable_sx = function sx(props) {\n        return styleFunctionSx_styleFunctionSx({\n            sx: props,\n            theme: this\n        });\n    };\n    muiTheme.toRuntimeSource = stringifyTheme; // for Pigment CSS integration\n    attachColorManipulators(muiTheme);\n    return muiTheme;\n}\n/* harmony default export */ const styles_createThemeNoVars = (createThemeNoVars);\n\n;// ./node_modules/@mui/material/esm/styles/getOverlayAlpha.js\n// Inspired by https://github.com/material-components/material-components-ios/blob/bca36107405594d5b7b16265a5b0ed698f85a5ee/components/Elevation/src/UIColor%2BMaterialElevation.m#L61\nfunction getOverlayAlpha(elevation) {\n    let alphaValue;\n    if (elevation < 1) {\n        alphaValue = 5.11916 * elevation ** 2;\n    } else {\n        alphaValue = 4.5 * Math.log(elevation + 1) + 2;\n    }\n    return Math.round(alphaValue * 10) / 1000;\n}\n\n;// ./node_modules/@mui/material/esm/styles/createColorScheme.js\n\n\nconst defaultDarkOverlays = [\n    ...Array(25)\n].map((_, index)=>{\n    if (index === 0) {\n        return 'none';\n    }\n    const overlay = getOverlayAlpha(index);\n    return `linear-gradient(rgba(255 255 255 / ${overlay}), rgba(255 255 255 / ${overlay}))`;\n});\nfunction getOpacity(mode) {\n    return {\n        inputPlaceholder: mode === 'dark' ? 0.5 : 0.42,\n        inputUnderline: mode === 'dark' ? 0.7 : 0.42,\n        switchTrackDisabled: mode === 'dark' ? 0.2 : 0.12,\n        switchTrack: mode === 'dark' ? 0.3 : 0.38\n    };\n}\nfunction getOverlays(mode) {\n    return mode === 'dark' ? defaultDarkOverlays : [];\n}\nfunction createColorScheme(options) {\n    const { palette: paletteInput = {\n        mode: 'light'\n    }, // need to cast to avoid module augmentation test\n    opacity, overlays, colorSpace, ...other } = options;\n    // need to cast because `colorSpace` is considered internal at the moment.\n    const palette = createPalette({\n        ...paletteInput,\n        colorSpace\n    });\n    return {\n        palette,\n        opacity: {\n            ...getOpacity(palette.mode),\n            ...opacity\n        },\n        overlays: overlays || getOverlays(palette.mode),\n        ...other\n    };\n}\n\n;// ./node_modules/@mui/material/esm/styles/shouldSkipGeneratingVar.js\nfunction shouldSkipGeneratingVar_shouldSkipGeneratingVar(keys) {\n    return !!keys[0].match(/(cssVarPrefix|colorSchemeSelector|modularCssLayers|rootSelector|typography|mixins|breakpoints|direction|transitions)/) || !!keys[0].match(/sxConfig$/) || // ends with sxConfig\n    keys[0] === 'palette' && !!keys[1]?.match(/(mode|contrastThreshold|tonalOffset)/);\n}\n\n;// ./node_modules/@mui/material/esm/styles/excludeVariablesFromRoot.js\n/**\n * @internal These variables should not appear in the :root stylesheet when the `defaultColorScheme=\"dark\"`\n */ const excludeVariablesFromRoot = (cssVarPrefix)=>[\n        ...[\n            ...Array(25)\n        ].map((_, index)=>`--${cssVarPrefix ? `${cssVarPrefix}-` : ''}overlays-${index}`),\n        `--${cssVarPrefix ? `${cssVarPrefix}-` : ''}palette-AppBar-darkBg`,\n        `--${cssVarPrefix ? `${cssVarPrefix}-` : ''}
1palette-AppBar-darkColor`\n    ];\n/* harmony default export */ const styles_excludeVariablesFromRoot = (excludeVariablesFromRoot);\n\n;// ./node_modules/@mui/material/esm/styles/createGetSelector.js\n\n/* harmony default export */ const createGetSelector = ((theme)=>(colorScheme, css)=>{\n        const root = theme.rootSelector || ':root';\n        const selector = theme.colorSchemeSelector;\n        let rule = selector;\n        if (selector === 'class') {\n            rule = '.%s';\n        }\n        if (selector === 'data') {\n            rule = '[data-%s]';\n        }\n        if (selector?.startsWith('data-') && !selector.includes('%s')) {\n            // 'data-mui-color-scheme' -> '[data-mui-color-scheme=\"%s\"]'\n            rule = `[${selector}=\"%s\"]`;\n        }\n        if (theme.defaultColorScheme === colorScheme) {\n            if (colorScheme === 'dark') {\n                const excludedVariables = {};\n                styles_excludeVariablesFromRoot(theme.cssVarPrefix).forEach((cssVar)=>{\n                    excludedVariables[cssVar] = css[cssVar];\n                    delete css[cssVar];\n                });\n                if (rule === 'media') {\n                    return {\n                        [root]: css,\n                        [`@media (prefers-color-scheme: dark)`]: {\n                            [root]: excludedVariables\n                        }\n                    };\n                }\n                if (rule) {\n                    return {\n                        [rule.replace('%s', colorScheme)]: excludedVariables,\n                        [`${root}, ${rule.replace('%s', colorScheme)}`]: css\n                    };\n                }\n                return {\n                    [root]: {\n                        ...css,\n                        ...excludedVariables\n                    }\n                };\n            }\n            if (rule && rule !== 'media') {\n                return `${root}, ${rule.replace('%s', String(colorScheme))}`;\n            }\n        } else if (colorScheme) {\n            if (rule === 'media') {\n                return {\n                    [`@media (prefers-color-scheme: ${String(colorScheme)})`]: {\n                        [root]: css\n                    }\n                };\n            }\n            if (rule) {\n                return rule.replace('%s', String(colorScheme));\n            }\n        }\n        return root;\n    });\n\n;// ./node_modules/@mui/material/esm/styles/createThemeWithVars.js\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction assignNode(obj, keys) {\n    keys.forEach((k)=>{\n        if (!obj[k]) {\n            obj[k] = {};\n        }\n    });\n}\nfunction setColor(obj, key, defaultValue) {\n    if (!obj[key] && defaultValue) {\n        obj[key] = defaultValue;\n    }\n}\nfunction toRgb(color) {\n    if (typeof color !== 'string' || !color.startsWith('hsl')) {\n        return color;\n    }\n    return hslToRgb(color);\n}\nfunction setColorChannel(obj, key) {\n    if (!(`${key}Channel` in obj)) {\n        // custom channel token is not provided, generate one.\n        // if channel token can't be generated, show a warning.\n        obj[`${key}Channel`] = private_safeColorChannel(toRgb(obj[key]), `MUI: Can't create \\`palette.${key}Channel\\` because \\`palette.${key}\\` is not one of these formats: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color().` + '\\n' + `To suppress this warning, you need to explicitly provide the \\`palette.${key}Channel\\` as a string (in rgb format, for example \"12 12 12\") or undefined if you want to remove the channel token.`);\n    }\n}\nfunction getSpacingVal(spacingInput) {\n    if (typeof spacingInput === 'number') {\n        return `${spacingInput}px`;\n    }\n    if (typeof spacingInput === 'string' || typeof spacingInput === 'function' || Array.isArray(spacingInput)) {\n        return spacingInput;\n    }\n    return '8px';\n}\nconst silent = (fn)=>{\n    try {\n        return fn();\n    } catch (error) {\n    // ignore error\n    }\n    return undefined;\n};\nconst createThemeWithVars_createGetCssVar = (cssVarPrefix = 'mui')=>createGetCssVar(cssVarPrefix);\nfunction attachColorScheme(colorSpace, colorSchemes, scheme, restTheme, colorScheme) {\n    if (!scheme) {\n        return undefined;\n    }\n    scheme = scheme === true ? {} : scheme;\n    const mode = colorScheme === 'dark' ? 'dark' : 'light';\n    if (!restTheme) {\n        colorSchemes[colorScheme] = createColorScheme({\n            ...scheme,\n            palette: {\n                mode,\n                ...scheme?.palette\n            },\n            colorSpace\n        });\n        return undefined;\n    }\n    const { palette, ...muiTheme } = styles_createThemeNoVars({\n        ...restTheme,\n        palette: {\n            mode,\n            ...scheme?.palette\n        },\n        colorSpace\n    });\n    colorSchemes[colorScheme] = {\n        ...scheme,\n        palette,\n        opacity: {\n            ...getOpacity(mode),\n            ...scheme?.opacity\n        },\n        overlays: scheme?.overlays || getOverlays(mode)\n    };\n    return muiTheme;\n}\n/**\n * A default `createThemeWithVars` comes with a single color scheme, either `light` or `dark` based on the `defaultColorScheme`.\n * This is better suited for apps that only need a single color scheme.\n *\n * To enable built-in `light` and `dark` color schemes, either:\n * 1. provide a `colorSchemeSelector` to define how the color schemes will change.\n * 2. provide `c
1olorSchemes.dark` will set `colorSchemeSelector: 'media'` by default.\n */ function createThemeWithVars(options = {}, ...args) {\n    const { colorSchemes: colorSchemesInput = {\n        light: true\n    }, defaultColorScheme: defaultColorSchemeInput, disableCssColorScheme = false, cssVarPrefix = 'mui', nativeColor = false, shouldSkipGeneratingVar = shouldSkipGeneratingVar_shouldSkipGeneratingVar, colorSchemeSelector: selector = colorSchemesInput.light && colorSchemesInput.dark ? 'media' : undefined, rootSelector = ':root', ...input } = options;\n    const firstColorScheme = Object.keys(colorSchemesInput)[0];\n    const defaultColorScheme = defaultColorSchemeInput || (colorSchemesInput.light && firstColorScheme !== 'light' ? 'light' : firstColorScheme);\n    const getCssVar = createThemeWithVars_createGetCssVar(cssVarPrefix);\n    const { [defaultColorScheme]: defaultSchemeInput, light: builtInLight, dark: builtInDark, ...customColorSchemes } = colorSchemesInput;\n    const colorSchemes = {\n        ...customColorSchemes\n    };\n    let defaultScheme = defaultSchemeInput;\n    // For built-in light and dark color schemes, ensure that the value is valid if they are the default color scheme.\n    if (defaultColorScheme === 'dark' && !('dark' in colorSchemesInput) || defaultColorScheme === 'light' && !('light' in colorSchemesInput)) {\n        defaultScheme = true;\n    }\n    if (!defaultScheme) {\n        throw new Error( false ? 0 : formatMuiErrorMessage(21, defaultColorScheme));\n    }\n    // The reason to use `oklch` is that it is the most perceptually uniform color space and widely supported.\n    let colorSpace;\n    if (nativeColor) {\n        colorSpace = 'oklch';\n    }\n    // Create the palette for the default color scheme, either `light`, `dark`, or custom color scheme.\n    const muiTheme = attachColorScheme(colorSpace, colorSchemes, defaultScheme, input, defaultColorScheme);\n    if (builtInLight && !colorSchemes.light) {\n        attachColorScheme(colorSpace, colorSchemes, builtInLight, undefined, 'light');\n    }\n    if (builtInDark && !colorSchemes.dark) {\n        attachColorScheme(colorSpace, colorSchemes, builtInDark, undefined, 'dark');\n    }\n    let theme = {\n        defaultColorScheme,\n        ...muiTheme,\n        cssVarPrefix,\n        colorSchemeSelector: selector,\n        rootSelector,\n        getCssVar,\n        colorSchemes,\n        font: {\n            ...prepareTypographyVars(muiTheme.typography),\n            ...muiTheme.font\n        },\n        spacing: getSpacingVal(input.spacing)\n    };\n    Object.keys(theme.colorSchemes).forEach((key)=>{\n        const palette = theme.colorSchemes[key].palette;\n        const setCssVarColor = (cssVar)=>{\n            const tokens = cssVar.split('-');\n            const color = tokens[1];\n            const colorToken = tokens[2];\n            return getCssVar(cssVar, palette[color][colorToken]);\n        };\n        // attach black & white channels to common node\n        if (palette.mode === 'light') {\n            setColor(palette.common, 'background', '#fff');\n            setColor(palette.common, 'onBackground', '#000');\n        }\n        if (palette.mode === 'dark') {\n            setColor(palette.common, 'background', '#000');\n            setColor(palette.common, 'onBackground', '#fff');\n        }\n        function colorMix(method, color, coefficient) {\n            if (colorSpace) {\n                let mixer;\n                if (method === private_safeAlpha) {\n                    mixer = `transparent ${((1 - coefficient) * 100).toFixed(0)}%`;\n                }\n                if (method === private_safeDarken) {\n                    mixer = `#000 ${(coefficient * 100).toFixed(0)}%`;\n                }\n                if (method === private_safeLighten) {\n                    mixer = `#fff ${(coefficient * 100).toFixed(0)}%`;\n                }\n                return `color-mix(in ${colorSpace}, ${color}, ${mixer})`;\n            }\n            return method(color, coefficient);\n        }\n        // assign component variables\n        assignNode(palette, [\n            'Alert',\n            'AppBar',\n            'Avatar',\n            'Button',\n            'Chip',\n            'FilledInput',\n            'LinearProgress',\n            'Skeleton',\n            'Slider',\n            'SnackbarContent',\n            'SpeedDialAction',\n            'StepConnector',\n            'StepContent',\n            'Switch',\n            'TableCell',\n            'Tooltip'\n        ]);\n        if (palette.mode === 'light') {\n            setColor(palette.Alert, 'errorColor', colorMix(private_safeDarken, palette.error.light, 0.6));\n            setColor(palette.Alert, 'infoColor', colorMix(private_safeDarken, palette.info.light, 0.6));\n            setColor(palette.Alert, 'successColor', colorMix(private_safeDarken, palette.success.light, 0.6));\n            setColor(palette.Alert, 'warningColor', colorMix(private_safeDarken, palette.warning.light, 0.6));\n            setColor(palette.Alert, 'errorFilledBg', setCssVarColor('palette-error-main'));\n            setColor(palette.Alert, 'infoFilledBg', setCssVarColor('palette-info-main'));\n            setColor(palette.Alert, 'successFilledBg', setCssVarColor('palette-success-main'));\n            setColor(palette.Alert, 'warningFilledBg', setCssVarColor('palette-warning-main'));\n            setColor(palette.Alert, 'errorFilledColor', silent(()=>palette.getContrastText(palette.error.main)));\n            setColor(palette.Alert, 'infoFilledColor', silent(()=>palette.getContrastText(palette.info.main)));\n            setColor(palette.Alert, 'successFilledColor', silent(()=>palette.getContrastText(palette.success.main)));\n            setColor(palette.Alert, 'warningFilledColor', silent(()=>palette.getContrastText(palette.warning.main)));\n            setColor(palette.Alert, 'errorStandardBg', colorMix(private_safeLighten, palette.error.light, 0.9));\n            setColor(palette.Alert, 'infoStandardBg', colorMix(private_safeLighten, palette.info.light, 0.9));\n            setColor(palette.Alert, 'successStandardBg', colorMix(private_safeLighten, palette.success.light, 0.9));\n            setColor(palette.Alert, 'warningStandardBg', colorMix(private_safeLighten, palette.warning.light, 0.9));\n            setColor(palette.Alert, 'errorIconColor', setCssVarColor('palette-error-main'));\n            setColor(palette.Alert, 'infoIconColor', setCssVarColor('palette-info-main'));\n            setColor(palette.Alert, 'successIconColor', setCssVarColor('palette-success-main'));\n            setColor(palette.Alert, 'warningIconColor', setCssVarColor('palette-warning-main'));\n            setColor(palette.AppBar, 'defaultBg', setCssVarColor('palette-grey-100'));\n            setColor(palette.Avatar, 'defaultBg', setCssVarColor('palette-grey-400'));\n            setColor(palette.Button, 'inheritContainedBg', setCssVarColor('palette-grey-300'));\n            setColor(palette.Button, 'inheritContainedHoverBg', setCssVarColor('palette-grey-A100'));\n            setColor(palette.Chip, 'defaultBorder', setCssVarColor('palette-grey-400'));\n            setColor(palette.Chip, 'defaultAvatarColor', setCssVarColor('palette-grey-700'));\n            setColor(palette.Chip, 'defaultIconColor', setCssVarColor('palette-grey-700'));\n            setColor(palette.FilledInput, 'bg', 'rgba(0, 0, 0, 0.06)');\n            setColor(palette.FilledInput, 'hoverBg', 'rgba(0, 0, 0, 0.09)');\n            setColor(palette.FilledInput, 'disabledBg', 'rgba(0, 0, 0, 0.12)');\n            setColor(palette.LinearProgress, 'primaryBg', colorMix(private_safeLighten, palette.primary.main, 0.62));\n            setColor(palette.LinearProgress, 'secondaryBg', colorMix(private_safeLighten, palette.secondary.main, 0.62));\n            setColor(palette.LinearProgress, 'errorBg', colorMix(private_safeLighten, palette.error.main, 0.62));\n            setColor(palette.LinearProgress, 'infoBg', colorMix(private_safeLighten, palette.info.main, 0.62));\n            setColor(palette.LinearProgress, 'successBg', colorMix(private_safeLighten, palette.success.main, 0.62));\n            setColor(palette.LinearProgress, 'warningBg', colorMix(private_safeLighten, palette.warning.main, 0.62));\n            setColor(palette.Skeleton, 'bg', colorSpace ? colorMix(private_safeAlpha, palette.text.primary, 0.11) : `rgba(${setCssVarColor('palette-text-primaryChannel')} / 0.11)`);\n            setColor(palette.Slider, 'primaryTrack', colorMix(private_safeLighten, palette.primary.main, 0.62));\n            setColor(palette.Slider, 'secondaryTrack', colorMix(private_safeLighten, palette.secondary.main, 0.62));\n            setColor(palette.Slider, 'errorTrack', colorMix(private_safeLighten, palette.error.main, 0.62));\n            setColor(palette.Slider, 'infoTrack', colorMix(private_safeLighten, palette.info.main, 0.62));\n            setColor(palette.Slider, 'successTrack', colorMix(private_safeLighten, palette.success.main, 0.62));\n            setColor(palette.Slider, 'warningTrack', colorMix(private_safeLighten, palette.warning.main, 0.62));
1\n            const snackbarContentBackground = colorSpace ? colorMix(private_safeDarken, palette.background.default, 0.6825) // use `0.6825` instead of `0.8` to match the contrast ratio of JS implementation\n             : private_safeEmphasize(palette.background.default, 0.8);\n            setColor(palette.SnackbarContent, 'bg', snackbarContentBackground);\n            setColor(palette.SnackbarContent, 'color', silent(()=>colorSpace ? dark.text.primary : palette.getContrastText(snackbarContentBackground)));\n            setColor(palette.SpeedDialAction, 'fabHoverBg', private_safeEmphasize(palette.background.paper, 0.15));\n            setColor(palette.StepConnector, 'border', setCssVarColor('palette-grey-400'));\n            setColor(palette.StepContent, 'border', setCssVarColor('palette-grey-400'));\n            setColor(palette.Switch, 'defaultColor', setCssVarColor('palette-common-white'));\n            setColor(palette.Switch, 'defaultDisabledColor', setCssVarColor('palette-grey-100'));\n            setColor(palette.Switch, 'primaryDisabledColor', colorMix(private_safeLighten, palette.primary.main, 0.62));\n            setColor(palette.Switch, 'secondaryDisabledColor', colorMix(private_safeLighten, palette.secondary.main, 0.62));\n            setColor(palette.Switch, 'errorDisabledColor', colorMix(private_safeLighten, palette.error.main, 0.62));\n            setColor(palette.Switch, 'infoDisabledColor', colorMix(private_safeLighten, palette.info.main, 0.62));\n            setColor(palette.Switch, 'successDisabledColor', colorMix(private_safeLighten, palette.success.main, 0.62));\n            setColor(palette.Switch, 'warningDisabledColor', colorMix(private_safeLighten, palette.warning.main, 0.62));\n            setColor(palette.TableCell, 'border', colorMix(private_safeLighten, colorMix(private_safeAlpha, palette.divider, 1), 0.88));\n            setColor(palette.Tooltip, 'bg', colorMix(private_safeAlpha, palette.grey[700], 0.92));\n        }\n        if (palette.mode === 'dark') {\n            setColor(palette.Alert, 'errorColor', colorMix(private_safeLighten, palette.error.light, 0.6));\n            setColor(palette.Alert, 'infoColor', colorMix(private_safeLighten, palette.info.light, 0.6));\n            setColor(palette.Alert, 'successColor', colorMix(private_safeLighten, palette.success.light, 0.6));\n            setColor(palette.Alert, 'warningColor', colorMix(private_safeLighten, palette.warning.light, 0.6));\n            setColor(palette.Alert, 'errorFilledBg', setCssVarColor('palette-error-dark'));\n            setColor(palette.Alert, 'infoFilledBg', setCssVarColor('palette-info-dark'));\n            setColor(palette.Alert, 'successFilledBg', setCssVarColor('palette-success-dark'));\n            setColor(palette.Alert, 'warningFilledBg', setCssVarColor('palette-warning-dark'));\n            setColor(palette.Alert, 'errorFilledColor', silent(()=>palette.getContrastText(palette.error.dark)));\n            setColor(palette.Alert, 'infoFilledColor', silent(()=>palette.getContrastText(palette.info.dark)));\n            setColor(palette.Alert, 'successFilledColor', silent(()=>palette.getContrastText(palette.success.dark)));\n            setColor(palette.Alert, 'warningFilledColor', silent(()=>palette.getContrastText(palette.warning.dark)));\n            setColor(palette.Alert, 'errorStandardBg', colorMix(private_safeDarken, palette.error.light, 0.9));\n            setColor(palette.Alert, 'infoStandardBg', colorMix(private_safeDarken, palette.info.light, 0.9));\n            setColor(palette.Alert, 'successStandardBg', colorMix(private_safeDarken, palette.success.light, 0.9));\n            setColor(palette.Alert, 'warningStandardBg', colorMix(private_safeDarken, palette.warning.light, 0.9));\n            setColor(palette.Alert, 'errorIconColor', setCssVarColor('palette-error-main'));\n            setColor(palette.Alert, 'infoIconColor', setCssVarColor('palette-info-main'));\n            setColor(palette.Alert, 'successIconColor', setCssVarColor('palette-success-main'));\n            setColor(palette.Alert, 'warningIconColor', setCssVarColor('palette-warning-main'));\n            setColor(palette.AppBar, 'defaultBg', setCssVarColor('palette-grey-900'));\n            setColor(palette.AppBar, 'darkBg', setCssVarColor('palette-background-paper')); // specific for dark mode\n            setColor(palette.AppBar, 'darkColor', setCssVarColor('palette-text-primary')); // specific for dark mode\n            setColor(palette.Avatar, 'defaultBg', setCssVarColor('palette-grey-600'));\n            setColor(palette.Button, 'inheritContainedBg', setCssVarColor('palette-grey-800'));\n            setColor(palette.Button, 'inheritContainedHoverBg', setCssVarColor('palette-grey-700'));\n            setColor(palette.Chip, 'defaultBorder', setCssVarColor('palette-grey-700'));\n            setColor(palette.Chip, 'defaultAvatarColor', setCssVarColor('palette-grey-300'));\n            setColor(palette.Chip, 'defaultIconColor', setCssVarColor('palette-grey-300'));\n            setColor(palette.FilledInput, 'bg', 'rgba(255, 255, 255, 0.09)');\n            setColor(palette.FilledInput, 'hoverBg', 'rgba(255, 255, 255, 0.13)');\n            setColor(palette.FilledInput, 'disabledBg', 'rgba(255, 255, 255, 0.12)');\n            setColor(palette.LinearProgress, 'primaryBg', colorMix(private_safeDarken, palette.primary.main, 0.5));\n            setColor(palette.LinearProgress, 'secondaryBg', colorMix(private_safeDarken, palette.secondary.main, 0.5));\n            setColor(palette.LinearProgress, 'errorBg', colorMix(private_safeDarken, palette.error.main, 0.5));\n            setColor(palette.LinearProgress, 'infoBg', colorMix(private_safeDarken, palette.info.main, 0.5));\n            setColor(palette.LinearProgress, 'successBg', colorMix(private_safeDarken, palette.success.main, 0.5));\n            setColor(palette.LinearProgress, 'warningBg', colorMix(private_safeDarken, palette.warning.main, 0.5));\n            setColor(palette.Skeleton, 'bg', colorSpace ? colorMix(private_safeAlpha, palette.text.primary, 0.13) : `rgba(${setCssVarColor('palette-text-primaryChannel')} / 0.13)`);\n            setColor(palette.Slider, 'primaryTrack', colorMix(private_safeDarken, palette.primary.main, 0.5));\n            setColor(palette.Slider, 'secondaryTrack', colorMix(private_safeDarken, palette.secondary.main, 0.5));\n            setColor(palette.Slider, 'errorTrack', colorMix(private_safeDarken, palette.error.main, 0.5));\n            setColor(palette.Slider, 'infoTrack', colorMix(private_safeDarken, palette.info.main, 0.5));\n            setColor(palette.Slider, 'successTrack', colorMix(private_safeDarken, palette.success.main, 0.5));\n            setColor(palette.Slider, 'warningTrack', colorMix(private_safeDarken, palette.warning.main, 0.5));
1\n            const snackbarContentBackground = colorSpace ? colorMix(private_safeLighten, palette.background.default, 0.985) // use `0.985` instead of `0.98` to match the contrast ratio of JS implementation\n             : private_safeEmphasize(palette.background.default, 0.98);\n            setColor(palette.SnackbarContent, 'bg', snackbarContentBackground);\n            setColor(palette.SnackbarContent, 'color', silent(()=>colorSpace ? light.text.primary : palette.getContrastText(snackbarContentBackground)));\n            setColor(palette.SpeedDialAction, 'fabHoverBg', private_safeEmphasize(palette.background.paper, 0.15));\n            setColor(palette.StepConnector, 'border', setCssVarColor('palette-grey-600'));\n            setColor(palette.StepContent, 'border', setCssVarColor('palette-grey-600'));\n            setColor(palette.Switch, 'defaultColor', setCssVarColor('palette-grey-300'));\n            setColor(palette.Switch, 'defaultDisabledColor', setCssVarColor('palette-grey-600'));\n            setColor(palette.Switch, 'primaryDisabledColor', colorMix(private_safeDarken, palette.primary.main, 0.55));\n            setColor(palette.Switch, 'secondaryDisabledColor', colorMix(private_safeDarken, palette.secondary.main, 0.55));\n            setColor(palette.Switch, 'errorDisabledColor', colorMix(private_safeDarken, palette.error.main, 0.55));\n            setColor(palette.Switch, 'infoDisabledColor', colorMix(private_safeDarken, palette.info.main, 0.55));\n            setColor(palette.Switch, 'successDisabledColor', colorMix(private_safeDarken, palette.success.main, 0.55));\n            setColor(palette.Switch, 'warningDisabledColor', colorMix(private_safeDarken, palette.warning.main, 0.55));\n            setColor(palette.TableCell, 'border', colorMix(private_safeDarken, colorMix(private_safeAlpha, palette.divider, 1), 0.68));\n            setColor(palette.Tooltip, 'bg', colorMix(private_safeAlpha, palette.grey[700], 0.92));\n        }\n        // MUI X - DataGrid needs this token.\n        setColorChannel(palette.background, 'default');\n        // added for consistency with the `background.default` token\n        setColorChannel(palette.background, 'paper');\n        setColorChannel(palette.common, 'background');\n        setColorChannel(palette.common, 'onBackground');\n        setColorChannel(palette, 'divider');\n        Object.keys(palette).forEach((color)=>{\n            const colors = palette[color];\n            // The default palettes (primary, secondary, error, info, success, and warning) errors are handled by the above `createTheme(...)`.\n            if (color !== 'tonalOffset' && colors && typeof colors === 'object') {\n                // Silent the error for custom palettes.\n                if (colors.main) {\n                    setColor(palette[color], 'mainChannel', private_safeColorChannel(toRgb(colors.main)));\n                }\n                if (colors.light) {\n                    setColor(palette[color], 'lightChannel', private_safeColorChannel(toRgb(colors.light)));\n                }\n                if (colors.dark) {\n                    setColor(palette[color], 'darkChannel', private_safeColorChannel(toRgb(colors.dark)));\n                }\n                if (colors.contrastText) {\n                    setColor(palette[color], 'contrastTextChannel', private_safeColorChannel(toRgb(colors.contrastText)));\n                }\n                if (color === 'text') {\n                    // Text colors: text.primary, text.secondary\n                    setColorChannel(palette[color], 'primary');\n                    setColorChannel(palette[color], 'secondary');\n                }\n                if (color === 'action') {\n                    // Action colors: action.active, action.selected\n                    if (colors.active) {\n                        setColorChannel(palette[color], 'active');\n                    }\n                    if (colors.selected) {\n                        setColorChannel(palette[color], 'selected');\n                    }\n                }\n            }\n        });\n    });\n    theme = args.reduce((acc, argument)=>deepmerge_deepmerge(acc, argument), theme);\n    const parserConfig = {\n        prefix: cssVarPrefix,\n        disableCssColorScheme,\n        shouldSkipGeneratingVar,\n        getSelector: createGetSelector(theme),\n        enableContrastVars: nativeColor\n    };
1\n    const { vars, generateThemeVars, generateStyleSheets } = cssVars_prepareCssVars(theme, parserConfig);\n    theme.vars = vars;\n    Object.entries(theme.colorSchemes[theme.defaultColorScheme]).forEach(([key, value])=>{\n        theme[key] = value;\n    });\n    theme.generateThemeVars = generateThemeVars;\n    theme.generateStyleSheets = generateStyleSheets;\n    theme.generateSpacing = function generateSpacing() {\n        return createSpacing(input.spacing, createUnarySpacing(this));\n    };\n    theme.getColorSchemeSelector = createGetColorSchemeSelector(selector);\n    theme.spacing = theme.generateSpacing();\n    theme.shouldSkipGeneratingVar = shouldSkipGeneratingVar;\n    theme.unstable_sxConfig = {\n        ...styleFunctionSx_defaultSxConfig,\n        ...input?.unstable_sxConfig\n    };\n    theme.unstable_sx = function sx(props) {\n        return styleFunctionSx_styleFunctionSx({\n            sx: props,\n            theme: this\n        });\n    };\n    theme.toRuntimeSource = stringifyTheme; // for Pigment CSS integration\n    return theme;\n}\n\n;// ./node_modules/@mui/material/esm/styles/createTheme.js\n\n\n\n// eslint-disable-next-line consistent-return\nfunction createTheme_attachColorScheme(theme, scheme, colorScheme) {\n    if (!theme.colorSchemes) {\n        return undefined;\n    }\n    if (colorScheme) {\n        theme.colorSchemes[scheme] = {\n            ...colorScheme !== true && colorScheme,\n            palette: createPalette({\n                ...colorScheme === true ? {} : colorScheme.palette,\n                mode: scheme\n            }) // cast type to skip module augmentation test\n        };\n    }\n}\n/**\n * Generate a theme base on the options received.\n * @param options Takes an incomplete theme object and adds the missing parts.\n * @param args Deep merge the arguments with the about to be returned theme.\n * @returns A complete, ready-to-use theme object.\n */ function styles_createTheme_createTheme(options = {}, // cast type to skip module augmentation test\n...args) {\n    const { palette, cssVariables = false, colorSchemes: initialColorSchemes = !palette ? {\n        light: true\n    } : undefined, defaultColorScheme: initialDefaultColorScheme = palette?.mode, ...other } = options;\n    const defaultColorSchemeInput = initialDefaultColorScheme || 'light';\n    const defaultScheme = initialColorSchemes?.[defaultColorSchemeInput];\n    const colorSchemesInput = {\n        ...initialColorSchemes,\n        ...palette ? {\n            [defaultColorSchemeInput]: {\n                ...typeof defaultScheme !== 'boolean' && defaultScheme,\n                palette\n            }\n        } : undefined\n    };\n    if (cssVariables === false) {\n        if (!('colorSchemes' in options)) {\n            // Behaves exactly as v5\n            return styles_createThemeNoVars(options, ...args);\n        }\n        let paletteOptions = palette;\n        if (!('palette' in options)) {\n            if (colorSchemesInput[defaultColorSchemeInput]) {\n                if (colorSchemesInput[defaultColorSchemeInput] !== true) {\n                    paletteOptions = colorSchemesInput[defaultColorSchemeInput].palette;\n                } else if (defaultColorSchemeInput === 'dark') {\n                    // @ts-ignore to prevent the module augmentation test from failing\n                    paletteOptions = {\n                        mode: 'dark'\n                    };\n                }\n            }\n        }\n        const theme = styles_createThemeNoVars({\n            ...options,\n            palette: paletteOptions\n        }, ...args);\n        theme.defaultColorScheme = defaultColorSchemeInput;\n        theme.colorSchemes = colorSchemesInput;\n        if (theme.palette.mode === 'light') {\n            theme.colorSchemes.light = {\n                ...colorSchemesInput.light !== true && colorSchemesInput.light,\n                palette: theme.palette\n            };\n            createTheme_attachColorScheme(theme, 'dark', colorSchemesInput.dark);\n        }\n        if (theme.palette.mode === 'dark') {\n            theme.colorSchemes.dark = {\n                ...colorSchemesInput.dark !== true && colorSchemesInput.dark,\n                palette: theme.palette\n            };\n            createTheme_attachColorScheme(theme, 'light', colorSchemesInput.light);\n        }\n        return theme;\n    }\n    if (!palette && !('light' in colorSchemesInput) && defaultColorSchemeInput === 'light') {\n        colorSchemesInput.light = true;\n    }\n    return createThemeWithVars({\n        ...other,\n        colorSchemes: colorSchemesInput,\n        defaultColorScheme: defaultColorSchemeInput,\n        ...typeof cssVariables !== 'boolean' && cssVariables\n    }, ...args);\n}\n\n;// ./node_modules/@mui/material/esm/styles/defaultTheme.js\n/* __next_internal_client_entry_do_not_use__ default auto */ \nconst defaultTheme = styles_createTheme_createTheme();\n/* harmony default export */ const styles_defaultTheme = (defaultTheme);\n\n;// ./node_modules/@mui/material/esm/styles/identifier.js\n/* harmony default export */ const styles_identifier = ('$$material');\n\n;// ./node_modules/@mui/material/esm/styles/slotShouldForwardProp.js\n// copied from @mui/system/createStyled\nfunction slotShouldForwardProp(prop) {\n    return prop !== 'ownerState' && prop !== 'theme' && prop !== 'sx' && prop !== 'as';\n}\n/* harmony default export */ const styles_slotShouldForwardProp = (slotShouldForwardProp);\n\n;// ./node_modules/@mui/material/esm/styles/rootShouldForwardProp.js\n\nconst rootShouldForwardProp = (prop)=>styles_slotShouldForwardProp(prop) && prop !== 'classes';\n/* harmony default export */ const styles_rootShouldForwardProp = (rootShouldForwardProp);\n\n;// ./node_modules/@mui/material/esm/styles/styled.js\n/* __next_internal_client_entry_do_not_use__ slotShouldForwardProp,rootShouldForwardProp,default auto */ \n\n\n\n\n\nconst styled_styled = createStyled_createStyled({\n    themeId: styles_identifier,\n    defaultTheme: styles_defaultTheme,\n    rootShouldForwardProp: styles_rootShouldForwardProp\n});\n/* harmony default export */ const styles_styled = (styled_styled);\n\n;// ./node_modules/@mui/system/esm/memoTheme.js\n\n\n/* eslint-disable @typescript-eslint/naming-convention */\n\n// We need to pass an argument as `{ theme }` for PigmentCSS, but we don't want to\n// allocate more objects.\nconst arg = {\n  theme: undefined\n};\n\n/**\n * Memoize style function on theme.\n * Intended to be used in styled() calls that only need access to the theme.\n */\nfunction unstable_memoTheme(styleFn) {\n  let lastValue;\n  let lastTheme;\n  return function styleMemoized(props) {\n    let value = lastValue;\n    if (value === undefined || props.theme !== lastTheme) {\n      arg.theme = props.theme;\n      value = preprocessStyles(styleFn(arg));
1\n      lastValue = value;\n      lastTheme = props.theme;\n    }\n    return value;\n  };\n}\n;// ./node_modules/@mui/material/esm/utils/memoTheme.js\n\nconst memoTheme = unstable_memoTheme;\n/* harmony default export */ const utils_memoTheme = (memoTheme);\n\n;// ./node_modules/@mui/utils/esm/resolveProps/resolveProps.js\n\n\n/**\n * Add keys, values of `defaultProps` that does not exist in `props`\n * @param defaultProps\n * @param props\n * @param mergeClassNameAndStyle If `true`, merges `className` and `style` props instead of overriding them.\n *   When `false` (default), props override defaultProps. When `true`, `className` values are concatenated\n *   and `style` objects are merged with props taking precedence.\n * @returns resolved props\n */\nfunction resolveProps(defaultProps, props, mergeClassNameAndStyle = false) {\n  const output = {\n    ...props\n  };\n  for (const key in defaultProps) {\n    if (Object.prototype.hasOwnProperty.call(defaultProps, key)) {\n      const propName = key;\n      if (propName === 'components' || propName === 'slots') {\n        output[propName] = {\n          ...defaultProps[propName],\n          ...output[propName]\n        };\n      } else if (propName === 'componentsProps' || propName === 'slotProps') {\n        const defaultSlotProps = defaultProps[propName];\n        const slotProps = props[propName];\n        if (!slotProps) {\n          output[propName] = defaultSlotProps || {};\n        } else if (!defaultSlotProps) {\n          output[propName] = slotProps;\n        } else {\n          output[propName] = {\n            ...slotProps\n          };\n          for (const slotKey in defaultSlotProps) {\n            if (Object.prototype.hasOwnProperty.call(defaultSlotProps, slotKey)) {\n              const slotPropName = slotKey;\n              output[propName][slotPropName] = resolveProps(defaultSlotProps[slotPropName], slotProps[slotPropName], mergeClassNameAndStyle);\n            }\n          }\n        }\n      } else if (propName === 'className' && mergeClassNameAndStyle && props.className) {\n        output.className = (0,clsx/* default */.A)(defaultProps?.className, props?.className);\n      } else if (propName === 'style' && mergeClassNameAndStyle && props.style) {\n        output.style = {\n          ...defaultProps?.style,\n          ...props?.style\n        };\n      } else if (output[propName] === undefined) {\n        output[propName] = defaultProps[propName];\n      }\n    }\n  }\n  return output;\n}\n// EXTERNAL MODULE: ./node_modules/react/jsx-runtime.js\nvar jsx_runtime = __webpack_require__(7876);\n;// ./node_modules/@mui/system/esm/DefaultPropsProvider/DefaultPropsProvider.js\n'use client';\n\n\n\n\n\nconst PropsContext = /*#__PURE__*/react.createContext(undefined);\nfunction DefaultPropsProvider({\n  value,\n  children\n}) {\n  return /*#__PURE__*/_jsx(PropsContext.Provider, {\n    value: value,\n    children: children\n  });\n}\n false ? 0 : void 0;\nfunction getThemeProps(params) {\n  const {\n    theme,\n    name,\n    props\n  } = params;\n  if (!theme || !theme.components || !theme.components[name]) {\n    return props;\n  }\n  const config = theme.components[name];\n  if (config.defaultProps) {\n    // compatible with v5 signature\n    return resolveProps(config.defaultProps, props, theme.components.mergeClassNameAndStyle);\n  }\n  if (!config.styleOverrides && !config.variants) {\n    // v6 signature, no property 'defaultProps'\n    return resolveProps(config, props, theme.components.mergeClassNameAndStyle);\n  }\n  return props;\n}\nfunction useDefaultProps({\n  props,\n  name\n}) {\n  const ctx = react.useContext(PropsContext);\n  return getThemeProps({\n    props,\n    name,\n    theme: {\n      components: ctx\n    }\n  });\n}\n/* harmony default export */ const DefaultPropsProvider_DefaultPropsProvider = ((/* unused pure expression or super */ null && (DefaultPropsProvider)));\n;// ./node_modules/@mui/material/esm/DefaultPropsProvider/DefaultPropsProvider.js\n/* __next_internal_client_entry_do_not_use__ default,useDefaultProps auto */ \n\n\n\nfunction DefaultPropsProvider_DefaultPropsProvider_DefaultPropsProvider(props) {\n    return /*#__PURE__*/ _jsx(SystemDefaultPropsProvider, {\n        ...props\n    });\n}\n false ? 0 : void 0;\n/* harmony default export */ const esm_DefaultPropsProvider_DefaultPropsProvider = ((/* unused pure expression or super */ null && (DefaultPropsProvider_DefaultPropsProvider_DefaultPropsProvider)));\nfunction DefaultPropsProvider_useDefaultProps(params) {\n    return useDefaultProps(params);\n}\n\n;// ./node_modules/@mui/utils/esm/ClassNameGenerator/ClassNameGenerator.js\nconst defaultGenerator = componentName => componentName;\nconst createClassNameGenerator = () => {\n  let generate = defaultGenerator;
1\n  return {\n    configure(generator) {\n      generate = generator;\n    },\n    generate(componentName) {\n      return generate(componentName);\n    },\n    reset() {\n      generate = defaultGenerator;\n    }\n  };\n};\nconst ClassNameGenerator = createClassNameGenerator();\n/* harmony default export */ const ClassNameGenerator_ClassNameGenerator = (ClassNameGenerator);\n;// ./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js\n\nconst globalStateClasses = {\n  active: 'active',\n  checked: 'checked',\n  completed: 'completed',\n  disabled: 'disabled',\n  error: 'error',\n  expanded: 'expanded',\n  focused: 'focused',\n  focusVisible: 'focusVisible',\n  open: 'open',\n  readOnly: 'readOnly',\n  required: 'required',\n  selected: 'selected'\n};\nfunction generateUtilityClass(componentName, slot, globalStatePrefix = 'Mui') {\n  const globalStateClass = globalStateClasses[slot];\n  return globalStateClass ? `${globalStatePrefix}-${globalStateClass}` : `${ClassNameGenerator_ClassNameGenerator.generate(componentName)}-${slot}`;\n}\nfunction isGlobalState(slot) {\n  return globalStateClasses[slot] !== undefined;\n}\n;// ./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js\n\nfunction generateUtilityClasses(componentName, slots, globalStatePrefix = 'Mui') {\n  const result = {};\n  slots.forEach(slot => {\n    result[slot] = generateUtilityClass(componentName, slot, globalStatePrefix);\n  });\n  return result;\n}\n;// ./node_modules/@mui/material/esm/SvgIcon/svgIconClasses.js\n\n\nfunction getSvgIconUtilityClass(slot) {\n    return generateUtilityClass('MuiSvgIcon', slot);\n}\nconst svgIconClasses = generateUtilityClasses('MuiSvgIcon', [\n    'root',\n    'colorPrimary',\n    'colorSecondary',\n    'colorAction',\n    'colorError',\n    'colorDisabled',\n    'fontSizeInherit',\n    'fontSizeSmall',\n    'fontSizeMedium',\n    'fontSizeLarge'\n]);\n/* harmony default export */ const SvgIcon_svgIconClasses = ((/* unused pure expression or super */ null && (svgIconClasses)));\n\n;// ./node_modules/@mui/material/esm/SvgIcon/SvgIcon.js\n/* __next_internal_client_entry_do_not_use__ default auto */ \n\n\n\n\n\n\n\n\n\nconst useUtilityClasses = (ownerState)=>{\n    const { color, fontSize, classes } = ownerState;\n    const slots = {\n        root: [\n            'root',\n            color !== 'inherit' && `color${utils_capitalize(color)}`,\n            `fontSize${utils_capitalize(fontSize)}`\n        ]\n    };\n    return composeClasses(slots, getSvgIconUtilityClass, classes);\n};\nconst SvgIconRoot = styles_styled('svg', {\n    name: 'MuiSvgIcon',\n    slot: 'Root',\n    overridesResolver: (props, styles)=>{\n        const { ownerState } = props;\n        return [\n            styles.root,\n            ownerState.color !== 'inherit' && styles[`color${utils_capitalize(ownerState.color)}`],\n            styles[`fontSize${utils_capitalize(ownerState.fontSize)}`]\n        ];\n    }\n})(utils_memoTheme(({ theme })=>({\n        userSelect: 'none',\n        width: '1em',\n        height: '1em',\n        display: 'inline-block',\n        flexShrink: 0,\n        transition: theme.transitions?.create?.('fill', {\n            duration: (theme.vars ?? theme).transitions?.duration?.shorter\n        }),\n        variants: [\n            {\n                props: (props)=>!props.hasSvgAsChild,\n                style: {\n                    // the <svg> will define the property that has `currentColor`\n                    // for example heroicons uses fill=\"none\" and stroke=\"currentColor\"\n                    fill: 'currentColor'\n                }\n            },\n            {\n                props: {\n                    fontSize: 'inherit'\n                },\n                style: {\n                    fontSize: 'inherit'\n                }\n            },\n            {\n                props: {\n                    fontSize: 'small'\n                },\n                style: {\n                    fontSize: theme.typography?.pxToRem?.(20) || '1.25rem'\n                }\n            },\n            {\n                props: {\n                    fontSize: 'medium'\n                }
1,\n                style: {\n                    fontSize: theme.typography?.pxToRem?.(24) || '1.5rem'\n                }\n            },\n            {\n                props: {\n                    fontSize: 'large'\n                },\n                style: {\n                    fontSize: theme.typography?.pxToRem?.(35) || '2.1875rem'\n                }\n            },\n            // TODO v5 deprecate color prop, v6 remove for sx\n            ...Object.entries((theme.vars ?? theme).palette).filter(([, value])=>value && value.main).map(([color])=>({\n                    props: {\n                        color\n                    },\n                    style: {\n                        color: (theme.vars ?? theme).palette?.[color]?.main\n                    }\n                })),\n            {\n                props: {\n                    color: 'action'\n                },\n                style: {\n                    color: (theme.vars ?? theme).palette?.action?.active\n                }\n            },\n            {\n                props: {\n                    color: 'disabled'\n                },\n                style: {\n                    color: (theme.vars ?? theme).palette?.action?.disabled\n                }\n            },\n            {\n                props: {\n                    color: 'inherit'\n                },\n                style: {\n                    color: undefined\n                }\n            }\n        ]\n    })));\nconst SvgIcon = /*#__PURE__*/ react.forwardRef(function SvgIcon(inProps, ref) {\n    const props = DefaultPropsProvider_useDefaultProps({\n        props: inProps,\n        name: 'MuiSvgIcon'\n    });\n    const { children, className, color = 'inherit', component = 'svg', fontSize = 'medium', htmlColor, inheritViewBox = false, titleAccess, viewBox = '0 0 24 24', ...other } = props;\n    const hasSvgAsChild = /*#__PURE__*/ react.isValidElement(children) && children.type === 'svg';\n    const ownerState = {\n        ...props,\n        color,\n        component,\n        fontSize,\n        instanceFontSize: inProps.fontSize,\n        inheritViewBox,\n        viewB
1ox,\n        hasSvgAsChild\n    };\n    const more = {};\n    if (!inheritViewBox) {\n        more.viewBox = viewBox;\n    }\n    const classes = useUtilityClasses(ownerState);\n    return /*#__PURE__*/ (0,jsx_runtime.jsxs)(SvgIconRoot, {\n        as: component,\n        className: (0,clsx/* default */.A)(classes.root, className),\n        focusable: \"false\",\n        color: htmlColor,\n        \"aria-hidden\": titleAccess ? undefined : true,\n        role: titleAccess ? 'img' : undefined,\n        ref: ref,\n        ...more,\n        ...other,\n        ...hasSvgAsChild && children.props,\n        ownerState: ownerState,\n        children: [\n            hasSvgAsChild ? children.props.children : children,\n            titleAccess ? /*#__PURE__*/ (0,jsx_runtime.jsx)(\"title\", {\n                children: titleAccess\n            }) : null\n        ]\n    });\n});\n false ? 0 : void 0;\nSvgIcon.muiName = 'SvgIcon';\n/* harmony default export */ const SvgIcon_SvgIcon = (SvgIcon);\n\n;// ./node_modules/@mui/material/esm/utils/createSvgIcon.js\n/* __next_internal_client_entry_do_not_use__ default auto */ \n\n/**\n * Private module reserved for @mui packages.\n */ \nfunction createSvgIcon(path, displayName) {\n    function Component(props, ref) {\n        return /*#__PURE__*/ (0,jsx_runtime.jsx)(SvgIcon_SvgIcon, {\n            \"data-testid\":  false ? 0 : undefined,\n            ref: ref,\n            ...props,\n            children: path\n        });\n    }\n    if (false) {}\n    Component.muiName = SvgIcon_SvgIcon.muiName;\n    return /*#__PURE__*/ react.memo(/*#__PURE__*/ react.forwardRef(Component));\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjI3My5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxLQUFLO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEM7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsSUFBSTtBQUN4QyxvQ0FBb0MsSUFBSTtBQUN4QztBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNlO0FBQ2YsZ0VBQWdFLEtBQUs7QUFDckU7QUFDQSxnQ0FBZ0MsT0FBTyxRQUFRLEtBQUs7QUFDcEQsQzs7QUNkbUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDZSxTQUFTLHFCQUFVO0FBQ2xDO0FBQ0Esb0JBQW9CLE1BQXFDLEdBQUcsQ0FBc0QsR0FBRyxxQkFBbUI7QUFDeEk7QUFDQTtBQUNBLEM7O0FDVitDO0FBQy9DLHVEQUFlQSxxQkFBVUEsRUFBQzs7O0FDRDFCLFNBQVMsZUFBUTtBQUNqQixTQUFTLGVBQVE7QUFDakIsb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsR0FBRyxFQUFFLGVBQVE7QUFDYjs7O0FDUkE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSxTQUFTLGFBQWE7O0FBRXRCLGtDQUFrQyxtQ0FBbUM7O0FBRXJFLDBCQUEwQix3QkFBd0I7QUFDbEQ7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOzs7QUFHQSxrQkFBa0IsaUNBQWlDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQzs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFcUI7OztBQzNJdEI7QUFDQSxXQUFXO0FBQ1gsWUFBWTtBQUNaO0FBQ087O0FBRVA7QUFDQSxXQUFXO0FBQ1gsWUFBWTtBQUNaO0FBQ08sSUFBSSxZQUFJOztBQUVmO0FBQ0EsV0FBVztBQUNYLFlBQVk7QUFDWjtBQUNPLElBQUksY0FBTTs7QUFFakI7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjtBQUNPO0FBQ1AsUUFBUSxjQUFNLHdDQUF3QyxjQUFNLG9CQUFvQixjQUFNLG9CQUFvQixjQUFNLG9CQUFvQixjQUFNO0FBQzFJOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaO0FBQ08sU0FBUyxhQUFLO0FBQ3JCO0FBQ0E7O0F
1BRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxpQkFBaUI7QUFDNUIsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjtBQUNPLFNBQVMsZUFBTztBQUN2QjtBQUNBOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjtBQUNPLFNBQVMsY0FBTTtBQUN0QjtBQUNBOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaO0FBQ08sU0FBUyxjQUFNO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaO0FBQ08sU0FBUyxjQUFNO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ08sU0FBUyxjQUFNO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLEtBQUs7QUFDaEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNPLFNBQVMsY0FBTTtBQUN0QjtBQUNBOztBQUVBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixZQUFZO0FBQ1o7QUFDTyxTQUFTLGVBQU87QUFDdkI7QUFDQTs7O0FDbEgrRTs7QUFFeEU7QUFDQTtBQUNBLElBQUksZ0JBQU07QUFDVjtBQUNBO0FBQ0E7O0FBRVA7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxlQUFlO0FBQzFCLFdBQVcsZUFBZTtBQUMxQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxRQUFRO0FBQ25CO0FBQ087QUFDUCxTQUFTO0FBQ1Q7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjtBQUNPLFNBQVMsY0FBSTtBQUNwQixRQUFRLGNBQU0saURBQWlELHFCQUFxQjtBQUNwRjs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNPLFNBQVMsY0FBSTtBQUNwQjtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ087QUFDUCw0QkFBNEIsY0FBTTs7QUFFbEM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ087QUFDUCx3QkFBd0IsZ0JBQU0sR0FBRyxjQUFNOztBQUV2QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDTztBQUNQLFFBQVEsY0FBTTtBQUNkOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ087QUFDUDtBQUNBOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7QUFDTztBQUNQLFFBQVEsY0FBTTtBQUNkOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjtBQUNPO0FBQ1AsMkJBQTJCLGdCQUFNLEdBQUcsY0FBTTtBQUMxQzs7QUFFQTtBQUNBLFdBQVcsS0FBSztBQUNoQixZQUFZO0FBQ1o7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaO0FBQ087QUFDUCxRQUFRLElBQUk7QUFDWjs7QUFFQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7QUFDTyxTQUFTLGtCQUFRO0FBQ3hCO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFVBQVU7QUFDckIsWUFBWTtBQUNaO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrREFBa0QsWUFBSTtBQUN0RDs7QUFFQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7O0FDclBPLElBQUksT0FBRTtBQUNOLElBQUksUUFBRztBQUNQLElBQUksV0FBTTs7QUFFVjtBQUNBLElBQUksWUFBTztBQUNYLElBQUksZ0JBQVc7O0FBRWY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksY0FBUztBQUNiO0FBQ0E7QUFDQTtBQUNBOzs7QUNwQjBFO0FBQ3RDOztBQUUzQztBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckIsWUFBWTtBQUNaO0FBQ08sU0FBUyxvQkFBUztBQUN6QjtBQUNBLGNBQWMsY0FBTTs7QUFFcEIsaUJBQWlCLFlBQVk7QUFDN0I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixZQUFZO0FBQ1o7QUFDTztBQUNQO0FBQ0EsT0FBTyxLQUFLO0FBQ1osT0FBTyxNQUFNLE9BQU8sZ0JBQVc7QUFDL0IsT0FBTyxPQUFPO0FBQ2QsT0FBTyxjQUFTLDRDQUE0QyxJQUFJLG9CQUFTLGlDQUFpQztBQUMxRyxPQUFPLFlBQU87QUFDZDs7QUFFQSxRQUFRLGNBQU0sWUFBWSxvQkFBUyxtRUFBbUUsaUJBQWlCO0FBQ3ZIOzs7QUNuQzBFO0FBQ1U7QUFDdkM7QUFDSjtBQUNMOztBQUVwQztBQUNBLFdBQVcsWUFBWTtBQUN2QixZQUFZO0FBQ1o7QUFDTztBQUNQLGNBQWMsY0FBTTs7QUFFcEI7QUFDQTs7QUFFQSxrQkFBa0IsWUFBWTtBQUM5Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFVBQVU7QUFDckIsWUFBWTtBQUNaO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxpREFB
1aUQ7QUFDdkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLHlEQUF5RDtBQUNuRztBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUVBQWlFO0FBQzFGLHlCQUF5Qix3REFBd0Q7QUFDakYseUJBQXlCLHVEQUF1RDtBQUNoRjtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7OztBQzNHdUQ7QUFDK0M7QUFDa0M7O0FBRXhJO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjtBQUNPO0FBQ1AsUUFBUSxPQUFPLDJDQUEyQyxLQUFLO0FBQy9EOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckIsWUFBWTtBQUNaO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0Q0FBNEMsSUFBSTtBQUNoRDtBQUNBO0FBQ0EsMkJBQTJCLGNBQU07QUFDakMsU0FBUyxPQUFPLGVBQWUsZUFBTyxDQUFDLE9BQU87QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixVQUFVO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixRQUFRLENBQUMsS0FBSztBQUNoQztBQUNBO0FBQ0E7QUFDQSxZQUFZLElBQUk7QUFDaEI7QUFDQSxNQUFNLGNBQU0sU0FBUyxTQUFTLENBQUMsSUFBSSxJQUFJLEtBQUs7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsY0FBTTtBQUM1QixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxlQUFPO0FBQ2hFLDJCQUEyQixjQUFNO0FBQ2pDLE9BQU8sY0FBTSw0Q0FBNEMsMkNBQTJDLGVBQU8sMEJBQTBCO0FBQ3JJO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsVUFBVTtBQUNWO0FBQ0EsTUFBTSxjQUFNOztBQUVaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLGNBQU07QUFDdkM7QUFDQTtBQUNBLHFEQUFxRCxjQUFNO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsY0FBTTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxJQUFJO0FBQ3pEOztBQUVBLDBCQUEwQixZQUFJO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixjQUFNO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUFJO0FBQ2QscUJBQXFCLE9BQU8sQ0FBQyxJQUFJOztBQUVqQyxlQUFlLElBQUksc0JBQXNCLGNBQU0sc0JBQXNCLFVBQVUsQ0FBQyxLQUFLO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixjQUFNO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7QUFDTztBQUNQO0FBQ0E7QUFDQSxZQUFZLGNBQU07O0FBRWxCLCtCQUErQixXQUFXO0FBQzFDLHNCQUFzQixjQUFNLHlCQUF5QixHQUFHLDZCQUE2QixVQUFVO0FBQy9GLFdBQVcsSUFBSSw2QkFBNkIsZUFBTztBQUNuRDs7QUFFQSxRQUFRLElBQUkscUNBQXFDLFlBQU87QUFDeEQ7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsU0FBUztBQUNwQixZQUFZO0FBQ1o7QUFDTztBQUNQLFFBQVEsSUFBSSxzQkFBc0IsT0FBTyxFQUFFLFlBQUksQ0FBQyxjQUFJLEtBQUssY0FBTTtBQUMvRDs7QUFFQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7QUFDTztBQUNQLFFBQVEsSUFBSSxzQkFBc0IsZ0JBQVcsRUFBRSxjQUFNLG9CQUFvQixjQUFNO0FBQy9FOzs7QUM5TDRDO0FBQ3FOO0FBQ2xPO0FBQ0w7O0FBRTFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCLElBQUksSUFBSTs7QUFFeEI7QUFDQTtBQUNBOztBQUVBLFFBQVEsS0FBSztBQUNiO0FBQ0E7O0FBRUEsSUFBSSxJQUFJO0FBQ1I7O0FBRUEsU0FBUyxLQUFLLFFBQVEsUUFBUTtBQUM5Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksS0FBSztBQUNqQjtBQUNBO0FBQ0EsZ0NBQWdDLElBQUk7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFEQUFxRCxRQUFRO0FBQzdEOztBQUVBO0FBQ0EseUJBQXlCLE9BQU87QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsSUFBSTtBQUNoQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx5QkFBeUIsWUFBSTtBQUM3QjtBQUNBLElBQUksbUJBQW1CLElBQUk7O0FBRTNCO0FBQ0E7O0FBRUE7QUFDQSxTQUFTLE9BQU8sU0FBUyxLQUFLO0FBQzlCLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlCQUF5QixrQkFBa0I7QUFDM0Msb0JBQW9CLHdCQUF3QjtB
1QUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUyxnQ0FBTTtBQUNmLFVBQVUsSUFBSTtBQUNkO0FBQ0E7QUFDQSxhQUFhLFdBQU07QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFdBQU07QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsV0FBTSxXQUFXLFFBQUcsV0FBVyxPQUFFO0FBQzlDOztBQUVBO0FBQ0E7QUFDQSxhQUFhLFdBQU0sV0FBVyxPQUFFO0FBQ2hDOztBQUVBO0FBQ0EsYUFBYSxXQUFNLFdBQVcsT0FBRTtBQUNoQzs7QUFFQTtBQUNBLGFBQWEsV0FBTSxXQUFXLGVBQU8sMEJBQTBCLFdBQU0sZ0JBQWdCLE9BQUU7QUFDdkY7O0FBRUE7QUFDQSxhQUFhLFdBQU0sV0FBVyxPQUFFLGtCQUFrQixlQUFPO0FBQ3pEOztBQUVBO0FBQ0EsYUFBYSxXQUFNLFdBQVcsT0FBRSxzQkFBc0IsZUFBTztBQUM3RDs7QUFFQTtBQUNBLGFBQWEsV0FBTSxXQUFXLE9BQUUsR0FBRyxlQUFPO0FBQzFDOztBQUVBO0FBQ0EsYUFBYSxXQUFNLFdBQVcsT0FBRSxHQUFHLGVBQU87QUFDMUM7O0FBRUE7QUFDQSxhQUFhLFdBQU0sWUFBWSxlQUFPLHVCQUF1QixXQUFNLFdBQVcsT0FBRSxHQUFHLGVBQU87QUFDMUY7O0FBRUE7QUFDQSxhQUFhLFdBQU0sR0FBRyxlQUFPLHFDQUFxQyxXQUFNO0FBQ3hFOztBQUVBO0FBQ0EsYUFBYSxlQUFPLENBQUMsZUFBTyxDQUFDLGVBQU8sd0JBQXdCLFdBQU0seUJBQXlCLFdBQU07QUFDakc7O0FBRUE7QUFDQTtBQUNBLGFBQWEsZUFBTyw2QkFBNkIsV0FBTTtBQUN2RDs7QUFFQTtBQUNBLGFBQWEsZUFBTyxDQUFDLGVBQU8sNkJBQTZCLFdBQU0sbUJBQW1CLE9BQUUsNkJBQTZCLGtCQUFrQixXQUFNO0FBQ3pJOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxlQUFPLDJCQUEyQixXQUFNO0FBQ3JEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxjQUFNLGtDQUFrQyxjQUFNO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBLGNBQWMsY0FBTTtBQUNwQjs7QUFFQTtBQUNBLGlCQUFpQixlQUFPLG1DQUFtQyxXQUFNLG9CQUFvQixRQUFHLElBQUksY0FBTTtBQUNsRzs7QUFFQTtBQUNBLGtCQUFrQixPQUFPLHFCQUFxQixnQ0FBTSxDQUFDLGVBQU87QUFDNUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLGNBQU07QUFDaEI7O0FBRUE7QUFDQSxjQUFjLGNBQU0sUUFBUSxjQUFNLGdCQUFnQixPQUFPO0FBQ3pEO0FBQ0E7QUFDQSxpQkFBaUIsZUFBTyxtQkFBbUIsV0FBTTtBQUNqRDs7QUFFQTtBQUNBLGlCQUFpQixlQUFPLGtCQUFrQixNQUFNLGdCQUFnQixXQUFNLElBQUksY0FBTSx3REFBd0QsV0FBTSxtQkFBbUIsT0FBRTtBQUNuSzs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsY0FBYyxjQUFNO0FBQ3BCO0FBQ0E7QUFDQSxpQkFBaUIsV0FBTSxXQUFXLE9BQUUsR0FBRyxlQUFPLHlCQUF5QixFQUFFO0FBQ3pFOztBQUVBO0FBQ0EsaUJBQWlCLFdBQU0sV0FBVyxPQUFFLEdBQUcsZUFBTyx5QkFBeUIsRUFBRTtBQUN6RTs7QUFFQTtBQUNBLGlCQUFpQixXQUFNLFdBQVcsT0FBRSxHQUFHLGVBQU8seUJBQXlCLEVBQUU7QUFDekU7O0FBRUEsYUFBYSxXQUFNLFdBQVcsT0FBRTtBQUNoQzs7QUFFQTtBQUNBOztBQUVBLElBQUksa0NBQVE7QUFDWjtBQUNBLFNBQVMsZ0JBQVc7QUFDcEIsMEJBQTBCLGdDQUFNO0FBQ2hDOztBQUVBLFNBQVMsY0FBUztBQUNsQixhQUFhLG9CQUFTLEVBQUUsY0FBSTtBQUM1QixlQUFlLGVBQU8sMkJBQTJCLFdBQU07QUFDdkQsT0FBTzs7QUFFUCxTQUFTLFlBQU87QUFDaEIsaUNBQWlDLGVBQU87QUFDeEMsZ0JBQWdCLGFBQUs7QUFDckI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG9CQUFTLEVBQUUsY0FBSTtBQUNsQyxzQkFBc0IsZUFBTyw2QkFBNkIsUUFBRztBQUM3RCxhQUFhO0FBQ2I7O0FBRUE7QUFDQSxtQkFBbUIsb0JBQVMsRUFBRSxjQUFJO0FBQ2xDLHNCQUFzQixlQUFPLDRCQUE0QixXQUFNO0FBQy9ELGFBQWEsR0FBRyxjQUFJO0FBQ3BCLHNCQUFzQixlQUFPLDRCQUE0QixRQUFHO0FBQzVELGFBQWEsR0FBRyxjQUFJO0FBQ3BCLHNCQUFzQixlQUFPLHNCQUFzQixPQUFFO0FBQ3JELGFBQWE7QUFDYjs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBLDRCQUE0QixrQ0FBUTs7QUFFcEM7QUFDQTs7QUFFQTtBQUNBLG9GQUFvRjtBQUNwRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQixtQkFBbUI7QUFDekM7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCLFNBQVMsRUFBRSxTQUFTO0FBQ2pEO0FBQ0EsS0FBSztBQUNMLHFCQUFxQixVQUFVOztBQUUvQjtBQUNBLGFBQWEsb0JBQVMsQ0FBQyxPQUFPO0FBQzlCOztBQUVBO0FBQ0E7O0FBRUEscUNBQXFDLDBCQUEwQjs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWtDOzs7QUNyYmxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBOztBQUVBLFNBQVMsVUFBVTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0F
1BRThCOzs7QUN0RDlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRW1DOzs7QUNuRG5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU4Qjs7O0FDUlM7QUFDRTtBQUNGOztBQUV2QyxJQUFJLG1DQUFhOztBQUVqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDLE9BQU87QUFDN0M7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxNQUFNLFlBQVE7QUFDZDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1EQUFtRDtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7O0FBR0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQyx5RUFBeUU7QUFDekU7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCLDZCQUE2QjtBQUN6RCxVQUFVO0FBQ1YsdUZBQXVGO0FBQ3ZGO0FBQ0EsUUFBUTtBQUNSLCtDQUErQyxtQ0FBYTtBQUM1RDtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLG1CQUFtQjtBQUM5QztBQUNBLDRGQUE0RjtBQUM1RjtBQUNBO0FBQ0EsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUVBQXlFO0FBQ3pFO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQ0FBa0MscUJBQXFCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9DQUFvQyxRQUFRLE9BQU87QUFDbkQ7O0FBRUE7QUFDQSxTQUFTLHFDQUFlO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQSxJQUFJOzs7QUFHSixrQkFBa0IsaUJBQWlCO0FBQ25DOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLE9BQVU7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFMkI7OztBQzNPSTs7QUFFL0I7QUFDQTtBQUNBOztBQUVBLHlCQUF5QixxQkFBSyw4QkFBOEIscUJBQUs7QUFDakUsSUFBSSxnR0FBd0M7QUFDNUMsaUVBQWlFLHFCQUFxQjs7QUFFSTs7O0FDVjNEO0FBQ2dCO0FBQ047QUFDaUI7QUFDVjtBQUNzRDtBQUNuQjtBQUM5QjtBQUNtRDs7QUFFeEcsSUFBSSxrREFBYTs7QUFFakIseUNBQXlDLG1CQUFtQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELFdBQVc7QUFDL0Q7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLG9CQUFVO0FBQ2hDO0FBQ0EsZ0JBQWdCLG9CQUFVO0FBQzFCO0FBQ0EsR0FBRztBQUNIOztBQUVBLGtDQUFrQyxtQkFBbUIsR0FBRzs7QUFFeEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9CQUFvQjtBQUNwQjs7QUFFQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDLENBQUM7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQSxlQUFlOztBQUVmO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUEsNkJBQTZCO0FBQzdCLDJCQUEyQjtBQUMzQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvRkFBb0Ysa0RBQWE7QUFDakc7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDLENBQUM7O0FBRUYsZ0JBQWdCLHVEQUFPOztBQUU2TTs7O0FDM0pwTzs7QUFFQSxTQUFTLDZDQUFtQjtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLElBQUksd0NBQWM7QUFDbEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLHNDQUFZO0FBQ2hCLEVBQUUsd0NBQWM7QUFDaEI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRTZEOzs7QUM1Q3RCOztBQUV2QztBQUNBLHVrSUFBdWtJOztBQUV2a0ksaUNBQWlDLE9BQU87QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFa0M7OztBQ2Z3QjtBQUNNO0FBQ1g7QUFDbUQ7QUFDckI7QUFDcEQ7QUFDa0I7O0FBRWpELElBQUksNkNBQWE7O0FBRWpCLCtCQUErQixXQUFXOztBQUUxQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7O0F
1BRUE7QUFDQTs7QUFFQSxJQUFJLHlDQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsRUFBRSx3Q0FBYztBQUNoQixFQUFFLGdHQUF3QztBQUMxQyxXQUFXLHNDQUFZO0FBQ3ZCLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBLGFBQWEsU0FBUzs7QUFFdEI7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCLGdCQUFnQixDQUFDLFlBQVk7QUFDekQ7O0FBRUE7QUFDQSxvQkFBb0IsNkNBQW1CO0FBQ3ZDLFFBQVE7QUFDUjtBQUNBOztBQUVBLHVCQUF1QixxQ0FBZTtBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEIsbUJBQW1CLENBQUMsY0FBYyxxQkFBcUIsbUJBQW1CLENBQUMseUNBQVM7QUFDOUc7QUFDQTtBQUNBO0FBQ0EsT0FBTyxnQkFBZ0IsbUJBQW1CO0FBQzFDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLDZDQUFhO0FBQzFEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw0Q0FBNEMsZUFBUSxHQUFHO0FBQ3ZEO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVtQzs7O0FDMUt3QztBQUNuQztBQUNoQjtBQUNJO0FBQzBCO0FBQzlCO0FBQ1Q7QUFDaUI7O0FBRWhDO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFlBQVk7QUFDekI7QUFDQTtBQUNBLENBQUM7O0FBRTRCOzs7QUNsQjdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDdUM7QUFDbUM7QUFDM0QsU0FBUyxVQUFNO0FBQzlCLHdCQUF3QixNQUFRO0FBQ2hDLE1BQU0sS0FBcUMsRUFBRSxFQVUxQztBQUNIO0FBQ0E7O0FBRUE7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsU0FBUyxxQ0FBaUI7QUFDMUI7QUFDOEQ7QUFDb0I7Ozs7O0FDN0NuRDtBQUNlOztBQUU5QztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsb0JBQW9CLFlBQVksa0RBQWtCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLLE1BQU0sUUFBUSxJQUFJLEtBQUssTUFBTSxRQUFRO0FBQ3pELFdBQVcsS0FBSyxZQUFZO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZSxTQUFTLG1CQUFTO0FBQ2pDO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLHVCQUF1QixvQkFBb0IsaUJBQWlCLGtEQUFrQjtBQUM5RTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsbUJBQVM7QUFDL0IsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEM7O0FDL0RBO0FBQ0E7QUFDTyx1QkFBdUIsOEVBQThCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxJQUFJO0FBQ1A7O0FBRUE7QUFDZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxNQUFNLEVBQUUsS0FBSztBQUM3QztBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsbUJBQW1CLEVBQUUsS0FBSztBQUMxRDtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsMERBQTBELEVBQUUsS0FBSyx3QkFBd0IsNEdBQTRHLEVBQUUsS0FBSztBQUM1TztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQzs7QUNoRm1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qix3QkFBd0IsaUZBQWlGO0FBQ3pHO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNPO0FBQ1Asb0dBQW9HLElBQUk7QUFDeEc7QUFDTztBQUNQO0FBQ0E7QUFDQSxRQUFRLEtBQXFDLEVBQUUsRUFFMUM7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDZTtBQUNmLG1HQUFtRyxLQUFLO0FBQ3hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEM7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBLHdEQUFlLEtBQUssRTs7QUNIZTtBQUNVO0FBQ1A7QUFDNkM7O0FBRW5GO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsWUFBWTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBLDJDQUEyQyxlQUFlLGFBQWEsT0FBTyw4QkFBOEIsT0FBTztBQUNuSDtBQUNBLEdBQUc7QUFDSDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxJQUFJO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGFBQWE7QUFDdkIsNkJBQTZCLGlCQUFpQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxJQUFJO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QU
1FDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSwrQkFBK0IsTUFBcUMsR0FBRyxDQU9wRSxDQUFDO0FBQ0o7QUFDQTtBQUNBO0FBQ08sMERBQTBEO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxJQUFJO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDTztBQUNQO0FBQ0EscUdBQXFHO0FBQ3JHO0FBQ0E7O0FBRUEsdUNBQXVDO0FBQ3ZDLGVBQWU7QUFDZixJQUFJLHFCQUFxQixJQUFJO0FBQ3RCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHLElBQUk7QUFDUDtBQUNBLDhEQUFlLDJEQUFXLEk7O0FDMUtxQjtBQUNpQjtBQUNKO0FBQ3JEO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0IsS0FBSztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsS0FBSyxFQUFFLG9DQ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UNIO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLEdBQUc7QUFDSDtBQUNBLFdBQVcsT0FBTztBQUNsQixHQUFHO0FBQ0g7QUFDQSxXQUFXLE9BQU87QUFDbEIsR0FBRztBQUNIO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLEdBQUc7QUFDSDtBQUNBLFdBQVcsT0FBTztBQUNsQixHQUFHO0FBQ0g7QUFDQSxXQUFXLE9BQU87QUFDbEIsR0FBRztBQUNIO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLEdBQUc7QUFDSDtBQUNBLFdBQVcsT0FBTztBQUNsQixHQUFHO0FBQ0g7QUFDQSxXQUFXLE9BQU87QUFDbEIsR0FBRztBQUNIO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLEdBQUc7QUFDSDtBQUNBLFdBQVcsT0FBTztBQUNsQixHQUFHO0FBQ0g7QUFDQSxXQUFXLE9BQU87QUFDbEIsR0FBRztBQUNIO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLEdBQUc7QUFDSDtBQUNBLFdBQVcsTUFBTTtBQUNqQixHQUFHO0FBQ0g7QUFDQSxXQUFXLE1BQU07QUFDakIsR0FBRztBQUNIO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLEdBQUc7QUFDSDtBQUNBLFdBQVcsTUFBTTtBQUNqQixHQUFHO0FBQ0g7QUFDQSxXQUFXLE1BQU07QUFDakIsR0FBRztBQUNIO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLEdBQUc7QUFDSDtBQUNBLFdBQVcsTUFBTTtBQUNqQixHQUFHO0FBQ0g7QUFDQSxXQUFXLE1BQU07QUFDakIsR0FBRztBQUNIO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLEdBQUc7QUFDSDtBQUNBLFdBQVcsTUFBTTtBQUNqQixHQUFHO0FBQ0g7QUFDQSxXQUFXLE1BQU07QUFDakIsR0FBRztBQUNIO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLEdBQUc7QUFDSDtBQUNBLFdBQVcsTUFBTTtBQUNqQixHQUFHO0FBQ0g7QUFDQSxXQUFXLE1BQU07QUFDakIsR0FBRztBQUNIO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLEdBQUc7QUFDSDtBQUNBLFdBQVcsTUFBTTtBQUNqQixHQUFHO0FBQ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0E7QUFDQSxXQUFXLCtCQUFlO0FBQzFCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsOERBQWUsV0FBVyxFOztBQ2hEb0M7QUFDL0M7QUFDZjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLFdBQVcsd0JBQXdCO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxDOztBQ3hCNEk7QUFDdkY7QUFDTjtBQUNRO0FBQ0w7QUFDUTtBQUNKOztBQUV0RDtBQUNBO0FBQ0E7O0FBRU8sMkJBQTJCLHVCQUFXOztBQUU3QztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxXQUFXLEVBQUUsMkJBQTJCO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QU
1FDNUIsa0NBQWtDO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1IsMkNBQTJDLHdCQUFlO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLHdCQUFlO0FBQ25EO0FBQ0Esa0NBQWtDLHdCQUFlO0FBQ2pEO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CLCtCQUErQixxQkFBcUI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLHdCQUFlO0FBQzNELE1BQU07QUFDTiw0Q0FBNEMsd0JBQWU7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDZSxTQUFTLHlCQUFZLFdBQVc7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBLElBQUkscUJBQVksaURBQWlELCtCQUFlO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxVQUFrQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsYUFBYTtBQUN2QiwyQkFBMkIsZ0JBQWdCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsNkJBQTZCLCtCQUFlO0FBQzVDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLEtBQXFDLEVBQUUsRUFFMUM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxjQUFjLEVBQUUsZ0NBQWdDO0FBQzlEO0FBQ0EsbUJBQW1CLG9CQUFvQjtBQUN2QztBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDLEVBQUUsRUFNMUM7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDOztBQ2hTQTtBQUNBO0FBQ0E7QUFDQSxrREFBZSxLQUFLLEU7O0FDSCtDO0FBQ25FO0FBQ3FDOztBQUVyQztBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSxNQUFNLEtBQXFDLEVBQUUsRUFJMUM7QUFDSCxTQUFTLFdBQUs7QUFDZDs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNPO0FBQ1A7QUFDQSwyQkFBMkIsSUFBSSwyQkFBMkI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDLEVBQUUsRUFJMUM7QUFDSCx3QkFBd0IsK0JBQStCLEdBQUc7QUFDMUQ7QUFDQSxHQUFHLGFBQWE7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLElBQUk7QUFDcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRLHVCQUF1QjtBQUM1QztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsTUFBcUMsR0FBRyxDQUF1SSxHQUFHLHFCQUFtQjtBQUN6TjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixNQUFxQyxHQUFHLENBQW9KLEdBQUcscUJBQW1CO0FBQ3hPO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ087QUFDUDtBQUNBLHFIQUFxSCxJQUFJO0FBQ3pIO0FBQ087QUFDUDtBQUNBO0FBQ0EsSUFBSTtBQUNKLG1CQUFtQixZQUFvQixtQkFBbUIsRUFFckQ7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxPQUFPO0FBQ2xCLGFBQWEsUUFBUTtBQUNyQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLG1CQUFtQixVQUFVO0FBQzdCLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0E7QUFDQSxnQkFBZ0IsWUFBWSxFQUFFLGlCQUFpQjtBQUMvQyxJQUFJO0FBQ0osZ0JBQWdCLGtCQUFrQjtBQUNsQztBQUNBLFlBQVksS0FBSyxHQUFHLE9BQU87QUFDM0I7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixhQUFhLDJFQUEyRTtBQUN4Rjs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLEd
1BQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsTUFBTTtBQUNoQyxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxJQUFJO0FBQ0osbUJBQW1CLFlBQW9CLG1CQUFtQixFQUVyRDtBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxJQUFJO0FBQ0osbUJBQW1CLFlBQW9CLG1CQUFtQixFQUVyRDtBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQSxJQUFJO0FBQ0osb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLElBQUk7QUFDSixtQkFBbUIsWUFBb0IsbUJBQW1CLEVBRXJEO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUD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0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsS0FBSztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsd0NBQXdDO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxhQUFhLG1CQUFTO0FBQ3RCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQWUsY0FBYyxFOztBQ25LN0I7QUFDTztBQUNQO0FBQ0E7QUFDQSxVQUFVLEtBQXFDLEVBQUUsRUFJMUM7QUFDUCw4Q0FBOEMsWUFBWTtBQUMxRDtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsU0FBUyxJQUFJLFlBQVk7QUFDNUM7QUFDQTtBQUNBLG1CQUFtQixhQUFhO0FBQ2hDO0FBQ0E7QUFDQSx3QkFBd0IsWUFBWTtBQUNwQztBQUNBLGdCQUFnQixxQ0FBcUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0EsQzs7QUN6QmUsU0FBU0MsYUFBYUMsV0FBVyxFQUFFQyxNQUFNO0lBQ3RELE9BQU87UUFDTEMsU0FBUztZQUNQQyxXQUFXO1lBQ1gsQ0FBQ0gsWUFBW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FVBQVU7SUFBQztJQUFRRixhQUFhLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0lBQUlBLGFBQWEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7SUFBSUEsYUFBYSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztJQUFJQSxhQUFhLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJO0lBQUlBLGFBQWEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUk7SUFBSUEsYUFBYSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSTtJQUFJQSxhQUFhLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJO0lBQUlBLGFBQWEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUk7SUFBSUEsYUFBYSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSTtJQUFJQSxhQUFhLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJO0lBQUlBLGFBQWEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUk7SUFBSUEsYUFBYSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSTtJQUFJQSxhQUFhLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJO0lBQUlBLGFBQWEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUk7SUFBSUEsYUFBYSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSTtJQUFJQSxhQUFhLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJO0lBQUlBLGFBQWEsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUk7SUFBSUEsYUFBYSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSTtJQUFJQSxhQUFhLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJO0lBQUlBLGFBQWEsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUk7SUFBSUEsYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSTtJQUFJQSxhQUFhLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJO0lBQUlBLGFBQWEsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUk7SUFBSUEsYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSTtDQUFHO0FBQ3J5QyxxREFBZUUsT0FBT0EsRUFBQzs7O0FDVHZCLHVHQUF1RztBQUN2Ryw0REFBNEQ7QUFDckQsTUFBTUMsU0FBUztJQUNwQix3Q0FBd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tL2NvbXBvc2VDbGFzc2VzL2NvbXBvc2VDbGFzc2VzLmpzP2UwNGUiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3V0aWxzL2VzbS9mb3JtYXRNdWlFcnJvck1lc3NhZ2UvZm9ybWF0TXVpRXJyb3JNZXNzYWdlLmpzPzczNjAiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3V0aWxzL2VzbS9jYXBpdGFsaXplL2NhcGl0YWxpemUuanM/MTc2ZSIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvbWF0ZXJpYWwvZXNtL3V0aWxzL2NhcGl0YWxpemUuanM/ODJlNiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanM/NzJlOSIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL3NoZWV0L2Rpc3QvZW1vdGlvbi1zaGVldC5lc20uanM/YzJkZSIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3N0eWxpcy9zcmMvVXRpbGl0eS5qcz8xNGFhIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc3R5bGlzL3NyYy9Ub2tlbml6ZXIuanM/NmQ5NCIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3N0eWxpcy9zcmMvRW51bS5qcz9lNzBhIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc3R5bGlzL3NyYy9TZXJpYWxpemVyLmpzPzFlMGUiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zdHlsaXMvc3JjL01pZGRsZXdhcmUuanM/MWFmYyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3N0eWxpcy9zcmMvUGFyc2VyLmpzP2EwOWYiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9jYWNoZS9kaXN0L2Vtb3Rpb24tY2FjaGUuYnJvd3Nlci5lc20uanM/N2E4YiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL2hhc2gvZGlzdC9lbW90aW9uLWhhc2guZXNtLmpzPzBkODEiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi91bml0bGVzcy9kaXN0L2Vtb3Rpb24tdW5pdGxlc3MuZXNtLmpzPzM2NTAiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9tZW1vaXplL2Rpc3QvZW1vdGlvbi1tZW1vaXplLmVzbS5qcz9lODhhIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGVtb3Rpb24vc2VyaWFsaXplL2Rpc3QvZW1vdGlvbi1zZXJpYWxpemUuZXNtLmpzP2JjNGEiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi91c2UtaW5zZXJ0aW9uLWVmZmVjdC13aXRoLWZhbGxiYWNrcy9kaXN0L2Vtb3Rpb24tdXNlLWluc2VydGlvbi1lZmZlY3Qtd2l0aC1mYWxsYmFja3MuYnJvd3Nlci5lc20uanM/MGU5NiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL3JlYWN0L2Rpc3QvZW1vdGlvbi1lbGVtZW50LWYwZGU5NjhlLmJyb3dzZXIuZXNtLmpzPzM0MTAiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi91dGlscy9kaXN0L2Vtb3Rpb24tdXRpbHMuYnJvd3Nlci5lc20uanM/NzA3OSIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL2lzLXByb3AtdmFsaWQvZGlzdC9lbW90aW9uLWlzLXByb3AtdmFsaWQuZXNtLmpzP2U1ZGYiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9zdHlsZWQvYmFzZS9kaXN0L2Vtb3Rpb24tc3R5bGVkLWJhc2UuYnJvd3Nlci5lc20uanM/YTVhNiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BlbW90aW9uL3N0eWxlZC9kaXN0L2Vtb3Rpb24tc3R5bGVkLmJyb3dzZXIuZXNtLmpzP2ZhNzUiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3N0eWxlZC1lbmdpbmUvZXNtL2luZGV4LmpzPzQ0ZTAiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3V0aWxzL2VzbS9kZWVwbWVyZ2UvZGVlcG1lcmdlLmpzPzIzODkiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3N5c3RlbS9lc20vY3JlYXRlQnJlYWtwb2ludHMvY3JlYXRlQnJlYWtwb2ludHMuanM/ZDNlNyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvc3lzdGVtL2VzbS9jc3NDb250YWluZXJRdWVyaWVzL2Nzc0NvbnRhaW5lclF1ZXJpZXMuanM/Yzk1NiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvc3lzdGVtL2VzbS9jcmVhdGVUaGVtZS9zaGFwZS5qcz9lNzEyIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9zeXN0ZW0vZXNtL2JyZWFrcG9pbnRzL2JyZWFrcG9pbnRzLmpzP2FlMzQiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3N5c3RlbS9lc20vc3R5bGUvc3R5bGUuanM/NGFjMSIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvc3lzdGVtL2VzbS9tZXJnZS9tZXJnZS5qcz8wYzMxIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9zeXN0ZW0vZXNtL21lbW9pemUvbWVtb2l6ZS5qcz84ZGU1Iiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9zeXN0ZW0vZXNtL3NwYWNpbmcvc3BhY2luZy5qcz8xMGMxIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9zeXN0ZW0vZXNtL2NyZWF0ZVRoZW1lL2NyZWF0ZVNwYWNpbmcuanM/MmEzYiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvc3lzdGVtL2VzbS9jb21wb3NlL2NvbXBvc2UuanM/MzAwMCIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvc3lzdGVtL2VzbS9ib3JkZXJzL2JvcmRlcnMuanM/Y2UwMyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvc3lzdGVtL2VzbS9jc3NHcmlkL2Nzc0dyaWQuanM/YTI1YyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvc3lzdGVtL2VzbS9wYWxldHRlL3BhbGV0dGUuanM/M2E4NyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvc3lzdGVtL2VzbS9zaXppbmcvc2l6aW5nLmpzP2I3MTIiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3N5c3RlbS9lc20vc3R5bGVGdW5jdGlvblN4L2RlZmF1bHRTeENvbmZpZy5qcz9kMjUwIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9zeXN0ZW0vZXNtL3N0eWxlRnVuY3Rpb25TeC9zdHlsZUZ1bmN0aW9uU3guanM/NTdlYiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvc3lzdGVtL2VzbS9jcmVhdGVUaGVtZS9hcHBseVN0eWxlcy5qcz83NWUxIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9zeXN0ZW0vZXNtL2NyZWF0ZVRoZW1lL2NyZWF0ZVRoZW1lLmpzPzAzMjEiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3N5c3RlbS9lc20vcHJlcHJvY2Vzc1N0eWxlcy5qcz80ODFjIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9zeXN0ZW0vZXNtL2NyZWF0ZVN0eWxlZC9jcmVhdGVTdHlsZWQuanM/Z
1DMxZCIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvdXRpbHMvZXNtL2NsYW1wL2NsYW1wLmpzPzZlZWIiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3N5c3RlbS9lc20vY29sb3JNYW5pcHVsYXRvci9jb2xvck1hbmlwdWxhdG9yLmpzP2VkZGMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL21hdGVyaWFsL2VzbS9jb2xvcnMvY29tbW9uLmpzP2RhZjgiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL21hdGVyaWFsL2VzbS9jb2xvcnMvZ3JleS5qcz8xODVmIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vY29sb3JzL3B1cnBsZS5qcz9mNjAxIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vY29sb3JzL3JlZC5qcz84ZDYyIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vY29sb3JzL29yYW5nZS5qcz83ZGJkIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vY29sb3JzL2JsdWUuanM/MTEwYyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvbWF0ZXJpYWwvZXNtL2NvbG9ycy9saWdodEJsdWUuanM/ZjJjMSIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvbWF0ZXJpYWwvZXNtL2NvbG9ycy9ncmVlbi5qcz9kNWU1Iiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vc3R5bGVzL2NyZWF0ZVBhbGV0dGUuanM/YWVjZiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvc3lzdGVtL2VzbS9jc3NWYXJzL2NyZWF0ZUdldENzc1Zhci5qcz9jZTg0Iiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9zeXN0ZW0vZXNtL2Nzc1ZhcnMvcHJlcGFyZVR5cG9ncmFwaHlWYXJzLmpzPzkyZTIiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3N5c3RlbS9lc20vY3NzVmFycy9jc3NWYXJzUGFyc2VyLmpzP2NkYzciLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3N5c3RlbS9lc20vY3NzVmFycy9wcmVwYXJlQ3NzVmFycy5qcz83MTg3Iiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9zeXN0ZW0vZXNtL2Nzc1ZhcnMvZ2V0Q29sb3JTY2hlbWVTZWxlY3Rvci5qcz9lMDBjIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vc3R5bGVzL2NyZWF0ZU1peGlucy5qcz81ZDBlIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vc3R5bGVzL2NyZWF0ZVR5cG9ncmFwaHkuanM/YzU5MiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvbWF0ZXJpYWwvZXNtL3N0eWxlcy9zaGFkb3dzLmpzP2YyY2UiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL21hdGVyaWFsL2VzbS9zdHlsZXMvY3JlYXRlVHJhbnNpdGlvbnMuanM/NWNmNCIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvbWF0ZXJpYWwvZXNtL3N0eWxlcy96SW5kZXguanM/ODYxMCIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvbWF0ZXJpYWwvZXNtL3N0eWxlcy9zdHJpbmdpZnlUaGVtZS5qcz84ODljIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vc3R5bGVzL2NyZWF0ZVRoZW1lTm9WYXJzLmpzPzY2MzEiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL21hdGVyaWFsL2VzbS9zdHlsZXMvZ2V0T3ZlcmxheUFscGhhLmpzPzQxNWMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL21hdGVyaWFsL2VzbS9zdHlsZXMvY3JlYXRlQ29sb3JTY2hlbWUuanM/OWJmZSIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvbWF0ZXJpYWwvZXNtL3N0eWxlcy9zaG91bGRTa2lwR2VuZXJhdGluZ1Zhci5qcz81MzllIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vc3R5bGVzL2V4Y2x1ZGVWYXJpYWJsZXNGcm9tUm9vdC5qcz9mYjY1Iiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vc3R5bGVzL2NyZWF0ZUdldFNlbGVjdG9yLmpzP2MzY2YiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL21hdGVyaWFsL2VzbS9zdHlsZXMvY3JlYXRlVGhlbWVXaXRoVmFycy5qcz9lMDE0Iiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vc3R5bGVzL2NyZWF0ZVRoZW1lLmpzPzcwMzkiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL21hdGVyaWFsL2VzbS9zdHlsZXMvZGVmYXVsdFRoZW1lLmpzPzc1M2MiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL21hdGVyaWFsL2VzbS9zdHlsZXMvaWRlbnRpZmllci5qcz9iYWVlIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vc3R5bGVzL3Nsb3RTaG91bGRGb3J3YXJkUHJvcC5qcz9jZjljIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vc3R5bGVzL3Jvb3RTaG91bGRGb3J3YXJkUHJvcC5qcz8wNzI3Iiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vc3R5bGVzL3N0eWxlZC5qcz85ZTQwIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9zeXN0ZW0vZXNtL21lbW9UaGVtZS5qcz8xODg1Iiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS9tYXRlcmlhbC9lc20vdXRpbHMvbWVtb1RoZW1lLmpzPzY4MDciLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3V0aWxzL2VzbS9yZXNvbHZlUHJvcHMvcmVzb2x2ZVByb3BzLmpzP2Q1OTUiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3N5c3RlbS9lc20vRGVmYXVsdFByb3BzUHJvdmlkZXIvRGVmYXVsdFByb3BzUHJvdmlkZXIuanM/YjI2NSIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvbWF0ZXJpYWwvZXNtL0RlZmF1bHRQcm9wc1Byb3ZpZGVyL0RlZmF1bHRQcm9wc1Byb3ZpZGVyLmpzPzZlYzgiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3V0aWxzL2VzbS9DbGFzc05hbWVHZW5lcmF0b3IvQ2xhc3NOYW1lR2VuZXJhdG9yLmpzP2Y1OGIiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL3V0aWxzL2VzbS9nZW5lcmF0ZVV0aWxpdHlDbGFzcy9nZW5lcmF0ZVV0aWxpdHlDbGFzcy5qcz84OThhIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG11aS91dGlscy9lc20vZ2VuZXJhdGVVdGlsaXR5Q2xhc3Nlcy9nZW5lcmF0ZVV0aWxpdHlDbGFzc2VzLmpzPzZiZDkiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL21hdGVyaWFsL2VzbS9TdmdJY29uL3N2Z0ljb25DbGFzc2VzLmpzPzhhNTAiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbXVpL21hdGVyaWFsL2VzbS9TdmdJY29uL1N2Z0ljb24uanM/NzljNCIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvbWF0ZXJpYWwvZXNtL3V0aWxzL2NyZWF0ZVN2Z0ljb24uanM/OTRjZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1zeW50YXg6IDAsIHByZWZlci10ZW1wbGF0ZTogMCwgZ3VhcmQtZm9yLWluOiAwXG4gICAtLS1cbiAgIFRoZXNlIHJ1bGVzIGFyZSBwcmV2ZW50aW5nIHRoZSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIGJlbG93LlxuICovXG5cbi8qKlxuICogQ29tcG9zZSBjbGFzc2VzIGZyb20gbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCBzbG90cyA9IHtcbiAqICByb290OiBbJ3Jvb3QnLCAncHJpbWFyeSddLFxuICogIGxhYmVsOiBbJ2xhYmVsJ10sXG4gKiB9O1xuICpcbiAqIGNvbnN0IGdldFV0aWxpdHlDbGFzcyA9IChzbG90KSA9PiBgTXVpQnV0dG9uLSR7c2xvdH1gO1xuICpcbiAqIGNvbnN0IGNsYXNzZXMgPSB7XG4gKiAgIHJvb3Q6ICdteS1yb290LWNsYXNzJyxcbiAqIH07XG4gKlxuICogY29uc3Qgb3V0cHV0ID0gY29tcG9zZUNsYXNzZXMoc2xvdHMsIGdldFV0aWxpdHlDbGFzcywgY2xhc3Nlcyk7XG4gKiAvLyB7XG4gKiAvLyAgIHJvb3Q6ICdNdWlCdXR0b24tcm9vdCBNdWlCdXR0b24tcHJpbWFyeSBteS1yb290LWNsYXNzJyxcbiAqIC8vICAgbGFiZWw6ICdNdWlCdXR0b24tbGFiZWwnLFxuICogLy8gfV
1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNsb3RzIGEgbGlzdCBvZiBjbGFzc2VzIGZvciBlYWNoIHBvc3NpYmxlIHNsb3RcbiAqIEBwYXJhbSBnZXRVdGlsaXR5Q2xhc3MgYSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjbGFzcyBiYXNlZCBvbiB0aGUgc2xvdCBuYW1lXG4gKiBAcGFyYW0gY2xhc3NlcyB0aGUgaW5wdXQgY2xhc3NlcyBmcm9tIHByb3BzXG4gKiBAcmV0dXJucyB0aGUgcmVzb2x2ZWQgY2xhc3NlcyBmb3IgYWxsIHNsb3RzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXBvc2VDbGFzc2VzKHNsb3RzLCBnZXRVdGlsaXR5Q2xhc3MsIGNsYXNzZXMgPSB1bmRlZmluZWQpIHtcbiAgY29uc3Qgb3V0cHV0ID0ge307XG4gIGZvciAoY29uc3Qgc2xvdE5hbWUgaW4gc2xvdHMpIHtcbiAgICBjb25zdCBzbG90ID0gc2xvdHNbc2xvdE5hbWVdO1xuICAgIGxldCBidWZmZXIgPSAnJztcbiAgICBsZXQgc3RhcnQgPSB0cnVlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xvdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBzbG90W2ldO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGJ1ZmZlciArPSAoc3RhcnQgPT09IHRydWUgPyAnJyA6ICcgJykgKyBnZXRVdGlsaXR5Q2xhc3ModmFsdWUpO1xuICAgICAgICBzdGFydCA9IGZhbHNlO1xuICAgICAgICBpZiAoY2xhc3NlcyAmJiBjbGFzc2VzW3ZhbHVlXSkge1xuICAgICAgICAgIGJ1ZmZlciArPSAnICcgKyBjbGFzc2VzW3ZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBvdXRwdXRbc2xvdE5hbWVdID0gYnVmZmVyO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59IiwiLyoqXG4gKiBXQVJOSU5HOiBEb24ndCBpbXBvcnQgdGhpcyBkaXJlY3RseS4gSXQncyBpbXBvcnRlZCBieSB0aGUgY29kZSBnZW5lcmF0ZWQgYnlcbiAqIGBAbXVpL2ludGVyYWwtYmFiZWwtcGx1Z2luLW1pbmlmeS1lcnJvcnNgLiBNYWtlIHN1cmUgdG8gYWx3YXlzIHVzZSBzdHJpbmcgbGl0ZXJhbHMgaW4gYEVycm9yYFxuICogY29uc3RydWN0b3JzIHRvIGVuc3VyZSB0aGUgcGx1Z2luIHdvcmtzIGFzIGV4cGVjdGVkLiBTdXBwb3J0ZWQgcGF0dGVybnMgaW5jbHVkZTpcbiAqICAgdGhyb3cgbmV3IEVycm9yKCdNeSBtZXNzYWdlJyk7XG4gKiAgIHRocm93IG5ldyBFcnJvcihgTXkgbWVzc2FnZTogJHtmb299YCk7XG4gKiAgIHRocm93IG5ldyBFcnJvcihgTXkgbWVzc2FnZTogJHtmb299YCArICdhbm90aGVyIHN0cmluZycpO1xuICogICAuLi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2RlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvcm1hdE11aUVycm9yTWVzc2FnZShjb2RlLCAuLi5hcmdzKSB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoYGh0dHBzOi8vbXVpLmNvbS9wcm9kdWN0aW9uLWVycm9yLz9jb2RlPSR7Y29kZX1gKTtcbiAgYXJncy5mb3JFYWNoKGFyZyA9PiB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnYXJnc1tdJywgYXJnKSk7XG4gIHJldHVybiBgTWluaWZpZWQgTVVJIGVycm9yICMke2NvZGV9OyB2aXNpdCAke3VybH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2UuYDtcbn0iLCJpbXBvcnQgX2Zvcm1hdEVycm9yTWVzc2FnZSBmcm9tIFwiQG11aS91dGlscy9mb3JtYXRNdWlFcnJvck1lc3NhZ2VcIjtcbi8vIEl0IHNob3VsZCB0byBiZSBub3RlZCB0aGF0IHRoaXMgZnVuY3Rpb24gaXNuJ3QgZXF1aXZhbGVudCB0byBgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemVgLlxuLy9cbi8vIEEgc3RyaWN0IGNhcGl0YWxpemF0aW9uIHNob3VsZCB1cHBlcmNhc2UgdGhlIGZpcnN0IGxldHRlciBvZiBlYWNoIHdvcmQgaW4gdGhlIHNlbnRlbmNlLlxuLy8gV2Ugb25seSBoYW5kbGUgdGhlIGZpcnN0IHdvcmQuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ01VSTogYGNhcGl0YWxpemUoc3RyaW5nKWAgZXhwZWN0cyBhIHN0cmluZyBhcmd1bWVudC4nIDogX2Zvcm1hdEVycm9yTWVzc2FnZSg3KSk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn0iLCJpbXBvcnQgY2FwaXRhbGl6ZSBmcm9tICdAbXVpL3V0aWxzL2NhcGl0YWxpemUnO1xuZXhwb3J0IGRlZmF1bHQgY2FwaXRhbGl6ZTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHtcbiAgICBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykge1xuICAgICAgdmFyIHQgPSBhcmd1bWVudHNbZV07XG4gICAgICBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCB7IF9leHRlbmRzIGFzIGRlZmF1bHQgfTsiLCJ2YXIgaXNEZXZlbG9wbWVudCA9IGZhbHNlO1xuXG4vKlxuXG5CYXNlZCBvZmYgZ2xhbW9yJ3MgU3R5bGVTaGVldCwgdGhhbmtzIFN1bmlsIOKdpO+4j1xuXG5oaWdoIHBlcmZvcm1hbmNlIFN0eWxlU2hlZXQgZm9yIGNzcy1pbi1qcyBzeXN0ZW1zXG5cbi0gdXNlcyBtdWx0aXBsZSBzdHlsZSB0YWdzIGJlaGluZCB0aGUgc2NlbmVzIGZvciBtaWxsaW9ucyBvZiBydWxlc1xuLSB1c2VzIGBpbnNlcnRSdWxlYCBmb3IgYXBwZW5kaW5nIGluIHByb2R1Y3Rpb24gZm9yICptdWNoKiBmYXN0ZXIgcGVyZm9ybWFuY2VcblxuLy8gdXNhZ2VcblxuaW1wb3J0IHsgU3R5bGVTaGVldCB9IGZyb20gJ0BlbW90aW9uL3NoZWV0J1xuXG5sZXQgc3R5bGVTaGVldCA9IG5ldyBTdHlsZVNoZWV0KHsga2V5OiAnJywgY29udGFpbmVyOiBkb2N1bWVudC5oZWFkIH0pXG5cbnN0eWxlU2hlZXQuaW5zZXJ0KCcjYm94IHsgYm9yZGVyOiAxcHggc29saWQgcmVkOyB9Jylcbi0gYXBwZW5kcyBhIGNzcyBydWxlIGludG8gdGhlIHN0eWxlc2hlZXRcblxuc3R5bGVTaGVldC5mbHVzaCgpXG4tIGVtcHRpZXMgdGhlIHN0eWxlc2hlZXQgb2YgYWxsIGl0cyBjb250ZW50c1xuXG4qL1xuXG5mdW5jdGlvbiBzaGVldEZvclRhZyh0YWcpIHtcbiAgaWYgKHRhZy5zaGVldCkge1xuICAgIHJldHVybi
1B0YWcuc2hlZXQ7XG4gIH0gLy8gdGhpcyB3ZWlyZG5lc3MgYnJvdWdodCB0byB5b3UgYnkgZmlyZWZveFxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGRvY3VtZW50LnN0eWxlU2hlZXRzW2ldLm93bmVyTm9kZSA9PT0gdGFnKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQuc3R5bGVTaGVldHNbaV07XG4gICAgfVxuICB9IC8vIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGFsd2F5cyByZXR1cm4gd2l0aCBhIHZhbHVlXG4gIC8vIFRTIGNhbid0IHVuZGVyc3RhbmQgaXQgdGhvdWdoIHNvIHdlIG1ha2UgaXQgc3RvcCBjb21wbGFpbmluZyBoZXJlXG5cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgdGFnLnNldEF0dHJpYnV0ZSgnZGF0YS1lbW90aW9uJywgb3B0aW9ucy5rZXkpO1xuXG4gIGlmIChvcHRpb25zLm5vbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB0YWcuc2V0QXR0cmlidXRlKCdub25jZScsIG9wdGlvbnMubm9uY2UpO1xuICB9XG5cbiAgdGFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKSk7XG4gIHRhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtcycsICcnKTtcbiAgcmV0dXJuIHRhZztcbn1cblxudmFyIFN0eWxlU2hlZXQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAvLyBVc2luZyBOb2RlIGluc3RlYWQgb2YgSFRNTEVsZW1lbnQgc2luY2UgY29udGFpbmVyIG1heSBiZSBhIFNoYWRvd1Jvb3RcbiAgZnVuY3Rpb24gU3R5bGVTaGVldChvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuX2luc2VydFRhZyA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgIHZhciBiZWZvcmU7XG5cbiAgICAgIGlmIChfdGhpcy50YWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAoX3RoaXMuaW5zZXJ0aW9uUG9pbnQpIHtcbiAgICAgICAgICBiZWZvcmUgPSBfdGhpcy5pbnNlcnRpb25Qb2ludC5uZXh0U2libGluZztcbiAgICAgICAgfSBlbHNlIGlmIChfdGhpcy5wcmVwZW5kKSB7XG4gICAgICAgICAgYmVmb3JlID0gX3RoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmVmb3JlID0gX3RoaXMuYmVmb3JlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiZWZvcmUgPSBfdGhpcy50YWdzW190aGlzLnRhZ3MubGVuZ3RoIC0gMV0ubmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUodGFnLCBiZWZvcmUpO1xuXG4gICAgICBfdGhpcy50YWdzLnB1c2godGFnKTtcbiAgICB9O1xuXG4gICAgdGhpcy5pc1NwZWVkeSA9IG9wdGlvbnMuc3BlZWR5ID09PSB1bmRlZmluZWQgPyAhaXNEZXZlbG9wbWVudCA6IG9wdGlvbnMuc3BlZWR5O1xuICAgIHRoaXMudGFncyA9IFtdO1xuICAgIHRoaXMuY3RyID0gMDtcbiAgICB0aGlzLm5vbmNlID0gb3B0aW9ucy5ub25jZTsgLy8ga2V5IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZGF0YS1lbW90aW9uIGF0dHJpYnV0ZSwgaXQncyB1c2VkIHRvIGlkZW50aWZ5IGRpZmZlcmVudCBzaGVldHNcblxuICAgIHRoaXMua2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcbiAgICB0aGlzLnByZXBlbmQgPSBvcHRpb25zLnByZXBlbmQ7XG4gICAgdGhpcy5pbnNlcnRpb25Qb2ludCA9IG9wdGlvbnMuaW5zZXJ0aW9uUG9pbnQ7XG4gICAgdGhpcy5iZWZvcmUgPSBudWxsO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFN0eWxlU2hlZXQucHJvdG90eXBlO1xuXG4gIF9wcm90by5oeWRyYXRlID0gZnVuY3Rpb24gaHlkcmF0ZShub2Rlcykge1xuICAgIG5vZGVzLmZvckVhY2godGhpcy5faW5zZXJ0VGFnKTtcbiAgfTtcblxuICBfcHJvdG8uaW5zZXJ0ID0gZnVuY3Rpb24gaW5zZXJ0KHJ1bGUpIHtcbiAgICAvLyB0aGUgbWF4IGxlbmd0aCBpcyBob3cgbWFueSBydWxlcyB3ZSBoYXZlIHBlciBzdHlsZSB0YWcsIGl0J3MgNjUwMDAgaW4gc3BlZWR5IG1vZGVcbiAgICAvLyBpdCdzIDEgaW4gZGV2IGJlY2F1c2Ugd2UgaW5zZXJ0IHNvdXJjZSBtYXBzIHRoYXQgbWFwIGEgc2luZ2xlIHJ1bGUgdG8gYSBsb2NhdGlvblxuICAgIC8vIGFuZCB5b3UgY2FuIG9ubHkgaGF2ZSBvbmUgc291cmNlIG1hcCBwZXIgc3R5bGUgdGFnXG4gICAgaWYgKHRoaXMuY3RyICUgKHRoaXMuaXNTcGVlZHkgPyA2NTAwMCA6IDEpID09PSAwKSB7XG4gICAgICB0aGlzLl9pbnNlcnRUYWcoY3JlYXRlU3R5bGVFbGVtZW50KHRoaXMpKTtcbiAgICB9XG5cbiAgICB2YXIgdGFnID0gdGhpcy50YWdzW3RoaXMudGFncy5sZW5ndGggLSAxXTtcblxuICAgIGlmICh0aGlzLmlzU3BlZWR5KSB7XG4gICAgICB2Y
1XIgc2hlZXQgPSBzaGVldEZvclRhZyh0YWcpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSB1bHRyYWZhc3QgdmVyc2lvbiwgd29ya3MgYWNyb3NzIGJyb3dzZXJzXG4gICAgICAgIC8vIHRoZSBiaWcgZHJhd2JhY2sgaXMgdGhhdCB0aGUgY3NzIHdvbid0IGJlIGVkaXRhYmxlIGluIGRldnRvb2xzXG4gICAgICAgIHNoZWV0Lmluc2VydFJ1bGUocnVsZSwgc2hlZXQuY3NzUnVsZXMubGVuZ3RoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHJ1bGUpKTtcbiAgICB9XG5cbiAgICB0aGlzLmN0cisrO1xuICB9O1xuXG4gIF9wcm90by5mbHVzaCA9IGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHRoaXMudGFncy5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgIHZhciBfdGFnJHBhcmVudE5vZGU7XG5cbiAgICAgIHJldHVybiAoX3RhZyRwYXJlbnROb2RlID0gdGFnLnBhcmVudE5vZGUpID09IG51bGwgPyB2b2lkIDAgOiBfdGFnJHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFnKTtcbiAgICB9KTtcbiAgICB0aGlzLnRhZ3MgPSBbXTtcbiAgICB0aGlzLmN0ciA9IDA7XG4gIH07XG5cbiAgcmV0dXJuIFN0eWxlU2hlZXQ7XG59KCk7XG5cbmV4cG9ydCB7IFN0eWxlU2hlZXQgfTtcbiIsIi8qKlxuICogQHBhcmFtIHtudW1iZXJ9XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCB2YXIgYWJzID0gTWF0aC5hYnNcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn1cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IHZhciBmcm9tID0gU3RyaW5nLmZyb21DaGFyQ29kZVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgdmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ25cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2ggKHZhbHVlLCBsZW5ndGgpIHtcblx0cmV0dXJuIGNoYXJhdCh2YWx1ZSwgMCkgXiA0NSA/ICgoKCgoKChsZW5ndGggPDwgMikgXiBjaGFyYXQodmFsdWUsIDApKSA8PCAyKSBeIGNoYXJhdCh2YWx1ZSwgMSkpIDw8IDIpIF4gY2hhcmF0KHZhbHVlLCAyKSkgPDwgMikgXiBjaGFyYXQodmFsdWUsIDMpIDogMFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbSAodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlLnRyaW0oKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtSZWdFeHB9IHBhdHRlcm5cbiAqIEByZXR1cm4ge3N0cmluZz99XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaCAodmFsdWUsIHBhdHRlcm4pIHtcblx0cmV0dXJuICh2YWx1ZSA9IHBhdHRlcm4uZXhlYyh2YWx1ZSkpID8gdmFsdWVbMF0gOiB2YWx1ZVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHsoc3RyaW5nfFJlZ0V4cCl9IHBhdHRlcm5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZXBsYWNlbWVudFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZSAodmFsdWUsIHBhdHRlcm4sIHJlcGxhY2VtZW50KSB7XG5cdHJldHVybiB2YWx1ZS5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaFxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhvZiAodmFsdWUsIHNlYXJjaCkge1xuXHRyZXR1cm4gdmFsdWUuaW5kZXhPZihzZWFyY2gpXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXJhdCAodmFsdWUsIGluZGV4KSB7XG5cdHJldHVybiB2YWx1ZS5jaGFyQ29kZUF0KGluZGV4KSB8IDBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBiZWdpblxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3Vic3RyICh2YWx1ZSwgYmVnaW4sIGVuZCkge1xuXHRyZXR1cm4gdmFsdWUuc2xpY2UoYmVnaW4sIGVuZClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmxlbiAodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlLmxlbmd0aFxufVxuXG4vKipcbiAqIEBwYXJhbSB7YW55W119IHZhbHVlXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaXplb2YgKHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZS5sZW5ndGhcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7YW55W119IGFycmF5XG4gKiBAcmV0dXJuIHthbnl9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmQgKHZhbHVlLCBhcnJheSkge1xuXHRyZXR1cm4gYXJyYXkucHVzaCh2YWx1ZSksIHZhbHVlXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJyYXlcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lIChhcnJheSwgY2FsbGJhY2spIHtcblx0cmV0dXJuIGFycmF5Lm1hcChjYWxsYmFjaykuam9pbignJylcbn1cbiIsImltcG9ydCB7ZnJvbSwgdHJpbSwgY2hhcmF0LCBzdHJsZW4sIHN1YnN0ciwgYXBwZW5kLCBhc3NpZ259IGZyb20gJy4vVXRpbGl0eS5qcydcblxuZXhwb3J0IHZhciBsaW5lID0gMVxuZXhwb3J0IHZhciBjb2x1bW4gPSAxXG5leHBvcnQgdmFyIGxlbmd0aCA9IDBcbmV4cG9ydCB2YXIgcG9zaXRpb24gPSAwXG5leHBvcnQgdmFyIGNoYXJhY3RlciA9IDBcbmV4cG9ydCB2YXIgY2hhcmFjdGVycyA9ICcnXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge29iamVjdCB8IG51bGx9IHJvb3RcbiAqIEBwYXJhbSB7b2JqZWN0IHwgbnVsbH0gcGFyZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHN0cmluZ30gcHJv
1cHNcbiAqIEBwYXJhbSB7b2JqZWN0W10gfCBzdHJpbmd9IGNoaWxkcmVuXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub2RlICh2YWx1ZSwgcm9vdCwgcGFyZW50LCB0eXBlLCBwcm9wcywgY2hpbGRyZW4sIGxlbmd0aCkge1xuXHRyZXR1cm4ge3ZhbHVlOiB2YWx1ZSwgcm9vdDogcm9vdCwgcGFyZW50OiBwYXJlbnQsIHR5cGU6IHR5cGUsIHByb3BzOiBwcm9wcywgY2hpbGRyZW46IGNoaWxkcmVuLCBsaW5lOiBsaW5lLCBjb2x1bW46IGNvbHVtbiwgbGVuZ3RoOiBsZW5ndGgsIHJldHVybjogJyd9XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IHJvb3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weSAocm9vdCwgcHJvcHMpIHtcblx0cmV0dXJuIGFzc2lnbihub2RlKCcnLCBudWxsLCBudWxsLCAnJywgbnVsbCwgbnVsbCwgMCksIHJvb3QsIHtsZW5ndGg6IC1yb290Lmxlbmd0aH0sIHByb3BzKVxufVxuXG4vKipcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXIgKCkge1xuXHRyZXR1cm4gY2hhcmFjdGVyXG59XG5cbi8qKlxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJldiAoKSB7XG5cdGNoYXJhY3RlciA9IHBvc2l0aW9uID4gMCA/IGNoYXJhdChjaGFyYWN0ZXJzLCAtLXBvc2l0aW9uKSA6IDBcblxuXHRpZiAoY29sdW1uLS0sIGNoYXJhY3RlciA9PT0gMTApXG5cdFx0Y29sdW1uID0gMSwgbGluZS0tXG5cblx0cmV0dXJuIGNoYXJhY3RlclxufVxuXG4vKipcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5leHQgKCkge1xuXHRjaGFyYWN0ZXIgPSBwb3NpdGlvbiA8IGxlbmd0aCA/IGNoYXJhdChjaGFyYWN0ZXJzLCBwb3NpdGlvbisrKSA6IDBcblxuXHRpZiAoY29sdW1uKyssIGNoYXJhY3RlciA9PT0gMTApXG5cdFx0Y29sdW1uID0gMSwgbGluZSsrXG5cblx0cmV0dXJuIGNoYXJhY3RlclxufVxuXG4vKipcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlZWsgKCkge1xuXHRyZXR1cm4gY2hhcmF0KGNoYXJhY3RlcnMsIHBvc2l0aW9uKVxufVxuXG4vKipcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcmV0ICgpIHtcblx0cmV0dXJuIHBvc2l0aW9uXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGJlZ2luXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGljZSAoYmVnaW4sIGVuZCkge1xuXHRyZXR1cm4gc3Vic3RyKGNoYXJhY3RlcnMsIGJlZ2luLCBlbmQpXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRva2VuICh0eXBlKSB7XG5cdHN3aXRjaCAodHlwZSkge1xuXHRcdC8vIFxcMCBcXHQgXFxuIFxcciBcXHMgd2hpdGVzcGFjZSB0b2tlblxuXHRcdGNhc2UgMDogY2FzZSA5OiBjYXNlIDEwOiBjYXNlIDEzOiBjYXNlIDMyOlxuXHRcdFx0cmV0dXJuIDVcblx0XHQvLyAhICsgLCAvID4gQCB+IGlzb2xhdGUgdG9rZW5cblx0XHRjYXNlIDMzOiBjYXNlIDQzOiBjYXNlIDQ0OiBjYXNlIDQ3OiBjYXNlIDYyOiBjYXNlIDY0OiBjYXNlIDEyNjpcblx0XHQvLyA7IHsgfSBicmVha3BvaW50IHRva2VuXG5cdFx0Y2FzZSA1OTogY2FzZSAxMjM6IGNhc2UgMTI1OlxuXHRcdFx0cmV0dXJuIDRcblx0XHQvLyA6IGFjY29tcGFuaWVkIHRva2VuXG5cdFx0Y2FzZSA1ODpcblx0XHRcdHJldHVybiAzXG5cdFx0Ly8gXCIgJyAoIFsgb3BlbmluZyBkZWxpbWl0IHRva2VuXG5cdFx0Y2FzZSAzNDogY2FzZSAzOTogY2FzZSA0MDogY2FzZSA5MTpcblx0XHRcdHJldHVybiAyXG5cdFx0Ly8gKSBdIGNsb3NpbmcgZGVsaW1pdCB0b2tlblxuXHRcdGNhc2UgNDE6IGNhc2UgOTM6XG5cdFx0XHRyZXR1cm4gMVxuXHR9XG5cblx0cmV0dXJuIDBcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge2FueVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsb2MgKHZhbHVlKSB7XG5cdHJldHVybiBsaW5lID0gY29sdW1uID0gMSwgbGVuZ3RoID0gc3RybGVuKGNoYXJhY3RlcnMgPSB2YWx1ZSksIHBvc2l0aW9uID0gMCwgW11cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm4ge2FueX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYWxsb2MgKHZhbHVlKSB7XG5cdHJldHVybiBjaGFyYWN0ZXJzID0gJycsIHZhbHVlXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGltaXQgKHR5cGUpIHtcblx0cmV0dXJuIHRyaW0oc2xpY2UocG9zaXRpb24gLSAxLCBkZWxpbWl0ZXIodHlwZSA9PT0gOTEgPyB0eXBlICsgMiA6IHR5cGUgPT09IDQwID8gdHlwZSArIDEgOiB0eXBlKSkpXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRva2VuaXplICh2YWx1ZSkge1xuXHRyZXR1cm4gZGVhbGxvYyh0b2tlbml6ZXIoYWxsb2ModmFsdWUpKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2hpdGVzcGFjZSAodHlwZSkge1xuXHR3aGlsZSAoY2hhcmFjdGVyID0gcGVlaygpKVxuXHRcdGlmIChjaGFyYWN0ZXIgPCAzMylcblx0XHRcdG5leHQoKVxuXHRcdGVsc2Vcblx0XHRcdGJyZWFrXG5cblx0cmV0dXJuIHRva2VuKHR5cGUpID4gMiB8fCB0b2tlbihjaGFyYWN0ZXIpID4gMyA/ICcnIDogJyAnXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gY2hpbGRyZW5cbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5pemVyIChjaGlsZHJlbikge1xuXHR3aGlsZSAobmV4dCgpKVxuXHRcdHN3aXRjaCAodG9rZW4oY2hhcmFjdGVyKSkge1xuXHRcdFx0Y2FzZSAwOiBhcHBlbmQoaWRlbnRpZmllcihwb3NpdGlvbiAtIDEpLCBjaGlsZHJlbilcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgMjogYXBwZW5kKGRlbGltaXQoY2hhcmFjdGVyKSwgY2hpbGRyZW4pXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRkZWZhdWx0OiBhcHBlbmQoZnJvbShjaGFyYWN0ZXIpLCBjaGlsZHJlbilcblx0XHR9XG5cblx0cmV0dXJuIGNoaWxkcmVuXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gY291bnRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwaW5nIChpbmRleCwgY291bnQpIHtcblx0d2hpbGUgKC0tY291bnQgJiYgbmV4dCgpKVxuXHRcdC8vIG5vdCAwLTkgQS1GIGEtZlxuXHRcdGlmIChjaGFyYWN0ZXIgPCA0OCB8fCBjaGFyYWN0ZXIgPiAxMDIgfHwgKGNoYXJhY3RlciA+IDU3ICYmIGNoYXJhY3RlciA8IDY1KSB8fCAoY2hhcmFjdGVyID4gNzAgJiYgY2hhcmFjdGVyIDwgOTcpKVxuXHRcdFx0YnJlYWtcblxuXHRyZXR1cm4gc2xpY2UoaW5kZXgsIGNhcmV0KCkgKyAoY291bnQgPCA2ICYmIHBlZWsoKSA9PSAzMiAmJi
1BuZXh0KCkgPT0gMzIpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxpbWl0ZXIgKHR5cGUpIHtcblx0d2hpbGUgKG5leHQoKSlcblx0XHRzd2l0Y2ggKGNoYXJhY3Rlcikge1xuXHRcdFx0Ly8gXSApIFwiICdcblx0XHRcdGNhc2UgdHlwZTpcblx0XHRcdFx0cmV0dXJuIHBvc2l0aW9uXG5cdFx0XHQvLyBcIiAnXG5cdFx0XHRjYXNlIDM0OiBjYXNlIDM5OlxuXHRcdFx0XHRpZiAodHlwZSAhPT0gMzQgJiYgdHlwZSAhPT0gMzkpXG5cdFx0XHRcdFx0ZGVsaW1pdGVyKGNoYXJhY3Rlcilcblx0XHRcdFx0YnJlYWtcblx0XHRcdC8vIChcblx0XHRcdGNhc2UgNDA6XG5cdFx0XHRcdGlmICh0eXBlID09PSA0MSlcblx0XHRcdFx0XHRkZWxpbWl0ZXIodHlwZSlcblx0XHRcdFx0YnJlYWtcblx0XHRcdC8vIFxcXG5cdFx0XHRjYXNlIDkyOlxuXHRcdFx0XHRuZXh0KClcblx0XHRcdFx0YnJlYWtcblx0XHR9XG5cblx0cmV0dXJuIHBvc2l0aW9uXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHR5cGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tbWVudGVyICh0eXBlLCBpbmRleCkge1xuXHR3aGlsZSAobmV4dCgpKVxuXHRcdC8vIC8vXG5cdFx0aWYgKHR5cGUgKyBjaGFyYWN0ZXIgPT09IDQ3ICsgMTApXG5cdFx0XHRicmVha1xuXHRcdC8vIC8qXG5cdFx0ZWxzZSBpZiAodHlwZSArIGNoYXJhY3RlciA9PT0gNDIgKyA0MiAmJiBwZWVrKCkgPT09IDQ3KVxuXHRcdFx0YnJlYWtcblxuXHRyZXR1cm4gJy8qJyArIHNsaWNlKGluZGV4LCBwb3NpdGlvbiAtIDEpICsgJyonICsgZnJvbSh0eXBlID09PSA0NyA/IHR5cGUgOiBuZXh0KCkpXG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmaWVyIChpbmRleCkge1xuXHR3aGlsZSAoIXRva2VuKHBlZWsoKSkpXG5cdFx0bmV4dCgpXG5cblx0cmV0dXJuIHNsaWNlKGluZGV4LCBwb3NpdGlvbilcbn1cbiIsImV4cG9ydCB2YXIgTVMgPSAnLW1zLSdcbmV4cG9ydCB2YXIgTU9aID0gJy1tb3otJ1xuZXhwb3J0IHZhciBXRUJLSVQgPSAnLXdlYmtpdC0nXG5cbmV4cG9ydCB2YXIgQ09NTUVOVCA9ICdjb21tJ1xuZXhwb3J0IHZhciBSVUxFU0VUID0gJ3J1bGUnXG5leHBvcnQgdmFyIERFQ0xBUkFUSU9OID0gJ2RlY2wnXG5cbmV4cG9ydCB2YXIgUEFHRSA9ICdAcGFnZSdcbmV4cG9ydCB2YXIgTUVESUEgPSAnQG1lZGlhJ1xuZXhwb3J0IHZhciBJTVBPUlQgPSAnQGltcG9ydCdcbmV4cG9ydCB2YXIgQ0hBUlNFVCA9ICdAY2hhcnNldCdcbmV4cG9ydCB2YXIgVklFV1BPUlQgPSAnQHZpZXdwb3J0J1xuZXhwb3J0IHZhciBTVVBQT1JUUyA9ICdAc3VwcG9ydHMnXG5leHBvcnQgdmFyIERPQ1VNRU5UID0gJ0Bkb2N1bWVudCdcbmV4cG9ydCB2YXIgTkFNRVNQQUNFID0gJ0BuYW1lc3BhY2UnXG5leHBvcnQgdmFyIEtFWUZSQU1FUyA9ICdAa2V5ZnJhbWVzJ1xuZXhwb3J0IHZhciBGT05UX0ZBQ0UgPSAnQGZvbnQtZmFjZSdcbmV4cG9ydCB2YXIgQ09VTlRFUl9TVFlMRSA9ICdAY291bnRlci1zdHlsZSdcbmV4cG9ydCB2YXIgRk9OVF9GRUFUVVJFX1ZBTFVFUyA9ICdAZm9udC1mZWF0dXJlLXZhbHVlcydcbmV4cG9ydCB2YXIgTEFZRVIgPSAnQGxheWVyJ1xuIiwiaW1wb3J0IHtJTVBPUlQsIExBWUVSLCBDT01NRU5ULCBSVUxFU0VULCBERUNMQVJBVElPTiwgS0VZRlJBTUVTfSBmcm9tICcuL0VudW0uanMnXG5pbXBvcnQge3N0cmxlbiwgc2l6ZW9mfSBmcm9tICcuL1V0aWxpdHkuanMnXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3RbXX0gY2hpbGRyZW5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUgKGNoaWxkcmVuLCBjYWxsYmFjaykge1xuXHR2YXIgb3V0cHV0ID0gJydcblx0dmFyIGxlbmd0aCA9IHNpemVvZihjaGlsZHJlbilcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKVxuXHRcdG91dHB1dCArPSBjYWxsYmFjayhjaGlsZHJlbltpXSwgaSwgY2hpbGRyZW4sIGNhbGxiYWNrKSB8fCAnJ1xuXG5cdHJldHVybiBvdXRwdXRcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge29iamVjdFtdfSBjaGlsZHJlblxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeSAoZWxlbWVudCwgaW5kZXgsIGNoaWxkcmVuLCBjYWxsYmFjaykge1xuXHRzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuXHRcdGNhc2UgTEFZRVI6IGlmIChlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCkgYnJlYWtcblx0XHRjYXNlIElNUE9SVDogY2FzZSBERUNMQVJBVElPTjogcmV0dXJuIGVsZW1lbnQucmV0dXJuID0gZWxlbWVudC5yZXR1cm4gfHwgZWxlbWVudC52YWx1ZVxuXHRcdGNhc2UgQ09NTUVOVDogcmV0dXJuICcnXG5cdFx0Y2FzZSBLRVlGUkFNRVM6IHJldHVybiBlbGVtZW50LnJldHVybiA9IGVsZW1lbnQudmFsdWUgKyAneycgKyBzZXJpYWxpemUoZWxlbWVudC5jaGlsZHJlbiwgY2FsbGJhY2spICsgJ30nXG5cdFx0Y2FzZSBSVUxFU0VUOiBlbGVtZW50LnZhbHVlID0gZWxlbWVudC5wcm9wcy5qb2luKCcsJylcblx0fVxuXG5cdHJldHVybiBzdHJsZW4oY2hpbGRyZW4gPSBzZXJpYWxpemUoZWxlbWVudC5jaGlsZHJlbiwgY2FsbGJhY2spKSA/IGVsZW1lbnQucmV0dXJuID0gZWxlbWVudC52YWx1ZSArICd7JyArIGNoaWxkcmVuICsgJ30nIDogJydcbn1cbiIsImltcG9ydCB7TVMsIE1PWiwgV0VCS0lULCBSVUxFU0VULCBLRVlGUkFNRVMsIERFQ0xBUkFUSU9OfSBmcm9tICcuL0VudW0uanMnXG5pbXBvcnQge21hdGNoLCBjaGFyYXQsIHN1YnN0ciwgc3RybGVuLCBzaXplb2YsIHJlcGxhY2UsIGNvbWJpbmV9IGZyb20gJy4vVXRpbGl0eS5qcydcbmltcG9ydCB7Y29weSwgdG9rZW5pemV9IGZyb20gJy4vVG9rZW5pemVyLmpzJ1xuaW1wb3J0IHtzZXJpYWxpemV9IGZyb20gJy4vU2VyaWFsaXplci5qcydcbmltcG9ydCB7cHJlZml4fSBmcm9tICcuL1ByZWZpeGVyLmpzJ1xuXG4vKipcbiAqIEBwYXJhbSB7ZnVuY3Rpb25bXX0gY29sbGVjdGlvblxuICogQHJldHVybi
1B7ZnVuY3Rpb259XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaWRkbGV3YXJlIChjb2xsZWN0aW9uKSB7XG5cdHZhciBsZW5ndGggPSBzaXplb2YoY29sbGVjdGlvbilcblxuXHRyZXR1cm4gZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4LCBjaGlsZHJlbiwgY2FsbGJhY2spIHtcblx0XHR2YXIgb3V0cHV0ID0gJydcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspXG5cdFx0XHRvdXRwdXQgKz0gY29sbGVjdGlvbltpXShlbGVtZW50LCBpbmRleCwgY2hpbGRyZW4sIGNhbGxiYWNrKSB8fCAnJ1xuXG5cdFx0cmV0dXJuIG91dHB1dFxuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVsZXNoZWV0IChjYWxsYmFjaykge1xuXHRyZXR1cm4gZnVuY3Rpb24gKGVsZW1lbnQpIHtcblx0XHRpZiAoIWVsZW1lbnQucm9vdClcblx0XHRcdGlmIChlbGVtZW50ID0gZWxlbWVudC5yZXR1cm4pXG5cdFx0XHRcdGNhbGxiYWNrKGVsZW1lbnQpXG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge29iamVjdFtdfSBjaGlsZHJlblxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWZpeGVyIChlbGVtZW50LCBpbmRleCwgY2hpbGRyZW4sIGNhbGxiYWNrKSB7XG5cdGlmIChlbGVtZW50Lmxlbmd0aCA+IC0xKVxuXHRcdGlmICghZWxlbWVudC5yZXR1cm4pXG5cdFx0XHRzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuXHRcdFx0XHRjYXNlIERFQ0xBUkFUSU9OOiBlbGVtZW50LnJldHVybiA9IHByZWZpeChlbGVtZW50LnZhbHVlLCBlbGVtZW50Lmxlbmd0aCwgY2hpbGRyZW4pXG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdGNhc2UgS0VZRlJBTUVTOlxuXHRcdFx0XHRcdHJldHVybiBzZXJpYWxpemUoW2NvcHkoZWxlbWVudCwge3ZhbHVlOiByZXBsYWNlKGVsZW1lbnQudmFsdWUsICdAJywgJ0AnICsgV0VCS0lUKX0pXSwgY2FsbGJhY2spXG5cdFx0XHRcdGNhc2UgUlVMRVNFVDpcblx0XHRcdFx0XHRpZiAoZWxlbWVudC5sZW5ndGgpXG5cdFx0XHRcdFx0XHRyZXR1cm4gY29tYmluZShlbGVtZW50LnByb3BzLCBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0c3dpdGNoIChtYXRjaCh2YWx1ZSwgLyg6OnBsYWNcXHcrfDpyZWFkLVxcdyspLykpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyA6cmVhZC0ob25seXx3cml0ZSlcblx0XHRcdFx0XHRcdFx0XHRjYXNlICc6cmVhZC1vbmx5JzogY2FzZSAnOnJlYWQtd3JpdGUnOlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHNlcmlhbGl6ZShbY29weShlbGVtZW50LCB7cHJvcHM6IFtyZXBsYWNlKHZhbHVlLCAvOihyZWFkLVxcdyspLywgJzonICsgTU9aICsgJyQxJyldfSldLCBjYWxsYmFjaylcblx0XHRcdFx0XHRcdFx0XHQvLyA6cGxhY2Vob2xkZXJcblx0XHRcdFx0XHRcdFx0XHRjYXNlICc6OnBsYWNlaG9sZGVyJzpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBzZXJpYWxpemUoW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb3B5KGVsZW1lbnQsIHtwcm9wczogW3JlcGxhY2UodmFsdWUsIC86KHBsYWNcXHcrKS8sICc6JyArIFdFQktJVCArICdpbnB1dC0kMScpXX0pLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb3B5KGVsZW1lbnQsIHtwcm9wczogW3JlcGxhY2UodmFsdWUsIC86KHBsYWNcXHcrKS8sICc6JyArIE1PWiArICckMScpXX0pLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb3B5KGVsZW1lbnQsIHtwcm9wczogW3JlcGxhY2UodmFsdWUsIC86KHBsYWNcXHcrKS8sIE1TICsgJ2lucHV0LSQxJyldfSlcblx0XHRcdFx0XHRcdFx0XHRcdF0sIGNhbGxiYWNrKVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuICcnXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50XG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7b2JqZWN0W119IGNoaWxkcmVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYW1lc3BhY2UgKGVsZW1lbnQpIHtcblx0c3dpdGNoIChlbGVtZW50LnR5cGUpIHtcblx0XHRjYXNlIFJVTEVTRVQ6XG5cdFx0XHRlbGVtZW50LnByb3BzID0gZWxlbWVudC5wcm9wcy5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiBjb21iaW5lKHRva2VuaXplKHZhbHVlKSwgZnVuY3Rpb24gKHZhbHVlLCBpbmRleCwgY2hpbGRyZW4pIHtcblx0XHRcdFx0XHRzd2l0Y2ggKGNoYXJhdCh2YWx1ZSwgMCkpIHtcblx0XHRcdFx0XHRcdC8vIFxcZlxuXHRcdFx0XHRcdFx0Y2FzZSAxMjpcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHN1YnN0cih2YWx1ZSwgMSwgc3RybGVuKHZhbHVlKSlcblx0XHRcdFx0XHRcdC8vIFxcMCAoICsgPiB+XG5cdFx0XHRcdFx0XHRjYXNlIDA6IGNhc2UgNDA6IGNhc2UgNDM6IGNhc2UgNjI6IGNhc2UgMTI2OlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWVcblx0XHRcdFx0XHRcdC8vIDpcblx0XHRcdFx0XHRcdGNhc2UgNTg6XG5cdFx0XHRcdFx0XHRcdGlmIChjaGlsZHJlblsrK2luZGV4XSA9PT0gJ2dsb2JhbCcpXG5cdFx0XHRcdFx0XHRcdFx0Y2hpbGRyZW5baW5kZXhdID0gJycsIGNoaWxkcmVuWysraW5kZXhdID0gJ1xcZicgKyBzdWJzdHIoY2hpbGRyZW5baW5kZXhdLCBpbmRleCA9IDEsIC0xKVxuXHRcdFx0XHRcdFx0Ly8gXFxzXG5cdFx0XHRcdFx0XHRjYXNlIDMyOlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gaW5kZXggPT09IDEgPyAnJyA6IHZhbHVlXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKGluZGV4KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSAwOiBlbGVtZW50ID0gdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBzaXplb2YoY2hpbGRyZW4pID4gMSA/ICcnIDogdmFsdWVcblx0XHRcdFx0XHRcdFx0XHRjYXNlIGluZGV4ID0gc2l6ZW9mKGNoaWxkcmVuKSAtIDE6IGNhc2UgMjpcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybi
1BpbmRleCA9PT0gMiA/IHZhbHVlICsgZWxlbWVudCArIGVsZW1lbnQgOiB2YWx1ZSArIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHR9KVxuXHR9XG59XG4iLCJpbXBvcnQge0NPTU1FTlQsIFJVTEVTRVQsIERFQ0xBUkFUSU9OfSBmcm9tICcuL0VudW0uanMnXG5pbXBvcnQge2FicywgY2hhcmF0LCB0cmltLCBmcm9tLCBzaXplb2YsIHN0cmxlbiwgc3Vic3RyLCBhcHBlbmQsIHJlcGxhY2UsIGluZGV4b2Z9IGZyb20gJy4vVXRpbGl0eS5qcydcbmltcG9ydCB7bm9kZSwgY2hhciwgcHJldiwgbmV4dCwgcGVlaywgY2FyZXQsIGFsbG9jLCBkZWFsbG9jLCBkZWxpbWl0LCB3aGl0ZXNwYWNlLCBlc2NhcGluZywgaWRlbnRpZmllciwgY29tbWVudGVyfSBmcm9tICcuL1Rva2VuaXplci5qcydcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge29iamVjdFtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZSAodmFsdWUpIHtcblx0cmV0dXJuIGRlYWxsb2MocGFyc2UoJycsIG51bGwsIG51bGwsIG51bGwsIFsnJ10sIHZhbHVlID0gYWxsb2ModmFsdWUpLCAwLCBbMF0sIHZhbHVlKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7b2JqZWN0fSByb290XG4gKiBAcGFyYW0ge29iamVjdD99IHBhcmVudFxuICogQHBhcmFtIHtzdHJpbmdbXX0gcnVsZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gcnVsZXNcbiAqIEBwYXJhbSB7c3RyaW5nW119IHJ1bGVzZXRzXG4gKiBAcGFyYW0ge251bWJlcltdfSBwc2V1ZG9cbiAqIEBwYXJhbSB7bnVtYmVyW119IHBvaW50c1xuICogQHBhcmFtIHtzdHJpbmdbXX0gZGVjbGFyYXRpb25zXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZSAodmFsdWUsIHJvb3QsIHBhcmVudCwgcnVsZSwgcnVsZXMsIHJ1bGVzZXRzLCBwc2V1ZG8sIHBvaW50cywgZGVjbGFyYXRpb25zKSB7XG5cdHZhciBpbmRleCA9IDBcblx0dmFyIG9mZnNldCA9IDBcblx0dmFyIGxlbmd0aCA9IHBzZXVkb1xuXHR2YXIgYXRydWxlID0gMFxuXHR2YXIgcHJvcGVydHkgPSAwXG5cdHZhciBwcmV2aW91cyA9IDBcblx0dmFyIHZhcmlhYmxlID0gMVxuXHR2YXIgc2Nhbm5pbmcgPSAxXG5cdHZhciBhbXBlcnNhbmQgPSAxXG5cdHZhciBjaGFyYWN0ZXIgPSAwXG5cdHZhciB0eXBlID0gJydcblx0dmFyIHByb3BzID0gcnVsZXNcblx0dmFyIGNoaWxkcmVuID0gcnVsZXNldHNcblx0dmFyIHJlZmVyZW5jZSA9IHJ1bGVcblx0dmFyIGNoYXJhY3RlcnMgPSB0eXBlXG5cblx0d2hpbGUgKHNjYW5uaW5nKVxuXHRcdHN3aXRjaCAocHJldmlvdXMgPSBjaGFyYWN0ZXIsIGNoYXJhY3RlciA9IG5leHQoKSkge1xuXHRcdFx0Ly8gKFxuXHRcdFx0Y2FzZSA0MDpcblx0XHRcdFx0aWYgKHByZXZpb3VzICE9IDEwOCAmJiBjaGFyYXQoY2hhcmFjdGVycywgbGVuZ3RoIC0gMSkgPT0gNTgpIHtcblx0XHRcdFx0XHRpZiAoaW5kZXhvZihjaGFyYWN0ZXJzICs9IHJlcGxhY2UoZGVsaW1pdChjaGFyYWN0ZXIpLCAnJicsICcmXFxmJyksICcmXFxmJykgIT0gLTEpXG5cdFx0XHRcdFx0XHRhbXBlcnNhbmQgPSAtMVxuXHRcdFx0XHRcdGJyZWFrXG5cdFx0XHRcdH1cblx0XHRcdC8vIFwiICcgW1xuXHRcdFx0Y2FzZSAzNDogY2FzZSAzOTogY2FzZSA5MTpcblx0XHRcdFx0Y2hhcmFjdGVycyArPSBkZWxpbWl0KGNoYXJhY3Rlcilcblx0XHRcdFx0YnJlYWtcblx0XHRcdC8vIFxcdCBcXG4gXFxyIFxcc1xuXHRcdFx0Y2FzZSA5OiBjYXNlIDEwOiBjYXNlIDEzOiBjYXNlIDMyOlxuXHRcdFx0XHRjaGFyYWN0ZXJzICs9IHdoaXRlc3BhY2UocHJldmlvdXMpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHQvLyBcXFxuXHRcdFx0Y2FzZSA5Mjpcblx0XHRcdFx0Y2hhcmFjdGVycyArPSBlc2NhcGluZyhjYXJldCgpIC0gMSwgNylcblx0XHRcdFx0Y29udGludWVcblx0XHRcdC8vIC9cblx0XHRcdGNhc2UgNDc6XG5cdFx0XHRcdHN3aXRjaCAocGVlaygpKSB7XG5cdFx0XHRcdFx0Y2FzZSA0MjogY2FzZSA0Nzpcblx0XHRcdFx0XHRcdGFwcGVuZChjb21tZW50KGNvbW1lbnRlcihuZXh0KCksIGNhcmV0KCkpLCByb290LCBwYXJlbnQpLCBkZWNsYXJhdGlvbnMpXG5cdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRjaGFyYWN0ZXJzICs9ICcvJ1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrXG5cdFx0XHQvLyB7XG5cdFx0XHRjYXNlIDEyMyAqIHZhcmlhYmxlOlxuXHRcdFx0XHRwb2ludHNbaW5kZXgrK10gPSBzdHJsZW4oY2hhcmFjdGVycykgKiBhbXBlcnNhbmRcblx0XHRcdC8vIH0gOyBcXDBcblx0XHRcdGNhc2UgMTI1ICogdmFyaWFibGU6IGNhc2UgNTk6IGNhc2UgMDpcblx0XHRcdFx0c3dpdGNoIChjaGFyYWN0ZXIpIHtcblx0XHRcdFx0XHQvLyBcXDAgfVxuXHRcdFx0XHRcdGNhc2UgMDogY2FzZSAxMjU6IHNjYW5uaW5nID0gMFxuXHRcdFx0XHRcdC8vIDtcblx0XHRcdFx0XHRjYXNlIDU5ICsgb2Zmc2V0OiBpZiAoYW1wZXJzYW5kID09IC0xKSBjaGFyYWN0ZXJzID0gcmVwbGFjZShjaGFyYWN0ZXJzLCAvXFxmL2csICcnKVxuXHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5ID4gMCAmJiAoc3RybGVuKGNoYXJhY3RlcnMpIC0gbGVuZ3RoKSlcblx0XHRcdFx0XHRcdFx0YXBwZW5kKHByb3BlcnR5ID4gMzIgPyBkZWNsYXJhdGlvbihjaGFyYWN0ZXJzICsgJzsnLCBydWxlLCBwYXJlbnQsIGxlbmd0aCAtIDEpIDogZGVjbGFyYXRpb24ocmVwbGFjZShjaGFyYWN0ZXJzLCAnICcsICcnKSArICc7JywgcnVsZSwgcGFyZW50LCBsZW5ndGggLSAyKSwgZGVjbGFyYXRpb25zKVxuXHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHQvLyBAIDtcblx0XHRcdFx0XHRjYXNlIDU5OiBjaGFyYWN0ZXJzICs9ICc7J1xuXHRcdFx0XHRcdC8vIHsgcnVsZS9hdC1ydWxlXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGFwcGVuZChyZWZlcmVuY2UgPSBydWxlc2V0KGNoYXJhY3RlcnMsIHJvb3QsIHBhcmVudCwgaW5kZXgsIG9mZnNldCwgcnVsZXMsIHBvaW50cywgdHlwZSwgcHJvcHMgP
1SBbXSwgY2hpbGRyZW4gPSBbXSwgbGVuZ3RoKSwgcnVsZXNldHMpXG5cblx0XHRcdFx0XHRcdGlmIChjaGFyYWN0ZXIgPT09IDEyMylcblx0XHRcdFx0XHRcdFx0aWYgKG9mZnNldCA9PT0gMClcblx0XHRcdFx0XHRcdFx0XHRwYXJzZShjaGFyYWN0ZXJzLCByb290LCByZWZlcmVuY2UsIHJlZmVyZW5jZSwgcHJvcHMsIHJ1bGVzZXRzLCBsZW5ndGgsIHBvaW50cywgY2hpbGRyZW4pXG5cdFx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0XHRzd2l0Y2ggKGF0cnVsZSA9PT0gOTkgJiYgY2hhcmF0KGNoYXJhY3RlcnMsIDMpID09PSAxMTAgPyAxMDAgOiBhdHJ1bGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGQgbCBtIHNcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgMTAwOiBjYXNlIDEwODogY2FzZSAxMDk6IGNhc2UgMTE1OlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwYXJzZSh2YWx1ZSwgcmVmZXJlbmNlLCByZWZlcmVuY2UsIHJ1bGUgJiYgYXBwZW5kKHJ1bGVzZXQodmFsdWUsIHJlZmVyZW5jZSwgcmVmZXJlbmNlLCAwLCAwLCBydWxlcywgcG9pbnRzLCB0eXBlLCBydWxlcywgcHJvcHMgPSBbXSwgbGVuZ3RoKSwgY2hpbGRyZW4pLCBydWxlcywgY2hpbGRyZW4sIGxlbmd0aCwgcG9pbnRzLCBydWxlID8gcHJvcHMgOiBjaGlsZHJlbilcblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBhcnNlKGNoYXJhY3RlcnMsIHJlZmVyZW5jZSwgcmVmZXJlbmNlLCByZWZlcmVuY2UsIFsnJ10sIGNoaWxkcmVuLCAwLCBwb2ludHMsIGNoaWxkcmVuKVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGluZGV4ID0gb2Zmc2V0ID0gcHJvcGVydHkgPSAwLCB2YXJpYWJsZSA9IGFtcGVyc2FuZCA9IDEsIHR5cGUgPSBjaGFyYWN0ZXJzID0gJycsIGxlbmd0aCA9IHBzZXVkb1xuXHRcdFx0XHRicmVha1xuXHRcdFx0Ly8gOlxuXHRcdFx0Y2FzZSA1ODpcblx0XHRcdFx0bGVuZ3RoID0gMSArIHN0cmxlbihjaGFyYWN0ZXJzKSwgcHJvcGVydHkgPSBwcmV2aW91c1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0aWYgKHZhcmlhYmxlIDwgMSlcblx0XHRcdFx0XHRpZiAoY2hhcmFjdGVyID09IDEyMylcblx0XHRcdFx0XHRcdC0tdmFyaWFibGVcblx0XHRcdFx0XHRlbHNlIGlmIChjaGFyYWN0ZXIgPT0gMTI1ICYmIHZhcmlhYmxlKysgPT0gMCAmJiBwcmV2KCkgPT0gMTI1KVxuXHRcdFx0XHRcdFx0Y29udGludWVcblxuXHRcdFx0XHRzd2l0Y2ggKGNoYXJhY3RlcnMgKz0gZnJvbShjaGFyYWN0ZXIpLCBjaGFyYWN0ZXIgKiB2YXJpYWJsZSkge1xuXHRcdFx0XHRcdC8vICZcblx0XHRcdFx0XHRjYXNlIDM4OlxuXHRcdFx0XHRcdFx0YW1wZXJzYW5kID0gb2Zmc2V0ID4gMCA/IDEgOiAoY2hhcmFjdGVycyArPSAnXFxmJywgLTEpXG5cdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHRcdC8vICxcblx0XHRcdFx0XHRjYXNlIDQ0OlxuXHRcdFx0XHRcdFx0cG9pbnRzW2luZGV4KytdID0gKHN0cmxlbihjaGFyYWN0ZXJzKSAtIDEpICogYW1wZXJzYW5kLCBhbXBlcnNhbmQgPSAxXG5cdFx0XHRcdFx0XHRicmVha1xuXHRcdFx0XHRcdC8vIEBcblx0XHRcdFx0XHRjYXNlIDY0OlxuXHRcdFx0XHRcdFx0Ly8gLVxuXHRcdFx0XHRcdFx0aWYgKHBlZWsoKSA9PT0gNDUpXG5cdFx0XHRcdFx0XHRcdGNoYXJhY3RlcnMgKz0gZGVsaW1pdChuZXh0KCkpXG5cblx0XHRcdFx0XHRcdGF0cnVsZSA9IHBlZWsoKSwgb2Zmc2V0ID0gbGVuZ3RoID0gc3RybGVuKHR5cGUgPSBjaGFyYWN0ZXJzICs9IGlkZW50aWZpZXIoY2FyZXQoKSkpLCBjaGFyYWN0ZXIrK1xuXHRcdFx0XHRcdFx0YnJlYWtcblx0XHRcdFx0XHQvLyAtXG5cdFx0XHRcdFx0Y2FzZSA0NTpcblx0XHRcdFx0XHRcdGlmIChwcmV2aW91cyA9PT0gNDUgJiYgc3RybGVuKGNoYXJhY3RlcnMpID09IDIpXG5cdFx0XHRcdFx0XHRcdHZhcmlhYmxlID0gMFxuXHRcdFx0XHR9XG5cdFx0fVxuXG5cdHJldHVybiBydWxlc2V0c1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtvYmplY3R9IHJvb3RcbiAqIEBwYXJhbSB7b2JqZWN0P30gcGFyZW50XG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqIEBwYXJhbSB7c3RyaW5nW119IHJ1bGVzXG4gKiBAcGFyYW0ge251bWJlcltdfSBwb2ludHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gY2hpbGRyZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bGVzZXQgKHZhbHVlLCByb290LCBwYXJlbnQsIGluZGV4LCBvZmZzZXQsIHJ1bGVzLCBwb2ludHMsIHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgbGVuZ3RoKSB7XG5cdHZhciBwb3N0ID0gb2Zmc2V0IC0gMVxuXHR2YXIgcnVsZSA9IG9mZnNldCA9PT0gMCA/IHJ1bGVzIDogWycnXVxuXHR2YXIgc2l6ZSA9IHNpemVvZihydWxlKVxuXG5cdGZvciAodmFyIGkgPSAwLCBqID0gMCwgayA9IDA7IGkgPCBpbmRleDsgKytpKVxuXHRcdGZvciAodmFyIHggPSAwLCB5ID0gc3Vic3RyKHZhbHVlLCBwb3N0ICsgMSwgcG9zdCA9IGFicyhqID0gcG9pbnRzW2ldKSksIHogPSB2YWx1ZTsgeCA8IHNpemU7ICsreClcblx0XHRcdGlmICh6ID0gdHJpbShqID4gMCA/IHJ1bGVbeF0gKyAnICcgKyB5IDogcmVwbGFjZSh5LCAvJlxcZi9nLCBydWxlW3hdKSkpXG5cdFx0XHRcdHByb3BzW2srK10gPSB6XG5cblx0cmV0dXJuIG5vZGUodmFsdWUsIHJvb3QsIHBhcmVudCwgb2Zmc2V0ID09PSAwID8gUlVMRVNFVCA6IHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgbGVuZ3RoKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtvYmplY3R9IHJvb3RcbiAqIEBwYXJhbSB7b2JqZWN0P30gcGFyZW50XG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21tZW50ICh2YWx1ZSwgcm9vdCwgcGFyZW50KSB7XG5cdHJldHVybi
1Bub2RlKHZhbHVlLCByb290LCBwYXJlbnQsIENPTU1FTlQsIGZyb20oY2hhcigpKSwgc3Vic3RyKHZhbHVlLCAyLCAtMiksIDApXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge29iamVjdH0gcm9vdFxuICogQHBhcmFtIHtvYmplY3Q/fSBwYXJlbnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY2xhcmF0aW9uICh2YWx1ZSwgcm9vdCwgcGFyZW50LCBsZW5ndGgpIHtcblx0cmV0dXJuIG5vZGUodmFsdWUsIHJvb3QsIHBhcmVudCwgREVDTEFSQVRJT04sIHN1YnN0cih2YWx1ZSwgMCwgbGVuZ3RoKSwgc3Vic3RyKHZhbHVlLCBsZW5ndGggKyAxLCAtMSksIGxlbmd0aClcbn1cbiIsImltcG9ydCB7IFN0eWxlU2hlZXQgfSBmcm9tICdAZW1vdGlvbi9zaGVldCc7XG5pbXBvcnQgeyBkZWFsbG9jLCBhbGxvYywgbmV4dCwgdG9rZW4sIGZyb20sIHBlZWssIGRlbGltaXQsIHNsaWNlLCBwb3NpdGlvbiwgUlVMRVNFVCwgY29tYmluZSwgbWF0Y2gsIHNlcmlhbGl6ZSwgY29weSwgcmVwbGFjZSwgV0VCS0lULCBNT1osIE1TLCBLRVlGUkFNRVMsIERFQ0xBUkFUSU9OLCBoYXNoLCBjaGFyYXQsIHN0cmxlbiwgaW5kZXhvZiwgc3RyaW5naWZ5LCBydWxlc2hlZXQsIG1pZGRsZXdhcmUsIGNvbXBpbGUgfSBmcm9tICdzdHlsaXMnO1xuaW1wb3J0ICdAZW1vdGlvbi93ZWFrLW1lbW9pemUnO1xuaW1wb3J0ICdAZW1vdGlvbi9tZW1vaXplJztcblxudmFyIGlkZW50aWZpZXJXaXRoUG9pbnRUcmFja2luZyA9IGZ1bmN0aW9uIGlkZW50aWZpZXJXaXRoUG9pbnRUcmFja2luZyhiZWdpbiwgcG9pbnRzLCBpbmRleCkge1xuICB2YXIgcHJldmlvdXMgPSAwO1xuICB2YXIgY2hhcmFjdGVyID0gMDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHByZXZpb3VzID0gY2hhcmFjdGVyO1xuICAgIGNoYXJhY3RlciA9IHBlZWsoKTsgLy8gJlxcZlxuXG4gICAgaWYgKHByZXZpb3VzID09PSAzOCAmJiBjaGFyYWN0ZXIgPT09IDEyKSB7XG4gICAgICBwb2ludHNbaW5kZXhdID0gMTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4oY2hhcmFjdGVyKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9XG5cbiAgcmV0dXJuIHNsaWNlKGJlZ2luLCBwb3NpdGlvbik7XG59O1xuXG52YXIgdG9SdWxlcyA9IGZ1bmN0aW9uIHRvUnVsZXMocGFyc2VkLCBwb2ludHMpIHtcbiAgLy8gcHJldGVuZCB3ZSd2ZSBzdGFydGVkIHdpdGggYSBjb21tYVxuICB2YXIgaW5kZXggPSAtMTtcbiAgdmFyIGNoYXJhY3RlciA9IDQ0O1xuXG4gIGRvIHtcbiAgICBzd2l0Y2ggKHRva2VuKGNoYXJhY3RlcikpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgLy8gJlxcZlxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSAzOCAmJiBwZWVrKCkgPT09IDEyKSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyBub3QgMTAwJSBjb3JyZWN0LCB3ZSBkb24ndCBhY2NvdW50IGZvciBsaXRlcmFsIHNlcXVlbmNlcyBoZXJlIC0gbGlrZSBmb3IgZXhhbXBsZSBxdW90ZWQgc3RyaW5nc1xuICAgICAgICAgIC8vIHN0eWxpcyBpbnNlcnRzIFxcZiBhZnRlciAmIHRvIGtub3cgd2hlbiAmIHdoZXJlIGl0IHNob3VsZCByZXBsYWNlIHRoaXMgc2VxdWVuY2Ugd2l0aCB0aGUgY29udGV4dCBzZWxlY3RvclxuICAgICAgICAgIC8vIGFuZCB3aGVuIGl0IHNob3VsZCBqdXN0IGNvbmNhdGVuYXRlIHRoZSBvdXRlciBhbmQgaW5uZXIgc2VsZWN0b3JzXG4gICAgICAgICAgLy8gaXQncyB2ZXJ5IHVubGlrZWx5IGZvciB0aGlzIHNlcXVlbmNlIHRvIGFjdHVhbGx5IGFwcGVhciBpbiBhIGRpZmZlcmVudCBjb250ZXh0LCBzbyB3ZSBqdXN0IGxldmVyYWdlIHRoaXMgZmFjdCBoZXJlXG4gICAgICAgICAgcG9pbnRzW2luZGV4XSA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJzZWRbaW5kZXhdICs9IGlkZW50aWZpZXJXaXRoUG9pbnRUcmFja2luZyhwb3NpdGlvbiAtIDEsIHBvaW50cywgaW5kZXgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAyOlxuICAgICAgICBwYXJzZWRbaW5kZXhdICs9IGRlbGltaXQoY2hhcmFjdGVyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgNDpcbiAgICAgICAgLy8gY29tbWFcbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gNDQpIHtcbiAgICAgICAgICAvLyBjb2xvblxuICAgICAgICAgIHBhcnNlZFsrK2luZGV4XSA9IHBlZWsoKSA9PT0gNTggPyAnJlxcZicgOiAnJztcbiAgICAgICAgICBwb2ludHNbaW5kZXhdID0gcGFyc2VkW2luZGV4XS5sZW5ndGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgLy8gZmFsbHRocm91Z2hcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcGFyc2VkW2luZGV4XSArPSBmcm9tKGNoYXJhY3Rlcik7XG4gICAgfVxuICB9IHdoaWxlIChjaGFyYWN0ZXIgPSBuZXh0KCkpO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuXG52YXIgZ2V0UnVsZXMgPSBmdW5jdGlvbiBnZXRSdWxlcyh2YWx1ZSwgcG9pbnRzKSB7XG4gIHJldHVybiBkZWFsbG9jKHRvUnVsZXMoYWxsb2ModmFsdWUpLCBwb2ludHMpKTtcbn07IC8vIFdlYWtTZXQgd291bGQgYmUgbW9yZSBhcHByb3ByaWF0ZSwgYnV0IG9ubHkgV2Vha01hcCBpcyBzdXBwb3J0ZWQgaW4gSUUxMVxuXG5cbnZhciBmaXhlZEVsZW1lbnRzID0gLyogI19fUFVSRV9fICovbmV3IFdlYWtNYXAoKTtcbnZhciBjb21wYXQgPSBmdW5jdGlvbiBjb21wYXQoZWxlbWVudCkge1xuICBpZiAoZWxlbWVudC50eXBlICE9PSAncnVsZScgfHwgIWVsZW1lbnQucGFyZW50IHx8IC8vIHBvc2l0aXZlIC5sZW5ndGggaW5kaWNhdGVzIHRoYXQgdGhpcyBydWxlIGNvbnRhaW5zIHBzZXVkb1xuICAvLyBuZWdhdGl2ZSAubGVuZ3RoIGluZGljYXRlcyB0aGF0IHRoaXMgcnVsZSBoYXMgYmVlbiBhbHJlYWR5IHByZWZpeGVkXG4gIGVsZW1lbnQubGVuZ3RoIDwgMSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB2YWx1ZSA9IGVsZW1lbnQudmFsdWU7XG4gIHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudDtcbiAgdmFyIGlzSW1wbGljaXRSdWxlID0gZWxlbWVudC5jb2x1bW4gPT09IHBhcmVudC5jb2x1bW4gJiYgZWxlbWVudC5saW5lID09PSBwYXJlbnQubGluZTtcblxuICB3aGlsZSAocGFyZW50LnR5cGUgIT09ICdydWxlJykge1xuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgaWYgKCFwYXJlbnQpIHJldHVybjtcbiAgfSAvLyBzaG9ydC1jaXJjdWl0IGZvciB0aGUgc2ltcGxlc3QgY2FzZVxuXG5cbiAgaWYgKGVsZW1lbnQucHJvcHMubGVuZ3RoID09PSAxICYmIHZhbHVlLmNoYXJDb2RlQXQoMCkgIT09IDU4XG4gIC8qIGNvbG9uICovXG4gICYmICFmaXhlZEVsZW1lbnRzLmdldChwYXJlbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIGlmIHRoaXMgaXMgYW4gaW1wbGljaXRseSBpbnNlcnRlZCBydWxlICh0aGUgb25lIGVhZ2VybHkgaW5zZXJ0ZWQgYXQgdGhlIGVhY2ggbmV3IG5lc3RlZCBsZXZlbClcbiAgLy8gdGhlbiB0aGUgcHJv
1cHMgaGFzIGFscmVhZHkgYmVlbiBtYW5pcHVsYXRlZCBiZWZvcmVoYW5kIGFzIHRoZXkgdGhhdCBhcnJheSBpcyBzaGFyZWQgYmV0d2VlbiBpdCBhbmQgaXRzIFwicnVsZSBwYXJlbnRcIlxuXG5cbiAgaWYgKGlzSW1wbGljaXRSdWxlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZml4ZWRFbGVtZW50cy5zZXQoZWxlbWVudCwgdHJ1ZSk7XG4gIHZhciBwb2ludHMgPSBbXTtcbiAgdmFyIHJ1bGVzID0gZ2V0UnVsZXModmFsdWUsIHBvaW50cyk7XG4gIHZhciBwYXJlbnRSdWxlcyA9IHBhcmVudC5wcm9wcztcblxuICBmb3IgKHZhciBpID0gMCwgayA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFyZW50UnVsZXMubGVuZ3RoOyBqKyssIGsrKykge1xuICAgICAgZWxlbWVudC5wcm9wc1trXSA9IHBvaW50c1tpXSA/IHJ1bGVzW2ldLnJlcGxhY2UoLyZcXGYvZywgcGFyZW50UnVsZXNbal0pIDogcGFyZW50UnVsZXNbal0gKyBcIiBcIiArIHJ1bGVzW2ldO1xuICAgIH1cbiAgfVxufTtcbnZhciByZW1vdmVMYWJlbCA9IGZ1bmN0aW9uIHJlbW92ZUxhYmVsKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2RlY2wnKSB7XG4gICAgdmFyIHZhbHVlID0gZWxlbWVudC52YWx1ZTtcblxuICAgIGlmICggLy8gY2hhcmNvZGUgZm9yIGxcbiAgICB2YWx1ZS5jaGFyQ29kZUF0KDApID09PSAxMDggJiYgLy8gY2hhcmNvZGUgZm9yIGJcbiAgICB2YWx1ZS5jaGFyQ29kZUF0KDIpID09PSA5OCkge1xuICAgICAgLy8gdGhpcyBpZ25vcmVzIGxhYmVsXG4gICAgICBlbGVtZW50W1wicmV0dXJuXCJdID0gJyc7XG4gICAgICBlbGVtZW50LnZhbHVlID0gJyc7XG4gICAgfVxuICB9XG59O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1mYWxsdGhyb3VnaCAqL1xuXG5mdW5jdGlvbiBwcmVmaXgodmFsdWUsIGxlbmd0aCkge1xuICBzd2l0Y2ggKGhhc2godmFsdWUsIGxlbmd0aCkpIHtcbiAgICAvLyBjb2xvci1hZGp1c3RcbiAgICBjYXNlIDUxMDM6XG4gICAgICByZXR1cm4gV0VCS0lUICsgJ3ByaW50LScgKyB2YWx1ZSArIHZhbHVlO1xuICAgIC8vIGFuaW1hdGlvbiwgYW5pbWF0aW9uLShkZWxheXxkaXJlY3Rpb258ZHVyYXRpb258ZmlsbC1tb2RlfGl0ZXJhdGlvbi1jb3VudHxuYW1lfHBsYXktc3RhdGV8dGltaW5nLWZ1bmN0aW9uKVxuXG4gICAgY2FzZSA1NzM3OlxuICAgIGNhc2UgNDIwMTpcbiAgICBjYXNlIDMxNzc6XG4gICAgY2FzZSAzNDMzOlxuICAgIGNhc2UgMTY0MTpcbiAgICBjYXNlIDQ0NTc6XG4gICAgY2FzZSAyOTIxOiAvLyB0ZXh0LWRlY29yYXRpb24sIGZpbHRlciwgY2xpcC1wYXRoLCBiYWNrZmFjZS12aXNpYmlsaXR5LCBjb2x1bW4sIGJveC1kZWNvcmF0aW9uLWJyZWFrXG5cbiAgICBjYXNlIDU1NzI6XG4gICAgY2FzZSA2MzU2OlxuICAgIGNhc2UgNTg0NDpcbiAgICBjYXNlIDMxOTE6XG4gICAgY2FzZSA2NjQ1OlxuICAgIGNhc2UgMzAwNTogLy8gbWFzaywgbWFzay1pbWFnZSwgbWFzay0obW9kZXxjbGlwfHNpemUpLCBtYXNrLShyZXBlYXR8b3JpZ2luKSwgbWFzay1wb3NpdGlvbiwgbWFzay1jb21wb3NpdGUsXG5cbiAgICBjYXNlIDYzOTE6XG4gICAgY2FzZSA1ODc5OlxuICAgIGNhc2UgNTYyMzpcbiAgICBjYXNlIDYxMzU6XG4gICAgY2FzZSA0NTk5OlxuICAgIGNhc2UgNDg1NTogLy8gYmFja2dyb3VuZC1jbGlwLCBjb2x1bW5zLCBjb2x1bW4tKGNvdW50fGZpbGx8Z2FwfHJ1bGV8cnVsZS1jb2xvcnxydWxlLXN0eWxlfHJ1bGUtd2lkdGh8c3Bhbnx3aWR0aClcblxuICAgIGNhc2UgNDIxNTpcbiAgICBjYXNlIDYzODk6XG4gICAgY2FzZSA1MTA5OlxuICAgIGNhc2UgNTM2NTpcbiAgICBjYXNlIDU2MjE6XG4gICAgY2FzZSAzODI5OlxuICAgICAgcmV0dXJuIFdFQktJVCArIHZhbHVlICsgdmFsdWU7XG4gICAgLy8gYXBwZWFyYW5jZSwgdXNlci1zZWxlY3QsIHRyYW5zZm9ybSwgaHlwaGVucywgdGV4dC1zaXplLWFkanVzdFxuXG4gICAgY2FzZSA1MzQ5OlxuICAgIGNhc2UgNDI0NjpcbiAgICBjYXNlIDQ4MTA6XG4gICAgY2FzZSA2OTY4OlxuICAgIGNhc2UgMjc1NjpcbiAgICAgIHJldHVybiBXRUJLSVQgKyB2YWx1ZSArIE1PWiArIHZhbHVlICsgTVMgKyB2YWx1ZSArIHZhbHVlO1xuICAgIC8vIGZsZXgsIGZsZXgtZGlyZWN0aW9uXG5cbiAgICBjYXNlIDY4Mjg6XG4gICAgY2FzZSA0MjY4OlxuICAgICAgcmV0dXJuIFdFQktJVCArIHZhbHVlICsgTVMgKyB2YWx1ZSArIHZhbHVlO1xuICAgIC8vIG9yZGVyXG5cbiAgICBjYXNlIDYxNjU6XG4gICAgICByZXR1cm4gV0VCS0lUICsgdmFsdWUgKyBNUyArICdmbGV4LScgKyB2YWx1ZSArIHZhbHVlO1xuICAgIC8vIGFsaWduLWl0ZW1zXG5cbiAgICBjYXNlIDUxODc6XG4gICAgICByZXR1cm4gV0VCS0lUICsgdmFsdWUgKyByZXBsYWNlKHZhbHVlLCAvKFxcdyspLisoOlteXSspLywgV0VCS0lUICsgJ2JveC0kMSQyJyArIE1TICsgJ2ZsZXgtJDEkMicpICsgdmFsdWU7XG4gICAgLy8gYWxpZ24tc2VsZlxuXG4gICAgY2FzZSA1NDQzOlxuICAgICAgcmV0dXJuIFdFQktJVCArIHZhbHVlICsgTVMgKyAnZmxleC1pdGVtLScgKyByZXBsYWNlKHZhbHVlLCAvZmxleC18LXNlbGYvLCAnJykgKyB2YWx1ZTtcbiAgICAvLyBhbGlnbi1jb250ZW50XG5cbiAgICBjYXNlIDQ2NzU6XG4gICAgICByZXR1cm4gV0VCS0lUICsgdmFsdWUgKyBNUyArICdmbGV4LWxpbmUtcGFjaycgKyByZXBsYWNlKHZhbHVlLCAvYWxpZ24tY29udGVudHxmbGV4LXwtc2VsZi8sICcnKSArIHZhbHVlO1xuICAgIC8vIGZsZXgtc2hyaW5rXG5cbiAgICBjYXNlIDU1NDg6XG4gICAgICByZXR1cm4gV0VCS0lUICsgdmFsdWUgKyBNUyArIHJlcGxhY2UodmFsdWUsICdzaHJpbmsnLCAnbmVnYXRpdmUnKSArIHZhbHVlO1xuICAgIC8vIGZsZXgtYmFzaXNcblxuICAgIGNhc2UgNTI5MjpcbiAgICAgIHJldHVybiBXRUJLSVQgKyB2YWx1ZSArIE1TICsgcmVwbGFjZSh2YWx1ZSwgJ2Jhc2lzJywgJ3ByZWZlcnJlZC1zaXplJykgKyB2YWx1ZTtcbiAgICAvLyBmbGV4LWdyb3dcblxuICAgIGNhc2UgNjA2MDpcbiAgICAgIHJldHVybiBXRUJLSV
1QgKyAnYm94LScgKyByZXBsYWNlKHZhbHVlLCAnLWdyb3cnLCAnJykgKyBXRUJLSVQgKyB2YWx1ZSArIE1TICsgcmVwbGFjZSh2YWx1ZSwgJ2dyb3cnLCAncG9zaXRpdmUnKSArIHZhbHVlO1xuICAgIC8vIHRyYW5zaXRpb25cblxuICAgIGNhc2UgNDU1NDpcbiAgICAgIHJldHVybiBXRUJLSVQgKyByZXBsYWNlKHZhbHVlLCAvKFteLV0pKHRyYW5zZm9ybSkvZywgJyQxJyArIFdFQktJVCArICckMicpICsgdmFsdWU7XG4gICAgLy8gY3Vyc29yXG5cbiAgICBjYXNlIDYxODc6XG4gICAgICByZXR1cm4gcmVwbGFjZShyZXBsYWNlKHJlcGxhY2UodmFsdWUsIC8oem9vbS18Z3JhYikvLCBXRUJLSVQgKyAnJDEnKSwgLyhpbWFnZS1zZXQpLywgV0VCS0lUICsgJyQxJyksIHZhbHVlLCAnJykgKyB2YWx1ZTtcbiAgICAvLyBiYWNrZ3JvdW5kLCBiYWNrZ3JvdW5kLWltYWdlXG5cbiAgICBjYXNlIDU0OTU6XG4gICAgY2FzZSAzOTU5OlxuICAgICAgcmV0dXJuIHJlcGxhY2UodmFsdWUsIC8oaW1hZ2Utc2V0XFwoW15dKikvLCBXRUJLSVQgKyAnJDEnICsgJyRgJDEnKTtcbiAgICAvLyBqdXN0aWZ5LWNvbnRlbnRcblxuICAgIGNhc2UgNDk2ODpcbiAgICAgIHJldHVybiByZXBsYWNlKHJlcGxhY2UodmFsdWUsIC8oLis6KShmbGV4LSk/KC4qKS8sIFdFQktJVCArICdib3gtcGFjazokMycgKyBNUyArICdmbGV4LXBhY2s6JDMnKSwgL3MuKy1iW147XSsvLCAnanVzdGlmeScpICsgV0VCS0lUICsgdmFsdWUgKyB2YWx1ZTtcbiAgICAvLyAobWFyZ2lufHBhZGRpbmcpLWlubGluZS0oc3RhcnR8ZW5kKVxuXG4gICAgY2FzZSA0MDk1OlxuICAgIGNhc2UgMzU4MzpcbiAgICBjYXNlIDQwNjg6XG4gICAgY2FzZSAyNTMyOlxuICAgICAgcmV0dXJuIHJlcGxhY2UodmFsdWUsIC8oLispLWlubGluZSguKykvLCBXRUJLSVQgKyAnJDEkMicpICsgdmFsdWU7XG4gICAgLy8gKG1pbnxtYXgpPyh3aWR0aHxoZWlnaHR8aW5saW5lLXNpemV8YmxvY2stc2l6ZSlcblxuICAgIGNhc2UgODExNjpcbiAgICBjYXNlIDcwNTk6XG4gICAgY2FzZSA1NzUzOlxuICAgIGNhc2UgNTUzNTpcbiAgICBjYXNlIDU0NDU6XG4gICAgY2FzZSA1NzAxOlxuICAgIGNhc2UgNDkzMzpcbiAgICBjYXNlIDQ2Nzc6XG4gICAgY2FzZSA1NTMzOlxuICAgIGNhc2UgNTc4OTpcbiAgICBjYXNlIDUwMjE6XG4gICAgY2FzZSA0NzY1OlxuICAgICAgLy8gc3RyZXRjaCwgbWF4LWNvbnRlbnQsIG1pbi1jb250ZW50LCBmaWxsLWF2YWlsYWJsZVxuICAgICAgaWYgKHN0cmxlbih2YWx1ZSkgLSAxIC0gbGVuZ3RoID4gNikgc3dpdGNoIChjaGFyYXQodmFsdWUsIGxlbmd0aCArIDEpKSB7XG4gICAgICAgIC8vIChtKWF4LWNvbnRlbnQsIChtKWluLWNvbnRlbnRcbiAgICAgICAgY2FzZSAxMDk6XG4gICAgICAgICAgLy8gLVxuICAgICAgICAgIGlmIChjaGFyYXQodmFsdWUsIGxlbmd0aCArIDQpICE9PSA0NSkgYnJlYWs7XG4gICAgICAgIC8vIChmKWlsbC1hdmFpbGFibGUsIChmKWl0LWNvbnRlbnRcblxuICAgICAgICBjYXNlIDEwMjpcbiAgICAgICAgICByZXR1cm4gcmVwbGFjZSh2YWx1ZSwgLyguKzopKC4rKS0oW15dKykvLCAnJDEnICsgV0VCS0lUICsgJyQyLSQzJyArICckMScgKyBNT1ogKyAoY2hhcmF0KHZhbHVlLCBsZW5ndGggKyAzKSA9PSAxMDggPyAnJDMnIDogJyQyLSQzJykpICsgdmFsdWU7XG4gICAgICAgIC8vIChzKXRyZXRjaFxuXG4gICAgICAgIGNhc2UgMTE1OlxuICAgICAgICAgIHJldHVybiB+aW5kZX
1hvZih2YWx1ZSwgJ3N0cmV0Y2gnKSA/IHByZWZpeChyZXBsYWNlKHZhbHVlLCAnc3RyZXRjaCcsICdmaWxsLWF2YWlsYWJsZScpLCBsZW5ndGgpICsgdmFsdWUgOiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIC8vIHBvc2l0aW9uOiBzdGlja3lcblxuICAgIGNhc2UgNDk0OTpcbiAgICAgIC8vIChzKXRpY2t5P1xuICAgICAgaWYgKGNoYXJhdCh2YWx1ZSwgbGVuZ3RoICsgMSkgIT09IDExNSkgYnJlYWs7XG4gICAgLy8gZGlzcGxheTogKGZsZXh8aW5saW5lLWZsZXgpXG5cbiAgICBjYXNlIDY0NDQ6XG4gICAgICBzd2l0Y2ggKGNoYXJhdCh2YWx1ZSwgc3RybGVuKHZhbHVlKSAtIDMgLSAofmluZGV4b2YodmFsdWUsICchaW1wb3J0YW50JykgJiYgMTApKSkge1xuICAgICAgICAvLyBzdGljKGspeVxuICAgICAgICBjYXNlIDEwNzpcbiAgICAgICAgICByZXR1cm4gcmVwbGFjZSh2YWx1ZSwgJzonLCAnOicgKyBXRUJLSVQpICsgdmFsdWU7XG4gICAgICAgIC8vIChpbmxpbmUtKT9mbChlKXhcblxuICAgICAgICBjYXNlIDEwMTpcbiAgICAgICAgICByZXR1cm4gcmVwbGFjZSh2YWx1ZSwgLyguKzopKFteOyFdKykoO3whLispPy8sICckMScgKyBXRUJLSVQgKyAoY2hhcmF0KHZhbHVlLCAxNCkgPT09IDQ1ID8gJ2lubGluZS0nIDogJycpICsgJ2JveCQzJyArICckMScgKyBXRUJLSVQgKyAnJDIkMycgKyAnJDEnICsgTVMgKyAnJDJib3gkMycpICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIC8vIHdyaXRpbmctbW9kZVxuXG4gICAgY2FzZSA1OTM2OlxuICAgICAgc3dpdGNoIChjaGFyYXQodmFsdWUsIGxlbmd0aCArIDExKSkge1xuICAgICAgICAvLyB2ZXJ0aWNhbC1sKHIpXG4gICAgICAgIGNhc2UgMTE0OlxuICAgICAgICAgIHJldHVybiBXRUJLSVQgKyB2YWx1ZSArIE1TICsgcmVwbGFjZSh2YWx1ZSwgL1tzdmhdXFx3Ky1bdGJscl17Mn0vLCAndGInKSArIHZhbHVlO1xuICAgICAgICAvLyB2ZXJ0aWNhbC1yKGwpXG5cbiAgICAgICAgY2FzZSAxMDg6XG4gICAgICAgICAgcmV0dXJuIFdFQktJVCArIHZhbHVlICsgTVMgKyByZXBsYWNlKHZhbHVlLCAvW3N2aF1cXHcrLVt0YmxyXXsyfS8sICd0Yi1ybCcpICsgdmFsdWU7XG4gICAgICAgIC8vIGhvcml6b250YWwoLSl0YlxuXG4gICAgICAgIGNhc2UgNDU6XG4gICAgICAgICAgcmV0dXJuIFdFQktJVCArIHZhbHVlICsgTVMgKyByZXBsYWNlKHZhbHVlLCAvW3N2aF1cXHcrLVt0YmxyXXsyfS8sICdscicpICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBXRUJLSVQgKyB2YWx1ZSArIE1TICsgdmFsdWUgKyB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIHByZWZpeGVyID0gZnVuY3Rpb24gcHJlZml4ZXIoZWxlbWVudCwgaW5kZXgsIGNoaWxkcmVuLCBjYWxsYmFjaykge1xuICBpZiAoZWxlbWVudC5sZW5ndGggPiAtMSkgaWYgKCFlbGVtZW50W1wicmV0dXJuXCJdKSBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgREVDTEFSQVRJT046XG4gICAgICBlbGVtZW50W1wicmV0dXJuXCJdID0gcHJlZml4KGVsZW1lbnQudmFsdWUsIGVsZW1lbnQubGVuZ3RoKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBLRVlGUkFNRVM6XG4gICAgICByZXR1cm4gc2VyaWFsaXplKFtjb3B5KGVsZW1lbnQsIHtcbiAgICAgICAgdmFsdWU6IHJlcGxhY2UoZWxlbWVudC52YWx1ZSwgJ0AnLCAnQCcgKyBXRUJLSVQpXG4gICAgICB9KV0sIGNhbGxiYWNrKTtcblxuICAgIGNhc2UgUlVMRVNFVDpcbiAgICAgIGlmIChlbGVtZW50Lmxlbmd0aCkgcmV0dXJuIGNvbWJpbmUoZWxlbWVudC5wcm9wcywgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHN3aXRjaCAobWF0Y2godmFsdWUsIC8oOjpwbGFjXFx3K3w6cmVhZC1cXHcrKS8pKSB7XG4gICAgICAgICAgLy8gOnJlYWQtKG9ubHl8d3JpdGUpXG4gICAgICAgICAgY2FzZSAnOnJlYWQtb25seSc6XG4gICAgICAgICAgY2FzZSAnOnJlYWQtd3JpdGUnOlxuICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZShbY29weShlbGVtZW50LCB7XG4gICAgICAgICAgICAgIHByb3BzOiBbcmVwbGFjZSh2YWx1ZSwgLzoocmVhZC1cXHcrKS8sICc6JyArIE1PWiArICckMScpXVxuICAgICAgICAgICAgfSldLCBjYWxsYmFjayk7XG4gICAgICAgICAgLy8gOnBsYWNlaG9sZGVyXG5cbiAgICAgICAgICBjYXNlICc6OnBsYWNlaG9sZGVyJzpcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemUoW2NvcHkoZWxlbWVudCwge1xuICAgICAgICAgICAgICBwcm9wczogW3JlcGxhY2UodmFsdWUsIC86KHBsYWNcXHcrKS8sICc6JyArIFdFQktJVCArICdpbnB1dC0kMScpXVxuICAgICAgICAgICAgfSksIGNvcHkoZWxlbWVudCwge1xuICAgICAgICAgICAgICBwcm9wczogW3JlcGxhY2UodmFsdWUsIC86KHBsYWNcXHcrKS8sICc6JyArIE1PWiArICckMScpXVxuICAgICAgICAgICAgfSksIGNvcHkoZWxlbWVudCwge1xuICAgICAgICAgICAgICBwcm9wczogW3JlcGxhY2UodmFsdWUsIC86KHBsYWNcXHcrKS8sIE1TICsgJ2lucHV0LSQxJyldXG4gICAgICAgICAgICB9KV0sIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH0pO1xuICB9XG59O1xuXG52YXIgZGVmYXVsdFN0eWxpc1BsdWdpbnMgPSBbcHJlZml4ZXJdO1xuXG52YXIgY3JlYXRlQ2FjaGUgPSBmdW5jdGlvbiBjcmVhdGVDYWNoZShvcHRpb25zKSB7XG4gIHZhciBrZXkgPSBvcHRpb25zLmtleTtcblxuICBpZiAoa2V5ID09PSAnY3NzJykge1xuICAgIHZhciBzc3JTdHlsZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbZGF0YS1lbW90aW9uXTpub3QoW2RhdGEtc10pXCIpOyAvLyBnZXQgU1NSZWQgc3R5bGVzIG91dCBvZiB0aGUgd2F5IG9mIFJlYWN0J3MgaHlkcmF0aW9uXG4gICAgLy8gZG9jdW1lbnQuaGVhZCBpcyBhIHNhZmUgcGxhY2UgdG8gbW92ZSB0aGVtIHRvKHRob3VnaCBub3RlIGRvY3VtZW50LmhlYWQgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBsYXN0IHBsYWNlIHRoZXkgd2lsbCBiZSlcbiAgICAvLyBub3RlIHRoaXMgdmVyeSB2ZXJ5IGludGVudGlvbmFsbHkgdGFyZ2V0cyBhbGwgc3R5bGUgZWxlbWVudHMgcmVnYXJkbGVzcyBvZiB0aGUga2V5IHRvIGVuc3VyZVxuICAgIC8vIHRoYXQgY3JlYXRpbmcgYSBjYWNoZSB3b3JrcyBpbnNpZGUgb2YgcmVuZGVyIG9mIGEgUmVhY3QgY29tcG9uZW50XG5cbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHNzclN0eWxlcywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIC8vIHdlIHdhbnQgdG8gb25seSBtb3ZlIGVsZW1lbnRzIHdoaWNoIGhhdmUgYSBzcGFjZSBpbiB0aGUgZGF0YS1lbW90aW9uIGF0dHJpYnV0ZSB2YWx1ZVxuICAgICAgLy8gYmVjYXVzZSB0aGF0IGluZGljYXRlcyB0aGF0IGl0IGlzIGFuIEVtb3Rpb24gMTEgc2VydmVyLXNpZGUgcmVuZGVyZWQgc3R5bGUgZWxlbWVudHNcbiAgICAgIC8vIHdoaWxlIHdlIHdpbGwgYWxyZWFkeSBpZ25vcmUgRW1vdGlvbiAxMSBjbGllbnQtc2lkZSBpbnNlcnRlZCBzdHlsZXMgYmVjYXVzZSBvZiB0aGUgOm5vdChbZGF0YS1zXSkgcGFydCBpbiB0aGUgc2VsZWN0b3JcbiAgICAgIC8vIEVtb3Rpb24gMTAgY2xpZW50LXNpZGUgaW5zZXJ0ZWQgc3R5bGVzIGRpZCBub3QgaGF2ZSBkYXRhLXMgKGJ1dCBpbXBvcnRhbnRseSBkaWQgbm90IGhhdmUgYSBzcGFjZSBpbiB0aG
1VpciBkYXRhLWVtb3Rpb24gYXR0cmlidXRlcylcbiAgICAgIC8vIHNvIGNoZWNraW5nIGZvciB0aGUgc3BhY2UgZW5zdXJlcyB0aGF0IGxvYWRpbmcgRW1vdGlvbiAxMSBhZnRlciBFbW90aW9uIDEwIGhhcyBpbnNlcnRlZCBzb21lIHN0eWxlc1xuICAgICAgLy8gd2lsbCBub3QgcmVzdWx0IGluIHRoZSBFbW90aW9uIDEwIHN0eWxlcyBiZWluZyBkZXN0cm95ZWRcbiAgICAgIHZhciBkYXRhRW1vdGlvbkF0dHJpYnV0ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLWVtb3Rpb24nKTtcblxuICAgICAgaWYgKGRhdGFFbW90aW9uQXR0cmlidXRlLmluZGV4T2YoJyAnKSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcycsICcnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBzdHlsaXNQbHVnaW5zID0gb3B0aW9ucy5zdHlsaXNQbHVnaW5zIHx8IGRlZmF1bHRTdHlsaXNQbHVnaW5zO1xuXG4gIHZhciBpbnNlcnRlZCA9IHt9O1xuICB2YXIgY29udGFpbmVyO1xuICB2YXIgbm9kZXNUb0h5ZHJhdGUgPSBbXTtcblxuICB7XG4gICAgY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXIgfHwgZG9jdW1lbnQuaGVhZDtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCAvLyB0aGlzIG1lYW5zIHdlIHdpbGwgaWdub3JlIGVsZW1lbnRzIHdoaWNoIGRvbid0IGhhdmUgYSBzcGFjZSBpbiB0aGVtIHdoaWNoXG4gICAgLy8gbWVhbnMgdGhhdCB0aGUgc3R5bGUgZWxlbWVudHMgd2UncmUgbG9va2luZyBhdCBhcmUgb25seSBFbW90aW9uIDExIHNlcnZlci1yZW5kZXJlZCBzdHlsZSBlbGVtZW50c1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzdHlsZVtkYXRhLWVtb3Rpb25ePVxcXCJcIiArIGtleSArIFwiIFxcXCJdXCIpLCBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIGF0dHJpYiA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1lbW90aW9uXCIpLnNwbGl0KCcgJyk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXR0cmliLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGluc2VydGVkW2F0dHJpYltpXV0gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBub2Rlc1RvSHlkcmF0ZS5wdXNoKG5vZGUpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIF9pbnNlcnQ7XG5cbiAgdmFyIG9tbmlwcmVzZW50UGx1Z2lucyA9IFtjb21wYXQsIHJlbW92ZUxhYmVsXTtcblxuICB7XG4gICAgdmFyIGN1cnJlbnRTaGVldDtcbiAgICB2YXIgZmluYWxpemluZ1BsdWdpbnMgPSBbc3RyaW5naWZ5LCBydWxlc2hlZXQoZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgIGN1cnJlbnRTaGVldC5pbnNlcnQocnVsZSk7XG4gICAgfSldO1xuICAgIHZhciBzZXJpYWxpemVyID0gbWlkZGxld2FyZShvbW5pcHJlc2VudFBsdWdpbnMuY29uY2F0KHN0eWxpc1BsdWdpbnMsIGZpbmFsaXppbmdQbHVnaW5zKSk7XG5cbiAgICB2YXIgc3R5bGlzID0gZnVuY3Rpb24gc3R5bGlzKHN0eWxlcykge1xuICAgICAgcmV0dXJuIHNlcmlhbGl6ZShjb21waWxlKHN0eWxlcyksIHNlcmlhbGl6ZXIpO1xuICAgIH07XG5cbiAgICBfaW5zZXJ0ID0gZnVuY3Rpb24gaW5zZXJ0KHNlbGVjdG9yLCBzZXJpYWxpemVkLCBzaGVldCwgc2hvdWxkQ2FjaGUpIHtcbiAgICAgIGN1cnJlbnRTaGVldCA9IHNoZWV0O1xuXG4gICAgICBzdHlsaXMoc2VsZWN0b3IgPyBzZWxlY3RvciArIFwie1wiICsgc2VyaWFsaXplZC5zdHlsZXMgKyBcIn1cIiA6IHNlcmlhbGl6ZWQuc3R5bGVzKTtcblxuICAgICAgaWYgKHNob3VsZENhY2hlKSB7XG4gICAgICAgIGNhY2hlLmluc2VydGVkW3NlcmlhbGl6ZWQubmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICB2YXIgY2FjaGUgPSB7XG4gICAga2V5OiBrZXksXG4gICAgc2hlZXQ6IG5ldyBTdHlsZVNoZWV0KHtcbiAgICAgIGtleToga2V5LFxuICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgICBub25jZTogb3B0aW9ucy5ub25jZSxcbiAgICAgIHNwZWVkeTogb3B0aW9ucy5zcGVlZHksXG4gICAgICBwcmVwZW5kOiBvcHRpb25zLnByZXBlbmQsXG4gICAgICBpbnNlcnRpb25Qb2ludDogb3B0aW9ucy5pbnNlcnRpb25Qb2ludFxuICAgIH0pLFxuICAgIG5vbmNlOiBvcHRpb25zLm5vbmNlLFxuICAgIGluc2VydGVkOiBpbnNlcnRlZCxcbiAgICByZWdpc3RlcmVkOiB7fSxcbiAgICBpbnNlcnQ6IF9pbnNlcnRcbiAgfTtcbiAgY2FjaGUuc2hlZXQuaHlkcmF0ZShub2Rlc1RvSHlkcmF0ZSk7XG4gIHJldHVybiBjYWNoZTtcbn07XG5cbmV4cG9ydCB7IGNyZWF0ZUNhY2hlIGFzIGRlZmF1bHQgfTtcbiIsIi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBJbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L211cm11cmhhc2gtanNcbi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hYXBwbGVieS9zbWhhc2hlci9ibG9iLzYxYTA1MzBmMjgyNzdmMmU4NTBiZmMzOTYwMGNlNjFkMDJiNTE4ZGUvc3JjL011cm11ckhhc2gyLmNwcCNMMzctTDg2XG5mdW5jdGlvbiBtdXJtdXIyKHN0cikge1xuICAvLyAnbScgYW5kICdyJyBhcmUgbWl4aW5nIGNvbnN0YW50cyBnZW5lcmF0ZWQgb2ZmbGluZS5cbiAgLy8gVGhleSdyZSBub3QgcmVhbGx5ICdtYWdpYycsIHRoZXkganVzdCBoYXBwZW4gdG8gd29yayB3ZWxsLlxuICAvLyBjb25zdCBtID0gMHg1YmQxZTk5NTtcbiAgLy8gY29uc3QgciA9IDI0O1xuICAvLyBJbml0aWFsaXplIHRoZSBoYXNoXG4gIHZhciBoID0gMDsgLy8gTWl4IDQgYnl0ZXMgYXQgYSB0aW1lIGludG8gdGhlIGhhc2hcblxuICB2YXIgayxcbiAgICAgIGkgPSAwLFxuICAgICAgbGVuID0gc3RyLmxlbmd0aDtcblxuICBmb3IgKDsgbGVuID49IDQ7ICsraSwgbGVuIC09IDQpIHtcbiAgICBrID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmIHwgKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCA4IHwgKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCAxNiB8IChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMjQ7XG4gICAgayA9XG4gICAgLyogTWF0aC5pbXVsKGssIG0pOiAqL1xuICAgIChrICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUgKyAoKGsgPj4+IDE2KSAqIDB4ZTk5NSA8PCAxNik7XG4gICAgayBePVxuICAgIC8qIGsgPj4+IHI6ICovXG4gICAgayA+Pj4gMjQ7XG4gICAgaCA9XG4gICAgLyogTWF0aC5pbXVsKGssIG0pOiAqL1xuICAgIChrICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUgKyAoKGsgPj4+IDE2KSAqIDB4ZTk5NSA8PCAxNikgXlxuICAgIC8qIE1hdGguaW11bChoLCBtKTogKi9cbiAgICAoaCAmIDB4ZmZmZikgKiAweDViZDFlOTk1ICsgKChoID4+PiAxNikgKiAweGU5OTUgPDwgMTYpO1xuICB9IC8vIEhhbmRsZSB0aGUgbGFzdCBmZXcgYnl0ZXMgb2YgdGhlIGlucHV0IGFycmF5XG5cblxuICBzd2l0Y2ggKGxlbikge1xuICAgIGNhc2UgMzpcbiAgICAgIGggXj0gKHN0ci5jaGFyQ29kZUF0KGkgKyAyKSAmIDB4ZmYpIDw8IDE2O1xuXG4gICAgY2FzZSAyOlxuICAgICAgaCBePSAoc3RyLmNoYXJDb2RlQXQoaSArIDEpICYgMHhmZikgPDwgODtcblxuICAgIGNhc2UgMTpcbiAgICAgIGggXj0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICAgICAgaCA9XG4gICAgICAvKiBNYXRoLmltdWwoaCwgbSk6ICovXG4gICAgICAoaCAmIDB4ZmZmZikgKiAweDViZDFlOTk1ICsgKChoID4+PiAxNikgKiAweGU5OTUgPDwgMTYpO1xuICB9IC8vIERvIGEgZmV3IGZpbmFsIG1peGVzIG9mIHRoZSBoYXNoIHRvIGVuc3VyZSB0aGUgbGFzdCBmZXdcbiAgLy8gYnl0ZXMgYXJlIHdlbGwtaW5jb3Jwb3JhdGVkLlxuXG5cbiAgaCBePSBoID4+PiAxMztcbiAgaCA9XG4gIC8qIE1hdGguaW11bChoLCBtKTogKi9cbiAgKGggJiAweGZmZmYpICogMHg1YmQxZTk5NSArICgoaCA+Pj4gMTYpICogMHhlOTk1IDw8IDE2KTtcbiAgcmV0dXJuICgoaCBeIGggPj4+IDE1KSA+Pj4gMCkudG9TdHJpbmc
1oMzYpO1xufVxuXG5leHBvcnQgeyBtdXJtdXIyIGFzIGRlZmF1bHQgfTtcbiIsInZhciB1bml0bGVzc0tleXMgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiAxLFxuICBhc3BlY3RSYXRpbzogMSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IDEsXG4gIGJvcmRlckltYWdlU2xpY2U6IDEsXG4gIGJvcmRlckltYWdlV2lkdGg6IDEsXG4gIGJveEZsZXg6IDEsXG4gIGJveEZsZXhHcm91cDogMSxcbiAgYm94T3JkaW5hbEdyb3VwOiAxLFxuICBjb2x1bW5Db3VudDogMSxcbiAgY29sdW1uczogMSxcbiAgZmxleDogMSxcbiAgZmxleEdyb3c6IDEsXG4gIGZsZXhQb3NpdGl2ZTogMSxcbiAgZmxleFNocmluazogMSxcbiAgZmxleE5lZ2F0aXZlOiAxLFxuICBmbGV4T3JkZXI6IDEsXG4gIGdyaWRSb3c6IDEsXG4gIGdyaWRSb3dFbmQ6IDEsXG4gIGdyaWRSb3dTcGFuOiAxLFxuICBncmlkUm93U3RhcnQ6IDEsXG4gIGdyaWRDb2x1bW46IDEsXG4gIGdyaWRDb2x1bW5FbmQ6IDEsXG4gIGdyaWRDb2x1bW5TcGFuOiAxLFxuICBncmlkQ29sdW1uU3RhcnQ6IDEsXG4gIG1zR3JpZFJvdzogMSxcbiAgbXNHcmlkUm93U3BhbjogMSxcbiAgbXNHcmlkQ29sdW1uOiAxLFxuICBtc0dyaWRDb2x1bW5TcGFuOiAxLFxuICBmb250V2VpZ2h0OiAxLFxuICBsaW5lSGVpZ2h0OiAxLFxuICBvcGFjaXR5OiAxLFxuICBvcmRlcjogMSxcbiAgb3JwaGFuczogMSxcbiAgc2NhbGU6IDEsXG4gIHRhYlNpemU6IDEsXG4gIHdpZG93czogMSxcbiAgekluZGV4OiAxLFxuICB6b29tOiAxLFxuICBXZWJraXRMaW5lQ2xhbXA6IDEsXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IDEsXG4gIGZsb29kT3BhY2l0eTogMSxcbiAgc3RvcE9wYWNpdHk6IDEsXG4gIHN0cm9rZURhc2hhcnJheTogMSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogMSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogMSxcbiAgc3Ryb2tlT3BhY2l0eTogMSxcbiAgc3Ryb2tlV2lkdGg6IDFcbn07XG5cbmV4cG9ydCB7IHVuaXRsZXNzS2V5cyBhcyBkZWZhdWx0IH07XG4iLCJmdW5jdGlvbiBtZW1vaXplKGZuKSB7XG4gIHZhciBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgaWYgKGNhY2hlW2FyZ10gPT09IHVuZGVmaW5lZCkgY2FjaGVbYXJnXSA9IGZuKGFyZyk7XG4gICAgcmV0dXJuIGNhY2hlW2FyZ107XG4gIH07XG59XG5cbmV4cG9ydCB7IG1lbW9pemUgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0IGhhc2hTdHJpbmcgZnJvbSAnQGVtb3Rpb24vaGFzaCc7XG5pbXBvcnQgdW5pdGxlc3MgZnJvbSAnQGVtb3Rpb24vdW5pdGxlc3MnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAnQGVtb3Rpb24vbWVtb2l6ZSc7XG5cbnZhciBpc0RldmVsb3BtZW50ID0gZmFsc2U7XG5cbnZhciBoeXBoZW5hdGVSZWdleCA9IC9bQS1aXXxebXMvZztcbnZhciBhbmltYXRpb25SZWdleCA9IC9fRU1PXyhbXl9dKz8pXyhbXl0qPylfRU1PXy9nO1xuXG52YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IGZ1bmN0aW9uIGlzQ3VzdG9tUHJvcGVydHkocHJvcGVydHkpIHtcbiAgcmV0dXJuIHByb3BlcnR5LmNoYXJDb2RlQXQoMSkgPT09IDQ1O1xufTtcblxudmFyIGlzUHJvY2Vzc2FibGVWYWx1ZSA9IGZ1bmN0aW9uIGlzUHJvY2Vzc2FibGVWYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJztcbn07XG5cbnZhciBwcm9jZXNzU3R5bGVOYW1lID0gLyogI19fUFVSRV9fICovbWVtb2l6ZShmdW5jdGlvbiAoc3R5bGVOYW1lKSB7XG4gIHJldHVybiBpc0N1c3RvbVByb3BlcnR5KHN0eWxlTmFtZSkgPyBzdHlsZU5hbWUgOiBzdHlsZU5hbWUucmVwbGFjZShoeXBoZW5hdGVSZWdleCwgJy0kJicpLnRvTG93ZXJDYXNlKCk7XG59KTtcblxudmFyIHByb2Nlc3NTdHlsZVZhbHVlID0gZnVuY3Rpb24gcHJvY2Vzc1N0eWxlVmFsdWUoa2V5LCB2YWx1ZSkge1xuICBzd2l0Y2ggKGtleSkge1xuICAgIGNhc2UgJ2FuaW1hdGlvbic6XG4gICAgY2FzZSAnYW5pbWF0aW9uTmFtZSc6XG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoYW5pbWF0aW9uUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCwgcDEsIHAyKSB7XG4gICAgICAgICAgICBjdXJzb3IgPSB7XG4gICAgICAgICAgICAgIG5hbWU6IHAxLFxuICAgICAgICAgICAgICBzdHlsZXM6IHAyLFxuICAgICAgICAgICAgICBuZXh0OiBjdXJzb3JcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcDE7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuXG4gIGlmICh1bml0bGVzc1trZXldICE9PSAxICYmICFpc0N1c3RvbVByb3BlcnR5KGtleSkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gMCkge1xuICAgIHJldHVybiB2YWx1ZSArICdweCc7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgbm9Db21wb25lbnRTZWxlY3Rvck1lc3NhZ2UgPSAnQ29tcG9uZW50IHNlbGVjdG9ycyBjYW4gb25seSBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggJyArICdAZW1vdGlvbi9iYWJlbC1wbHVnaW4sIHRoZSBzd2MgRW1vdGlvbiBwbHVnaW4sIG9yIGFub3RoZXIgRW1vdGlvbi1hd2FyZSAnICsgJ2NvbXBpbGVyIHRyYW5zZm9ybS4nO1xuXG5mdW5jdGlvbiBoYW5kbGVJbnRlcnBvbGF0aW9uKG1lcmdlZFByb3BzLCByZWdpc3RlcmVkLCBpbnRlcnBvbGF0aW9uKSB7XG4gIGlmIChpbnRlcnBvbGF0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB2YXIgY29tcG9uZW50U2VsZWN0b3IgPSBpbnRlcnBvbGF0aW9uO1xuXG4gIGlmIChjb21wb25lbnRTZWxlY3Rvci5fX2Vtb3Rpb25fc3R5bGVzICE9PSB1bmRlZmluZWQpIHtcblxuICAgIHJldHVybiBjb21wb25lbnRTZWxlY3RvcjtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mIGludGVycG9sYXRpb24pIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHtcbiAgICAgICAgdmFyIGtleWZyYW1lcyA9IGludGVycG9sYXRpb247XG5cbiAgICAgICAgaWYgKGtleWZyYW1lcy5hbmltID09PSAxKSB7XG4gICAgICAgICAgY3Vyc29yID0ge1xuICAgICAgICAgICAgbmFtZToga2V5ZnJhbWVzLm5hbWUsXG4gICAgICAgICAgICBzdHlsZXM6IGtleWZyYW1lcy5zdHlsZXMsXG4gICAgICAgICAgICBuZXh0OiBjdXJzb3JcbiAgICAgICAgICB9O1xuICAgICAgICAgI
1HJldHVybiBrZXlmcmFtZXMubmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZXJpYWxpemVkU3R5bGVzID0gaW50ZXJwb2xhdGlvbjtcblxuICAgICAgICBpZiAoc2VyaWFsaXplZFN0eWxlcy5zdHlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhciBuZXh0ID0gc2VyaWFsaXplZFN0eWxlcy5uZXh0O1xuXG4gICAgICAgICAgaWYgKG5leHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gbm90IHRoZSBtb3N0IGVmZmljaWVudCB0aGluZyBldmVyIGJ1dCB0aGlzIGlzIGEgcHJldHR5IHJhcmUgY2FzZVxuICAgICAgICAgICAgLy8gYW5kIHRoZXJlIHdpbGwgYmUgdmVyeSBmZXcgaXRlcmF0aW9ucyBvZiB0aGlzIGdlbmVyYWxseVxuICAgICAgICAgICAgd2hpbGUgKG5leHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjdXJzb3IgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogbmV4dC5uYW1lLFxuICAgICAgICAgICAgICAgIHN0eWxlczogbmV4dC5zdHlsZXMsXG4gICAgICAgICAgICAgICAgbmV4dDogY3Vyc29yXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHN0eWxlcyA9IHNlcmlhbGl6ZWRTdHlsZXMuc3R5bGVzICsgXCI7XCI7XG4gICAgICAgICAgcmV0dXJuIHN0eWxlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjcmVhdGVTdHJpbmdGcm9tT2JqZWN0KG1lcmdlZFByb3BzLCByZWdpc3RlcmVkLCBpbnRlcnBvbGF0aW9uKTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKG1lcmdlZFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2Y
1XIgcHJldmlvdXNDdXJzb3IgPSBjdXJzb3I7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGludGVycG9sYXRpb24obWVyZ2VkUHJvcHMpO1xuICAgICAgICAgIGN1cnNvciA9IHByZXZpb3VzQ3Vyc29yO1xuICAgICAgICAgIHJldHVybiBoYW5kbGVJbnRlcnBvbGF0aW9uKG1lcmdlZFByb3BzLCByZWdpc3RlcmVkLCByZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH0gLy8gZmluYWxpemUgc3RyaW5nIHZhbHVlcyAocmVndWxhciBzdHJpbmdzIGFuZCBmdW5jdGlvbnMgaW50ZXJwb2xhdGVkIGludG8gY3NzIGNhbGxzKVxuXG5cbiAgdmFyIGFzU3RyaW5nID0gaW50ZXJwb2xhdGlvbjtcblxuICBpZiAocmVnaXN0ZXJlZCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nO1xuICB9XG5cbiAgdmFyIGNhY2hlZCA9IHJlZ2lzdGVyZWRbYXNTdHJpbmddO1xuICByZXR1cm4gY2FjaGVkICE9PSB1bmRlZmluZWQgPyBjYWNoZWQgOiBhc1N0cmluZztcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3RyaW5nRnJvbU9iamVjdChtZXJnZWRQcm9wcywgcmVnaXN0ZXJlZCwgb2JqKSB7XG4gIHZhciBzdHJpbmcgPSAnJztcblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIHN0cmluZyArPSBoYW5kbGVJbnRlcnBvbGF0aW9uKG1lcmdlZFByb3BzLCByZWdpc3RlcmVkLCBvYmpbaV0pICsgXCI7XCI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIHZhciB2YWx1ZSA9IG9ialtrZXldO1xuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB2Y
1XIgYXNTdHJpbmcgPSB2YWx1ZTtcblxuICAgICAgICBpZiAocmVnaXN0ZXJlZCAhPSBudWxsICYmIHJlZ2lzdGVyZWRbYXNTdHJpbmddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzdHJpbmcgKz0ga2V5ICsgXCJ7XCIgKyByZWdpc3RlcmVkW2FzU3RyaW5nXSArIFwifVwiO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUHJvY2Vzc2FibGVWYWx1ZShhc1N0cmluZykpIHtcbiAgICAgICAgICBzdHJpbmcgKz0gcHJvY2Vzc1N0eWxlTmFtZShrZXkpICsgXCI6XCIgKyBwcm9jZXNzU3R5bGVWYWx1ZShrZXksIGFzU3RyaW5nKSArIFwiO1wiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoa2V5ID09PSAnTk9fQ09NUE9ORU5UX1NFTEVDVE9SJyAmJiBpc0RldmVsb3BtZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG5vQ29tcG9uZW50U2VsZWN0b3JNZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB0eXBlb2YgdmFsdWVbMF0gPT09ICdzdHJpbmcnICYmIChyZWdpc3RlcmVkID09IG51bGwgfHwgcmVnaXN0ZXJlZFt2YWx1ZVswXV0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdmFsdWUubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBpZiAoaXNQcm9jZXNzYWJsZVZhbHVlKHZhbHVlW19pXSkpIHtcbiAgICAgICAgICAgICAgc3RyaW5nICs9IHByb2Nlc3NTdHlsZU5hbWUoa2V5KSArIFwiOlwiICsgcHJvY2Vzc1N0eWxlVmFsdWUoa2V5LCB2YWx1ZVtfaV0pICsgXCI7XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBpbnRlcnBvbGF0ZWQgPSBoYW5kbGVJbnRlcnBvbGF0aW9uKG1lcmdlZFByb3BzLCByZWdpc3RlcmVkLCB2YWx1ZSk7XG5cbiAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnYW5pbWF0aW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ2FuaW1hdGlvbk5hbWUnOlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3RyaW5nICs9IHByb2Nlc3NTdHlsZU5hbWUoa2V5KSArIFwiOlwiICsgaW50ZXJwb2xhdGVkICsgXCI7XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgc3RyaW5nICs9IGtleSArIFwie1wiICsgaW50ZXJwb2xhdGVkICsgXCJ9XCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyaW5nO1xufVxuXG52YXIgbGFiZWxQYXR0ZXJuID0gL2xhYmVsOlxccyooW15cXHM7e10rKVxccyooO3wkKS9nOyAvLyB0aGlzIGlzIHRoZSBjdXJzb3IgZm9yIGtleWZyYW1lc1xuLy8ga2V5ZnJhbWVzIGFyZSBzdG9yZWQgb24gdGhlIFNlcmlhbGl6ZWRTdHlsZXMgb2JqZWN0IGFzIGEgbGlua2VkIGxpc3RcblxudmFyIGN1cnNvcjtcbmZ1bmN0aW9uIHNlcmlhbGl6ZVN0eWxlcyhhcmdzLCByZWdpc3RlcmVkLCBtZXJnZWRQcm9wcykge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnICYmIGFyZ3NbMF0gIT09IG51bGwgJiYgYXJnc1swXS5zdHlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBhcmdzWzBdO1xuICB9XG5cbiAgdmFyIHN0cmluZ01vZGUgPSB0cnVlO1xuICB2YXIgc3R5bGVzID0gJyc7XG4gIGN1cnNvciA9IHVuZGVmaW5lZDtcbiAgdmFyIHN0cmluZ3MgPSBhcmdzWzBdO1xuXG4gIGlmIChzdHJpbmdzID09IG51bGwgfHwgc3RyaW5ncy5yYXcgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0cmluZ01vZGUgPSBmYWxzZTtcbiAgICBzdHlsZXMgKz0gaGFuZGxlSW50ZXJwb2xhdGlvbihtZXJnZWRQcm9wcywgcmVnaXN0ZXJlZCwgc3RyaW5ncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGFzVGVtcGxhdGVTdHJpbmdzQXJyID0gc3RyaW5ncztcblxuICAgIHN0eWxlcyArPSBhc1RlbXBsYXRlU3RyaW5nc0FyclswXTtcbiAgfSAvLyB3ZSBzdGFydCBhdCAxIHNpbmNlIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgZmlyc3QgYXJnXG5cblxuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBzdHlsZXMgKz0gaGFuZGxlSW50ZXJwb2xhdGlvbihtZXJnZWRQcm9wcywgcmVnaXN0ZXJlZCwgYXJnc1tpXSk7XG5cbiAgICBpZiAoc3RyaW5nTW9kZSkge1xuICAgICAgdmFyIHRlbXBsYXRlU3RyaW5nc0FyciA9IHN0cmluZ3M7XG5cbiAgICAgIHN0eWxlcyArPSB0ZW1wbGF0ZVN0cmluZ3NBcnJbaV07XG4gICAgfVxuICB9IC8vIHVzaW5nIGEgZ2xvYmFsIHJlZ2V4IHdpdGggLmV4ZWMgaXMgc3RhdGVmdWwgc28gbGFzdEluZGV4IGhhcyB0byBiZSByZXNldCBlYWNoIHRpbWVcblxuXG4gIGxhYmVsUGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICB2YXIgaWRlbnRpZmllck5hbWUgPSAnJztcbiAgdmFyIG1hdGNoOyAvLyBodHRwczovL2VzYmVuY2guY29tL2JlbmNoLzViODA5YzJjZjI5NDk4MDBhMGY2MWZiNVxuXG4gIHdoaWxlICgobWF0Y2ggPSBsYWJlbFBhdHRlcm4uZXhlYyhzdHlsZXMpKSAhPT0gbnVsbCkge1xuICAgIGlkZW50aWZpZXJOYW1lICs9ICctJyArIG1hdGNoWzFdO1xuICB9XG5cbiAgdmFyIG5hbWUgPSBoYXNoU3RyaW5nKHN0eWxlcykgKyBpZGVudGlmaWVyTmFtZTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgc3R5bGVzOiBzdHlsZXMsXG4gICAgbmV4dDogY3Vyc29yXG4gIH07XG59XG5cbmV4cG9ydCB7IHNlcmlhbGl6ZVN0eWxlcyB9O1xuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG52YXIgc3luY0ZhbGxiYWNrID0gZnVuY3Rpb24gc3luY0ZhbGxiYWNrKGNyZWF0ZSkge1xuICByZXR1cm4gY3JlYXRlKCk7XG59O1xuXG52YXIgdXNlSW5zZXJ0aW9uRWZmZWN0ID0gUmVhY3RbJ3VzZUluc2VydGlvbicgKyAnRWZmZWN0J10gPyBSZWFjdFsndXNlSW5zZXJ0aW9uJyArICdFZmZlY3QnXSA6IGZhbHNlO1xudmFyIHVzZUluc2VydGlvbkVmZmVjdEFsd2F5c1dpdGhTeW5jRmFsbGJhY2sgPSB1c2VJbnNlcnRpb25
1FZmZlY3QgfHwgc3luY0ZhbGxiYWNrO1xudmFyIHVzZUluc2VydGlvbkVmZmVjdFdpdGhMYXlvdXRGYWxsYmFjayA9IHVzZUluc2VydGlvbkVmZmVjdCB8fCBSZWFjdC51c2VMYXlvdXRFZmZlY3Q7XG5cbmV4cG9ydCB7IHVzZUluc2VydGlvbkVmZmVjdEFsd2F5c1dpdGhTeW5jRmFsbGJhY2ssIHVzZUluc2VydGlvbkVmZmVjdFdpdGhMYXlvdXRGYWxsYmFjayB9O1xuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29udGV4dCwgZm9yd2FyZFJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjcmVhdGVDYWNoZSBmcm9tICdAZW1vdGlvbi9jYWNoZSc7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kcyc7XG5pbXBvcnQgd2Vha01lbW9pemUgZnJvbSAnQGVtb3Rpb24vd2Vhay1tZW1vaXplJztcbmltcG9ydCBob2lzdE5vblJlYWN0U3RhdGljcyBmcm9tICcuLi9faXNvbGF0ZWQtaG5ycy9kaXN0L2Vtb3Rpb24tcmVhY3QtX2lzb2xhdGVkLWhucnMuYnJvd3Nlci5lc20uanMnO1xuaW1wb3J0IHsgZ2V0UmVnaXN0ZXJlZFN0eWxlcywgcmVnaXN0ZXJTdHlsZXMsIGluc2VydFN0eWxlcyB9IGZyb20gJ0BlbW90aW9uL3V0aWxzJztcbmltcG9ydCB7IHNlcmlhbGl6ZVN0eWxlcyB9IGZyb20gJ0BlbW90aW9uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyB1c2VJbnNlcnRpb25FZmZlY3RBbHdheXNXaXRoU3luY0ZhbGxiYWNrIH0gZnJvbSAnQGVtb3Rpb24vdXNlLWluc2VydGlvbi1lZmZlY3Qtd2l0aC1mYWxsYmFja3MnO1xuXG52YXIgaXNEZXZlbG9wbWVudCA9IGZhbHNlO1xuXG52YXIgRW1vdGlvbkNhY2hlQ29udGV4dCA9IC8qICNfX1BVUkVfXyAqL1JlYWN0LmNyZWF0ZUNvbnRleHQoIC8vIHdlJ3JlIGRvaW5nIHRoaXMgdG8gYXZvaWQgcHJlY29uc3RydWN0J3MgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIGluIHRoaXMgb25lIGNhc2Vcbi8vIGJlY2F1c2UgdGhpcyBtb2R1bGUgaXMgcHJpbWFyaWx5IGludGVuZGVkIGZvciB0aGUgYnJvd3NlciBhbmQgbm9kZVxuLy8gYnV0IGl0J3MgYWxzbyByZXF1aXJlZCBpbiByZWFjdCBuYXRpdmUgYW5kIHNpbWlsYXIgZW52aXJvbm1lbnRzIHNvbWV0aW1lc1xuLy8gYW5kIHdlIGNvdWxkIGhhdmUgYSBzcGVjaWFsIGJ1aWxkIGp1c3QgZm9yIHRoYXRcbi8vIGJ1dCB0aGlzIGlzIG11Y2ggZWFzaWVyIGFuZCB0aGUgbmF0aXZlIHBhY2thZ2VzXG4vLyBtaWdodCB1c2UgYSBkaWZmZXJlbnQgdGhlbWUgY29udGV4dCBpbiB0aGUgZnV0dXJlIGFueXdheVxudHlwZW9mIEhUTUxFbGVtZW50ICE9PSAndW5kZWZpbmVkJyA/IC8qICNfX1BVUkVfXyAqL2NyZWF0ZUNhY2hlKHtcbiAga2V5OiAnY3NzJ1xufSkgOiBudWxsKTtcblxudmFyIENhY2hlUHJvdmlkZXIgPSBFbW90aW9uQ2FjaGVDb250ZXh0LlByb3ZpZGVyO1xudmFyIF9fdW5zYWZlX3VzZUVtb3Rpb25DYWNoZSA9IGZ1bmN0aW9uIHVzZUVtb3Rpb25DYWNoZSgpIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoRW1vdGlvbkNhY2hlQ29udGV4dCk7XG59O1xuXG52YXIgd2l0aEVtb3Rpb25DYWNoZSA9IGZ1bmN0aW9uIHdpdGhFbW90aW9uQ2FjaGUoZnVuYykge1xuICByZXR1cm4gLyojX19QVVJFX18qL2ZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgICAvLyB0aGUgY2FjaGUgd2lsbCBuZXZlciBiZSBudWxsIGluIHRoZSBicm93c2VyXG4gICAgdmFyIGNhY2hlID0gdXNlQ29udGV4dChFbW90aW9uQ2FjaGVDb250ZXh0KTtcbiAgICByZXR1cm4gZnVuYyhwcm9wcywgY2FjaGUsIHJlZik7XG4gIH0pO1xufTtcblxudmFyIFRoZW1lQ29udGV4dCA9IC8qICNfX1BVUkVfXyAqL1JlYWN0LmNyZWF0ZUNvbnRleHQoe30pO1xuXG52YXIgdXNlVGhlbWUgPSBmdW5jdGlvbiB1c2VUaGVtZSgpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoVGhlbWVDb250ZXh0KTtcbn07XG5cbnZhciBnZXRUaGVtZSA9IGZ1bmN0aW9uIGdldFRoZW1lKG91dGVyVGhlbWUsIHRoZW1lKSB7XG4gIGlmICh0eXBlb2YgdGhlbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgbWVyZ2VkVGhlbWUgPSB0aGVtZShvdXRlclRoZW1lKTtcblxuICAgIHJldHVybiBtZXJnZWRUaGVtZTtcbiAgfVxuXG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgb3V0ZXJUaGVtZSwgdGhlbWUpO1xufTtcblxudmFyIGNyZWF0ZUNhY2hlV2l0aFRoZW1lID0gLyogI19fUFVSRV9fICovd2Vha01lbW9pemUoZnVuY3Rpb24gKG91dGVyVGhlbWUpIHtcbiAgcmV0dXJuIHdlYWtNZW1vaXplKGZ1bmN0aW9uICh0aGVtZSkge1xuICAgIHJldHVybiBnZXRUaGVtZShvdXRlclRoZW1lLCB0aGVtZSk7XG4gIH0pO1xufSk7XG52YXIgVGhlbWVQcm92aWRlciA9IGZ1bmN0aW9uIFRoZW1lUHJvdmlkZXIocHJvcHMpIHtcbiAgdmFyIHRoZW1lID0gUmVhY3QudXNlQ29udGV4dChUaGVtZUNvbnRleHQpO1xuXG4gIGlmIChwcm9wcy50aGVtZSAhPT0gdGhlbWUpIHtcbiAgICB0aGVtZSA9IGNyZWF0ZUNhY2hlV2l0aFRoZW1lKHRoZW1lKShwcm9wcy50aGVtZSk7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGhlbWVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IHRoZW1lXG4gIH0sIHByb3BzLmNoaWxkcmVuKTtcbn07XG5mdW5jdGlvbiB3aXRoVGhlbWUoQ29tcG9uZW50KSB7XG4gIHZhciBjb21wb25lbnROYW1lID0gQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuICB2YXIgV2l0aFRoZW1lID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gcmVuZGVyKHByb3BzLCByZWYpIHtcbiAgICB2YXIgdGhlbWUgPSBSZWFjdC51c2VDb250ZXh0KFRoZW1lQ29udGV4dCk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgICAgdGhlbWU6IHRoZW1lLFxuICAgICAgcmVmOiByZWZcbiAgICB9LCBwcm9wcykpO1xuICB9KTtcbiAgV2l0aFRoZW1lLmRpc3BsYXlOYW1lID0gXCJXaXRoVGhlbWUoXCIgKyBjb21wb25lbnROYW1lICsgXCIpXCI7XG4gIHJldHVybi
1Bob2lzdE5vblJlYWN0U3RhdGljcyhXaXRoVGhlbWUsIENvbXBvbmVudCk7XG59XG5cbnZhciBoYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIHR5cGVQcm9wTmFtZSA9ICdfX0VNT1RJT05fVFlQRV9QTEVBU0VfRE9fTk9UX1VTRV9fJztcbnZhciBjcmVhdGVFbW90aW9uUHJvcHMgPSBmdW5jdGlvbiBjcmVhdGVFbW90aW9uUHJvcHModHlwZSwgcHJvcHMpIHtcblxuICB2YXIgbmV3UHJvcHMgPSB7fTtcblxuICBmb3IgKHZhciBfa2V5IGluIHByb3BzKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKHByb3BzLCBfa2V5KSkge1xuICAgICAgbmV3UHJvcHNbX2tleV0gPSBwcm9wc1tfa2V5XTtcbiAgICB9XG4gIH1cblxuICBuZXdQcm9wc1t0eXBlUHJvcE5hbWVdID0gdHlwZTsgLy8gUnVudGltZSBsYWJlbGluZyBpcyBhbiBvcHQtaW4gZmVhdHVyZSBiZWNhdXNlOlxuXG4gIHJldHVybiBuZXdQcm9wcztcbn07XG5cbnZhciBJbnNlcnRpb24gPSBmdW5jdGlvbiBJbnNlcnRpb24oX3JlZikge1xuICB2YXIgY2FjaGUgPSBfcmVmLmNhY2hlLFxuICAgICAgc2VyaWFsaXplZCA9IF9yZWYuc2VyaWFsaXplZCxcbiAgICAgIGlzU3RyaW5nVGFnID0gX3JlZi5pc1N0cmluZ1RhZztcbiAgcmVnaXN0ZXJTdHlsZXMoY2FjaGUsIHNlcmlhbGl6ZWQsIGlzU3RyaW5nVGFnKTtcbiAgdXNlSW5zZXJ0aW9uRWZmZWN0QWx3YXlzV2l0aFN5bmNGYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGluc2VydFN0eWxlcyhjYWNoZSwgc2VyaWFsaXplZCwgaXNTdHJpbmdUYWcpO1xuICB9KTtcblxuICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciBFbW90aW9uID0gLyogI19fUFVSRV9fICovd2l0aEVtb3Rpb25DYWNoZShmdW5jdGlvbiAocHJvcHMsIGNhY2hlLCByZWYpIHtcbiAgdmFyIGNzc1Byb3AgPSBwcm9wcy5jc3M7IC8vIHNvIHRoYXQgdXNpbmcgYGNzc2AgZnJvbSBgZW1vdGlvbmAgYW5kIHBhc3NpbmcgdGhlIHJlc3VsdCB0byB0aGUgY3NzIHByb3Agd29ya3NcbiAgLy8gbm90IHBhc3NpbmcgdGhlIHJlZ2lzdGVyZWQgY2FjaGUgdG8gc2VyaWFsaXplU3R5bGVzIGJlY2F1c2UgaXQgd291bGRcbiAgLy8gbWFrZSBjZXJ0YWluIGJhYmVsIG9wdGltaXNhdGlvbnMgbm90IHBvc3NpYmxlXG5cbiAgaWYgKHR5cGVvZiBjc3NQcm9wID09PSAnc3RyaW5nJyAmJiBjYWNoZS5yZWdpc3RlcmVkW2Nzc1Byb3BdICE9PSB1bmRlZmluZWQpIHtcbiAgICBjc3NQcm9wID0gY2FjaGUucmVnaXN0ZXJlZFtjc3NQcm9wXTtcbiAgfVxuXG4gIHZhciBXcmFwcGVkQ29tcG9uZW50ID0gcHJvcHNbdHlwZVByb3BOYW1lXTtcbiAgdmFyIHJlZ2lzdGVyZWRTdHlsZXMgPSBbY3NzUHJvcF07XG4gIHZhciBjbGFzc05hbWUgPSAnJztcblxuICBpZiAodHlwZW9mIHByb3BzLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjbGFzc05hbWUgPSBnZXRSZWdpc3RlcmVkU3R5bGVzKGNhY2hlLnJlZ2lzdGVyZWQsIHJlZ2lzdGVyZWRTdHlsZXMsIHByb3BzLmNsYXNzTmFtZSk7XG4gIH0gZWxzZSBpZiAocHJvcHMuY2xhc3NOYW1lICE9IG51bGwpIHtcbiAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUgKyBcIiBcIjtcbiAgfVxuXG4gIHZhciBzZXJpYWxpemVkID0gc2VyaWFsaXplU3R5bGVzKHJlZ2lzdGVyZWRTdHlsZXMsIHVuZGVmaW5lZCwgUmVhY3QudXNlQ29udGV4dChUaGVtZUNvbnRleHQpKTtcblxuICBjbGFzc05hbWUgKz0gY2FjaGUua2V5ICsgXCItXCIgKyBzZXJpYWxpemVkLm5hbWU7XG4gIHZhciBuZXdQcm9wcyA9IHt9O1xuXG4gIGZvciAodmFyIF9rZXkyIGluIHByb3BzKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKHByb3BzLCBfa2V5MikgJiYgX2tleTIgIT09ICdjc3MnICYmIF9rZXkyICE9PSB0eXBlUHJvcE5hbWUgJiYgKCFpc0RldmVsb3BtZW50ICkpIHtcbiAgICAgIG5ld1Byb3BzW19rZXkyXSA9IHByb3BzW19rZXkyXTtcbiAgICB9XG4gIH1cblxuICBuZXdQcm9wcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG5cbiAgaWYgKHJlZikge1xuICAgIG5ld1Byb3BzLnJlZiA9IHJlZjtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5zZXJ0aW9uLCB7XG4gICAgY2FjaGU6IGNhY2hlLFxuICAgIHNlcmlhbGl6ZWQ6IHNlcmlhbGl6ZWQsXG4gICAgaXNTdHJpbmdUYWc6IHR5cGVvZiBXcmFwcGVkQ29tcG9uZW50ID09PSAnc3RyaW5nJ1xuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoV3JhcHBlZENvbXBvbmVudCwgbmV3UHJvcHMpKTtcbn0pO1xuXG52YXIgRW1vdGlvbiQxID0gRW1vdGlvbjtcblxuZXhwb3J0IHsgQ2FjaGVQcm92aWRlciBhcyBDLCBFbW90aW9uJDEgYXMgRSwgVGhlbWVDb250ZXh0IGFzIFQsIF9fdW5zYWZlX3VzZUVtb3Rpb25DYWNoZSBhcyBfLCBUaGVtZVByb3ZpZGVyIGFzIGEsIHdpdGhUaGVtZSBhcyBiLCBjcmVhdGVFbW90aW9uUHJvcHMgYXMgYywgaGFzT3duIGFzIGgsIGlzRGV2ZWxvcG1lbnQgYXMgaSwgdXNlVGhlbWUgY
1XMgdSwgd2l0aEVtb3Rpb25DYWNoZSBhcyB3IH07XG4iLCJ2YXIgaXNCcm93c2VyID0gdHJ1ZTtcblxuZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZFN0eWxlcyhyZWdpc3RlcmVkLCByZWdpc3RlcmVkU3R5bGVzLCBjbGFzc05hbWVzKSB7XG4gIHZhciByYXdDbGFzc05hbWUgPSAnJztcbiAgY2xhc3NOYW1lcy5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xuICAgIGlmIChyZWdpc3RlcmVkW2NsYXNzTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVnaXN0ZXJlZFN0eWxlcy5wdXNoKHJlZ2lzdGVyZWRbY2xhc3NOYW1lXSArIFwiO1wiKTtcbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgcmF3Q2xhc3NOYW1lICs9IGNsYXNzTmFtZSArIFwiIFwiO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByYXdDbGFzc05hbWU7XG59XG52YXIgcmVnaXN0ZXJTdHlsZXMgPSBmdW5jdGlvbiByZWdpc3RlclN0eWxlcyhjYWNoZSwgc2VyaWFsaXplZCwgaXNTdHJpbmdUYWcpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IGNhY2hlLmtleSArIFwiLVwiICsgc2VyaWFsaXplZC5uYW1lO1xuXG4gIGlmICggLy8gd2Ugb25seSBuZWVkIHRvIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSByZWdpc3RlcmVkIGNhY2hlIGlmIHRoZVxuICAvLyBjbGFzcyBuYW1lIGNvdWxkIGJlIHVzZWQgZnVydGhlciBkb3duXG4gIC8vIHRoZSB0cmVlIGJ1dCBpZiBpdCdzIGEgc3RyaW5nIHRhZywgd2Uga25vdyBpdCB3b24ndFxuICAvLyBzbyB3ZSBkb24ndCBoYXZlIHRvIGFkZCBpdCB0byByZWdpc3RlcmVkIGNhY2hlLlxuICAvLyB0aGlzIGltcHJvdmVzIG1lbW9yeSB1c2FnZSBzaW5jZSB3ZSBjYW4gYXZvaWQgc3RvcmluZyB0aGUgd2hvbGUgc3R5bGUgc3RyaW5nXG4gIChpc1N0cmluZ1RhZyA9PT0gZmFsc2UgfHwgLy8gd2UgbmVlZCB0byBhbHdheXMgc3RvcmUgaXQgaWYgd2UncmUgaW4gY29tcGF0IG1vZGUgYW5kXG4gIC8vIGluIG5vZGUgc2luY2UgZW1vdGlvbi1zZXJ2ZXIgcmVsaWVzIG9uIHdoZXRoZXIgYSBzdHlsZSBpcyBpblxuICAvLyB0aGUgcmVnaXN0ZXJlZCBjYWNoZSB0byBrbm93IHdoZXRoZXIgYSBzdHlsZSBpcyBnbG9iYWwgb3Igbm90XG4gIC8vIGFsc28sIG5vdGUgdGhhdCB0aGlzIGNoZWNrIHdpbGwgYmUgZGVhZCBjb2RlIGVsaW1pbmF0ZWQgaW4gdGhlIGJyb3dzZXJcbiAgaXNCcm93c2VyID09PSBmYWxzZSApICYmIGNhY2hlLnJlZ2lzdGVyZWRbY2xhc3NOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FjaGUucmVnaXN0ZXJlZFtjbGFzc05hbWVdID0gc2VyaWFsaXplZC5zdHlsZXM7XG4gIH1cbn07XG52YXIgaW5zZXJ0U3R5bGVzID0gZnVuY3Rpb24gaW5zZXJ0U3R5bGVzKGNhY2hlLCBzZXJpYWxpemVkLCBpc1N0cmluZ1RhZykge1xuICByZWdpc3RlclN0eWxlcyhjYWNoZSwgc2VyaWFsaXplZCwgaXNTdHJpbmdUYWcpO1xuICB2YXIgY2xhc3NOYW1lID0gY2FjaGUua2V5ICsgXCItXCIgKyBzZXJpYWxpemVkLm5hbWU7XG5cbiAgaWYgKGNhY2hlLmluc2VydGVkW3NlcmlhbGl6ZWQubmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBjdXJyZW50ID0gc2VyaWFsaXplZDtcblxuICAgIGRvIHtcbiAgICAgIGNhY2hlLmluc2VydChzZXJpYWxpemVkID09PSBjdXJyZW50ID8gXCIuXCIgKyBjbGFzc05hbWUgOiAnJywgY3VycmVudCwgY2FjaGUuc2hlZXQsIHRydWUpO1xuXG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgIH0gd2hpbGUgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCk7XG4gIH1cbn07XG5cbmV4cG9ydCB7IGdldFJlZ2lzdGVyZWRTdHlsZXMsIGluc2VydFN0eWxlcywgcmVnaXN0ZXJTdHlsZXMgfTtcbiIsImltcG9ydCBtZW1vaXplIGZyb20gJ0BlbW90aW9uL21lbW9pemUnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbnZhciByZWFjdFByb3BzUmVnZXggPSAvXigoY2hpbGRyZW58ZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUx8a2V5fHJlZnxhdXRvRm9jdXN8ZGVmYXVsdFZhbHVlfGRlZmF1bHRDaGVja2VkfGlubmVySFRNTHxzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmd8c3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nfHZhbHVlTGlua3xhYmJyfGFjY2VwdHxhY2NlcHRDaGFyc2V0fGFjY2Vzc0tleXxhY3Rpb258YWxsb3d8YWxsb3dVc2VyTWVkaWF8YWxsb3dQYXltZW50UmVxdWVzdHxhbGxvd0Z1bGxTY3JlZW58YWxsb3dUcmFuc3BhcmVuY3l8YWx0fGFzeW5jfGF1dG9Db21wbGV0ZXxhdXRvUGxheXxjYXB0dXJlfGNlbGxQYWRkaW5nfGNlbGxTcGFjaW5nfGNoYWxsZW5nZXxjaGFyU2V0fGNoZWNrZWR8Y2l0ZXxjbGFzc0lEfGNsYXNzTmFtZXxjb2xzfGNvbFNwYW58Y29udGVudHxjb250ZW50RWRpdGFibGV8Y29udGV4dE1lbnV8Y29udHJvbHN8Y29udHJvbHNMaXN0fGNvb3Jkc3xjcm9zc09yaWdpbnxkYXRhfGRhdGVUaW1lfGRlY29kaW5nfGRlZmF1bHR8ZGVmZXJ8ZGlyfGRpc2FibGVkfGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlfGRpc2FibGVSZW1vdGVQbGF5YmFja3xkb3dubG9hZHxkcmFnZ2FibGV8ZW5jVHlwZXxlbnRlcktleUhpbnR8ZmV0Y2hwcmlvcml0eXxmZXRjaFByaW9yaXR5fGZvcm18Zm9ybUFjdGlvbnxmb3JtRW5jVHlwZXxmb3JtTWV0aG9kfGZvcm1Ob1ZhbGlkYXRlfGZvcm1UYXJnZXR8ZnJhbWVCb3JkZXJ8aGVhZGVyc3xoZWlnaHR8aGlkZGVufGhpZ2h8aHJlZnxocmVmTGFuZ3xodG1sRm9yfGh0dHBFcXVpdnxpZHxpbnB1dE1vZGV8aW50ZWdyaXR5fGlzfGtleVBhcmFtc3xrZXlUeXBlfGtpbmR8bGFiZWx8bGFuZ3xsaXN0fGxvYWRpbmd8bG9vcHxsb3d8bWFyZ2luSGVpZ2h0fG1hcmdpbldpZHRofG1heHxtYXhMZW5ndGh8bWVkaWF8bWVkaWFHcm91cHxtZXRob2R8bWlufG1pbkxlbmd0aHxtdWx0aXBsZXxtdXRlZHxuYW1lfG5vbmNlfG5vVmFsaWRhdGV8b3BlbnxvcHRpbXVtfHBhdHRlcm58cGxhY2Vob2xkZXJ8cGxheXNJbmxpbmV8cG9wb3Zlcnxwb3BvdmVyVGFyZ2V0fHBvcG92ZXJUYXJnZXRBY3Rpb258cG9zdGVyfHByZWxvYWR8cHJvZmlsZXxyYWRpb0dyb3VwfHJlYWRPbmx5fHJlZmVycmVyUG9saWN5fHJlbHxyZXF1aXJlZHxyZXZlcnNlZHxyb2xlfHJvd3N8cm93U3BhbnxzYW5kYm94fHNjb3BlfHNjb3BlZHxzY3JvbGxpbmd8c2VhbWxlc3N8c2
1VsZWN0ZWR8c2hhcGV8c2l6ZXxzaXplc3xzbG90fHNwYW58c3BlbGxDaGVja3xzcmN8c3JjRG9jfHNyY0xhbmd8c3JjU2V0fHN0YXJ0fHN0ZXB8c3R5bGV8c3VtbWFyeXx0YWJJbmRleHx0YXJnZXR8dGl0bGV8dHJhbnNsYXRlfHR5cGV8dXNlTWFwfHZhbHVlfHdpZHRofHdtb2RlfHdyYXB8YWJvdXR8ZGF0YXR5cGV8aW5saXN0fHByZWZpeHxwcm9wZXJ0eXxyZXNvdXJjZXx0eXBlb2Z8dm9jYWJ8YXV0b0NhcGl0YWxpemV8YXV0b0NvcnJlY3R8YXV0b1NhdmV8Y29sb3J8aW5jcmVtZW50YWx8ZmFsbGJhY2t8aW5lcnR8aXRlbVByb3B8aXRlbVNjb3BlfGl0ZW1UeXBlfGl0ZW1JRHxpdGVtUmVmfG9ufG9wdGlvbnxyZXN1bHRzfHNlY3VyaXR5fHVuc2VsZWN0YWJsZXxhY2NlbnRIZWlnaHR8YWNjdW11bGF0ZXxhZGRpdGl2ZXxhbGlnbm1lbnRCYXNlbGluZXxhbGxvd1Jlb3JkZXJ8YWxwaGFiZXRpY3xhbXBsaXR1ZGV8YXJhYmljRm9ybXxhc2NlbnR8YXR0cmlidXRlTmFtZXxhdHRyaWJ1dGVUeXBlfGF1dG9SZXZlcnNlfGF6aW11dGh8YmFzZUZyZXF1ZW5jeXxiYXNlbGluZVNoaWZ0fGJhc2VQcm9maWxlfGJib3h8YmVnaW58Ymlhc3xieXxjYWxjTW9kZXxjYXBIZWlnaHR8Y2xpcHxjbGlwUGF0aFVuaXRzfGNsaXBQYXRofGNsaXBSdWxlfGNvbG9ySW50ZXJwb2xhdGlvbnxjb2xvckludGVycG9sYXRpb25GaWx0ZXJzfGNvbG9yUHJvZmlsZXxjb2xvclJlbmRlcmluZ3xjb250ZW50U2NyaXB0VHlwZXxjb250ZW50U3R5bGVUeXBlfGN1cnNvcnxjeHxjeXxkfGRlY2VsZXJhdGV8ZGVzY2VudHxkaWZmdXNlQ29uc3RhbnR8ZGlyZWN0aW9ufGRpc3BsYXl8ZGl2aXNvcnxkb21pbmFudEJhc2VsaW5lfGR1cnxkeHxkeXxlZGdlTW9kZXxlbGV2YXRpb258ZW5hYmxlQmFja2dyb3VuZHxlbmR8ZXhwb25lbnR8ZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZHxmaWxsfGZpbGxPcGFjaXR5fGZpbGxSdWxlfGZpbHRlcnxmaWx0ZXJSZXN8ZmlsdGVyVW5pdHN8Zmxvb2RDb2xvcnxmbG9vZE9wYWNpdHl8Zm9jdXNhYmxlfGZvbnRGYW1pbHl8Zm9udFNpemV8Zm9udFNpemVBZGp1c3R8Zm9udFN0cmV0Y2h8Zm9udFN0eWxlfGZvbnRWYXJpYW50fGZvbnRXZWlnaHR8Zm9ybWF0fGZyb218ZnJ8Znh8Znl8ZzF8ZzJ8Z2x5cGhOYW1lfGdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsfGdseXBoT3JpZW50YXRpb25WZXJ0aWNhbHxnbHlwaFJlZnxncmFkaWVudFRyYW5zZm9ybXxncmFkaWVudFVuaXRzfGhhbmdpbmd8aG9yaXpBZHZYfGhvcml6T3JpZ2luWHxpZGVvZ3JhcGhpY3xpbWFnZVJlbmRlcmluZ3xpbnxpbjJ8aW50ZXJjZXB0fGt8azF8azJ8azN8azR8a2VybmVsTWF0cml4fGtlcm5lbFVuaXRMZW5ndGh8a2VybmluZ3xrZXlQb2ludHN8a2V5U3BsaW5lc3xrZXlUaW1lc3xsZW5ndGhBZGp1c3R8bGV0dGVyU3BhY2luZ3xsaWdodGluZ0NvbG9yfGxpbWl0aW5nQ29uZUFuZ2xlfGxvY2FsfG1hcmtlckVuZHxtYXJrZXJNaWR8bWFya2VyU3RhcnR8bWFya2VySGVpZ2h0fG1hcmtlclVuaXRzfG1hcmtlcldpZHRofG1hc2t8bWFza0NvbnRlbnRVbml0c3xtYXNrVW5pdHN8bWF0aGVtYXRpY2FsfG1vZGV8bnVtT2N0YXZlc3xvZmZzZXR8b3BhY2l0eXxvcGVyYXRvcnxvcmRlcnxvcmllbnR8b3JpZW50YXRpb258b3JpZ2lufG92ZXJmbG93fG92ZXJsaW5lUG9zaXRpb258b3ZlcmxpbmVUaGlja25lc3N8cGFub3NlMXxwYWludE9yZGVyfHBhdGhMZW5ndGh8cGF0dGVybkNvbnRlbnRVbml0c3xwYXR0ZXJuVHJhbnNmb3JtfHBhdHRlcm5Vbml0c3xwb2ludGVyRXZlbnRzfHBvaW50c3xwb2ludHNBdFh8cG9pbnRzQXRZfHBvaW50c0F0WnxwcmVzZXJ2ZUFscGhhfHByZXNlcnZlQXNwZWN0UmF0aW98cHJpbWl0aXZlVW5pdHN8cnxyYWRpdXN8cmVmWHxyZWZZfHJlbmRlcmluZ0ludGVudHxyZXBlYXRDb3VudHxyZXBlYXREdXJ8cmVxdWlyZWRFeHRlbnNpb25zfHJlcXVpcmVkRmVhdHVyZXN8cmVzdGFydHxyZXN1bHR8cm90YXRlfHJ4fHJ5fHNjYWxlfHNlZWR8c2hhcGVSZW5kZXJpbmd8c2xvcGV8c3BhY2luZ3xzcGVjdWxhckNvbnN0YW50fHNwZWN1bGFyRXhwb25lbnR8c3BlZWR8c3ByZWFkTWV0aG9kfHN0YXJ0T2Zmc2V0fHN0ZERldmlhdGlvbnxzdGVtaHxzdGVtdnxzdGl0Y2hUaWxlc3xzdG9wQ29sb3J8c3RvcE9wYWNpdHl8c3RyaWtldGhyb3VnaFBvc2l0aW9ufHN0cmlrZXRocm91Z2hUaGlja25lc3N8c3RyaW5nfHN0cm9rZXxzdHJva2VEYXNoYXJyYXl8c3Ryb2tlRGFzaG9mZnNldHxzdHJva2VMaW5lY2FwfHN0cm9rZUxpbmVqb2lufHN0cm9rZU1pdGVybGltaXR8c3Ryb2tlT3BhY2l0eXxzdHJva2VXaWR0aHxzdXJmYWNlU2NhbGV8c3lzdGVtTGFuZ3VhZ2V8dGFibGVWYWx1ZXN8dGFyZ2V0WHx0YXJnZXRZfHRleHRBbmNob3J8dGV4dERlY29yYXRpb258dGV4dFJlbmRlcmluZ3x0ZXh0TGVuZ3RofHRvfHRyYW5zZm9ybXx1MXx1Mnx1bmRlcmxpbmVQb3NpdGlvbnx1bmRlcmxpbmVUaGlja25lc3N8dW5pY29kZXx1bmljb2RlQmlkaXx1bmljb2RlUmFuZ2V8dW5pdHNQZXJFbXx2QWxwaGFiZXRpY3x2SGFuZ2luZ3x2SWRlb2dyYXBoaWN8dk1hdGhlbWF0aWNhbHx2YWx1ZXN8dmVjdG9yRWZmZWN0fHZlcnNpb258dmVydEFkdll8dmVydE9yaWdpblh8dmVydE9yaWdpbll8dmlld0JveHx2aWV3VGFyZ2V0fHZpc2liaWxpdHl8d2lkdGhzfHdvcmRTcGFjaW5nfHdyaXRpbmdNb2RlfHh8eEhlaWdodHx4MXx4Mnx4Q2hhbm5lbFNlbGVjdG9yfHhsaW5rQWN0dWF0ZXx4bGlua0FyY3JvbGV8eGxpbmtIcmVmfHhsaW5rUm9sZXx4bGlua1Nob3d8eGxpbmtUaXRsZXx4bGlua1R5cGV8eG1sQmFzZXx4bWxuc3x4bWxuc1hsaW5rfHhtbExhbmd8eG1sU3BhY2V8eXx5MXx5Mnx5Q2hhbm5lbFNlbGVjdG9yfHp8em9vbUFuZFBhbnxmb3J8Y2xhc3N8YXV0b2ZvY3VzKXwoKFtEZF1bQWFdW1R0XVtBYV18W0FhXVtScl1bSWldW0FhXXx4KS0uKikpJC87IC8vIGh0dHBzOi8vZXNiZW5jaC5jb20vYmVuY2gvNWJmZWU2OGE0Y2Q3ZTYwMDllZjYxZDIzXG5cbnZhciBpc1Byb3BWYWxpZCA9IC8qICNfX1BVUkVfXyAqL21lbW9pemUoZnVuY3Rpb24gKHByb3ApIHtcbiAgcmV0dXJuIHJlYWN0UHJvcHNSZWdleC50ZXN0KHByb3ApIHx8IHByb3AuY2hhckNvZGVBdCgwKSA9PT0gMTExXG4gIC8qIG8gKi9cbiAgJiYgcHJvcC5jaGFyQ29kZUF0KDEpID09PSAxMTBcbiAgLyogbiAqL1xuICAmJiBwcm9wLmNoYXJDb2RlQXQoMikgPCA5MTtcbn1cbi8qIForMSAqL1xuKTtcblxuZXhwb3J0IHsgaXNQcm9wVmFsaWQgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0IF9leHRlbmRzIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMnO1xuaW1wb3J0IHsgd2l0aEVtb3Rpb25DYWNoZSwgVGhlbWVDb250ZXh0IH0gZnJvbSAnQG
1Vtb3Rpb24vcmVhY3QnO1xuaW1wb3J0IHsgc2VyaWFsaXplU3R5bGVzIH0gZnJvbSAnQGVtb3Rpb24vc2VyaWFsaXplJztcbmltcG9ydCB7IHVzZUluc2VydGlvbkVmZmVjdEFsd2F5c1dpdGhTeW5jRmFsbGJhY2sgfSBmcm9tICdAZW1vdGlvbi91c2UtaW5zZXJ0aW9uLWVmZmVjdC13aXRoLWZhbGxiYWNrcyc7XG5pbXBvcnQgeyBnZXRSZWdpc3RlcmVkU3R5bGVzLCByZWdpc3RlclN0eWxlcywgaW5zZXJ0U3R5bGVzIH0gZnJvbSAnQGVtb3Rpb24vdXRpbHMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGlzUHJvcFZhbGlkIGZyb20gJ0BlbW90aW9uL2lzLXByb3AtdmFsaWQnO1xuXG52YXIgaXNEZXZlbG9wbWVudCA9IGZhbHNlO1xuXG52YXIgdGVzdE9taXRQcm9wc09uU3RyaW5nVGFnID0gaXNQcm9wVmFsaWQ7XG5cbnZhciB0ZXN0T21pdFByb3BzT25Db21wb25lbnQgPSBmdW5jdGlvbiB0ZXN0T21pdFByb3BzT25Db21wb25lbnQoa2V5KSB7XG4gIHJldHVybiBrZXkgIT09ICd0aGVtZSc7XG59O1xuXG52YXIgZ2V0RGVmYXVsdFNob3VsZEZvcndhcmRQcm9wID0gZnVuY3Rpb24gZ2V0RGVmYXVsdFNob3VsZEZvcndhcmRQcm9wKHRhZykge1xuICByZXR1cm4gdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgJiYgLy8gOTYgaXMgb25lIGxlc3MgdGhhbiB0aGUgY2hhciBjb2RlXG4gIC8vIGZvciBcImFcIiBzbyB0aGlzIGlzIGNoZWNraW5nIHRoYXRcbiAgLy8gaXQncyBhIGxvd2VyY2FzZSBjaGFyYWN0ZXJcbiAgdGFnLmNoYXJDb2RlQXQoMCkgPiA5NiA/IHRlc3RPbWl0UHJvcHNPblN0cmluZ1RhZyA6IHRlc3RPbWl0UHJvcHNPbkNvbXBvbmVudDtcbn07XG52YXIgY29tcG9zZVNob3VsZEZvcndhcmRQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvc2VTaG91bGRGb3J3YXJkUHJvcHModGFnLCBvcHRpb25zLCBpc1JlYWwpIHtcbiAgdmFyIHNob3VsZEZvcndhcmRQcm9wO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgdmFyIG9wdGlvbnNTaG91bGRGb3J3YXJkUHJvcCA9IG9wdGlvbnMuc2hvdWxkRm9yd2FyZFByb3A7XG4gICAgc2hvdWxkRm9yd2FyZFByb3AgPSB0YWcuX19lbW90aW9uX2ZvcndhcmRQcm9wICYmIG9wdGlvbnNTaG91bGRGb3J3YXJkUHJvcCA/IGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgcmV0dXJuIHRhZy5fX2Vtb3Rpb25fZm9yd2FyZFByb3AocHJvcE5hbWUpICYmIG9wdGlvbnNTaG91bGRGb3J3YXJkUHJvcChwcm9wTmFtZSk7XG4gICAgfSA6IG9wdGlvbnNTaG91bGRGb3J3YXJkUHJvcDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2hvdWxkRm9yd2FyZFByb3AgIT09ICdmdW5jdGlvbicgJiYgaXNSZWFsKSB7XG4gICAgc2hvdWxkRm9yd2FyZFByb3AgPSB0YWcuX19lbW90aW9uX2ZvcndhcmRQcm9wO1xuICB9XG5cbiAgcmV0dXJuIHNob3VsZEZvcndhcmRQcm9wO1xufTtcblxudmFyIEluc2VydGlvbiA9IGZ1bmN0aW9uIEluc2VydGlvbihfcmVmKSB7XG4gIHZhciBjYWNoZSA9IF9yZWYuY2FjaGUsXG4gICAgICBzZXJpYWxpemVkID0gX3JlZi5zZXJpYWxpemVkLFxuICAgICAgaXNTdHJpbmdUYWcgPSBfcmVmLmlzU3RyaW5nVGFnO1xuICByZWdpc3RlclN0eWxlcyhjYWNoZSwgc2VyaWFsaXplZCwgaXNTdHJpbmdUYWcpO1xuICB1c2VJbnNlcnRpb25FZmZlY3RBbHdheXNXaXRoU3luY0ZhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW5zZXJ0U3R5bGVzKGNhY2hlLCBzZXJpYWxpemVkLCBpc1N0cmluZ1RhZyk7XG4gIH0pO1xuXG4gIHJldHVybiBudWxsO1xufTtcblxudmFyIGNyZWF0ZVN0eWxlZCA9IGZ1bmN0aW9uIGNyZWF0ZVN0eWxlZCh0YWcsIG9wdGlvbnMpIHtcblxuICB2YXIgaXNSZWFsID0gdGFnLl9fZW1vdGlvbl9yZWFsID09PSB0YWc7XG4gIHZhciBiYXNlVGFnID0gaXNSZWFsICYmIHRhZy5fX2Vtb3Rpb25fYmFzZSB8fCB0YWc7XG4gIHZhciBpZGVudGlmaWVyTmFtZTtcbiAgdmFyIHRhcmdldENsYXNzTmFtZTtcblxuICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWRlbnRpZmllck5hbWUgPSBvcHRpb25zLmxhYmVsO1xuICAgIHRhcmdldENsYXNzTmFtZSA9IG9wdGlvbnMudGFyZ2V0O1xuICB9XG5cbiAgdmFyIHNob3VsZEZvcndhcmRQcm9wID0gY29tcG9zZVNob3VsZEZvcndhcmRQcm9wcyh0YWcsIG9wdGlvbnMsIGlzUmVhbCk7XG4gIHZhciBkZWZhdWx0U2hvdWxkRm9yd2FyZFByb3AgPSBzaG91bGRGb3J3YXJkUHJvcCB8fCBnZXREZWZhdWx0U2hvdWxkRm9yd2FyZFByb3AoYmFzZVRhZyk7XG4gIHZhciBzaG91bGRVc2VBcyA9ICFkZWZhdWx0U2hvdWxkRm9yd2FyZFByb3AoJ2FzJyk7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciBzdHlsZXMgPSBpc1JlYWwgJiYgdGFnLl9fZW1vdGlvbl9zdHlsZXMgIT09IHVuZGVmaW5lZCA/IHRhZy5fX2Vtb3Rpb25fc3R5bGVzLnNsaWNlKDApIDogW107XG5cbiAgICBpZiAoaWRlbnRpZmllck5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3R5bGVzLnB1c2goXCJsYWJlbDpcIiArIGlkZW50aWZpZXJOYW1lICsgXCI7XCIpO1xuICAgIH1cblxuICAgIGlmIChhcmdzWzBdID09IG51bGwgfHwgYXJnc1swXS5yYXcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1zcHJlYWRcbiAgICAgIHN0eWxlcy5wdXNoLmFwcGx5KHN0eWxlcywgYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0ZW1wbGF0ZVN0cmluZ3NBcnIgPSBhcmdzWzBdO1xuXG4gICAgICBzdHlsZXMucHVzaCh0ZW1wbGF0ZVN0cmluZ3NBcnJbMF0pO1xuICAgICAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICAgICAgdmFyIGkgPSAxO1xuXG4gICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG5cbiAgICAgICAgc3R5bGVzLnB1c2goYXJnc1tpXSwgdGVtcGxhdGVTdHJpbmdzQXJyW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgU3R5bGVkID0gd2l0aEVtb3Rpb25DYWNoZShmdW5jdGlvbiAocHJvcHMsIGNhY2hlLCByZWYpIHtcbiAgICAgIHZhciBGaW5hbFRhZyA9IHNob3VsZFVzZUFzICYmIHByb3BzLmFzIHx8IGJhc2VUYWc7XG4gICAgICB2Y
1XIgY2xhc3NOYW1lID0gJyc7XG4gICAgICB2YXIgY2xhc3NJbnRlcnBvbGF0aW9ucyA9IFtdO1xuICAgICAgdmFyIG1lcmdlZFByb3BzID0gcHJvcHM7XG5cbiAgICAgIGlmIChwcm9wcy50aGVtZSA9PSBudWxsKSB7XG4gICAgICAgIG1lcmdlZFByb3BzID0ge307XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgICAgICAgbWVyZ2VkUHJvcHNba2V5XSA9IHByb3BzW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICBtZXJnZWRQcm9wcy50aGVtZSA9IFJlYWN0LnVzZUNvbnRleHQoVGhlbWVDb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5jbGFzc05hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNsYXNzTmFtZSA9IGdldFJlZ2lzdGVyZWRTdHlsZXMoY2FjaGUucmVnaXN0ZXJlZCwgY2xhc3NJbnRlcnBvbGF0aW9ucywgcHJvcHMuY2xhc3NOYW1lKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvcHMuY2xhc3NOYW1lICE9IG51bGwpIHtcbiAgICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lICsgXCIgXCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBzZXJpYWxpemVkID0gc2VyaWFsaXplU3R5bGVzKHN0eWxlcy5jb25jYXQoY2xhc3NJbnRlcnBvbGF0aW9ucyksIGNhY2hlLnJlZ2lzdGVyZWQsIG1lcmdlZFByb3BzKTtcbiAgICAgIGNsYXNzTmFtZSArPSBjYWNoZS5rZXkgKyBcIi1cIiArIHNlcmlhbGl6ZWQubmFtZTtcblxuICAgICAgaWYgKHRhcmdldENsYXNzTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNsYXNzTmFtZSArPSBcIiBcIiArIHRhcmdldENsYXNzTmFtZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpbmFsU2hvdWxkRm9yd2FyZFByb3AgPSBzaG91bGRVc2VBcyAmJiBzaG91bGRGb3J3YXJkUHJvcCA9PT0gdW5kZWZpbmVkID8gZ2V0RGVmYXVsdFNob3VsZEZvcndhcmRQcm9wKEZpbmFsVGFnKSA6IGRlZmF1bHRTaG91bGRGb3J3YXJkUHJvcDtcbiAgICAgIHZhciBuZXdQcm9wcyA9IHt9O1xuXG4gICAgICBmb3IgKHZhciBfa2V5IGluIHByb3BzKSB7XG4gICAgICAgIGlmIChzaG91bGRVc2VBcyAmJiBfa2V5ID09PSAnYXMnKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoZmluYWxTaG91bGRGb3J3YXJkUHJvcChfa2V5KSkge1xuICAgICAgICAgIG5ld1Byb3BzW19rZXldID0gcHJvcHNbX2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbmV3UHJvcHMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuXG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIG5ld1Byb3BzLnJlZiA9IHJlZjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnNlcnRpb24sIHtcbiAgICAgICAgY2FjaGU6IGNhY2hlLFxuICAgICAgICBzZXJpYWxpemVkOiBzZXJpYWxpemVkLFxuICAgICAgICBpc1N0cmluZ1RhZzogdHlwZW9mIEZpbmFsVGFnID09PSAnc3RyaW5nJ1xuICAgICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZpbmFsVGFnLCBuZXdQcm9wcykpO1xuICAgIH0pO1xuICAgIFN0eWxlZC5kaXNwbGF5TmFtZSA9IGlkZW50aWZpZXJOYW1lICE9PSB1bmRlZmluZWQgPyBpZGVudGlmaWVyTmFtZSA6IFwiU3R5bGVkKFwiICsgKHR5cGVvZiBiYXNlVGFnID09PSAnc3RyaW5nJyA/IGJhc2VUYWcgOiBiYXNlVGFnLmRpc3BsYXlOYW1lIHx8IGJhc2VUYWcubmFtZSB8fCAnQ29tcG9uZW50JykgKyBcIilcIjtcbiAgICBTdHlsZWQuZGVmYXVsdFByb3BzID0gdGFnLmRlZmF1bHRQcm9wcztcbiAgICBTdHlsZWQuX19lbW90aW9uX3JlYWwgPSBTdHlsZWQ7XG4gICAgU3R5bGVkLl9fZW1vdGlvbl9iYXNlID0gYmFzZVRhZztcbiAgICBTdHlsZWQuX19lbW90aW9uX3N0eWxlcyA9IHN0eWxlcztcbiAgICBTdHlsZWQuX19lbW90aW9uX2ZvcndhcmRQcm9wID0gc2hvdWxkRm9yd2FyZFByb3A7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0eWxlZCwgJ3RvU3RyaW5nJywge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgICBpZiAodGFyZ2V0Q2xhc3NOYW1lID09PSB1bmRlZmluZWQgJiYgaXNEZXZlbG9wbWVudCkge1xuICAgICAgICAgIHJldHVybiAnTk9fQ09NUE9ORU5UX1NFTEVDVE9SJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIi5cIiArIHRhcmdldENsYXNzTmFtZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIFN0eWxlZC53aXRoQ29tcG9uZW50ID0gZnVuY3Rpb24gKG5leHRUYWcsIG5leHRPcHRpb25zKSB7XG4gICAgICB2Y
1XIgbmV3U3R5bGVkID0gY3JlYXRlU3R5bGVkKG5leHRUYWcsIF9leHRlbmRzKHt9LCBvcHRpb25zLCBuZXh0T3B0aW9ucywge1xuICAgICAgICBzaG91bGRGb3J3YXJkUHJvcDogY29tcG9zZVNob3VsZEZvcndhcmRQcm9wcyhTdHlsZWQsIG5leHRPcHRpb25zLCB0cnVlKVxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIG5ld1N0eWxlZC5hcHBseSh2b2lkIDAsIHN0eWxlcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBTdHlsZWQ7XG4gIH07XG59O1xuXG5leHBvcnQgeyBjcmVhdGVTdHlsZWQgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0IGNyZWF0ZVN0eWxlZCBmcm9tICcuLi9iYXNlL2Rpc3QvZW1vdGlvbi1zdHlsZWQtYmFzZS5icm93c2VyLmVzbS5qcyc7XG5pbXBvcnQgJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcyc7XG5pbXBvcnQgJ0BlbW90aW9uL3JlYWN0JztcbmltcG9ydCAnQGVtb3Rpb24vc2VyaWFsaXplJztcbmltcG9ydCAnQGVtb3Rpb24vdXNlLWluc2VydGlvbi1lZmZlY3Qtd2l0aC1mYWxsYmFja3MnO1xuaW1wb3J0ICdAZW1vdGlvbi91dGlscyc7XG5pbXBvcnQgJ3JlYWN0JztcbmltcG9ydCAnQGVtb3Rpb24vaXMtcHJvcC12YWxpZCc7XG5cbnZhciB0YWdzID0gWydhJywgJ2FiYnInLCAnYWRkcmVzcycsICdhcmVhJywgJ2FydGljbGUnLCAnYXNpZGUnLCAnYXVkaW8nLCAnYicsICdiYXNlJywgJ2JkaScsICdiZG8nLCAnYmlnJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FudmFzJywgJ2NhcHRpb24nLCAnY2l0ZScsICdjb2RlJywgJ2NvbCcsICdjb2xncm91cCcsICdkYXRhJywgJ2RhdGFsaXN0JywgJ2RkJywgJ2RlbCcsICdkZXRhaWxzJywgJ2RmbicsICdkaWFsb2cnLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtJywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2knLCAnaWZyYW1lJywgJ2ltZycsICdpbnB1dCcsICdpbnMnLCAna2JkJywgJ2tleWdlbicsICdsYWJlbCcsICdsZWdlbmQnLCAnbGknLCAnbGluaycsICdtYWluJywgJ21hcCcsICdtYXJrJywgJ21hcnF1ZWUnLCAnbWVudScsICdtZW51aXRlbScsICdtZXRhJywgJ21ldGVyJywgJ25hdicsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAnb3B0Z3JvdXAnLCAnb3B0aW9uJywgJ291dHB1dCcsICdwJywgJ3BhcmFtJywgJ3BpY3R1cmUnLCAncHJlJywgJ3Byb2dyZXNzJywgJ3EnLCAncnAnLCAncnQnLCAncnVieScsICdzJywgJ3NhbXAnLCAnc2NyaXB0JywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NtYWxsJywgJ3NvdXJjZScsICdzcGFuJywgJ3N0cm9uZycsICdzdHlsZScsICdzdWInLCAnc3VtbWFyeScsICdzdXAnLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGltZScsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1JywgJ3VsJywgJ3ZhcicsICd2aWRlbycsICd3YnInLCAvLyBTVkdcbidjaXJjbGUnLCAnY2xpcFBhdGgnLCAnZGVmcycsICdlbGxpcHNlJywgJ2ZvcmVpZ25PYmplY3QnLCAnZycsICdpbWFnZScsICdsaW5lJywgJ2xpbmVhckdyYWRpZW50JywgJ21hc2snLCAncGF0aCcsICdwYXR0ZXJuJywgJ3BvbHlnb24nLCAncG9seWxpbmUnLCAncmFkaWFsR3JhZGllbnQnLCAncmVjdCcsICdzdG9wJywgJ3N2ZycsICd0ZXh0JywgJ3RzcGFuJ107XG5cbi8vIGJpbmQgaXQgdG8gYXZvaWQgbXV0YXRpbmcgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uXG52YXIgc3R5bGVkID0gY3JlYXRlU3R5bGVkLmJpbmQobnVsbCk7XG50YWdzLmZvckVhY2goZnVuY3Rpb24gKHRhZ05hbWUpIHtcbiAgc3R5bGVkW3RhZ05hbWVdID0gc3R5bGVkKHRhZ05hbWUpO1xufSk7XG5cbmV4cG9ydCB7IHN0eWxlZCBhcyBkZWZhdWx0IH07XG4iLCIvKipcbiAqIEBtdWkvc3R5bGVkLWVuZ2luZSB2Ny4zLjdcbiAqXG4gKiBAbGljZW5zZSBNSVRcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4ndXNlIGNsaWVudCc7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG5pbXBvcnQgZW1TdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCB7IHNlcmlhbGl6ZVN0eWxlcyBhcyBlbVNlcmlhbGl6ZVN0eWxlcyB9IGZyb20gJ0BlbW90aW9uL3NlcmlhbGl6ZSc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdHlsZWQodGFnLCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0eWxlc0ZhY3RvcnkgPSBlbVN0eWxlZCh0YWcsIG9wdGlvbnMpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHJldHVybiAoLi4uc3R5bGVzKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyA/IGBcIiR7dGFnfVwiYCA6ICdjb21wb25lbnQnO1xuICAgICAgaWYgKHN0eWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihbYE1VSTogU2VlbXMgbGlrZSB5b3UgY2FsbGVkIFxcYHN0eWxlZCgke2NvbXBvbmVudH0pKClcXGAgd2l0aG91dCBhIFxcYHN0eWxlXFxgIGFyZ3VtZW50LmAsICdZb3UgbXVzdCBwcm92aWRlIGEgYHN0eWxlc2AgYXJndW1lbnQ6IGBzdHlsZWQoXCJkaXZcIikoc3R5bGVZb3VGb3Jnb3RUb1Bhc3MpYC4nXS5qb2luKCdcXG4nKSk7XG4gICAgICB9IGVsc2UgaWYgKHN0eWxlcy5zb21lKHN0eWxlID0+IHN0eWxlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE1VSTogdGhlIHN0eWxlZCgke2NvbXBvbmVudH0pKC4uLmFyZ3MpIEFQSSByZXF1aXJlcyBhbGwgaXRzIGFyZ3MgdG8gYmUgZGVmaW5lZC5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHlsZXNGYWN0b3J5KC4uLnN0eWxlcyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gc3R5bGVzRmFjdG9yeTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsX211dGF0ZVN0eWxlcyh0YWcsIHByb2Nlc3Nvcikge1xuICAvLyBFbW90aW9uIGF0dGFjaGVzIGFsbCB0aGUgc3R5bGVzIGFzIGBfX2Vtb3Rpb25fc3R5bGVzYC5cbiAgLy8gUmVmOiBodHRwczovL2dpdGh1Yi5jb20vZW1vdGlvbi1qcy9lbW90aW9uL2Jsb2IvMTZkOTcxZDBkYTIyOTU5NmQ2YmNjMzlkMjgyYmE5NzUzYzllZTdjZi9wYWNrYWdlcy9zdHlsZWQvc3JjL2Jhc2UuanMjTDE4NlxuICBpZiAoQXJyYXkuaXNBcnJheSh0YWcuX19lbW90aW9uX3
1N0eWxlcykpIHtcbiAgICB0YWcuX19lbW90aW9uX3N0eWxlcyA9IHByb2Nlc3Nvcih0YWcuX19lbW90aW9uX3N0eWxlcyk7XG4gIH1cbn1cblxuLy8gRW1vdGlvbiBvbmx5IGFjY2VwdHMgYW4gYXJyYXksIGJ1dCB3ZSB3YW50IHRvIGF2b2lkIGFsbG9jYXRpb25zXG5jb25zdCB3cmFwcGVyID0gW107XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJuYWxfc2VyaWFsaXplU3R5bGVzKHN0eWxlcykge1xuICB3cmFwcGVyWzBdID0gc3R5bGVzO1xuICByZXR1cm4gZW1TZXJpYWxpemVTdHlsZXMod3JhcHBlcik7XG59XG5leHBvcnQgeyBUaGVtZUNvbnRleHQsIGtleWZyYW1lcywgY3NzIH0gZnJvbSAnQGVtb3Rpb24vcmVhY3QnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTdHlsZWRFbmdpbmVQcm92aWRlciB9IGZyb20gXCIuL1N0eWxlZEVuZ2luZVByb3ZpZGVyL2luZGV4LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEdsb2JhbFN0eWxlcyB9IGZyb20gXCIuL0dsb2JhbFN0eWxlcy9pbmRleC5qc1wiOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzVmFsaWRFbGVtZW50VHlwZSB9IGZyb20gJ3JlYWN0LWlzJztcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9pcy1wbGFpbi1vYmovYmxvYi9tYWluL2luZGV4LmpzXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdChpdGVtKSB7XG4gIGlmICh0eXBlb2YgaXRlbSAhPT0gJ29iamVjdCcgfHwgaXRlbSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoaXRlbSk7XG4gIHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gaXRlbSkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gaXRlbSk7XG59XG5mdW5jdGlvbiBkZWVwQ2xvbmUoc291cmNlKSB7XG4gIGlmICgvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoc291cmNlKSB8fCBpc1ZhbGlkRWxlbWVudFR5cGUoc291cmNlKSB8fCAhaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgb3V0cHV0W2tleV0gPSBkZWVwQ2xvbmUoc291cmNlW2tleV0pO1xuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBNZXJnZSBvYmplY3RzIGRlZXBseS5cbiAqIEl0IHdpbGwgc2hhbGxvdyBjb3B5IFJlYWN0IGVsZW1lbnRzLlxuICpcbiAqIElmIGBvcHRpb25zLmNsb25lYCBpcyBzZXQgdG8gYGZhbHNlYCB0aGUgc291cmNlIG9iamVjdCB3aWxsIGJlIG1lcmdlZCBkaXJlY3RseSBpbnRvIHRoZSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogZGVlcG1lcmdlKHsgYTogeyBiOiAxIH0sIGQ6IDIgfSwgeyBhOiB7IGM6IDIgfSwgZDogNCB9KTtcbiAqIC8vID0+IHsgYTogeyBiOiAxLCBjOiAyIH0sIGQ6IDQgfVxuICogYGBgYFxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIG9wdGlvbnMgVGhlIG1lcmdlIG9wdGlvbnMuXG4gKiBAcGFyYW0gb3B0aW9ucy5jbG9uZSBTZXQgdG8gYGZhbHNlYCB0byBtZXJnZSB0aGUgc291cmNlIG9iamVjdCBkaXJlY3RseSBpbnRvIHRoZSB0YXJnZXQgb2JqZWN0LlxuICogQHJldHVybnMgVGhlIG1lcmdlZCBvYmplY3QuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlZXBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucyA9IHtcbiAgY2xvbmU6IHRydWVcbn0pIHtcbiAgY29uc3Qgb3V0cHV0ID0gb3B0aW9ucy5jbG9uZSA/IHtcbiAgICAuLi50YXJnZXRcbiAgfSA6IHRhcmdldDtcbiAgaWYgKGlzUGxhaW5PYmplY3QodGFyZ2V0KSAmJiBpc1BsYWluT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICgvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoc291cmNlW2tleV0pIHx8IGlzVmFsaWRFbGVtZW50VHlwZShzb3VyY2Vba2V5XSkpIHtcbiAgICAgICAgb3V0cHV0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzb3VyY2Vba2V5XSkgJiZcbiAgICAgIC8vIEF2b2lkIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkgJiYgaXNQbGFpbk9iamVjdCh0YXJnZXRba2V5XSkpIHtcbiAgICAgICAgLy8gU2luY2UgYG91dHB1dGAgaXMgYSBjbG9uZSBvZiBgdGFyZ2V0YCBhbmQgd2UgaGF2ZSBuYXJyb3dlZCBgdGFyZ2V0YCBpbiB0aGlzIGJsb2NrIHdlIGNhbiBjYXN0IHRvIHRoZSBzYW1lIHR5cGUuXG4gICAgICAgIG91dHB1dFtrZXldID0gZGVlcG1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuY2xvbmUpIHtcbiAgICAgICAgb3V0cHV0W2tleV0gPSBpc1BsYWluT2JqZWN0KHNvdXJjZVtrZXldKSA/IGRlZXBDbG9uZShzb3VyY2Vba2V5XSkgOiBzb3VyY2Vba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn0iLCIvLyBTb3J0ZWQgQVNDIGJ5IHNpemUuIFRoYXQncyBpbXBvcnRhbnQuXG4vLyBJdCBjYW4ndCBiZSBjb25maWd1cmVkIGFzIGl0J3MgdXNlZCBzdGF0aWNhbGx5IGZvciBwcm9wVHlwZXMuXG5leHBvcnQgY29uc3QgYnJlYWtwb2ludEtleXMgPSBbJ3hzJywgJ3NtJywgJ21kJywgJ2xnJywgJ3hsJ107XG5jb25zdCBzb3J0QnJlYWtwb2ludHNWYWx1ZXMgPSB2YWx1ZXMgPT4ge1xuICBjb25zdCBicmVha3BvaW50c0FzQXJyYXkgPSBPYmplY3Qua2V5cyh2YWx1ZXMpLm1hcChrZXkgPT4gKHtcbiAgICBrZXksXG4gICAgdmFsOiB2YWx1ZXNba2V5XVxuICB9KSkgfHwgW107XG4gIC8vIFNvcnQgaW4gYXNjZW5kaW5nIG9yZGVyXG4gIGJyZWFrcG9pbnRzQXNBcnJheS5zb3J0KChicmVha3BvaW50MSwgYnJlYWtwb2ludDIpID0+IGJyZWFrcG9pbnQxLnZhbCAtIGJyZWFrcG9pbnQyLnZhbCk7XG4gIHJldHVybi
1BicmVha3BvaW50c0FzQXJyYXkucmVkdWNlKChhY2MsIG9iaikgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5hY2MsXG4gICAgICBbb2JqLmtleV06IG9iai52YWxcbiAgICB9O1xuICB9LCB7fSk7XG59O1xuXG4vLyBLZWVwIGluIG1pbmQgdGhhdCBAbWVkaWEgaXMgaW5jbHVzaXZlIGJ5IHRoZSBDU1Mgc3BlY2lmaWNhdGlvbi5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzKSB7XG4gIGNvbnN0IHtcbiAgICAvLyBUaGUgYnJlYWtwb2ludCAqKnN0YXJ0KiogYXQgdGhpcyB2YWx1ZS5cbiAgICAvLyBGb3IgaW5zdGFuY2Ugd2l0aCB0aGUgZmlyc3QgYnJlYWtwb2ludCB4czogW3hzLCBzbSkuXG4gICAgdmFsdWVzID0ge1xuICAgICAgeHM6IDAsXG4gICAgICAvLyBwaG9uZVxuICAgICAgc206IDYwMCxcbiAgICAgIC8vIHRhYmxldFxuICAgICAgbWQ6IDkwMCxcbiAgICAgIC8vIHNtYWxsIGxhcHRvcFxuICAgICAgbGc6IDEyMDAsXG4gICAgICAvLyBkZXNrdG9wXG4gICAgICB4bDogMTUzNiAvLyBsYXJnZSBzY3JlZW5cbiAgICB9LFxuICAgIHVuaXQgPSAncHgnLFxuICAgIHN0ZXAgPSA1LFxuICAgIC4uLm90aGVyXG4gIH0gPSBicmVha3BvaW50cztcbiAgY29uc3Qgc29ydGVkVmFsdWVzID0gc29ydEJyZWFrcG9pbnRzVmFsdWVzKHZhbHVlcyk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzb3J0ZWRWYWx1ZXMpO1xuICBmdW5jdGlvbiB1cChrZXkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiB2YWx1ZXNba2V5XSA9PT0gJ251bWJlcicgPyB2YWx1ZXNba2V5XSA6IGtleTtcbiAgICByZXR1cm4gYEBtZWRpYSAobWluLXdpZHRoOiR7dmFsdWV9JHt1bml0fSlgO1xuICB9XG4gIGZ1bmN0aW9uIGRvd24oa2V5KSB7XG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgdmFsdWVzW2tleV0gPT09ICdudW1iZXInID8gdmFsdWVzW2tleV0gOiBrZXk7XG4gICAgcmV0dXJuIGBAbWVkaWEgKG1heC13aWR0aDoke3ZhbHVlIC0gc3RlcCAvIDEwMH0ke3VuaXR9KWA7XG4gIH1cbiAgZnVuY3Rpb24gYmV0d2VlbihzdGFydCwgZW5kKSB7XG4gICAgY29uc3QgZW5kSW5kZXggPSBrZXlzLmluZGV4T2YoZW5kKTtcbiAgICByZXR1cm4gYEBtZWRpYSAobWluLXdpZHRoOiR7dHlwZW9mIHZhbHVlc1tzdGFydF0gPT09ICdudW1iZXInID8gdmFsdWVzW3N0YXJ0XSA6IHN0YXJ0fSR7dW5pdH0pIGFuZCBgICsgYChtYXgtd2lkdGg6JHsoZW5kSW5kZXggIT09IC0xICYmIHR5cGVvZiB2YWx1ZXNba2V5c1tlbmRJbmRleF1dID09PSAnbnVtYmVyJyA/IHZhbHVlc1trZXlzW2VuZEluZGV4XV0gOiBlbmQpIC0gc3RlcCAvIDEwMH0ke3VuaXR9KWA7XG4gIH1cbiAgZnVuY3Rpb24gb25seShrZXkpIHtcbiAgICBpZiAoa2V5cy5pbmRleE9mKGtleSkgKyAxIDwga2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBiZXR3ZWVuKGtleSwga2V5c1trZXlzLmluZGV4T2Yoa2V5KSArIDFdKTtcbiAgICB9XG4gICAgcmV0dXJuIHVwKGtleSk7XG4gIH1cbiAgZnVuY3Rpb24gbm90KGtleSkge1xuICAgIC8vIGhhbmRsZSBmaXJzdCBhbmQgbGFzdCBrZXkgc2VwYXJhdGVseSwgZm9yIGJldHRlciByZWFkYWJpbGl0eVxuICAgIGNvbnN0IGtleUluZGV4ID0ga2V5cy5pbmRleE9mKGtleSk7XG4gICAgaWYgKGtleUluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gdXAoa2V5c1sxXSk7XG4gICAgfVxuICAgIGlmIChrZXlJbmRleCA9PT0ga2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gZG93bihrZXlzW2tleUluZGV4XSk7XG4gICAgfVxuICAgIHJldHVybiBiZXR3ZWVuKGtleSwga2V5c1trZXlzLmluZGV4T2Yoa2V5KSArIDFdKS5yZXBsYWNlKCdAbWVkaWEnLCAnQG1lZGlhIG5vdCBhbGwgYW5kJyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBrZXlzLFxuICAgIHZhbHVlczogc29ydGVkVmFsdWVzLFxuICAgIHVwLFxuICAgIGRvd24sXG4gICAgYmV0d2VlbixcbiAgICBvbmx5LFxuICAgIG5vdCxcbiAgICB1bml0LFxuICAgIC4uLm90aGVyXG4gIH07XG59IiwiaW1wb3J0IF9mb3JtYXRFcnJvck1lc3NhZ2UgZnJvbSBcIkBtdWkvdXRpbHMvZm9ybWF0TXVpRXJyb3JNZXNzYWdlXCI7XG4vKipcbiAqIEZvciB1c2luZyBpbiBgc3hgIHByb3AgdG8gc29ydCB0aGUgYnJlYWtwb2ludCBmcm9tIGxvdyB0byBoaWdoLlxuICogTm90ZTogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3b3JrIGFuZCB3aWxsIG5vdCBzdXBwb3J0IG11bHRpcGxlIHVuaXRzLlxuICogICAgICAgZS5nLiBpbnB1dDogeyAnQGNvbnRhaW5lciAobWluLXdpZHRoOjMwMHB4KSc6ICcxcmVtJywgJ0Bjb250YWluZXIgKG1pbi13aWR0aDo0MHJlbSknOiAnMnJlbScgfVxuICogICAgICAgICAgICBvdXRwdXQ6IHsgJ0Bjb250YWluZXIgKG1pbi13aWR0aDo0MHJlbSknOiAnMnJlbScsICdAY29udGFpbmVyIChtaW4td2lkdGg6MzAwcHgpJzogJzFyZW0nIH0gLy8gc2luY2UgNDAgPCAzMDAgZXZlbiB0aG91Z2ggNDByZW0gPiAzMDBweFxuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydENvbnRhaW5lclF1ZXJpZXModGhlbWUsIGNzcykge1xuICBpZiAoIXRoZW1lLmNvbnRhaW5lclF1ZXJpZXMpIHtcbiAgICByZXR1cm4gY3NzO1xuICB9XG4gIGNvbnN0IHNvcnRlZCA9IE9iamVjdC5rZXlzKGNzcykuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aCgnQGNvbnRhaW5lcicpKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgcmVnZXggPSAvbWluLXdpZHRoOlxccyooWzAtOS5dKykvO1xuICAgIHJldHVybiArKGEubWF0Y2gocmVnZXgpPy5bMV0gfHwgMCkgLSArKGIubWF0Y2gocmVnZXgpPy5bMV0gfHwgMCk7XG4gIH0pO1xuICBpZiAoIXNvcnRlZC5sZW5ndGgpIHtcbiAgICByZXR1cm4gY3NzO1xuICB9XG4gIHJldHVybiBzb3J0ZWQucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gY3NzW2tleV07XG4gICAgZGVsZXRlIGFjY1trZXldO1xuICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge1xuICAgIC4uLmNzc1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NxU2hvcnRoYW5kKGJyZWFrcG9pbnRLZXlzLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09ICdAJyB8fCB2YWx1ZS
15zdGFydHNXaXRoKCdAJykgJiYgKGJyZWFrcG9pbnRLZXlzLnNvbWUoa2V5ID0+IHZhbHVlLnN0YXJ0c1dpdGgoYEAke2tleX1gKSkgfHwgISF2YWx1ZS5tYXRjaCgvXkBcXGQvKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udGFpbmVyUXVlcnkodGhlbWUsIHNob3J0aGFuZCkge1xuICBjb25zdCBtYXRjaGVzID0gc2hvcnRoYW5kLm1hdGNoKC9eQChbXi9dKyk/XFwvPyguKyk/JC8pO1xuICBpZiAoIW1hdGNoZXMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGBNVUk6IFRoZSBwcm92aWRlZCBzaG9ydGhhbmQgJHtgKCR7c2hvcnRoYW5kfSlgfSBpcyBpbnZhbGlkLiBUaGUgZm9ybWF0IHNob3VsZCBiZSBcXGBAPGJyZWFrcG9pbnQgfCBudW1iZXI+XFxgIG9yIFxcYEA8YnJlYWtwb2ludCB8IG51bWJlcj4vPGNvbnRhaW5lcj5cXGAuXFxuYCArICdGb3IgZXhhbXBsZSwgYEBzbWAgb3IgYEA2MDBgIG9yIGBANDByZW0vc2lkZWJhcmAuJyA6IF9mb3JtYXRFcnJvck1lc3NhZ2UoMTgsIGAoJHtzaG9ydGhhbmR9KWApKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgWywgY29udGFpbmVyUXVlcnksIGNvbnRhaW5lck5hbWVdID0gbWF0Y2hlcztcbiAgY29uc3QgdmFsdWUgPSBOdW1iZXIuaXNOYU4oK2NvbnRhaW5lclF1ZXJ5KSA/IGNvbnRhaW5lclF1ZXJ5IHx8IDAgOiArY29udGFpbmVyUXVlcnk7XG4gIHJldHVybiB0aGVtZS5jb250YWluZXJRdWVyaWVzKGNvbnRhaW5lck5hbWUpLnVwKHZhbHVlKTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNzc0NvbnRhaW5lclF1ZXJpZXModGhlbWVJbnB1dCkge1xuICBjb25zdCB0b0NvbnRhaW5lclF1ZXJ5ID0gKG1lZGlhUXVlcnksIG5hbWUpID0+IG1lZGlhUXVlcnkucmVwbGFjZSgnQG1lZGlhJywgbmFtZSA/IGBAY29udGFpbmVyICR7bmFtZX1gIDogJ0Bjb250YWluZXInKTtcbiAgZnVuY3Rpb24gYXR0YWNoQ3Eobm9kZSwgbmFtZSkge1xuICAgIG5vZGUudXAgPSAoLi4uYXJncykgPT4gdG9Db250YWluZXJRdWVyeSh0aGVtZUlucHV0LmJyZWFrcG9pbnRzLnVwKC4uLmFyZ3MpLCBuYW1lKTtcbiAgICBub2RlLmRvd24gPSAoLi4uYXJncykgPT4gdG9Db250YWluZXJRdWVyeSh0aGVtZUlucHV0LmJyZWFrcG9pbnRzLmRvd24oLi4uYXJncyksIG5hbWUpO1xuICAgIG5vZGUuYmV0d2VlbiA9ICguLi5hcmdzKSA9PiB0b0NvbnRhaW5lclF1ZXJ5KHRoZW1lSW5wdXQuYnJlYWtwb2ludHMuYmV0d2VlbiguLi5hcmdzKSwgbmFtZSk7XG4gICAgbm9kZS5vbmx5ID0gKC4uLmFyZ3MpID0+IHRvQ29udGFpbmVyUXVlcnkodGhlbWVJbnB1dC5icmVha3BvaW50cy5vbmx5KC4uLmFyZ3MpLCBuYW1lKTtcbiAgICBub2RlLm5vdCA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0b0NvbnRhaW5lclF1ZXJ5KHRoZW1lSW5wdXQuYnJlYWtwb2ludHMubm90KC4uLmFyZ3MpLCBuYW1lKTtcbiAgICAgIGlmIChyZXN1bHQuaW5jbHVkZXMoJ25vdCBhbGwgYW5kJykpIHtcbiAgICAgICAgLy8gYEBjb250YWluZXJgIGRvZXMgbm90IHdvcmsgd2l0aCBgbm90IGFsbCBhbmRgLCBzbyBuZWVkIHRvIGludmVydCB0aGUgbG9naWNcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXBsYWNlKCdub3QgYWxsIGFuZCAnLCAnJykucmVwbGFjZSgnbWluLXdpZHRoOicsICd3aWR0aDwnKS5yZXBsYWNlKCdtYXgtd2lkdGg6JywgJ3dpZHRoPicpLnJlcGxhY2UoJ2FuZCcsICdvcicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9XG4gIGNvbnN0IG5vZGUgPSB7fTtcbiAgY29uc3QgY29udGFpbmVyUXVlcmllcyA9IG5hbWUgPT4ge1xuICAgIGF0dGFjaENxKG5vZGUsIG5hbWUpO1xuICAgIHJldHVybiBub2RlO1xuICB9O1xuICBhdHRhY2hDcShjb250YWluZXJRdWVyaWVzKTtcbiAgcmV0dXJuIHtcbiAgICAuLi50aGVtZUlucHV0LFxuICAgIGNvbnRhaW5lclF1ZXJpZXNcbiAgfTtcbn0iLCJjb25zdCBzaGFwZSA9IHtcbiAgYm9yZGVyUmFkaXVzOiA0XG59O1xuZXhwb3J0IGRlZmF1bHQgc2hhcGU7IiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnQG11aS91dGlscy9kZWVwbWVyZ2UnO1xuaW1wb3J0IG1lcmdlIGZyb20gXCIuLi9tZXJnZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgaXNDcVNob3J0aGFuZCwgZ2V0Q29udGFpbmVyUXVlcnkgfSBmcm9tIFwiLi4vY3NzQ29udGFpbmVyUXVlcmllcy9pbmRleC5qc1wiO1xuXG4vLyBUaGUgYnJlYWtwb2ludCAqKnN0YXJ0KiogYXQgdGhpcyB2YWx1ZS5cbi8vIEZvciBpbnN0YW5jZSB3aXRoIHRoZSBmaXJzdCBicmVha3BvaW50IHhzOiBbeHMsIHNtWy5cbmV4cG9ydCBjb25zdCB2YWx1ZXMgPSB7XG4gIHhzOiAwLFxuICAvLyBwaG9uZVxuICBzbTogNjAwLFxuICAvLyB0YWJsZXRcbiAgbWQ6IDkwMCxcbiAgLy8gc21hbGwgbGFwdG9wXG4gIGxnOiAxMjAwLFxuICAvLyBkZXNrdG9wXG4gIHhsOiAxNTM2IC8vIGxhcmdlIHNjcmVlblxufTtcbmNvbnN0IGRlZmF1bHRCcmVha3BvaW50cyA9IHtcbiAgLy8gU29ydGVkIEFTQyBieSBzaXplLiBUaGF0J3MgaW1wb3J0YW50LlxuICAvLyBJdCBjYW4ndCBiZSBjb25maWd1cmVkIGFzIGl0J3MgdXNlZCBzdGF0aWNhbGx5IGZvciBwcm9wVHlwZXMuXG4gIGtleXM6IFsneHMnLCAnc20nLCAnbWQnLCAnbGcnLCAneGwnXSxcbiAgdXA6IGtleSA9PiBgQG1lZGlhIChtaW4td2lkdGg6JHt2YWx1ZXNba2V5XX1weClgXG59O1xuY29uc3QgZGVmYXVsdENvbnRhaW5lclF1ZXJpZXMgPSB7XG4gIGNvbnRhaW5lclF1ZXJpZXM6IGNvbnRhaW5lck5hbWUgPT4gKHtcbiAgICB1cDoga2V5ID0+IHtcbiAgICAgIGxldCByZXN1bHQgPSB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJyA/IGtleSA6IHZhbHVlc1trZXldIHx8IGtleTtcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXN1bHQgPSBgJHtyZXN1bHR9cHhgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRhaW5lck5hbWUgPyBgQGNvbnRhaW5lciAke2NvbnRhaW5lck5hbWV9IChtaW4td2lkdGg6JHtyZXN1bHR9KWAgOiBgQGNvbnRhaW5lciAobWluLXdpZHRoOiR7cmVzdWx0fSlgO1xuICAgIH1cbiAgfSlcbn07XG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlQnJlYWtwb2ludHMocHJvcHMsIHByb3BWYWx1ZSwgc3R5bGVGcm9tUHJvcFZhbHVlKSB7XG4gIGNvbnN0IHRoZW1lID0gcHJvcHMudGhlbWUgfHwge307XG4gIGlmIChBcnJheS5pc0FycmF
15KHByb3BWYWx1ZSkpIHtcbiAgICBjb25zdCB0aGVtZUJyZWFrcG9pbnRzID0gdGhlbWUuYnJlYWtwb2ludHMgfHwgZGVmYXVsdEJyZWFrcG9pbnRzO1xuICAgIHJldHVybiBwcm9wVmFsdWUucmVkdWNlKChhY2MsIGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBhY2NbdGhlbWVCcmVha3BvaW50cy51cCh0aGVtZUJyZWFrcG9pbnRzLmtleXNbaW5kZXhdKV0gPSBzdHlsZUZyb21Qcm9wVmFsdWUocHJvcFZhbHVlW2luZGV4XSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgfVxuICBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCB0aGVtZUJyZWFrcG9pbnRzID0gdGhlbWUuYnJlYWtwb2ludHMgfHwgZGVmYXVsdEJyZWFrcG9pbnRzO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhwcm9wVmFsdWUpLnJlZHVjZSgoYWNjLCBicmVha3BvaW50KSA9PiB7XG4gICAgICBpZiAoaXNDcVNob3J0aGFuZCh0aGVtZUJyZWFrcG9pbnRzLmtleXMsIGJyZWFrcG9pbnQpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lcktleSA9IGdldENvbnRhaW5lclF1ZXJ5KHRoZW1lLmNvbnRhaW5lclF1ZXJpZXMgPyB0aGVtZSA6IGRlZmF1bHRDb250YWluZXJRdWVyaWVzLCBicmVha3BvaW50KTtcbiAgICAgICAgaWYgKGNvbnRhaW5lcktleSkge1xuICAgICAgICAgIGFjY1tjb250YWluZXJLZXldID0gc3R5bGVGcm9tUHJvcFZhbHVlKHByb3BWYWx1ZVticmVha3BvaW50XSwgYnJlYWtwb2ludCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGtleSBpcyBicmVha3BvaW50XG4gICAgICBlbHNlIGlmIChPYmplY3Qua2V5cyh0aGVtZUJyZWFrcG9pbnRzLnZhbHVlcyB8fCB2YWx1ZXMpLmluY2x1ZGVzKGJyZWFrcG9pbnQpKSB7XG4gICAgICAgIGNvbnN0IG1lZGlhS2V5ID0gdGhlbWVCcmVha3BvaW50cy51cChicmVha3BvaW50KTtcbiAgICAgICAgYWNjW21lZGlhS2V5XSA9IHN0eWxlRnJvbVByb3BWYWx1ZShwcm9wVmFsdWVbYnJlYWtwb2ludF0sIGJyZWFrcG9pbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY3NzS2V5ID0gYnJlYWtwb2ludDtcbiAgICAgICAgYWNjW2Nzc0tleV0gPSBwcm9wVmFsdWVbY3NzS2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuICB9XG4gIGNvbnN0IG91dHB1dCA9IHN0eWxlRnJvbVByb3BWYWx1ZShwcm9wVmFsdWUpO1xuICByZXR1cm4gb3V0cHV0O1xufVxuZnVuY3Rpb24gYnJlYWtwb2ludHMoc3R5bGVGdW5jdGlvbikge1xuICAvLyBmYWxzZSBwb3NpdGl2ZVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvZnVuY3Rpb24tY29tcG9uZW50LWRlZmluaXRpb25cbiAgY29uc3QgbmV3U3R5bGVGdW5jdGlvbiA9IHByb3BzID0+IHtcbiAgICBjb25zdCB0aGVtZSA9IHByb3BzLnRoZW1lIHx8IHt9O1xuICAgIGNvbnN0IGJhc2UgPSBzdHlsZUZ1bmN0aW9uKHByb3BzKTtcbiAgICBjb25zdCB0aGVtZUJyZWFrcG9pbnRzID0gdGhlbWUuYnJlYWtwb2ludHMgfHwgZGVmYXVsdEJyZWFrcG9pbnRzO1xuICAgIGNvbnN0IGV4dGVuZGVkID0gdGhlbWVCcmVha3BvaW50cy5rZXlzLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgIGlmIChwcm9wc1trZXldKSB7XG4gICAgICAgIGFjYyA9IGFjYyB8fCB7fTtcbiAgICAgICAgYWNjW3RoZW1lQnJlYWtwb2ludHMudXAoa2V5KV0gPSBzdHlsZUZ1bmN0aW9uKHtcbiAgICAgICAgICB0aGVtZSxcbiAgICAgICAgICAuLi5wcm9wc1trZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBudWxsKTtcbiAgICByZXR1cm4gbWVyZ2UoYmFzZSwgZXh0ZW5kZWQpO1xuICB9O1xuICBuZXdTdHlsZUZ1bmN0aW9uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB7XG4gICAgLi4uc3R5bGVGdW5jdGlvbi5wcm9wVHlwZXMsXG4gICAgeHM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgc206IFByb3BUeXBlcy5vYmplY3QsXG4gICAgbWQ6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgbGc6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgeGw6IFByb3BUeXBlcy5vYmplY3RcbiAgfSA6IHt9O1xuICBuZXdTdHlsZUZ1bmN0aW9uLmZpbHRlclByb3BzID0gWyd4cycsICdzbScsICdtZCcsICdsZycsICd4bCcsIC4uLnN0eWxlRnVuY3Rpb24uZmlsdGVyUHJvcHNdO1xuICByZXR1cm4gbmV3U3R5bGVGdW5jdGlvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbXB0eUJyZWFrcG9pbnRPYmplY3QoYnJlYWtwb2ludHNJbnB1dCA9IHt9KSB7XG4gIGNvbnN0IGJyZWFrcG9pbnRzSW5PcmRlciA9IGJyZWFrcG9pbnRzSW5wdXQua2V5cz8ucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgIGNvbnN0IGJyZWFrcG9pbnRTdHlsZUtleSA9IGJyZWFrcG9pbnRzSW5wdXQudXAoa2V5KTtcbiAgICBhY2NbYnJlYWtwb2ludFN0eWxlS2V5XSA9IHt9O1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIGJyZWFrcG9pbnRzSW5PcmRlciB8fCB7fTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVVbnVzZWRCcmVha3BvaW50cyhicmVha3BvaW50S2V5cywgc3R5bGUpIHtcbiAgcmV0dXJuIGJyZWFrcG9pbnRLZXlzLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICBjb25zdCBicmVha3BvaW50T3V0cHV0ID0gYWNjW2tleV07XG4gICAgY29uc3QgaXNCcmVha3BvaW50VW51c2VkID0gIWJyZWFrcG9pbnRPdXRwdXQgfHwgT2JqZWN0LmtleXMoYnJlYWtwb2ludE91dHB1dCkubGVuZ3RoID09PSAwO1xuICAgIGlmIChpc0JyZWFrcG9pbnRVbnVzZWQpIHtcbiAgICAgIGRlbGV0ZSBhY2Nba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgc3R5bGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQnJlYWtwb2ludHNJbk9yZGVyKGJyZWFrcG9pbnRzSW5wdXQsIC4uLnN0eWxlcykge1xuICBjb25zdCBlbXB0eUJyZWFrcG9pbnRzID0gY3JlYXRlRW1wdHlCcmVha3BvaW50T2JqZWN0KGJyZWFrcG9pbnRzSW5wdXQpO1xuICBjb25zdCBtZXJnZWRPdXRwdXQgPSBbZW1wdHlCcmVha3BvaW50cywgLi4uc3R5bGVzXS5yZWR1Y2UoKHByZXYsIG5leHQpID0+IGRlZXBtZXJnZShwcmV2LCBuZXh0KSwge30pO1xuICByZXR1cm4gcmVtb3ZlVW51c2VkQnJlYWtwb2ludHMoT2JqZWN0LmtleXMoZW1wdHlCcmVha3BvaW50cyksIG1lcmdlZE91dHB1dCk7XG59XG5cbi8vIGNvbXB1dGUgYmFzZSBmb3IgcmVzcG9uc2l2ZSB2YWx1ZXM7IGUuZy4sXG4vLyBbMSwyLDNdID0+IHt4czogdHJ1ZSwgc206IHRydWUsIG1kOiB0cnVlfVxuLy8ge3hzOiAxLCBzbTogMiwgbWQ6IDN9ID0+IHt4czogdHJ1ZSwgc206IHRydWUsIG1kOiB0cnVlfVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVCcmVha3BvaW50c0Jhc2UoYnJlYWtwb2ludFZhbHVlcywgdGhlbWVCcmVha3BvaW50cykge1xuICAvLyBmaXhlZCB2YWx1ZVxuICBpZiAodHlwZW9mIGJyZWFrcG9pbnRWYWx1ZXMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGNvbnN0IGJhc2UgPSB7fTtcbiAgY29uc3QgYnJlYWtwb2ludHNLZXlzID0gT2JqZWN0LmtleXModGhlbWVCcmVha3BvaW50cyk7XG4gIGlmIChBcnJheS5pc0FycmF
15KGJyZWFrcG9pbnRWYWx1ZXMpKSB7XG4gICAgYnJlYWtwb2ludHNLZXlzLmZvckVhY2goKGJyZWFrcG9pbnQsIGkpID0+IHtcbiAgICAgIGlmIChpIDwgYnJlYWtwb2ludFZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgYmFzZVticmVha3BvaW50XSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgYnJlYWtwb2ludHNLZXlzLmZvckVhY2goYnJlYWtwb2ludCA9PiB7XG4gICAgICBpZiAoYnJlYWtwb2ludFZhbHVlc1ticmVha3BvaW50XSAhPSBudWxsKSB7XG4gICAgICAgIGJhc2VbYnJlYWtwb2ludF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBiYXNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCcmVha3BvaW50VmFsdWVzKHtcbiAgdmFsdWVzOiBicmVha3BvaW50VmFsdWVzLFxuICBicmVha3BvaW50czogdGhlbWVCcmVha3BvaW50cyxcbiAgYmFzZTogY3VzdG9tQmFzZVxufSkge1xuICBjb25zdCBiYXNlID0gY3VzdG9tQmFzZSB8fCBjb21wdXRlQnJlYWtwb2ludHNCYXNlKGJyZWFrcG9pbnRWYWx1ZXMsIHRoZW1lQnJlYWtwb2ludHMpO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYmFzZSk7XG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBicmVha3BvaW50VmFsdWVzO1xuICB9XG4gIGxldCBwcmV2aW91cztcbiAgcmV0dXJuIGtleXMucmVkdWNlKChhY2MsIGJyZWFrcG9pbnQsIGkpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShicmVha3BvaW50VmFsdWVzKSkge1xuICAgICAgYWNjW2JyZWFrcG9pbnRdID0gYnJlYWtwb2ludFZhbHVlc1tpXSAhPSBudWxsID8gYnJlYWtwb2ludFZhbHVlc1tpXSA6IGJyZWFrcG9pbnRWYWx1ZXNbcHJldmlvdXNdO1xuICAgICAgcHJldmlvdXMgPSBpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJyZWFrcG9pbnRWYWx1ZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBhY2NbYnJlYWtwb2ludF0gPSBicmVha3BvaW50VmFsdWVzW2JyZWFrcG9pbnRdICE9IG51bGwgPyBicmVha3BvaW50VmFsdWVzW2JyZWFrcG9pbnRdIDogYnJlYWtwb2ludFZhbHVlc1twcmV2aW91c107XG4gICAgICBwcmV2aW91cyA9IGJyZWFrcG9pbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjY1ticmVha3BvaW50XSA9IGJyZWFrcG9pbnRWYWx1ZXM7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn1cbmV4cG9ydCBkZWZhdWx0IGJyZWFrcG9pbnRzOyIsImltcG9ydCBjYXBpdGFsaXplIGZyb20gJ0BtdWkvdXRpbHMvY2FwaXRhbGl6ZSc7XG5pbXBvcnQgcmVzcG9uc2l2ZVByb3BUeXBlIGZyb20gXCIuLi9yZXNwb25zaXZlUHJvcFR5cGUvaW5kZXguanNcIjtcbmltcG9ydCB7IGhhbmRsZUJyZWFrcG9pbnRzIH0gZnJvbSBcIi4uL2JyZWFrcG9pbnRzL2luZGV4LmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aChvYmosIHBhdGgsIGNoZWNrVmFycyA9IHRydWUpIHtcbiAgaWYgKCFwYXRoIHx8IHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgQ1NTIHZhcmlhYmxlcyBhcmUgdXNlZFxuICBpZiAob2JqICYmIG9iai52YXJzICYmIGNoZWNrVmFycykge1xuICAgIGNvbnN0IHZhbCA9IGB2YXJzLiR7cGF0aH1gLnNwbGl0KCcuJykucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyAmJiBhY2NbaXRlbV0gPyBhY2NbaXRlbV0gOiBudWxsLCBvYmopO1xuICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKGFjYywgaXRlbSkgPT4ge1xuICAgIGlmIChhY2MgJiYgYWNjW2l0ZW1dICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBhY2NbaXRlbV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LCBvYmopO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlVmFsdWUodGhlbWVNYXBwaW5nLCB0cmFuc2Zvcm0sIHByb3BWYWx1ZUZpbmFsLCB1c2VyVmFsdWUgPSBwcm9wVmFsdWVGaW5hbCkge1xuICBsZXQgdmFsdWU7XG4gIGlmICh0eXBlb2YgdGhlbWVNYXBwaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFsdWUgPSB0aGVtZU1hcHBpbmcocHJvcFZhbHVlRmluYWwpO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhlbWVNYXBwaW5nKSkge1xuICAgIHZhbHVlID0gdGhlbWVNYXBwaW5nW3Byb3BWYWx1ZUZpbmFsXSB8fCB1c2VyVmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBnZXRQYXRoKHRoZW1lTWFwcGluZywgcHJvcFZhbHVlRmluYWwpIHx8IHVzZXJWYWx1ZTtcbiAgfVxuICBpZiAodHJhbnNmb3JtKSB7XG4gICAgdmFsdWUgPSB0cmFuc2Zvcm0odmFsdWUsIHVzZXJWYWx1ZSwgdGhlbWVNYXBwaW5nKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBzdHlsZShvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBwcm9wLFxuICAgIGNzc1Byb3BlcnR5ID0gb3B0aW9ucy5wcm9wLFxuICAgIHRoZW1lS2V5LFxuICAgIHRyYW5zZm9ybVxuICB9ID0gb3B0aW9ucztcblxuICAvLyBmYWxzZSBwb3NpdGl2ZVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvZnVuY3Rpb24tY29tcG9uZW50LWRlZmluaXRpb25cbiAgY29uc3QgZm4gPSBwcm9wcyA9PiB7XG4gICAgaWYgKHByb3BzW3Byb3BdID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBwcm9wVmFsdWUgPSBwcm9wc1twcm9wXTtcbiAgICBjb25zdCB0aGVtZSA9IHByb3BzLnRoZW1lO1xuICAgIGNvbnN0IHRoZW1lTWFwcGluZyA9IGdldFBhdGgodGhlbWUsIHRoZW1lS2V5KSB8fCB7fTtcbiAgICBjb25zdCBzdHlsZUZyb21Qcm9wVmFsdWUgPSBwcm9wVmFsdWVGaW5hbCA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBnZXRTdHlsZVZhbHVlKHRoZW1lTWFwcGluZywgdHJhbnNmb3JtLCBwcm9wVmFsdWVGaW5hbCk7XG4gICAgICBpZiAocHJvcFZhbHVlRmluYWwgPT09IHZhbHVlICYmIHR5cGVvZiBwcm9wVmFsdWVGaW5hbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gSGF2ZW4ndCBmb3VuZCB2YWx1ZVxuICAgICAgICB2YWx1ZSA9IGdldFN0eWxlVmFsdWUodGhlbWVNYXBwaW5nLCB0cmFuc2Zvcm0sIGAke3Byb3B9JHtwcm9wVmFsdWVGaW5hbCA9PT0gJ2RlZmF1bHQnID8gJycgOiBjYXBpdGFsaXplKHByb3BWYWx1ZUZpbmFsKX1gLCBwcm9wVmFsdWVGaW5hbCk7XG4gICAgICB9XG4gICAgICBpZiAoY3NzUHJvcGVydHkgPT09IGZhbHNlKSB7XG4gICAgICAgI
1HJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtjc3NQcm9wZXJ0eV06IHZhbHVlXG4gICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIGhhbmRsZUJyZWFrcG9pbnRzKHByb3BzLCBwcm9wVmFsdWUsIHN0eWxlRnJvbVByb3BWYWx1ZSk7XG4gIH07XG4gIGZuLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB7XG4gICAgW3Byb3BdOiByZXNwb25zaXZlUHJvcFR5cGVcbiAgfSA6IHt9O1xuICBmbi5maWx0ZXJQcm9wcyA9IFtwcm9wXTtcbiAgcmV0dXJuIGZuO1xufVxuZXhwb3J0IGRlZmF1bHQgc3R5bGU7IiwiaW1wb3J0IGRlZXBtZXJnZSBmcm9tICdAbXVpL3V0aWxzL2RlZXBtZXJnZSc7XG5mdW5jdGlvbiBtZXJnZShhY2MsIGl0ZW0pIHtcbiAgaWYgKCFpdGVtKSB7XG4gICAgcmV0dXJuIGFjYztcbiAgfVxuICByZXR1cm4gZGVlcG1lcmdlKGFjYywgaXRlbSwge1xuICAgIGNsb25lOiBmYWxzZSAvLyBObyBuZWVkIHRvIGNsb25lIGRlZXAsIGl0J3Mgd2F5IGZhc3Rlci5cbiAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBtZXJnZTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZW1vaXplKGZuKSB7XG4gIGNvbnN0IGNhY2hlID0ge307XG4gIHJldHVybiBhcmcgPT4ge1xuICAgIGlmIChjYWNoZVthcmddID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhY2hlW2FyZ10gPSBmbihhcmcpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVbYXJnXTtcbiAgfTtcbn0iLCJpbXBvcnQgcmVzcG9uc2l2ZVByb3BUeXBlIGZyb20gXCIuLi9yZXNwb25zaXZlUHJvcFR5cGUvaW5kZXguanNcIjtcbmltcG9ydCB7IGhhbmRsZUJyZWFrcG9pbnRzIH0gZnJvbSBcIi4uL2JyZWFrcG9pbnRzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSBcIi4uL3N0eWxlL2luZGV4LmpzXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcIi4uL21lcmdlL2luZGV4LmpzXCI7XG5pbXBvcnQgbWVtb2l6ZSBmcm9tIFwiLi4vbWVtb2l6ZS9pbmRleC5qc1wiO1xuY29uc3QgcHJvcGVydGllcyA9IHtcbiAgbTogJ21hcmdpbicsXG4gIHA6ICdwYWRkaW5nJ1xufTtcbmNvbnN0IGRpcmVjdGlvbnMgPSB7XG4gIHQ6ICdUb3AnLFxuICByOiAnUmlnaHQnLFxuICBiOiAnQm90dG9tJyxcbiAgbDogJ0xlZnQnLFxuICB4OiBbJ0xlZnQnLCAnUmlnaHQnXSxcbiAgeTogWydUb3AnLCAnQm90dG9tJ11cbn07XG5jb25zdCBhbGlhc2VzID0ge1xuICBtYXJnaW5YOiAnbXgnLFxuICBtYXJnaW5ZOiAnbXknLFxuICBwYWRkaW5nWDogJ3B4JyxcbiAgcGFkZGluZ1k6ICdweSdcbn07XG5cbi8vIG1lbW9pemUoKSBpbXBhY3Q6XG4vLyBGcm9tIDMwMCwwMDAgb3BzL3NlY1xuLy8gVG8gMzUwLDAwMCBvcHMvc2VjXG5jb25zdCBnZXRDc3NQcm9wZXJ0aWVzID0gbWVtb2l6ZShwcm9wID0+IHtcbiAgLy8gSXQncyBub3QgYSBzaG9ydGhhbmQgbm90YXRpb24uXG4gIGlmIChwcm9wLmxlbmd0aCA+IDIpIHtcbiAgICBpZiAoYWxpYXNlc1twcm9wXSkge1xuICAgICAgcHJvcCA9IGFsaWFzZXNbcHJvcF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbcHJvcF07XG4gICAgfVxuICB9XG4gIGNvbnN0IFthLCBiXSA9IHByb3Auc3BsaXQoJycpO1xuICBjb25zdCBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbYV07XG4gIGNvbnN0IGRpcmVjdGlvbiA9IGRpcmVjdGlvbnNbYl0gfHwgJyc7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGRpcmVjdGlvbikgPyBkaXJlY3Rpb24ubWFwKGRpciA9PiBwcm9wZXJ0eSArIGRpcikgOiBbcHJvcGVydHkgKyBkaXJlY3Rpb25dO1xufSk7XG5leHBvcnQgY29uc3QgbWFyZ2luS2V5cyA9IFsnbScsICdtdCcsICdtcicsICdtYicsICdtbCcsICdteCcsICdteScsICdtYXJnaW4nLCAnbWFyZ2luVG9wJywgJ21hcmdpblJpZ2h0JywgJ21hcmdpbkJvdHRvbScsICdtYXJnaW5MZWZ0JywgJ21hcmdpblgnLCAnbWFyZ2luWScsICdtYXJnaW5JbmxpbmUnLCAnbWFyZ2luSW5saW5lU3RhcnQnLCAnbWFyZ2luSW5saW5lRW5kJywgJ21hcmdpbkJsb2NrJywgJ21hcmdpbkJsb2NrU3RhcnQnLCAnbWFyZ2luQmxvY2tFbmQnXTtcbmV4cG9ydCBjb25zdCBwYWRkaW5nS2V5cyA9IFsncCcsICdwdCcsICdwcicsICdwYicsICdwbCcsICdweCcsICdweScsICdwYWRkaW5nJywgJ3BhZGRpbmdUb3AnLCAncGFkZGluZ1JpZ2h0JywgJ3BhZGRpbmdCb3R0b20nLCAncGFkZGluZ0xlZnQnLCAncGFkZGluZ1gnLCAncGFkZGluZ1knLCAncGFkZGluZ0lubGluZScsICdwYWRkaW5nSW5saW5lU3RhcnQnLCAncGFkZGluZ0lubGluZUVuZCcsICdwYWRkaW5nQmxvY2snLCAncGFkZGluZ0Jsb2NrU3RhcnQnLCAncGFkZGluZ0Jsb2NrRW5kJ107XG5jb25zdCBzcGFjaW5nS2V5cyA9IFsuLi5tYXJnaW5LZXlzLCAuLi5wYWRkaW5nS2V5c107XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVW5hcnlVbml0KHRoZW1lLCB0aGVtZUtleSwgZGVmYXVsdFZhbHVlLCBwcm9wTmFtZSkge1xuICBjb25zdCB0aGVtZVNwYWNpbmcgPSBnZXRQYXRoKHRoZW1lLCB0aGVtZUtleSwgdHJ1ZSkgPz8gZGVmYXVsdFZhbHVlO1xuICBpZiAodHlwZW9mIHRoZW1lU3BhY2luZyA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHRoZW1lU3BhY2luZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfVxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgTVVJOiBFeHBlY3RlZCAke3Byb3BOYW1lfSBhcmd1bWVudCB0byBiZSBhIG51bWJlciBvciBhIHN0cmluZywgZ290ICR7dmFsfS5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0aGVtZVNwYWNpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0aGVtZVNwYWNpbmcuc3RhcnRzV2l0aCgndmFyKCcpICYmIHZhbCA9PT0gMCkge1xuICAgICAgICAgI
1HJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGVtZVNwYWNpbmcuc3RhcnRzV2l0aCgndmFyKCcpICYmIHZhbCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB0aGVtZVNwYWNpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBjYWxjKCR7dmFsfSAqICR7dGhlbWVTcGFjaW5nfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoZW1lU3BhY2luZyAqIHZhbDtcbiAgICB9O1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHRoZW1lU3BhY2luZykpIHtcbiAgICByZXR1cm4gdmFsID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgfVxuICAgICAgY29uc3QgYWJzID0gTWF0aC5hYnModmFsKTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhYnMpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihbYE1VSTogVGhlIFxcYHRoZW1lLiR7dGhlbWVLZXl9XFxgIGFycmF5IHR5cGUgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggbm9uIGludGVnZXIgdmFsdWVzLmAgKyBgWW91IHNob3VsZCBlaXRoZXIgdXNlIGFuIGludGVnZXIgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbmRleCwgb3IgZGVmaW5lIHRoZSBcXGB0aGVtZS4ke3RoZW1lS2V5fVxcYCBhcyBhIG51bWJlci5gXS5qb2luKCdcXG4nKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoYWJzID4gdGhlbWVTcGFjaW5nLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFtgTVVJOiBUaGUgdmFsdWUgcHJvdmlkZWQgKCR7YWJzfSkgb3ZlcmZsb3dzLmAsIGBUaGUgc3VwcG9ydGVkIHZhbHVlcyBhcmU6ICR7SlNPTi5zdHJpbmdpZnkodGhlbWVTcGFjaW5nKX0uYCwgYCR7YWJzfSA+ICR7dGhlbWVTcGFjaW5nLmxlbmd0aCAtIDF9LCB5b3UgbmVlZCB0byBhZGQgdGhlIG1pc3NpbmcgdmFsdWVzLmBdLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSB0aGVtZVNwYWNpbmdbYWJzXTtcbiAgICAgIGlmICh2YWwgPj0gMCkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybWVkID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gLXRyYW5zZm9ybWVkO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm1lZCA9PT0gJ3N0cmluZycgJiYgdHJhbnNmb3JtZWQuc3RhcnRzV2l0aCgndmFyKCcpKSB7XG4gICAgICAgIHJldHVybiBgY2FsYygtMSAqICR7dHJhbnNmb3JtZWR9KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYC0ke3RyYW5zZm9ybWVkfWA7XG4gICAgfTtcbiAgfVxuICBpZiAodHlwZW9mIHRoZW1lU3BhY2luZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0aGVtZVNwYWNpbmc7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKFtgTVVJOiBUaGUgXFxgdGhlbWUuJHt0aGVtZUtleX1cXGAgdmFsdWUgKCR7dGhlbWVTcGFjaW5nfSkgaXMgaW52YWxpZC5gLCAnSXQgc2hvdWxkIGJlIGEgbnVtYmVyLCBhbiBhcnJheSBvciBhIGZ1bmN0aW9uLiddLmpvaW4oJ1xcbicpKTtcbiAgfVxuICByZXR1cm4gKCkgPT4gdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVuYXJ5U3BhY2luZyh0aGVtZSkge1xuICByZXR1cm4gY3JlYXRlVW5hcnlVbml0KHRoZW1lLCAnc3BhY2luZycsIDgsICdzcGFjaW5nJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWUodHJhbnNmb3JtZXIsIHByb3BWYWx1ZSkge1xuICBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3N0cmluZycgfHwgcHJvcFZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gcHJvcFZhbHVlO1xuICB9XG4gIHJldHVybiB0cmFuc2Zvcm1lcihwcm9wVmFsdWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlRnJvbVByb3BWYWx1ZShjc3NQcm9wZXJ0aWVzLCB0cmFuc2Zvcm1lcikge1xuICByZXR1cm4gcHJvcFZhbHVlID0+IGNzc1Byb3BlcnRpZXMucmVkdWNlKChhY2MsIGNzc1Byb3BlcnR5KSA9PiB7XG4gICAgYWNjW2Nzc1Byb3BlcnR5XSA9IGdldFZhbHVlKHRyYW5zZm9ybWVyLCBwcm9wVmFsdWUpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVDc3NQcm9wZXJ0eShwcm9wcywga2V5cywgcHJvcCwgdHJhbnNmb3JtZXIpIHtcbiAgLy8gVXNpbmcgYSBoYXNoIGNvbXB1dGF0aW9uIG92ZXIgYW4gYXJyYXkgaXRlcmF0aW9uIGNvdWxkIGJlIGZhc3RlciwgYnV0IHdpdGggb25seSAyOCBpdGVtcyxcbiAgLy8gaXQncyBkb2Vzbid0IHdvcnRoIHRoZSBidW5kbGUgc2l6ZS5cbiAgaWYgKCFrZXlzLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgY3NzUHJvcGVydGllcyA9IGdldENzc1Byb3BlcnRpZXMocHJvcCk7XG4gIGNvbnN0IHN0eWxlRnJvbVByb3BWYWx1ZSA9IGdldFN0eWxlRnJvbVByb3BWYWx1ZShjc3NQcm9wZXJ0aWVzLCB0cmFuc2Zvcm1lcik7XG4gIGNvbnN0IHByb3BWYWx1ZSA9IHByb3BzW3Byb3BdO1xuICByZXR1cm4gaGFuZGxlQnJlYWtwb2ludHMocHJvcHMsIHByb3BWYWx1ZSwgc3R5bGVGcm9tUHJvcFZhbHVlKTtcbn1cbmZ1bmN0aW9uIHN0eWxlKHByb3BzLCBrZXlzKSB7XG4gIGNvbnN0IHRyYW5zZm9ybWVyID0gY3JlYXRlVW5hcnlTcGFjaW5nKHByb3BzLnRoZW1lKTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BzKS5tYXAocHJvcCA9PiByZXNvbHZlQ3NzUHJvcGVydHkocHJvcHMsIGtleXMsIHByb3AsIHRyYW5zZm9ybWVyKSkucmVkdWNlKG1lcmdlLCB7fSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWFyZ2luKHByb3BzKSB7XG4gIHJldHVybiBzdHlsZShwcm9wcywgbWFyZ2luS2V5cyk7XG59XG5tYXJnaW4ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IG1hcmdpbktleXMucmVkdWNlKChvYmosIGtleSkgPT4ge1xuICBvYmpba2V5XSA9IHJlc3BvbnNpdmVQcm9wVHlwZTtcbiAgcmV0dXJuIG9iajtcbn0sIHt9KSA6IHt9O1xubWFyZ2luLmZpbHRlclByb3BzID0gbWFyZ2luS2V5cztcbmV4cG9ydCBmdW5jdGlvbiBwYWRkaW5nKHByb3BzKSB7XG4gIHJldHVybi
1BzdHlsZShwcm9wcywgcGFkZGluZ0tleXMpO1xufVxucGFkZGluZy5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gcGFkZGluZ0tleXMucmVkdWNlKChvYmosIGtleSkgPT4ge1xuICBvYmpba2V5XSA9IHJlc3BvbnNpdmVQcm9wVHlwZTtcbiAgcmV0dXJuIG9iajtcbn0sIHt9KSA6IHt9O1xucGFkZGluZy5maWx0ZXJQcm9wcyA9IHBhZGRpbmdLZXlzO1xuZnVuY3Rpb24gc3BhY2luZyhwcm9wcykge1xuICByZXR1cm4gc3R5bGUocHJvcHMsIHNwYWNpbmdLZXlzKTtcbn1cbnNwYWNpbmcucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHNwYWNpbmdLZXlzLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcbiAgb2JqW2tleV0gPSByZXNwb25zaXZlUHJvcFR5cGU7XG4gIHJldHVybiBvYmo7XG59LCB7fSkgOiB7fTtcbnNwYWNpbmcuZmlsdGVyUHJvcHMgPSBzcGFjaW5nS2V5cztcbmV4cG9ydCBkZWZhdWx0IHNwYWNpbmc7IiwiaW1wb3J0IHsgY3JlYXRlVW5hcnlTcGFjaW5nIH0gZnJvbSBcIi4uL3NwYWNpbmcvaW5kZXguanNcIjtcblxuLy8gVGhlIGRpZmZlcmVudCBzaWduYXR1cmVzIGltcGx5IGRpZmZlcmVudCBtZWFuaW5nIGZvciB0aGVpciBhcmd1bWVudHMgdGhhdCBjYW4ndCBiZSBleHByZXNzZWQgc3RydWN0dXJhbGx5LlxuLy8gV2UgZXhwcmVzcyB0aGUgZGlmZmVyZW5jZSB3aXRoIHZhcmlhYmxlIG5hbWVzLlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVTcGFjaW5nKHNwYWNpbmdJbnB1dCA9IDgsXG4vLyBNYXRlcmlhbCBEZXNpZ24gbGF5b3V0cyBhcmUgdmlzdWFsbHkgYmFsYW5jZWQuIE1vc3QgbWVhc3VyZW1lbnRzIGFsaWduIHRvIGFuIDhkcCBncmlkLCB3aGljaCBhbGlnbnMgYm90aCBzcGFjaW5nIGFuZCB0aGUgb3ZlcmFsbCBsYXlvdXQuXG4vLyBTbWFsbGVyIGNvbXBvbmVudHMsIHN1Y2ggYXMgaWNvbnMsIGNhbiBhbGlnbiB0byBhIDRkcCBncmlkLlxuLy8gaHR0cHM6Ly9tMi5tYXRlcmlhbC5pby9kZXNpZ24vbGF5b3V0L3VuZGVyc3RhbmRpbmctbGF5b3V0Lmh0bWxcbnRyYW5zZm9ybSA9IGNyZWF0ZVVuYXJ5U3BhY2luZyh7XG4gIHNwYWNpbmc6IHNwYWNpbmdJbnB1dFxufSkpIHtcbiAgLy8gQWxyZWFkeSB0cmFuc2Zvcm1lZC5cbiAgaWYgKHNwYWNpbmdJbnB1dC5tdWkpIHtcbiAgICByZXR1cm4gc3BhY2luZ0lucHV0O1xuICB9XG4gIGNvbnN0IHNwYWNpbmcgPSAoLi4uYXJnc0lucHV0KSA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICghKGFyZ3NJbnB1dC5sZW5ndGggPD0gNCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgTVVJOiBUb28gbWFueSBhcmd1bWVudHMgcHJvdmlkZWQsIGV4cGVjdGVkIGJldHdlZW4gMCBhbmQgNCwgZ290ICR7YXJnc0lucHV0Lmxlbmd0aH1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJncyA9IGFyZ3NJbnB1dC5sZW5ndGggPT09IDAgPyBbMV0gOiBhcmdzSW5wdXQ7XG4gICAgcmV0dXJuIGFyZ3MubWFwKGFyZ3VtZW50ID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IHRyYW5zZm9ybShhcmd1bWVudCk7XG4gICAgICByZXR1cm4gdHlwZW9mIG91dHB1dCA9PT0gJ251bWJlcicgPyBgJHtvdXRwdXR9cHhgIDogb3V0cHV0O1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgfTtcbiAgc3BhY2luZy5tdWkgPSB0cnVlO1xuICByZXR1cm4gc3BhY2luZztcbn0iLCJpbXBvcnQgbWVyZ2UgZnJvbSBcIi4uL21lcmdlL2luZGV4LmpzXCI7XG5mdW5jdGlvbiBjb21wb3NlKC4uLnN0eWxlcykge1xuICBjb25zdCBoYW5kbGVycyA9IHN0eWxlcy5yZWR1Y2UoKGFjYywgc3R5bGUpID0+IHtcbiAgICBzdHlsZS5maWx0ZXJQcm9wcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgYWNjW3Byb3BdID0gc3R5bGU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuXG4gIC8vIGZhbHNlIHBvc2l0aXZlXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9mdW5jdGlvbi1jb21wb25lbnQtZGVmaW5pdGlvblxuICBjb25zdCBmbiA9IHByb3BzID0+IHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocHJvcHMpLnJlZHVjZSgoYWNjLCBwcm9wKSA9PiB7XG4gICAgICBpZiAoaGFuZGxlcnNbcHJvcF0pIHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKGFjYywgaGFuZGxlcnNbcHJvcF0ocHJvcHMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuICB9O1xuICBmbi5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gc3R5bGVzLnJlZHVjZSgoYWNjLCBzdHlsZSkgPT4gT2JqZWN0LmFzc2lnbihhY2MsIHN0eWxlLnByb3BUeXBlcyksIHt9KSA6IHt9O1xuICBmbi5maWx0ZXJQcm9wcyA9IHN0eWxlcy5yZWR1Y2UoKGFjYywgc3R5bGUpID0+IGFjYy5jb25jYXQoc3R5bGUuZmlsdGVyUHJvcHMpLCBbXSk7XG4gIHJldHVybiBmbjtcbn1cbmV4cG9ydCBkZWZhdWx0IGNvbXBvc2U7IiwiaW1wb3J0IHJlc3BvbnNpdmVQcm9wVHlwZSBmcm9tIFwiLi4vcmVzcG9uc2l2ZVByb3BUeXBlL2luZGV4LmpzXCI7XG5pbXBvcnQgc3R5bGUgZnJvbSBcIi4uL3N0eWxlL2luZGV4LmpzXCI7XG5pbXBvcnQgY29tcG9zZSBmcm9tIFwiLi4vY29tcG9zZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlVbml0LCBnZXRWYWx1ZSB9IGZyb20gXCIuLi9zcGFjaW5nL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBoYW5kbGVCcmVha3BvaW50cyB9IGZyb20gXCIuLi9icmVha3BvaW50cy9pbmRleC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGJvcmRlclRyYW5zZm9ybSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gYCR7dmFsdWV9cHggc29saWRgO1xufVxuZnVuY3Rpb24gY3JlYXRlQm9yZGVyU3R5bGUocHJvcCwgdHJhbnNmb3JtKSB7XG4gIHJldHVybiBzdHlsZSh7XG4gICAgcHJvcCxcbiAgICB0aGVtZUtleTogJ2JvcmRlcnMnLFxuICAgIHRyYW5zZm9ybVxuICB9KTtcbn1cbmV4cG9ydCBjb25zdCBib3JkZXIgPSBjcmVhdGVCb3JkZXJTdHlsZSgnYm9yZGVyJywgYm9yZGVyVHJhbnNmb3JtKTtcbmV4cG9ydCBjb25zdCBib3JkZXJUb3AgPSBjcmVhdGVCb3JkZXJTdHlsZSgnYm9yZGVyVG9wJywgYm9yZGVyVHJhbnNmb3JtKTtcbmV4cG9ydCBjb25zdCBib3JkZXJSaWdodCA9IGNyZWF0ZUJvcmRlclN0eWxlKCdib3JkZXJSaWdodCcsIGJvcmRlclRyYW5zZm9ybSk7XG5leHBvcnQgY29uc3QgYm9yZGVyQm90dG9tID0gY3JlYXRlQm9yZGVyU3R5bGUoJ2JvcmRlckJvdHRvbScsIGJvcmRlclRyYW5zZm9ybSk7XG5leHBvcnQgY29uc3QgYm9yZGVyTGVmdCA9IGNyZWF0ZUJvcmRlclN0eWxlKCdib3JkZXJMZWZ0JywgYm9yZGVyVHJhbnNmb3JtKTtcbmV4cG9ydCBjb25zdCBib3JkZXJDb2xvciA9IGNyZWF0ZUJvcmRlclN0eWxlKCdib3JkZXJDb2xvcicpO1xuZXhwb3J0IGNvbnN0IGJvcmRlclRvcENvbG9yID0gY3JlYXRlQm9yZGVyU3R5bGUoJ2JvcmRlclRvcENvbG9yJyk7XG5leHBvcnQgY29uc3QgYm9yZGVyUmlnaHRDb2xvciA9IGNyZWF0ZUJvcmRlclN0eWxlKCdib3JkZXJSaWdodENvbG9yJyk7XG5leHBvcnQgY29uc3QgYm9yZGVyQm90dG9tQ29sb3IgPSBjcmVhdGVCb3JkZXJTdHlsZSgnYm9yZGVyQm90dG9tQ29sb3InKTtcbmV4cG9ydCBjb25zdCBib3JkZXJMZWZ0Q29sb3IgPSBjcmVhdGVCb3JkZXJTdHlsZSgnYm9yZGVyTGVmdENvbG9yJyk7XG5leHBvcnQgY29uc3Qgb3V0bGluZSA9IGNyZWF0ZUJvcmRlclN0eWxlKCdvdXRsaW5lJywgYm9yZGVyVHJhbnNmb3JtKTtcbmV4cG9ydCBjb25zdCBvdXRsaW5lQ29sb3IgPSBjcmVhdGVCb3JkZXJTdHlsZSgnb3V0bGluZUNvbG9yJyk7XG5cbi8vIGZhbHNlIHBvc2l0aXZlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvZnVuY3Rpb24tY29tcG9uZW50LWRlZmluaXRpb25cbmV4cG9ydCBjb25zdCBib3JkZXJSYWR
1pdXMgPSBwcm9wcyA9PiB7XG4gIGlmIChwcm9wcy5ib3JkZXJSYWRpdXMgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5ib3JkZXJSYWRpdXMgIT09IG51bGwpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1lciA9IGNyZWF0ZVVuYXJ5VW5pdChwcm9wcy50aGVtZSwgJ3NoYXBlLmJvcmRlclJhZGl1cycsIDQsICdib3JkZXJSYWRpdXMnKTtcbiAgICBjb25zdCBzdHlsZUZyb21Qcm9wVmFsdWUgPSBwcm9wVmFsdWUgPT4gKHtcbiAgICAgIGJvcmRlclJhZGl1czogZ2V0VmFsdWUodHJhbnNmb3JtZXIsIHByb3BWYWx1ZSlcbiAgICB9KTtcbiAgICByZXR1cm4gaGFuZGxlQnJlYWtwb2ludHMocHJvcHMsIHByb3BzLmJvcmRlclJhZGl1cywgc3R5bGVGcm9tUHJvcFZhbHVlKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5ib3JkZXJSYWRpdXMucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHtcbiAgYm9yZGVyUmFkaXVzOiByZXNwb25zaXZlUHJvcFR5cGVcbn0gOiB7fTtcbmJvcmRlclJhZGl1cy5maWx0ZXJQcm9wcyA9IFsnYm9yZGVyUmFkaXVzJ107XG5jb25zdCBib3JkZXJzID0gY29tcG9zZShib3JkZXIsIGJvcmRlclRvcCwgYm9yZGVyUmlnaHQsIGJvcmRlckJvdHRvbSwgYm9yZGVyTGVmdCwgYm9yZGVyQ29sb3IsIGJvcmRlclRvcENvbG9yLCBib3JkZXJSaWdodENvbG9yLCBib3JkZXJCb3R0b21Db2xvciwgYm9yZGVyTGVmdENvbG9yLCBib3JkZXJSYWRpdXMsIG91dGxpbmUsIG91dGxpbmVDb2xvcik7XG5leHBvcnQgZGVmYXVsdCBib3JkZXJzOyIsImltcG9ydCBzdHlsZSBmcm9tIFwiLi4vc3R5bGUvaW5kZXguanNcIjtcbmltcG9ydCBjb21wb3NlIGZyb20gXCIuLi9jb21wb3NlL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVVbmFyeVVuaXQsIGdldFZhbHVlIH0gZnJvbSBcIi4uL3NwYWNpbmcvaW5kZXguanNcIjtcbmltcG9ydCB7IGhhbmRsZUJyZWFrcG9pbnRzIH0gZnJvbSBcIi4uL2JyZWFrcG9pbnRzL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVzcG9uc2l2ZVByb3BUeXBlIGZyb20gXCIuLi9yZXNwb25zaXZlUHJvcFR5cGUvaW5kZXguanNcIjtcblxuLy8gZmFsc2UgcG9zaXRpdmVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC9mdW5jdGlvbi1jb21wb25lbnQtZGVmaW5pdGlvblxuZXhwb3J0IGNvbnN0IGdhcCA9IHByb3BzID0+IHtcbiAgaWYgKHByb3BzLmdhcCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmdhcCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gY3JlYXRlVW5hcnlVbml0KHByb3BzLnRoZW1lLCAnc3BhY2luZycsIDgsICdnYXAnKTtcbiAgICBjb25zdCBzdHlsZUZyb21Qcm9wVmFsdWUgPSBwcm9wVmFsdWUgPT4gKHtcbiAgICAgIGdhcDogZ2V0VmFsdWUodHJhbnNmb3JtZXIsIHByb3BWYWx1ZSlcbiAgICB9KTtcbiAgICByZXR1cm4gaGFuZGxlQnJlYWtwb2ludHMocHJvcHMsIHByb3BzLmdhcCwgc3R5bGVGcm9tUHJvcFZhbHVlKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5nYXAucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHtcbiAgZ2FwOiByZXNwb25zaXZlUHJvcFR5cGVcbn0gOiB7fTtcbmdhcC5maWx0ZXJQcm9wcyA9IFsnZ2FwJ107XG5cbi8vIGZhbHNlIHBvc2l0aXZlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvZnVuY3Rpb24tY29tcG9uZW50LWRlZmluaXRpb25cbmV4cG9ydCBjb25zdCBjb2x1bW5HYXAgPSBwcm9wcyA9PiB7XG4gIGlmIChwcm9wcy5jb2x1bW5HYXAgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5jb2x1bW5HYXAgIT09IG51bGwpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1lciA9IGNyZWF0ZVVuYXJ5VW5pdChwcm9wcy50aGVtZSwgJ3NwYWNpbmcnLCA4LCAnY29sdW1uR2FwJyk7XG4gICAgY29uc3Qgc3R5bGVGcm9tUHJvcFZhbHVlID0gcHJvcFZhbHVlID0+ICh7XG4gICAgICBjb2x1bW5HYXA6IGdldFZhbHVlKHRyYW5zZm9ybWVyLCBwcm9wVmFsdWUpXG4gICAgfSk7XG4gICAgcmV0dXJuIGhhbmRsZUJyZWFrcG9pbnRzKHByb3BzLCBwcm9wcy5jb2x1bW5HYXAsIHN0eWxlRnJvbVByb3BWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuY29sdW1uR2FwLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB7XG4gIGNvbHVtbkdhcDogcmVzcG9uc2l2ZVByb3BUeXBlXG59IDoge307XG5jb2x1bW5HYXAuZmlsdGVyUHJvcHMgPSBbJ2NvbHVtbkdhcCddO1xuXG4vLyBmYWxzZSBwb3NpdGl2ZVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L2Z1bmN0aW9uLWNvbXBvbmVudC1kZWZpbml0aW9uXG5leHBvcnQgY29uc3Qgcm93R2FwID0gcHJvcHMgPT4ge1xuICBpZiAocHJvcHMucm93R2FwICE9PSB1bmRlZmluZWQgJiYgcHJvcHMucm93R2FwICE9PSBudWxsKSB7XG4gICAgY29uc3QgdHJhbnNmb3JtZXIgPSBjcmVhdGVVbmFyeVVuaXQocHJvcHMudGhlbWUsICdzcGFjaW5nJywgOCwgJ3Jvd0dhcCcpO1xuICAgIGNvbnN0IHN0eWxlRnJvbVByb3BWYWx1ZSA9IHByb3BWYWx1ZSA9PiAoe1xuICAgICAgcm93R2FwOiBnZXRWYWx1ZSh0cmFuc2Zvcm1lciwgcHJvcFZhbHVlKVxuICAgIH0pO1xuICAgIHJldHVybiBoYW5kbGVCcmVha3BvaW50cyhwcm9wcywgcHJvcHMucm93R2FwLCBzdHlsZUZyb21Qcm9wVmFsdWUpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbnJvd0dhcC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8ge1xuICByb3dHYXA6IHJlc3BvbnNpdmVQcm9wVHlwZVxufSA6IHt9O1xucm93R2FwLmZpbHRlclByb3BzID0gWydyb3dHYXAnXTtcbmV4cG9ydCBjb25zdCBncmlkQ29sdW1uID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZENvbHVtbidcbn0pO1xuZXhwb3J0IGNvbnN0IGdyaWRSb3cgPSBzdHlsZSh7XG4gIHByb3A6ICdncmlkUm93J1xufSk7XG5leHBvcnQgY29uc3QgZ3JpZEF1dG9GbG93ID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZEF1dG9GbG93J1xufSk7XG5leHBvcnQgY29uc3QgZ3JpZEF1dG9Db2x1bW5zID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZEF1dG9Db2x1bW5zJ1xufSk7XG5leHBvcnQgY29uc3QgZ3JpZEF1dG9Sb3dzID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZEF1dG9Sb3dzJ1xufSk7XG5leHBvcnQgY29uc3QgZ3JpZFRlbXBsYXRlQ29sdW1ucyA9IHN0eWxlKHtcbiAgcHJvcDogJ2dyaWRU
1ZW1wbGF0ZUNvbHVtbnMnXG59KTtcbmV4cG9ydCBjb25zdCBncmlkVGVtcGxhdGVSb3dzID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZFRlbXBsYXRlUm93cydcbn0pO1xuZXhwb3J0IGNvbnN0IGdyaWRUZW1wbGF0ZUFyZWFzID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZFRlbXBsYXRlQXJlYXMnXG59KTtcbmV4cG9ydCBjb25zdCBncmlkQXJlYSA9IHN0eWxlKHtcbiAgcHJvcDogJ2dyaWRBcmVhJ1xufSk7XG5jb25zdCBncmlkID0gY29tcG9zZShnYXAsIGNvbHVtbkdhcCwgcm93R2FwLCBncmlkQ29sdW1uLCBncmlkUm93LCBncmlkQXV0b0Zsb3csIGdyaWRBdXRvQ29sdW1ucywgZ3JpZEF1dG9Sb3dzLCBncmlkVGVtcGxhdGVDb2x1bW5zLCBncmlkVGVtcGxhdGVSb3dzLCBncmlkVGVtcGxhdGVBcmVhcywgZ3JpZEFyZWEpO1xuZXhwb3J0IGRlZmF1bHQgZ3JpZDsiLCJpbXBvcnQgc3R5bGUgZnJvbSBcIi4uL3N0eWxlL2luZGV4LmpzXCI7XG5pbXBvcnQgY29tcG9zZSBmcm9tIFwiLi4vY29tcG9zZS9pbmRleC5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHBhbGV0dGVUcmFuc2Zvcm0odmFsdWUsIHVzZXJWYWx1ZSkge1xuICBpZiAodXNlclZhbHVlID09PSAnZ3JleScpIHtcbiAgICByZXR1cm4gdXNlclZhbHVlO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbmV4cG9ydCBjb25zdCBjb2xvciA9IHN0eWxlKHtcbiAgcHJvcDogJ2NvbG9yJyxcbiAgdGhlbWVLZXk6ICdwYWxldHRlJyxcbiAgdHJhbnNmb3JtOiBwYWxldHRlVHJhbnNmb3JtXG59KTtcbmV4cG9ydCBjb25zdCBiZ2NvbG9yID0gc3R5bGUoe1xuICBwcm9wOiAnYmdjb2xvcicsXG4gIGNzc1Byb3BlcnR5OiAnYmFja2dyb3VuZENvbG9yJyxcbiAgdGhlbWVLZXk6ICdwYWxldHRlJyxcbiAgdHJhbnNmb3JtOiBwYWxldHRlVHJhbnNmb3JtXG59KTtcbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kQ29sb3IgPSBzdHlsZSh7XG4gIHByb3A6ICdiYWNrZ3JvdW5kQ29sb3InLFxuICB0aGVtZUtleTogJ3BhbGV0dGUnLFxuICB0cmFuc2Zvcm06IHBhbGV0dGVUcmFuc2Zvcm1cbn0pO1xuY29uc3QgcGFsZXR0ZSA9IGNvbXBvc2UoY29sb3IsIGJnY29sb3IsIGJhY2tncm91bmRDb2xvcik7XG5leHBvcnQgZGVmYXVsdCBwYWxldHRlOyIsImltcG9ydCBzdHlsZSBmcm9tIFwiLi4vc3R5bGUvaW5kZXguanNcIjtcbmltcG9ydCBjb21wb3NlIGZyb20gXCIuLi9jb21wb3NlL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBoYW5kbGVCcmVha3BvaW50cywgdmFsdWVzIGFzIGJyZWFrcG9pbnRzVmFsdWVzIH0gZnJvbSBcIi4uL2JyZWFrcG9pbnRzL2luZGV4LmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gc2l6aW5nVHJhbnNmb3JtKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA8PSAxICYmIHZhbHVlICE9PSAwID8gYCR7dmFsdWUgKiAxMDB9JWAgOiB2YWx1ZTtcbn1cbmV4cG9ydCBjb25zdCB3aWR0aCA9IHN0eWxlKHtcbiAgcHJvcDogJ3dpZHRoJyxcbiAgdHJhbnNmb3JtOiBzaXppbmdUcmFuc2Zvcm1cbn0pO1xuZXhwb3J0IGNvbnN0IG1heFdpZHRoID0gcHJvcHMgPT4ge1xuICBpZiAocHJvcHMubWF4V2lkdGggIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5tYXhXaWR0aCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHN0eWxlRnJvbVByb3BWYWx1ZSA9IHByb3BWYWx1ZSA9PiB7XG4gICAgICBjb25zdCBicmVha3BvaW50ID0gcHJvcHMudGhlbWU/LmJyZWFrcG9pbnRzPy52YWx1ZXM/Lltwcm9wVmFsdWVdIHx8IGJyZWFrcG9pbnRzVmFsdWVzW3Byb3BWYWx1ZV07XG4gICAgICBpZiAoIWJyZWFrcG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtYXhXaWR0aDogc2l6aW5nVHJhbnNmb3JtKHByb3BWYWx1ZSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy50aGVtZT8uYnJlYWtwb2ludHM/LnVuaXQgIT09ICdweCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtYXhXaWR0aDogYCR7YnJlYWtwb2ludH0ke3Byb3BzLnRoZW1lLmJyZWFrcG9pbnRzLnVuaXR9YFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWF4V2lkdGg6IGJyZWFrcG9pbnRcbiAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gaGFuZGxlQnJlYWtwb2ludHMocHJvcHMsIHByb3BzLm1heFdpZHRoLCBzdHlsZUZyb21Qcm9wVmFsdWUpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbm1heFdpZHRoLmZpbHRlclByb3BzID0gWydtYXhXaWR0aCddO1xuZXhwb3J0IGNvbnN0IG1pbldpZHRoID0gc3R5bGUoe1xuICBwcm9wOiAnbWluV2lkdGgnLFxuICB0cmFuc2Zvcm06IHNpemluZ1RyYW5zZm9ybVxufSk7XG5leHBvcnQgY29uc3QgaGVpZ2h0ID0gc3R5bGUoe1xuICBwcm9wOiAnaGVpZ2h0JyxcbiAgdHJhbnNmb3JtOiBzaXppbmdUcmFuc2Zvcm1cbn0pO1xuZXhwb3J0IGNvbnN0IG1heEhlaWdodCA9IHN0eWxlKHtcbiAgcHJvcDogJ21heEhlaWdodCcsXG4gIHRyYW5zZm9ybTogc2l6aW5nVHJhbnNmb3JtXG59KTtcbmV4cG9ydCBjb25zdCBtaW5IZWlnaHQgPSBzdHlsZSh7XG4gIHByb3A6ICdtaW5IZWlnaHQnLFxuICB0cmFuc2Zvcm06IHNpemluZ1RyYW5zZm9ybVxufSk7XG5leHBvcnQgY29uc3Qgc2l6ZVdpZHRoID0gc3R5bGUoe1xuICBwcm9wOiAnc2l6ZScsXG4gIGNzc1Byb3BlcnR5OiAnd2lkdGgnLFxuICB0cmFuc2Zvcm06IHNpemluZ1RyYW5zZm9ybVxufSk7XG5leHBvcnQgY29uc3Qgc2l6ZUhlaWdodCA9IHN0eWxlKHtcbiAgcHJvcDogJ3NpemUnLFxuICBjc3NQcm9wZXJ0eTogJ2hlaWdodCcsXG4gIHRyYW5zZm9ybTogc2l6aW5nVHJhbnNmb3JtXG59KTtcbmV4cG9ydCBjb25zdCBib3hTaXppbmcgPSBzdHlsZSh7XG4gIHByb3A6ICdib3hTaXppbmcnXG59KTtcbmNvbnN0IHNpemluZyA9IGNvbXBvc2Uod2lkdGgsIG1heFdpZHRoLCBtaW5XaWR0aCwgaGVpZ2h0LCBtYXhIZWlnaHQsIG1pbkhlaWdodCwgYm94U2l6aW5nKTtcbmV4cG9ydCBkZWZhdWx0IHNpemluZzsiLCJpbXBvcnQgeyBwYWRkaW5nLCBtYXJnaW4gfSBmcm9tIFwiLi4vc3BhY2luZy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgYm9yZGVyUmFkaXVzLCBib3JkZXJUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vYm9yZGVycy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2FwLCByb3dHYXAsIGNvbHVtbkdhcCB9IGZyb20gXCIuLi9jc3NHcmlkL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBwYWxldHRlVHJhbnNmb3JtIH0gZnJvbSBcIi4uL3BhbGV0dGUvaW5kZXguanNcIjtcbmltcG9ydCB7
1IG1heFdpZHRoLCBzaXppbmdUcmFuc2Zvcm0gfSBmcm9tIFwiLi4vc2l6aW5nL2luZGV4LmpzXCI7XG5jb25zdCBkZWZhdWx0U3hDb25maWcgPSB7XG4gIC8vIGJvcmRlcnNcbiAgYm9yZGVyOiB7XG4gICAgdGhlbWVLZXk6ICdib3JkZXJzJyxcbiAgICB0cmFuc2Zvcm06IGJvcmRlclRyYW5zZm9ybVxuICB9LFxuICBib3JkZXJUb3A6IHtcbiAgICB0aGVtZUtleTogJ2JvcmRlcnMnLFxuICAgIHRyYW5zZm9ybTogYm9yZGVyVHJhbnNmb3JtXG4gIH0sXG4gIGJvcmRlclJpZ2h0OiB7XG4gICAgdGhlbWVLZXk6ICdib3JkZXJzJyxcbiAgICB0cmFuc2Zvcm06IGJvcmRlclRyYW5zZm9ybVxuICB9LFxuICBib3JkZXJCb3R0b206IHtcbiAgICB0aGVtZUtleTogJ2JvcmRlcnMnLFxuICAgIHRyYW5zZm9ybTogYm9yZGVyVHJhbnNmb3JtXG4gIH0sXG4gIGJvcmRlckxlZnQ6IHtcbiAgICB0aGVtZUtleTogJ2JvcmRlcnMnLFxuICAgIHRyYW5zZm9ybTogYm9yZGVyVHJhbnNmb3JtXG4gIH0sXG4gIGJvcmRlckNvbG9yOiB7XG4gICAgdGhlbWVLZXk6ICdwYWxldHRlJ1xuICB9LFxuICBib3JkZXJUb3BDb2xvcjoge1xuICAgIHRoZW1lS2V5OiAncGFsZXR0ZSdcbiAgfSxcbiAgYm9yZGVyUmlnaHRDb2xvcjoge1xuICAgIHRoZW1lS2V5OiAncGFsZXR0ZSdcbiAgfSxcbiAgYm9yZGVyQm90dG9tQ29sb3I6IHtcbiAgICB0aGVtZUtleTogJ3BhbGV0dGUnXG4gIH0sXG4gIGJvcmRlckxlZnRDb2xvcjoge1xuICAgIHRoZW1lS2V5OiAncGFsZXR0ZSdcbiAgfSxcbiAgb3V0bGluZToge1xuICAgIHRoZW1lS2V5OiAnYm9yZGVycycsXG4gICAgdHJhbnNmb3JtOiBib3JkZXJUcmFuc2Zvcm1cbiAgfSxcbiAgb3V0bGluZUNvbG9yOiB7XG4gICAgdGhlbWVLZXk6ICdwYWxldHRlJ1xuICB9LFxuICBib3JkZXJSYWRpdXM6IHtcbiAgICB0aGVtZUtleTogJ3NoYXBlLmJvcmRlclJhZGl1cycsXG4gICAgc3R5bGU6IGJvcmRlclJhZGl1c1xuICB9LFxuICAvLyBwYWxldHRlXG4gIGNvbG9yOiB7XG4gICAgdGhlbWVLZXk6ICdwYWxldHRlJyxcbiAgICB0cmFuc2Zvcm06IHBhbGV0dGVUcmFuc2Zvcm1cbiAgfSxcbiAgYmdjb2xvcjoge1xuICAgIHRoZW1lS2V5OiAncGFsZXR0ZScsXG4gICAgY3NzUHJvcGVydHk6ICdiYWNrZ3JvdW5kQ29sb3InLFxuICAgIHRyYW5zZm9ybTogcGFsZXR0ZVRyYW5zZm9ybVxuICB9LFxuICBiYWNrZ3JvdW5kQ29sb3I6IHtcbiAgICB0aGVtZUtleTogJ3BhbGV0dGUnLFxuICAgIHRyYW5zZm9ybTogcGFsZXR0ZVRyYW5zZm9ybVxuICB9LFxuICAvLyBzcGFjaW5nXG4gIHA6IHtcbiAgICBzdHlsZTogcGFkZGluZ1xuICB9LFxuICBwdDoge1xuICAgIHN0eWxlOiBwYWRkaW5nXG4gIH0sXG4gIHByOiB7XG4gICAgc3R5bGU6IHBhZGRpbmdcbiAgfSxcbiAgcGI6IHtcbiAgICBzdHlsZTogcGFkZGluZ1xuICB9LFxuICBwbDoge1xuICAgIHN0eWxlOiBwYWRkaW5nXG4gIH0sXG4gIHB4OiB7XG4gICAgc3R5bGU6IHBhZGRpbmdcbiAgfSxcbiAgcHk6IHtcbiAgICBzdHlsZTogcGFkZGluZ1xuICB9LFxuICBwYWRkaW5nOiB7XG4gICAgc3R5bGU6IHBhZGRpbmdcbiAgfSxcbiAgcGFkZGluZ1RvcDoge1xuICAgIHN0eWxlOiBwYWRkaW5nXG4gIH0sXG4gIHBhZGRpbmdSaWdodDoge1xuICAgIHN0eWxlOiBwYWRkaW5nXG4gIH0sXG4gIHBhZGRpbmdCb3R0b206IHtcbiAgICBzdHlsZTogcGFkZGluZ1xuICB9LFxuICBwYWRkaW5nTGVmdDoge1xuICAgIHN0eWxlOiBwYWRkaW5nXG4gIH0sXG4gIHBhZGRpbmdYOiB7XG4gICAgc3R5bGU6IHBhZGRpbmdcbiAgfSxcbiAgcGFkZGluZ1k6IHtcbiAgICBzdHlsZTogcGFkZGluZ1xuICB9LFxuICBwYWRkaW5nSW5saW5lOiB7XG4gICAgc3R5bGU6IHBhZGRpbmdcbiAgfSxcbiAgcGFkZGluZ0lubGluZVN0YXJ0OiB7XG4gICAgc3R5bGU6IHBhZGRpbmdcbiAgfSxcbiAgcGFkZGluZ0lubGluZUVuZDoge1xuICAgIHN0eWxlOiBwYWRkaW5nXG4gIH0sXG4gIHBhZGRpbmdCbG9jazoge1xuICAgIHN0eWxlOiBwYWRkaW5nXG4gIH0sXG4gIHBhZGRpbmdCbG9ja1N0YXJ0OiB7XG4gICAgc3R5bGU6IHBhZGRpbmdcbiAgfSxcbiAgcGFkZGluZ0Jsb2NrRW5kOiB7XG4gICAgc3R5bGU6IHBhZGRpbmdcbiAgfSxcbiAgbToge1xuICAgIHN0eWxlOiBtYXJnaW5cbiAgfSxcbiAgbXQ6IHtcbiAgICBzdHlsZTogbWFyZ2luXG4gIH0sXG4gIG1yOiB7XG4gICAgc3R5bGU6IG1hcmdpblxuICB9LFxuICBtYjoge1xuICAgIHN0eWxlOiBtYXJnaW5cbiAgfSxcbiAgbWw6IHtcbiAgICBzdHlsZTogbWFyZ2luXG4gIH0sXG4gIG14OiB7XG4gICAgc3R5bGU6IG1hcmdpblxuICB9LFxuICBteToge1xuICAgIHN0eWxlOiBtYXJnaW5cbiAgfSxcbiAgbWFyZ2luOiB7XG4gICAgc3R5bGU6IG1hcmdpblxuICB9LFxuICBtYXJnaW5Ub3A6IHtcbiAgICBzdHlsZTogbWFyZ2luXG4gIH0sXG4gIG1hcmdpblJpZ2h0OiB7XG4gICAgc3R5bGU6IG1hcmdpblxuICB9LFxuICBtYXJnaW5Cb3R0b206IHtcbiAgICBzdHlsZTogbWFyZ2luXG4gIH0sXG4gIG1hcmdpbkxlZnQ6IHtcbiAgICBzdHlsZTogbWFyZ2luXG4gIH0sXG4gIG1hcmdpblg6IHtcbiAgICBzdHlsZTogbWFyZ2luXG4gIH0sXG4gIG1hcmdpblk6IHtcbiAgICBzdHlsZTogbWFyZ2luXG4gIH0sXG4gIG1hcmdpbklubGluZToge1xuICAgIHN0eWxlOiBtYXJnaW5cbiAgfSxcbiAgbWFyZ2luSW5saW5lU3RhcnQ6IHtcbiAgICBzdHlsZTogbWFyZ2luXG4gIH0sXG4gIG1hcmdpbklubGluZUVuZDoge1xuICAgIHN0eWxlOiBtYXJnaW5cbiAgfSxcbiAgbWFyZ2luQmxvY2s6IHtcbiAgICBzdHlsZTogbWFyZ2luXG4gIH0sXG4gIG1hcmdpbkJsb2NrU3RhcnQ6IHtcbiAgICBzdHlsZTogbWFyZ2luXG4gIH0sXG4gIG1hcmdpbkJsb2NrRW5kOiB7XG4gICAgc3R5bGU6IG1hcmdpblxuICB9LFxuICAvLyBkaXNwbGF5XG4gIGRpc3BsYXlQcmludDoge1xuICAgIGNzc1Byb3BlcnR5OiBmYWxzZSxcbiAgICB0cmFuc2Zvcm06IHZhbHVlID0+ICh7XG4gICAgICAnQG1lZGlhIHByaW50Jzoge1xuICAgICAgICBkaXNwbGF5OiB2YWx1ZVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG4gIGRpc3BsYXk6IHt9LFxuICBvdmVyZmxvdzoge30sXG4gIHRleHRPdmVyZmxvdzoge30sXG4gIHZpc2liaWxpdHk6IHt9LFxuICB3aGl0ZVNwYWNlOiB7fSxcbiAgLy8gZmxleGJveFxuICBmbGV4QmFzaXM6IHt9LFxuICBmbGV4RGlyZWN0aW9uOiB7fSxcbiAgZmxleFdyYXA6IHt9LFxuICBqdXN0aWZ5Q29udGVudDoge30sXG4gIGFsaWduSXRlbXM6IHt9LFxuICBhbGlnbkNvbnRlbnQ6IHt9LFxuICBvcmRlcjoge30sXG4gIGZsZXg6IHt9LFxuICBmbGV4R3Jvdzoge30sXG4gIGZsZXhTaHJpbms6IHt9LFxuICBhbGlnblNlbGY6IHt9LFxuICBqdXN0aWZ5SXRlbXM6IHt9LFxuICBqdXN0aWZ5U2VsZjoge30sXG4gIC8vIGdyaWRcbiAgZ2FwOiB7XG4gICAgc3R5bGU6IGdhcFxuICB9LFxuICByb3dHYXA6IHtcbiAgICBzdHlsZTogcm93R2FwXG4gIH0sXG4gIGNvbHVtbkdhcDoge1xuICAgIHN0eWxlOiBjb2x1bW5HYXBcbiAgfSxcbiAgZ3JpZENvbHVtbjoge30sXG4gIGdyaWRSb3c6IHt9LFxuICBncmlkQXV0b0Zsb3c6IHt9LFxuICBncmlkQXV0b0NvbHVtbnM6IHt9LFxuICBncmlkQXV0b1Jvd3M6IHt9LFxuICBncmlkVGVtcGxhdGVDb2x1bW5zOiB7fSxcbiAgZ3JpZFRlbXBsYXRlUm93czoge30sXG4gIGdyaWRUZW1wbGF0ZUFyZWFzOiB7fSxcbiAgZ3JpZEFyZWE6IHt9LFxuICAvLyBwb3NpdGlvbnNcbiAgcG9zaXRpb246IHt9LFxuICB6SW5kZXg6IHtcbiAgICB0aGVtZUtleTogJ3pJbmRleCdcbiAgfSxcbiAgdG9wOiB7fSxcbiAgcmlnaHQ6IHt9LFxuICBib3R0b206IHt9LFxuICBsZWZ0OiB7fSxcbiAgLy8gc2hhZG93c1xuICBib3hTaGFkb3c6IHtcbiAgICB0aGVtZUtleTogJ3NoYWRvd3MnXG4gIH0sXG4gIC8vIHNpemluZ1xuICB3aWR0aDoge1xuICAgIHRyYW5zZm9ybTogc2l6aW5nVHJhbnNmb3JtXG4gIH0sXG4gIG1heFdpZHRoOiB7XG4gICAgc3R5bGU6IG1heFdpZHRoXG4gIH0sXG4gIG1pbldpZHRoOiB7XG4gICAgdHJhbnNmb3JtOiBzaXppbmdUcmFuc2Zvcm1cbiAgfSxcbiAgaGVpZ2h0OiB7XG4gICAgdHJhbnNmb3JtOiBzaXppbmdUcmFuc2Zvcm1cbiAgfSxcbiAgbWF4SGVpZ2h0OiB7XG4gICAgdHJhbnNmb3JtOiBzaXppbmdUcmFuc2Zvcm1cbiAgfSxcbiAgbWluSGVpZ2h0OiB7XG4gICAgdHJhbnNmb3JtOiBzaXppbmdUcmFuc2Zvcm1cbiAgfSxcbiAgYm94U2l6aW5nOiB7fSxcbiAgLy8gdHlwb2dyYXBoeVxuICBmb250OiB7XG4gICAgdGhlbWVLZXk6ICdmb250J1xuICB9LFxuICBmb250RmFtaWx5OiB7XG4gICAgdGhlbWVLZXk6ICd0eXBvZ3JhcGh5J1xuICB9LFxuICBmb250U2l6ZToge1xuICAgIHRoZW1lS2V5OiAndHlwb2dyYXBoeSdcbiAgfSxcbiAgZm9udFN0eWxlOiB7XG4gICAgdGhlbWVLZXk6ICd0eXBvZ3JhcGh5J1xuICB9LFxuICBmb250V2VpZ2h0OiB7XG4gICAgdGhlbWVLZXk6ICd0eXBvZ3JhcGh5J1xuICB9LFxuICBsZXR0ZXJTcGFjaW5nOiB7fSxcbiAgdGV4dFRyYW5zZm9ybToge30sXG4gIGxpbmVIZWlnaHQ6IHt9LFxuICB0ZXh0QWxpZ246IHt9LFxuICB0eXBvZ3JhcGh5OiB7XG4gICAgY3NzUHJvcGVydHk6IGZhbHNlLFxuICAgIHRoZW1lS2V5OiAndHlwb2dyYXBoeSdcbiAgfVxufTtcbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRTeENvbmZpZzsiLCJpbXBvcnQgY2FwaXRhbGl6ZSBmcm9tICdAbXVpL3V0aWxzL2NhcGl0YWxpemUnO1xuaW1wb3J0IG1lcmdlIGZyb20gXCIuLi9tZXJnZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgZ2V0UGF0aCwgZ2V0U3R5bGVWYWx1ZSBhcyBnZXRWYWx1ZSB9IGZyb20gXCIuLi9zdHlsZS9pbmRleC5qc1wiO1xuaW1wb3J0IHsgaGFuZGxlQnJlYWtwb2ludHMsIGNyZWF0ZUVtcHR5QnJlYWtwb2ludE9iamVjdCwgcmVtb3ZlVW51c2VkQnJlYWtwb2ludHMgfSBmcm9tIFwiLi4vYnJlYWtwb2ludHMvaW5kZXguanNcIjtcbmltcG9ydCB7
1IHNvcnRDb250YWluZXJRdWVyaWVzIH0gZnJvbSBcIi4uL2Nzc0NvbnRhaW5lclF1ZXJpZXMvaW5kZXguanNcIjtcbmltcG9ydCBkZWZhdWx0U3hDb25maWcgZnJvbSBcIi4vZGVmYXVsdFN4Q29uZmlnLmpzXCI7XG5mdW5jdGlvbiBvYmplY3RzSGF2ZVNhbWVLZXlzKC4uLm9iamVjdHMpIHtcbiAgY29uc3QgYWxsS2V5cyA9IG9iamVjdHMucmVkdWNlKChrZXlzLCBvYmplY3QpID0+IGtleXMuY29uY2F0KE9iamVjdC5rZXlzKG9iamVjdCkpLCBbXSk7XG4gIGNvbnN0IHVuaW9uID0gbmV3IFNldChhbGxLZXlzKTtcbiAgcmV0dXJuIG9iamVjdHMuZXZlcnkob2JqZWN0ID0+IHVuaW9uLnNpemUgPT09IE9iamVjdC5rZXlzKG9iamVjdCkubGVuZ3RoKTtcbn1cbmZ1bmN0aW9uIGNhbGxJZkZuKG1heWJlRm4sIGFyZykge1xuICByZXR1cm4gdHlwZW9mIG1heWJlRm4gPT09ICdmdW5jdGlvbicgPyBtYXliZUZuKGFyZykgOiBtYXliZUZuO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5leHBvcnQgZnVuY3Rpb24gdW5zdGFibGVfY3JlYXRlU3R5bGVGdW5jdGlvblN4KCkge1xuICBmdW5jdGlvbiBnZXRUaGVtZVZhbHVlKHByb3AsIHZhbCwgdGhlbWUsIGNvbmZpZykge1xuICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgW3Byb3BdOiB2YWwsXG4gICAgICB0aGVtZVxuICAgIH07XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbmZpZ1twcm9wXTtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtwcm9wXTogdmFsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjc3NQcm9wZXJ0eSA9IHByb3AsXG4gICAgICB0aGVtZUtleSxcbiAgICAgIHRyYW5zZm9ybSxcbiAgICAgIHN0eWxlXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUT0RPIHY2OiByZW1vdmUsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbXVpL21hdGVyaWFsLXVpL3B1bGwvMzgxMjNcbiAgICBpZiAodGhlbWVLZXkgPT09ICd0eXBvZ3JhcGh5JyAmJiB2YWwgPT09ICdpbmhlcml0Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW3Byb3BdOiB2YWxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHRoZW1lTWFwcGluZyA9IGdldFBhdGgodGhlbWUsIHRoZW1lS2V5KSB8fCB7fTtcbiAgICBpZiAoc3R5bGUpIHtcbiAgICAgIHJldHVybiBzdHlsZShwcm9wcyk7XG4gICAgfVxuICAgIGNvbnN0IHN0eWxlRnJvbVByb3BWYWx1ZSA9IHByb3BWYWx1ZUZpbmFsID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IGdldFZhbHVlKHRoZW1lTWFwcGluZywgdHJhbnNmb3JtLCBwcm9wVmFsdWVGaW5hbCk7XG4gICAgICBpZiAocHJvcFZhbHVlRmluYWwgPT09IHZhbHVlICYmIHR5cGVvZiBwcm9wVmFsdWVGaW5hbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gSGF2ZW4ndCBmb3VuZCB2YWx1ZVxuICAgICAgICB2YWx1ZSA9IGdldFZhbHVlKHRoZW1lTWFwcGluZywgdHJhbnNmb3JtLCBgJHtwcm9wfSR7cHJvcFZhbHVlRmluYWwgPT09ICdkZWZhdWx0JyA/ICcnIDogY2FwaXRhbGl6ZShwcm9wVmFsdWVGaW5hbCl9YCwgcHJvcFZhbHVlRmluYWwpO1xuICAgICAgfVxuICAgICAgaWYgKGNzc1Byb3BlcnR5ID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbY3NzUHJvcGVydHldOiB2YWx1ZVxuICAgICAgfTtcbiAgICB9O1xuICAgIHJldHVybiBoYW5kbGVCcmVha3BvaW50cyhwcm9wcywgdmFsLCBzdHlsZUZyb21Qcm9wVmFsdWUpO1xuICB9XG4gIGZ1bmN0aW9uIHN0eWxlRnVuY3Rpb25TeChwcm9wcykge1xuICAgIGNvbnN0IHtcbiAgICAgIHN4LFxuICAgICAgdGhlbWUgPSB7fSxcbiAgICAgIG5lc3RlZFxuICAgIH0gPSBwcm9wcyB8fCB7fTtcbiAgICBpZiAoIXN4KSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gRW1vdGlvbiAmIHN0eWxlZC1jb21wb25lbnRzIHdpbGwgbmVnbGVjdCBudWxsXG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZyA9IHRoZW1lLnVuc3RhYmxlX3N4Q29uZmlnID8/IGRlZmF1bHRTeENvbmZpZztcblxuICAgIC8qXG4gICAgICogUmVjZWl2ZSBgc3hJbnB1dGAgYXMgb2JqZWN0IG9yIGNhbGxiYWNrXG4gICAgICogYW5kIHRoZW4gcmVjdXJzaXZlbHkgY2hlY2sga2V5cyAmIHZhbHVlcyB0byBjcmVhdGUgbWVkaWEgcXVlcnkgb2JqZWN0IHN0eWxlcy5cbiAgICAgKiAodGhlIHJlc3VsdCB3aWxsIGJlIHVzZWQgaW4gYHN0eWxlZGApXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhdmVyc2Uoc3hJbnB1dCkge1xuICAgICAgbGV0IHN4T2JqZWN0ID0gc3hJbnB1dDtcbiAgICAgIGlmICh0eXBlb2Ygc3hJbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzeE9iamVjdCA9IHN4SW5wdXQodGhlbWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3hJbnB1dCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gdmFsdWVcbiAgICAgICAgcmV0dXJuIHN4SW5wdXQ7XG4gICAgICB9XG4gICAgICBpZiAoIXN4T2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgZW1wdHlCcmVha3BvaW50cyA9IGNyZWF0ZUVtcHR5QnJlYWtwb2ludE9iamVjdCh0aGVtZS5icmVha3BvaW50cyk7XG4gICAgICBjb25zdCBicmVha3BvaW50c0tleXMgPSBPYmplY3Qua2V5cyhlbXB0eUJyZWFrcG9pbnRzKTtcbiAgICAgIGxldCBjc3MgPSBlbXB0eUJyZWFrcG9pbnRzO1xuICAgICAgT2JqZWN0LmtleXMoc3hPYmplY3QpLmZvckVhY2goc3R5bGVLZXkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGNhbGxJZkZuKHN4T2JqZWN0W3N0eWxlS2V5XSwgdGhlbWUpO1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnW3N0eWxlS2V5XSkge1xuICAgICAgICAgICAgICBjc3MgPSBtZXJnZShjc3MsIGdldFRoZW1lVmFsdWUoc3R5bGVLZXksIHZhbHVlLCB0aGVtZSwgY29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBicmVha3BvaW50c1ZhbHVlcyA9IGhhbmRsZUJyZWFrcG9pbnRzKHtcbiAgICAgICAgICAgICAgICB0aGVtZVxuICAgICAgICAgICAgICB9LCB2YWx1ZSwgeCA9PiAoe1xuICAgICAgICAgICAgICAgIFtzdHlsZUtleV06IHhcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICBpZiAob2JqZWN0c0hhdmVTYW1lS2V5cyhicmVha3BvaW50c1ZhbHVlcywgdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY3NzW3N0eWxlS2V5XSA9IHN0eWxlRnVuY3Rpb25TeCh7XG4gICAgICAgICAgICAgICAgICBzeDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICB0aGVtZSxcbiAgICAgICAgICAgICAgICAgIG5lc3RlZDogdHJ1ZVxuICAgICAgICAgICAgICAgI
1H0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNzcyA9IG1lcmdlKGNzcywgYnJlYWtwb2ludHNWYWx1ZXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNzcyA9IG1lcmdlKGNzcywgZ2V0VGhlbWVWYWx1ZShzdHlsZUtleSwgdmFsdWUsIHRoZW1lLCBjb25maWcpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFuZXN0ZWQgJiYgdGhlbWUubW9kdWxhckNzc0xheWVycykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICdAbGF5ZXIgc3gnOiBzb3J0Q29udGFpbmVyUXVlcmllcyh0aGVtZSwgcmVtb3ZlVW51c2VkQnJlYWtwb2ludHMoYnJlYWtwb2ludHNLZXlzLCBjc3MpKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNvcnRDb250YWluZXJRdWVyaWVzKHRoZW1lLCByZW1vdmVVbnVzZWRCcmVha3BvaW50cyhicmVha3BvaW50c0tleXMsIGNzcykpO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShzeCkgPyBzeC5tYXAodHJhdmVyc2UpIDogdHJhdmVyc2Uoc3gpO1xuICB9XG4gIHJldHVybiBzdHlsZUZ1bmN0aW9uU3g7XG59XG5jb25zdCBzdHlsZUZ1bmN0aW9uU3ggPSB1bnN0YWJsZV9jcmVhdGVTdHlsZUZ1bmN0aW9uU3goKTtcbnN0eWxlRnVuY3Rpb25TeC5maWx0ZXJQcm9wcyA9IFsnc3gnXTtcbmV4cG9ydCBkZWZhdWx0IHN0eWxlRnVuY3Rpb25TeDsiLCIvKipcbiAqIEEgdW5pdmVyc2FsIHV0aWxpdHkgdG8gc3R5bGUgY29tcG9uZW50cyB3aXRoIG11bHRpcGxlIGNvbG9yIG1vZGVzLiBBbHdheXMgdXNlIGl0IGZyb20gdGhlIHRoZW1lIG9iamVjdC5cbiAqIEl0IHdvcmtzIHdpdGg6XG4gKiAgLSBbQmFzaWMgdGhlbWVdKGh0dHBzOi8vbXVpLmNvbS9tYXRlcmlhbC11aS9jdXN0b21pemF0aW9uL2RhcmstbW9kZS8pXG4gKiAgLSBbQ1NTIHRoZW1lIHZhcmlhYmxlc10oaHR0cHM6Ly9tdWkuY29tL21hdGVyaWFsLXVpL2N1c3RvbWl6YXRpb24vY3NzLXRoZW1lLXZhcmlhYmxlcy9vdmVydmlldy8pXG4gKiAgLSBaZXJvLXJ1bnRpbWUgZW5naW5lXG4gKlxuICogVGlwczogVXNlIGFuIGFycmF5IG92ZXIgb2JqZWN0IHNwcmVhZCBhbmQgcGxhY2UgYHRoZW1lLmFwcGx5U3R5bGVzKClgIGxhc3QuXG4gKlxuICogV2l0aCB0aGUgc3R5bGVkIGZ1bmN0aW9uOlxuICog4pyFIFt7IGJhY2tncm91bmQ6ICcjZTVlNWU1JyB9LCB0aGVtZS5hcHBseVN0eWxlcygnZGFyaycsIHsgYmFja2dyb3VuZDogJyMxYzFjMWMnIH0pXVxuICog8J+aqyB7IGJhY2tncm91bmQ6ICcjZTVlNWU1JywgLi4udGhlbWUuYXBwbHlTdHlsZXMoJ2RhcmsnLCB7IGJhY2tncm91bmQ6ICcjMWMxYzFjJyB9KX1cbiAqXG4gKiBXaXRoIHRoZSBzeCBwcm9wOlxuICog4pyFIFt7IGJhY2tncm91bmQ6ICcjZTVlNWU1JyB9LCB0aGVtZSA9PiB0aGVtZS5hcHBseVN0eWxlcygnZGFyaycsIHsgYmFja2dyb3VuZDogJyMxYzFjMWMnIH0pXVxuICog8J+aqyB7IGJhY2tncm91bmQ6ICcjZTVlNWU1JywgLi4udGhlbWUgPT4gdGhlbWUuYXBwbHlTdHlsZXMoJ2RhcmsnLCB7IGJhY2tncm91bmQ6ICcjMWMxYzFjJyB9KX1cbiAqXG4gKiBAZXhhbXBsZVxuICogMS4gdXNpbmcgd2l0aCBgc3R5bGVkYDpcbiAqIGBgYGpzeFxuICogICBjb25zdCBDb21wb25lbnQgPSBzdHlsZWQoJ2RpdicpKCh7IHRoZW1lIH0pID0+IFtcbiAqICAgICB7IGJhY2tncm91bmQ6ICcjZTVlNWU1JyB9LFxuICogICAgIHRoZW1lLmFwcGx5U3R5bGVzKCdkYXJrJywge1xuICogICAgICAgYmFja2dyb3VuZDogJyMxYzFjMWMnLFxuICogICAgICAgY29sb3I6ICcjZmZmJyxcbiAqICAgICB9KSxcbiAqICAgXSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogMi4gdXNpbmcgd2l0aCBgc3hgIHByb3A6XG4gKiBgYGBqc3hcbiAqICAgPEJveCBzeD17W1xuICogICAgIHsgYmFja2dyb3VuZDogJyNlNWU1ZTUnIH0sXG4gKiAgICAgdGhlbWUgPT4gdGhlbWUuYXBwbHlTdHlsZXMoJ2RhcmsnLCB7XG4gKiAgICAgICAgYmFja2dyb3VuZDogJyMxYzFjMWMnLFxuICogICAgICAgIGNvbG9yOiAnI2ZmZicsXG4gKiAgICAgIH0pLFxuICogICAgIF19XG4gKiAgIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogMy4gdGhlbWluZyBhIGNvbXBvbmVudDpcbiAqIGBgYGpzeFxuICogICBleHRlbmRUaGVtZSh7XG4gKiAgICAgY29tcG9uZW50czoge1xuICogICAgICAgTXVpQnV0dG9uOiB7XG4gKiAgICAgICAgIHN0eWxlT3ZlcnJpZGVzOiB7XG4gKiAgICAgICAgICAgcm9vdDogKHsgdGhlbWUgfSkgPT4gW1xuICogICAgICAgICAgICAgeyBiYWNrZ3JvdW5kOiAnI2U1ZTVlNScgfSxcbiAqICAgICAgICAgICAgIHRoZW1lLmFwcGx5U3R5bGVzKCdkYXJrJywge1xuICogICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnIzFjMWMxYycsXG4gKiAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZicsXG4gKiAgICAgICAgICAgICB9KSxcbiAqICAgICAgICAgICBdLFxuICogICAgICAgICB9LFxuICogICAgICAgfVxuICogICAgIH1cbiAqICAgfSlcbiAqYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFwcGx5U3R5bGVzKGtleSwgc3R5bGVzKSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhpcyBpcyAnYW55JyB0eXBlXG4gIGNvbnN0IHRoZW1lID0gdGhpcztcbiAgaWYgKHRoZW1lLnZhcnMpIHtcbiAgICBpZiAoIXRoZW1lLmNvbG9yU2NoZW1lcz8uW2tleV0gfHwgdHlwZW9mIHRoZW1lLmdldENvbG9yU2NoZW1lU2VsZWN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgLy8gSWYgQ3NzVmFyc1Byb3ZpZGVyIGlzIHVzZWQgYXMgYSBwcm92aWRlciwgcmV0dXJucyAnKjp3aGVyZSh7c2VsZWN0b3J9KSAmJ1xuICAgIGxldCBzZWxlY3RvciA9IHRoZW1lLmdldENvbG9yU2NoZW1lU2VsZWN0b3Ioa2V5KTtcbiAgICBpZiAoc2VsZWN0b3IgPT09ICcmJykge1xuICAgICAgcmV0dXJuIHN0eWxlcztcbiAgICB9XG4gICAgaWYgKHNlbGVjdG9yLmluY2x1ZGVzKCdkYXRhLScpIHx8IHNlbGVjdG9yLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgIC8vICcqJyBpcyByZXF1aXJlZCBhcyBhIHdvcmthcm91bmQgZm9yIEVtb3Rpb24gaXNzdWUgKGh0dHBzOi8vZ2l0aHViLmNvbS9lbW90aW9uLWpzL2Vtb3Rpb24vaXNzdWVzLzI4MzYpXG4gICAgICBzZWxlY3RvciA9IGAqOndoZXJlKCR7c2VsZWN0b3IucmVwbGFjZSgvXFxzKiYkLywgJycpfSkgJmA7XG4gICAgfVxuICAgIHJldHVybi
1B7XG4gICAgICBbc2VsZWN0b3JdOiBzdHlsZXNcbiAgICB9O1xuICB9XG4gIGlmICh0aGVtZS5wYWxldHRlLm1vZGUgPT09IGtleSkge1xuICAgIHJldHVybiBzdHlsZXM7XG4gIH1cbiAgcmV0dXJuIHt9O1xufSIsImltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnQG11aS91dGlscy9kZWVwbWVyZ2UnO1xuaW1wb3J0IGNyZWF0ZUJyZWFrcG9pbnRzIGZyb20gXCIuLi9jcmVhdGVCcmVha3BvaW50cy9jcmVhdGVCcmVha3BvaW50cy5qc1wiO1xuaW1wb3J0IGNzc0NvbnRhaW5lclF1ZXJpZXMgZnJvbSBcIi4uL2Nzc0NvbnRhaW5lclF1ZXJpZXMvaW5kZXguanNcIjtcbmltcG9ydCBzaGFwZSBmcm9tIFwiLi9zaGFwZS5qc1wiO1xuaW1wb3J0IGNyZWF0ZVNwYWNpbmcgZnJvbSBcIi4vY3JlYXRlU3BhY2luZy5qc1wiO1xuaW1wb3J0IHN0eWxlRnVuY3Rpb25TeCBmcm9tIFwiLi4vc3R5bGVGdW5jdGlvblN4L3N0eWxlRnVuY3Rpb25TeC5qc1wiO1xuaW1wb3J0IGRlZmF1bHRTeENvbmZpZyBmcm9tIFwiLi4vc3R5bGVGdW5jdGlvblN4L2RlZmF1bHRTeENvbmZpZy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL2FwcGx5U3R5bGVzLmpzXCI7XG5mdW5jdGlvbiBjcmVhdGVUaGVtZShvcHRpb25zID0ge30sIC4uLmFyZ3MpIHtcbiAgY29uc3Qge1xuICAgIGJyZWFrcG9pbnRzOiBicmVha3BvaW50c0lucHV0ID0ge30sXG4gICAgcGFsZXR0ZTogcGFsZXR0ZUlucHV0ID0ge30sXG4gICAgc3BhY2luZzogc3BhY2luZ0lucHV0LFxuICAgIHNoYXBlOiBzaGFwZUlucHV0ID0ge30sXG4gICAgLi4ub3RoZXJcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGJyZWFrcG9pbnRzID0gY3JlYXRlQnJlYWtwb2ludHMoYnJlYWtwb2ludHNJbnB1dCk7XG4gIGNvbnN0IHNwYWNpbmcgPSBjcmVhdGVTcGFjaW5nKHNwYWNpbmdJbnB1dCk7XG4gIGxldCBtdWlUaGVtZSA9IGRlZXBtZXJnZSh7XG4gICAgYnJlYWtwb2ludHMsXG4gICAgZGlyZWN0aW9uOiAnbHRyJyxcbiAgICBjb21wb25lbnRzOiB7fSxcbiAgICAvLyBJbmplY3QgY29tcG9uZW50IGRlZmluaXRpb25zLlxuICAgIHBhbGV0dGU6IHtcbiAgICAgIG1vZGU6ICdsaWdodCcsXG4gICAgICAuLi5wYWxldHRlSW5wdXRcbiAgICB9LFxuICAgIHNwYWNpbmcsXG4gICAgc2hhcGU6IHtcbiAgICAgIC4uLnNoYXBlLFxuICAgICAgLi4uc2hhcGVJbnB1dFxuICAgIH1cbiAgfSwgb3RoZXIpO1xuICBtdWlUaGVtZSA9IGNzc0NvbnRhaW5lclF1ZXJpZXMobXVpVGhlbWUpO1xuICBtdWlUaGVtZS5hcHBseVN0eWxlcyA9IGFwcGx5U3R5bGVzO1xuICBtdWlUaGVtZSA9IGFyZ3MucmVkdWNlKChhY2MsIGFyZ3VtZW50KSA9PiBkZWVwbWVyZ2UoYWNjLCBhcmd1bWVudCksIG11aVRoZW1lKTtcbiAgbXVpVGhlbWUudW5zdGFibGVfc3hDb25maWcgPSB7XG4gICAgLi4uZGVmYXVsdFN4Q29uZmlnLFxuICAgIC4uLm90aGVyPy51bnN0YWJsZV9zeENvbmZpZ1xuICB9O1xuICBtdWlUaGVtZS51bnN0YWJsZV9zeCA9IGZ1bmN0aW9uIHN4KHByb3BzKSB7XG4gICAgcmV0dXJuIHN0eWxlRnVuY3Rpb25TeCh7XG4gICAgICBzeDogcHJvcHMsXG4gICAgICB0aGVtZTogdGhpc1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4gbXVpVGhlbWU7XG59XG5leHBvcnQgZGVmYXVsdCBjcmVhdGVUaGVtZTsiLCJpbXBvcnQgeyBpbnRlcm5hbF9zZXJpYWxpemVTdHlsZXMgfSBmcm9tICdAbXVpL3N0eWxlZC1lbmdpbmUnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcHJlcHJvY2Vzc1N0eWxlcyhpbnB1dCkge1xuICBjb25zdCB7XG4gICAgdmFyaWFudHMsXG4gICAgLi4uc3R5bGVcbiAgfSA9IGlucHV0O1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgdmFyaWFudHMsXG4gICAgc3R5bGU6IGludGVybmFsX3NlcmlhbGl6ZVN0eWxlcyhzdHlsZSksXG4gICAgaXNQcm9jZXNzZWQ6IHRydWVcbiAgfTtcblxuICAvLyBOb3Qgc3VwcG9ydGVkIG9uIHN0eWxlZC1jb21wb25lbnRzXG4gIGlmIChyZXN1bHQuc3R5bGUgPT09IHN0eWxlKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBpZiAodmFyaWFudHMpIHtcbiAgICB2YXJpYW50cy5mb3JFYWNoKHZhcmlhbnQgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YXJpYW50LnN0eWxlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhcmlhbnQuc3R5bGUgPSBpbnRlcm5hbF9zZXJpYWxpemVTdHlsZXModmFyaWFudC5zdHlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0iLCJpbXBvcnQgc3R5bGVkRW5naW5lU3R5bGVkLCB7IGludGVybmFsX211dGF0ZVN0eWxlcyBhcyBtdXRhdGVTdHlsZXMsIGludGVybmFsX3NlcmlhbGl6ZVN0eWxlcyBhcyBzZXJpYWxpemVTdHlsZXMgfSBmcm9tICdAbXVpL3N0eWxlZC1lbmdpbmUnO1xuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCB9IGZyb20gJ0BtdWkvdXRpbHMvZGVlcG1lcmdlJztcbmltcG9ydCBjYXBpdGFsaXplIGZyb20gJ0BtdWkvdXRpbHMvY2FwaXRhbGl6ZSc7XG5pbXBvcnQgZ2V0RGlzcGxheU5hbWUgZnJvbSAnQG11aS91dGlscy9nZXREaXNwbGF5TmFtZSc7XG5pbXBvcnQgY3JlYXRlVGhlbWUgZnJvbSBcIi4uL2NyZWF0ZVRoZW1lL2luZGV4LmpzXCI7XG5pbXBvcnQgc3R5bGVGdW5jdGlvblN4IGZyb20gXCIuLi9zdHlsZUZ1bmN0aW9uU3gvaW5kZXguanNcIjtcbmltcG9ydCBwcmVwcm9jZXNzU3R5bGVzIGZyb20gXCIuLi9wcmVwcm9jZXNzU3R5bGVzLmpzXCI7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1sYWJlbHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWxvbmUtYmxvY2tzICovXG5cbmV4cG9ydCBjb25zdCBzeXN0ZW1EZWZhdWx0VGhlbWUgPSBjcmVhdGVUaGVtZSgpO1xuXG4vLyBVcGRhdGUgL3N5c3RlbS9zdHlsZWQvI2FwaSBpbiBjYXNlIGlmIHRoaXMgY2hhbmdlc1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEZvcndhcmRQcm9wKHByb3ApIHtcbiAgcmV0dXJuIHByb3AgIT09ICdvd25lclN0YXRlJyAmJiBwcm9wICE9PSAndGhlbWUnICYmIHByb3AgIT09ICdzeCcgJiYgcHJvcCAhPT0gJ2FzJztcbn1cbmZ1bmN0aW9uIHNoYWxsb3dMYXllcihzZXJpYWxpemVkLCBsYXllck5hbWUpIHtcbiAgaWYgKGxheWVyTmFtZSAmJiBzZXJpYWxpemVkICYmIHR5cGVvZiBzZXJpYWxpemVkID09PSAnb2JqZWN0JyAmJiBzZXJpYWxpemVkLnN0eWxlcyAmJiAhc2VyaWFsaXplZC5zdHlsZXMuc3RhcnRzV2l0aCgnQGxheWVyJykgLy8gb25seSBhZGQgdGhlIGxheWVyIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLlxuICApIHtcbiAgICBzZXJpYWxpemVkLnN0eWxlcyA9IGBAbGF5ZXIgJHtsYXllck5hbWV9eyR7U3RyaW5nKHNlcmlhbGl6ZWQuc3R5bGVzKX19YDtcbiAgfVxuICByZXR1cm4gc2VyaWFsaXplZDtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRPdmVycmlkZXNSZXNvbHZlcihzbG90KSB7XG4gIGlmICghc2xvdCkge1xuICAgIHJldHVybi
1BudWxsO1xuICB9XG4gIHJldHVybiAoX3Byb3BzLCBzdHlsZXMpID0+IHN0eWxlc1tzbG90XTtcbn1cbmZ1bmN0aW9uIGF0dGFjaFRoZW1lKHByb3BzLCB0aGVtZUlkLCBkZWZhdWx0VGhlbWUpIHtcbiAgcHJvcHMudGhlbWUgPSBpc09iamVjdEVtcHR5KHByb3BzLnRoZW1lKSA/IGRlZmF1bHRUaGVtZSA6IHByb3BzLnRoZW1lW3RoZW1lSWRdIHx8IHByb3BzLnRoZW1lO1xufVxuZnVuY3Rpb24gcHJvY2Vzc1N0eWxlKHByb3BzLCBzdHlsZSwgbGF5ZXJOYW1lKSB7XG4gIC8qXG4gICAqIFN0eWxlIHR5cGVzOlxuICAgKiAgLSBudWxsL3VuZGVmaW5lZFxuICAgKiAgLSBzdHJpbmdcbiAgICogIC0gQ1NTIHN0eWxlIG9iamVjdDogeyBbY3NzS2V5XTogW2Nzc1ZhbHVlXSwgdmFyaWFudHMgfVxuICAgKiAgLSBQcm9jZXNzZWQgc3R5bGUgb2JqZWN0OiB7IHN0eWxlLCB2YXJpYW50cywgaXNQcm9jZXNzZWQ6IHRydWUgfVxuICAgKiAgLSBBcnJheSBvZiBhbnkgb2YgdGhlIGFib3ZlXG4gICAqL1xuXG4gIGNvbnN0IHJlc29sdmVkU3R5bGUgPSB0eXBlb2Ygc3R5bGUgPT09ICdmdW5jdGlvbicgPyBzdHlsZShwcm9wcykgOiBzdHlsZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmVzb2x2ZWRTdHlsZSkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRTdHlsZS5mbGF0TWFwKHN1YlN0eWxlID0+IHByb2Nlc3NTdHlsZShwcm9wcywgc3ViU3R5bGUsIGxheWVyTmFtZSkpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc29sdmVkU3R5bGU/LnZhcmlhbnRzKSkge1xuICAgIGxldCByb290U3R5bGU7XG4gICAgaWYgKHJlc29sdmVkU3R5bGUuaXNQcm9jZXNzZWQpIHtcbiAgICAgIHJvb3RTdHlsZSA9IGxheWVyTmFtZSA/IHNoYWxsb3dMYXllcihyZXNvbHZlZFN0eWxlLnN0eWxlLCBsYXllck5hbWUpIDogcmVzb2x2ZWRTdHlsZS5zdHlsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qge1xuICAgICAgICB2Y
1XJpYW50cyxcbiAgICAgICAgLi4ub3RoZXJTdHlsZXNcbiAgICAgIH0gPSByZXNvbHZlZFN0eWxlO1xuICAgICAgcm9vdFN0eWxlID0gbGF5ZXJOYW1lID8gc2hhbGxvd0xheWVyKHNlcmlhbGl6ZVN0eWxlcyhvdGhlclN0eWxlcyksIGxheWVyTmFtZSkgOiBvdGhlclN0eWxlcztcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NTdHlsZVZhcmlhbnRzKHByb3BzLCByZXNvbHZlZFN0eWxlLnZhcmlhbnRzLCBbcm9vdFN0eWxlXSwgbGF5ZXJOYW1lKTtcbiAgfVxuICBpZiAocmVzb2x2ZWRTdHlsZT8uaXNQcm9jZXNzZWQpIHtcbiAgICByZXR1cm4gbGF5ZXJOYW1lID8gc2hhbGxvd0xheWVyKHNlcmlhbGl6ZVN0eWxlcyhyZXNvbHZlZFN0eWxlLnN0eWxlKSwgbGF5ZXJOYW1lKSA6IHJlc29sdmVkU3R5bGUuc3R5bGU7XG4gIH1cbiAgcmV0dXJuIGxheWVyTmFtZSA/IHNoYWxsb3dMYXllcihzZXJpYWxpemVTdHlsZXMocmVzb2x2ZWRTdHlsZSksIGxheWVyTmFtZSkgOiByZXNvbHZlZFN0eWxlO1xufVxuZnVuY3Rpb24gcHJvY2Vzc1N0eWxlVmFyaWFudHMocHJvcHMsIHZhcmlhbnRzLCByZXN1bHRzID0gW10sIGxheWVyTmFtZSA9IHVuZGVmaW5lZCkge1xuICBsZXQgbWVyZ2VkU3RhdGU7IC8vIFdlIG1pZ2h0IG5vdCBuZWVkIGl0LCBpbml0aWFsaXplZCBsYXppbHlcblxuICB2YXJpYW50TG9vcDogZm9yIChsZXQgaSA9IDA7IGkgPCB2YXJpYW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHZhcmlhbnQgPSB2YXJpYW50c1tpXTtcbiAgICBpZiAodHlwZW9mIHZhcmlhbnQucHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG1lcmdlZFN0YXRlID8/PSB7XG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICAuLi5wcm9wcy5vd25lclN0YXRlLFxuICAgICAgICBvd25lclN0YXRlOiBwcm9wcy5vd25lclN0YXRlXG4gICAgICB9O1xuICAgICAgaWYgKCF2YXJpYW50LnByb3BzKG1lcmdlZFN0YXRlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFyaWFudC5wcm9wcykge1xuICAgICAgICBpZiAocHJvcHNba2V5XSAhPT0gdmFyaWFudC5wcm9wc1trZXldICYmIHByb3BzLm93bmVyU3RhdGU/LltrZXldICE9PSB2YXJpYW50LnByb3BzW2tleV0pIHtcbiAgICAgICAgICBjb250aW51ZSB2YXJpYW50TG9vcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhcmlhbnQuc3R5bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG1lcmdlZFN0YXRlID8/PSB7XG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICAuLi5wcm9wcy5vd25lclN0YXRlLFxuICAgICAgICBvd25lclN0YXRlOiBwcm9wcy5vd25lclN0YXRlXG4gICAgICB9O1xuICAgICAgcmVzdWx0cy5wdXNoKGxheWVyTmFtZSA/IHNoYWxsb3dMYXllcihzZXJpYWxpemVTdHlsZXModmFyaWFudC5zdHlsZShtZXJnZWRTdGF0ZSkpLCBsYXllck5hbWUpIDogdmFyaWFudC5zdHlsZShtZXJnZWRTdGF0ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRzLnB1c2gobGF5ZXJOYW1lID8gc2hhbGxvd0xheWVyKHNlcmlhbGl6ZVN0eWxlcyh2YXJpYW50LnN0eWxlKSwgbGF5ZXJOYW1lKSA6IHZhcmlhbnQuc3R5bGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVN0eWxlZChpbnB1dCA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0aGVtZUlkLFxuICAgIGRlZmF1bHRUaGVtZSA9IHN5c3RlbURlZmF1bHRUaGVtZSxcbiAgICByb290U2hvdWxkRm9yd2FyZFByb3AgPSBzaG91bGRGb3J3YXJkUHJvcCxcbiAgICBzbG90U2hvdWxkRm9yd2FyZFByb3AgPSBzaG91bGRGb3J3YXJkUHJvcFxuICB9ID0gaW5wdXQ7XG4gIGZ1bmN0aW9uIHN0eWxlQXR0YWNoVGhlbWUocHJvcHMpIHtcbiAgICBhdHRhY2hUaGVtZShwcm9wcywgdGhlbWVJZCwgZGVmYXVsdFRoZW1lKTtcbiAgfVxuICBjb25zdCBzdHlsZWQgPSAodGFnLCBpbnB1dE9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIC8vIElmIGB0YWdgIGlzIGFscmVhZHkgYSBzdHlsZWQgY29tcG9uZW50LCBmaWx0ZXIgb3V0IHRoZSBgc3hgIHN0eWxlIGZ1bmN0aW9uXG4gICAgLy8gdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBzdHlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSBjb21wb3NpdGUgY29tcG9uZW50cy5cbiAgICBtdXRhdGVTdHlsZXModGFnLCBzdHlsZXMgPT4gc3R5bGVzLmZpbHRlcihzdHlsZSA9PiBzdHlsZSAhPT0gc3R5bGVGdW5jdGlvblN4KSk7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZTogY29tcG9uZW50TmFtZSxcbiAgICAgIHNsb3Q6IGNvbXBvbmVudFNsb3QsXG4gICAgICBza2lwVmFyaWFudHNSZXNvbHZlcjogaW5wdXRTa2lwVmFyaWFudHNSZXNvbHZlcixcbiAgICAgIHNraXBTeDogaW5wdXRTa2lwU3gsXG4gICAgICAvLyBUT0RPIHY2OiByZW1vdmUgYGxvd2VyY2FzZUZpcnN0TGV0dGVyKClgIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2VcbiAgICAgIC8vIEZvciBtb3JlIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9tdWkvbWF0ZXJpYWwtdWkvcHVsbC8zNzkwOFxuICAgICAgb3ZlcnJpZGVzUmVzb2x2ZXIgPSBkZWZhdWx0T3ZlcnJpZGVzUmVzb2x2ZXIobG93ZXJjYXNlRmlyc3RMZXR0ZXIoY29tcG9uZW50U2xvdCkpLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSBpbnB1dE9wdGlvbnM7XG4gICAgY29uc3QgbGF5ZXJOYW1lID0gY29tcG9uZW50TmFtZSAmJiBjb21wb25lbnROYW1lLnN0YXJ0c1dpdGgoJ011aScpIHx8ICEhY29tcG9uZW50U2xvdCA/ICdjb21wb25lbnRzJyA6ICdjdXN0b20nO1xuXG4gICAgLy8gaWYgc2tpcFZhcmlhbnRzUmVzb2x2ZXIgb3B0aW9uIGlzIGRlZmluZWQsIHRha2UgdGhlIHZhbHVlLCBvdGhlcndpc2UsIHRydWUgZm9yIHJvb3QgYW5kIGZhbHNlIGZvciBvdGhlciBzbG90cy5cbiAgICBjb25zdCBza2lwVmFyaWFudHNSZXNvbHZlciA9IGlucHV0U2tpcFZhcmlhbnRzUmVzb2x2ZXIgIT09IHVuZGVmaW5lZCA/IGlucHV0U2tpcFZhcmlhbnRzUmVzb2x2ZXIgOlxuICAgIC8vIFRPRE8gdjY6IHJlbW92ZSBgUm9vdGAgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZVxuICAgIC8vIEZvciBtb3JlIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9tdWkvbWF0ZXJpYWwtdWkvcHVsbC8zNzkwOFxuICAgIGNvbXBvbmVudFNsb3QgJiYgY29tcG9uZW50U2xvdCAhPT0gJ1Jvb3QnICYmIGNvbXBvbmVudFNsb3QgIT09ICdyb290JyB8fCBmYWxzZTtcbiAgICBjb25zdCBza2lwU3ggPSBpbnB1dFNraXBTeCB8fCBmYWxzZTtcbiAgICBsZXQgc2hvdWxkRm9yd2FyZFByb3BPcHRpb24gPSBzaG91bGRGb3J3YXJkUHJvcDtcblxuICAgIC8vIFRPRE8gdjY6IHJlbW92ZSBgUm9vdGAgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZVxuICAgIC8vIEZvciBtb3JlIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9tdWkvbWF0ZXJpYWwtdWkvcHVsbC8zNzkwOFxuICAgIGlmIChjb21wb25lbnRTbG90ID09PSAnUm9vdCcgfHwgY29tcG9uZW50U2xvdCA9PT0gJ3Jvb3QnKSB7XG4gICAgICBzaG91bGRGb3J3YXJkUHJvcE9wdGlvbiA9IHJvb3RTaG91bGRGb3J3YXJkUHJvcDtcbiAgICB9IGVsc2UgaWYgKGNvbXBvbmVudFNsb3QpIHtcbiAgICAgIC8vIGFueSBvdGhlciBzbG90IHNwZWNpZmllZFxuICAgICAgc2hvdWxkRm9yd2FyZFByb3BPcHRpb24gPSBzbG90U2hvdWxkRm9yd2FyZFByb3A7XG4gICAgfSBlbHNlIGlmIChpc1N0cmluZ1RhZyh0YWcpKSB7XG4gICAgICAvLyBmb3Igc3RyaW5nIChodG
11sKSB0YWcsIHByZXNlcnZlIHRoZSBiZWhhdmlvciBpbiBlbW90aW9uICYgc3R5bGVkLWNvbXBvbmVudHMuXG4gICAgICBzaG91bGRGb3J3YXJkUHJvcE9wdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGVmYXVsdFN0eWxlZFJlc29sdmVyID0gc3R5bGVkRW5naW5lU3R5bGVkKHRhZywge1xuICAgICAgc2hvdWxkRm9yd2FyZFByb3A6IHNob3VsZEZvcndhcmRQcm9wT3B0aW9uLFxuICAgICAgbGFiZWw6IGdlbmVyYXRlU3R5bGVkTGFiZWwoY29tcG9uZW50TmFtZSwgY29tcG9uZW50U2xvdCksXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSk7XG4gICAgY29uc3QgdHJhbnNmb3JtU3R5bGUgPSBzdHlsZSA9PiB7XG4gICAgICAvLyAtIE9uIHRoZSBzZXJ2ZXIgRW1vdGlvbiBkb2Vzbid0IHVzZSBSZWFjdC5mb3J3YXJkUmVmIGZvciBjcmVhdGluZyBjb21wb25lbnRzLCBzbyB0aGUgY3JlYXRlZFxuICAgICAgLy8gICBjb21wb25lbnQgc3RheXMgYXMgYSBmdW5jdGlvbi4gVGhpcyBjb25kaXRpb24gbWFrZXMgc3VyZSB0aGF0IHdlIGRvIG5vdCBpbnRlcnBvbGF0ZSBmdW5jdGlvbnNcbiAgICAgIC8vICAgd2hpY2ggYXJlIGJhc2ljYWxseSBjb21wb25lbnRzIHVzZWQgYXMgYSBzZWxlY3RvcnMuXG4gICAgICAvLyAtIGBzdHlsZWAgY291bGQgYmUgYSBzdHlsZWQgY29tcG9uZW50IGZyb20gYSBiYWJlbCBwbHVnaW4gZm9yIGNvbXBvbmVudCBzZWxlY3RvcnMsIFRoaXMgY29uZGl0aW9uXG4gICAgICAvLyAgIG1ha2VzIHN1cmUgdGhhdCB3ZSBkbyBub3QgaW50ZXJwb2xhdGUgdGhlbS5cbiAgICAgIGlmIChzdHlsZS5fX2Vtb3Rpb25fcmVhbCA9PT0gc3R5bGUpIHtcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBzdHlsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gc3R5bGVGdW5jdGlvblByb2Nlc3Nvcihwcm9wcykge1xuICAgICAgICAgIHJldHVybiBwcm9jZXNzU3R5bGUocHJvcHMsIHN0eWxlLCBwcm9wcy50aGVtZS5tb2R1bGFyQ3NzTGF5ZXJzID8gbGF5ZXJOYW1lIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KHN0eWxlKSkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gcHJlcHJvY2Vzc1N0eWxlcyhzdHlsZSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBzdHlsZU9iamVjdFByb2Nlc3Nvcihwcm9wcykge1xuICAgICAgICAgIGlmICghc2VyaWFsaXplZC52YXJpYW50cykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzLnRoZW1lLm1vZHVsYXJDc3NMYXllcnMgPyBzaGFsbG93TGF5ZXIoc2VyaWFsaXplZC5zdHlsZSwgbGF5ZXJOYW1lKSA6IHNlcmlhbGl6ZWQuc3R5bGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwcm9jZXNzU3R5bGUocHJvcHMsIHNlcmlhbGl6ZWQsIHByb3BzLnRoZW1lLm1vZHVsYXJDc3NMYXllcnMgPyBsYXllck5hbWUgOiB1bmRlZmluZWQpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH07XG4gICAgY29uc3QgbXVpU3R5bGVkUmVzb2x2ZXIgPSAoLi4uZXhwcmVzc2lvbnNJbnB1dCkgPT4ge1xuICAgICAgY29uc3QgZXhwcmVzc2lvbnNIZWFkID0gW107XG4gICAgICBjb25zdCBleHByZXNzaW9uc0JvZHkgPSBleHByZXNzaW9uc0lucHV0Lm1hcCh0cmFuc2Zvcm1TdHlsZSk7XG4gICAgICBjb25zdCBleHByZXNzaW9uc1RhaWwgPSBbXTtcblxuICAgICAgLy8gUHJlcHJvY2VzcyBgcHJvcHNgIHRvIHNldCB0aGUgc2NvcGVkIHRoZW1lIHZhbHVlLlxuICAgICAgLy8gVGhpcyBtdXN0IHJ1biBiZWZvcmUgYW55IG90aGVyIGV4cHJlc3Npb24uXG4gICAgICBleHByZXNzaW9uc0hlYWQucHVzaChzdHlsZUF0dGFjaFRoZW1lKTtcbiAgICAgIGlmIChjb21wb25lbnROYW1lICYmIG92ZXJyaWRlc1Jlc29sdmVyKSB7XG4gICAgICAgIGV4cHJlc3Npb25zVGFpbC5wdXNoKGZ1bmN0aW9uIHN0eWxlVGhlbWVPdmVycmlkZXMocHJvcHMpIHtcbiAgICAgICAgICBjb25zdCB0aGVtZSA9IHByb3BzLnRoZW1lO1xuICAgICAgICAgIGNvbnN0IHN0eWxlT3ZlcnJpZGVzID0gdGhlbWUuY29tcG9uZW50cz8uW2NvbXBvbmVudE5hbWVdPy5zdHlsZU92ZXJyaWRlcztcbiAgICAgICAgICBpZiAoIXN0eWxlT3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRTdHlsZU92ZXJyaWRlcyA9IHt9O1xuXG4gICAgICAgICAgLy8gVE9ETzogdjcgcmVtb3ZlIGl0ZXJhdGlvbiBhbmQgdXNlIGByZXNvbHZlU3R5bGVBcmcoc3R5bGVPdmVycmlkZXNbc2xvdF0pYCBkaXJlY3RseVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBndWFyZC1mb3ItaW5cbiAgICAgICAgICBmb3IgKGNvbnN0IHNsb3RLZXkgaW4gc3R5bGVPdmVycmlkZXMpIHtcbiAgICAgICAgICAgIHJlc29sdmVkU3R5bGVPdmVycmlkZXNbc2xvdEtleV0gPSBwcm9jZXNzU3R5bGUocHJvcHMsIHN0eWxlT3ZlcnJpZGVzW3Nsb3RLZXldLCBwcm9wcy50aGVtZS5tb2R1bGFyQ3NzTGF5ZXJzID8gJ3RoZW1lJyA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdmVycmlkZXNSZXNvbHZlcihwcm9wcywgcmVzb2x2ZWRTdHlsZU92ZXJyaWRlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXBvbmVudE5hbWUgJiYgIXNraXBWYXJpYW50c1Jlc29sdmVyKSB7XG4gICAgICAgIGV4cHJlc3Npb25zVGFpbC5wdXNoKGZ1bmN0aW9uIHN0eWxlVGhlbWVWYXJpYW50cyhwcm9wcykge1xuICAgICAgICAgIGNvbnN0IHRoZW1lID0gcHJvcHMudGhlbWU7XG4gICAgICAgICAgY29uc3QgdGhlbWVWYXJpYW50cyA9IHRoZW1lPy5jb21wb25lbnRzPy5bY29tcG9uZW50TmFtZV0/LnZhcmlhbnRzO1xuICAgICAgICAgIGlmICghdGhlbWVWYXJpYW50cykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwcm9jZXNzU3R5bGVWYXJpYW50cyhwcm9wcywgdGhlbWVWYXJpYW50cywgW10sIHByb3BzLnRoZW1lLm1vZHVsYXJDc3NMYXllcnMgPyAndGhlbWUnIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIXNraXBTeCkge1xuICAgICAgICBleHByZXNzaW9uc1RhaWwucHVzaChzdHlsZUZ1bmN0aW9uU3gpO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYXMgYSB0YWdnZWQgdGVtcGxhdGUsIHNvIHRoZSBmaXJzdCBhcmd1bWVudCB3b3VsZCBjb250YWluXG4gICAgICAvLyBDU1MgYHN0cmluZ1tdYCB2YWx1ZXMuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShleHByZXNzaW9uc0JvZHlbMF0pKSB7XG4gICAgICAgIGNvbnN0IGlucHV0U3RyaW5ncyA9IGV4cHJlc3Npb25zQm9keS5zaGlmdCgpO1xuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gYWRkIHBsYWNlaG9sZG
1VycyBpbiB0aGUgdGFnZ2VkIHRlbXBsYXRlIGZvciB0aGUgY3VzdG9tIGZ1bmN0aW9ucyB3ZSBoYXZlXG4gICAgICAgIC8vIHBvc3NpYmx5IGFkZGVkIChhdHRhY2hUaGVtZSwgb3ZlcnJpZGVzLCB2YXJpYW50cywgYW5kIHN4KS5cbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzSGVhZCA9IG5ldyBBcnJheShleHByZXNzaW9uc0hlYWQubGVuZ3RoKS5maWxsKCcnKTtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzVGFpbCA9IG5ldyBBcnJheShleHByZXNzaW9uc1RhaWwubGVuZ3RoKS5maWxsKCcnKTtcbiAgICAgICAgbGV0IG91dHB1dFN0cmluZ3M7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB7XG4gICAgICAgICAgb3V0cHV0U3RyaW5ncyA9IFsuLi5wbGFjZWhvbGRlcnNIZWFkLCAuLi5pbnB1dFN0cmluZ3MsIC4uLnBsYWNlaG9sZGVyc1RhaWxdO1xuICAgICAgICAgIG91dHB1dFN0cmluZ3MucmF3ID0gWy4uLnBsYWNlaG9sZGVyc0hlYWQsIC4uLmlucHV0U3RyaW5ncy5yYXcsIC4uLnBsYWNlaG9sZGVyc1RhaWxdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIG9ubHkgY2FzZSB3aGVyZSB3ZSBwdXQgc29tZXRoaW5nIGJlZm9yZSBgYXR0YWNoVGhlbWVgXG4gICAgICAgIGV4cHJlc3Npb25zSGVhZC51bnNoaWZ0KG91dHB1dFN0cmluZ3MpO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhwcmVzc2lvbnMgPSBbLi4uZXhwcmVzc2lvbnNIZWFkLCAuLi5leHByZXNzaW9uc0JvZHksIC4uLmV4cHJlc3Npb25zVGFpbF07XG4gICAgICBjb25zdCBDb21wb25lbnQgPSBkZWZhdWx0U3R5bGVkUmVzb2x2ZXIoLi4uZXhwcmVzc2lvbnMpO1xuICAgICAgaWYgKHRhZy5tdWlOYW1lKSB7XG4gICAgICAgIENvbXBvbmVudC5tdWlOYW1lID0gdGFnLm11aU5hbWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBDb21wb25lbnQuZGlzcGxheU5hbWUgPSBnZW5lcmF0ZURpc3BsYXlOYW1lKGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudFNsb3QsIHRhZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gQ29tcG9uZW50O1xuICAgIH07XG4gICAgaWYgKGRlZmF1bHRTdHlsZWRSZXNvbHZlci53aXRoQ29uZmlnKSB7XG4gICAgICBtdWlTdHlsZWRSZXNvbHZlci53aXRoQ29uZmlnID0gZGVmYXVsdFN0eWxlZFJlc29sdmVyLndpdGhDb25maWc7XG4gICAgfVxuICAgIHJldHVybiBtdWlTdHlsZWRSZXNvbHZlcjtcbiAgfTtcbiAgcmV0dXJuIHN0eWxlZDtcbn1cbmZ1bmN0aW9uIGdlbmVyYXRlRGlzcGxheU5hbWUoY29tcG9uZW50TmFtZSwgY29tcG9uZW50U2xvdCwgdGFnKSB7XG4gIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgcmV0dXJuIGAke2NvbXBvbmVudE5hbWV9JHtjYXBpdGFsaXplKGNvbXBvbmVudFNsb3QgfHwgJycpfWA7XG4gIH1cbiAgcmV0dXJuIGBTdHlsZWQoJHtnZXREaXNwbGF5TmFtZSh0YWcpfSlgO1xufVxuZnVuY3Rpb24gZ2VuZXJhdGVTdHlsZWRMYWJlbChjb21wb25lbnROYW1lLCBjb21wb25lbnRTbG90KSB7XG4gIGxldCBsYWJlbDtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoY29tcG9uZW50TmFtZSkge1xuICAgICAgLy8gVE9ETyB2NjogcmVtb3ZlIGBsb3dlcmNhc2VGaXJzdExldHRlcigpYCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlXG4gICAgICAvLyBGb3IgbW9yZSBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vbXVpL21hdGVyaWFsLXVpL3B1bGwvMzc5MDhcbiAgICAgIGxhYmVsID0gYCR7Y29tcG9uZW50TmFtZX0tJHtsb3dlcmNhc2VGaXJzdExldHRlcihjb21wb25lbnRTbG90IHx8ICdSb290Jyl9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxhYmVsO1xufVxuZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmplY3QpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIGZvciAoY29uc3QgXyBpbiBvYmplY3QpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW90aW9uLWpzL2Vtb3Rpb24vYmxvYi8yNmRlZDYxMDlmY2Q4Y2E5ODc1Y2MyY2U0NTY0ZmVlNjc4YTNmM2M1L3BhY2thZ2VzL3N0eWxlZC9zcmMvdXRpbHMuanMjTDQwXG5mdW5jdGlvbiBpc1N0cmluZ1RhZyh0YWcpIHtcbiAgcmV0dXJuIHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnICYmXG4gIC8vIDk2IGlzIG9uZSBsZXNzIHRoYW4gdGhlIGNoYXIgY29kZVxuICAvLyBmb3IgXCJhXCIgc28gdGhpcyBpcyBjaGVja2luZyB0aGF0XG4gIC8vIGl0J3MgYSBsb3dlcmNhc2UgY2hhcmFjdGVyXG4gIHRhZy5jaGFyQ29kZUF0KDApID4gOTY7XG59XG5mdW5jdGlvbiBsb3dlcmNhc2VGaXJzdExldHRlcihzdHJpbmcpIHtcbiAgaWYgKCFzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG4gIHJldHVybiBzdHJpbmcuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHJpbmcuc2xpY2UoMSk7XG59IiwiZnVuY3Rpb24gY2xhbXAodmFsLCBtaW4gPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiwgbWF4ID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4odmFsLCBtYXgpKTtcbn1cbmV4cG9ydCBkZWZhdWx0IGNsYW1wOyIsImltcG9ydCBfZm9ybWF0RXJyb3JNZXNzYWdlIGZyb20gXCJAbXVpL3V0aWxzL2Zvcm1hdE11aUVycm9yTWVzc2FnZVwiO1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXG5pbXBvcnQgY2xhbXAgZnJvbSAnQG11aS91dGlscy9jbGFtcCc7XG5cbi8qKlxuICogUmV0dXJucyBhIG51bWJlciB3aG9zZSB2YWx1ZSBpcyBsaW1pdGVkIHRvIHRoZSBnaXZlbiByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgY2xhbXBlZFxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiBUaGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIG91dHB1dCByYW5nZVxuICogQHBhcmFtIHtudW1iZXJ9IG1heCBUaGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIG91
1dHB1dCByYW5nZVxuICogQHJldHVybnMge251bWJlcn0gQSBudW1iZXIgaW4gdGhlIHJhbmdlIFttaW4sIG1heF1cbiAqL1xuZnVuY3Rpb24gY2xhbXBXcmFwcGVyKHZhbHVlLCBtaW4gPSAwLCBtYXggPSAxKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBNVUk6IFRoZSB2YWx1ZSBwcm92aWRlZCAke3ZhbHVlfSBpcyBvdXQgb2YgcmFuZ2UgWyR7bWlufSwgJHttYXh9XS5gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNsYW1wKHZhbHVlLCBtaW4sIG1heCk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBjb2xvciBmcm9tIENTUyBoZXggZm9ybWF0IHRvIENTUyByZ2IgZm9ybWF0LlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gSGV4IGNvbG9yLCBpLmUuICNubm4gb3IgI25ubm5ublxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgcmdiIGNvbG9yIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9SZ2IoY29sb3IpIHtcbiAgY29sb3IgPSBjb2xvci5zbGljZSgxKTtcbiAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGAuezEsJHtjb2xvci5sZW5ndGggPj0gNiA/IDIgOiAxfX1gLCAnZycpO1xuICBsZXQgY29sb3JzID0gY29sb3IubWF0Y2gocmUpO1xuICBpZiAoY29sb3JzICYmIGNvbG9yc1swXS5sZW5ndGggPT09IDEpIHtcbiAgICBjb2xvcnMgPSBjb2xvcnMubWFwKG4gPT4gbiArIG4pO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGNvbG9yLmxlbmd0aCAhPT0gY29sb3IudHJpbSgpLmxlbmd0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihgTVVJOiBUaGUgY29sb3I6IFwiJHtjb2xvcn1cIiBpcyBpbnZhbGlkLiBNYWtlIHN1cmUgdGhlIGNvbG9yIGlucHV0IGRvZXNuJ3QgY29udGFpbiBsZWFkaW5nL3RyYWlsaW5nIHNwYWNlLmApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29sb3JzID8gYHJnYiR7Y29sb3JzLmxlbmd0aCA9PT0gNCA/ICdhJyA6ICcnfSgke2NvbG9ycy5tYXAoKG4sIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIGluZGV4IDwgMyA/IHBhcnNlSW50KG4sIDE2KSA6IE1hdGgucm91bmQocGFyc2VJbnQobiwgMTYpIC8gMjU1ICogMTAwMCkgLyAxMDAwO1xuICB9KS5qb2luKCcsICcpfSlgIDogJyc7XG59XG5mdW5jdGlvbiBpbnRUb0hleChpbnQpIHtcbiAgY29uc3QgaGV4ID0gaW50LnRvU3RyaW5nKDE2KTtcbiAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBgMCR7aGV4fWAgOiBoZXg7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgdHlwZSBhbmQgdmFsdWVzIG9mIGEgY29sb3IuXG4gKlxuICogTm90ZTogRG9lcyBub3Qgc3VwcG9ydCByZ2IgJSB2YWx1ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBDU1MgY29sb3IsIGkuZS4gb25lIG9mOiAjbm5uLCAjbm5ubm5uLCByZ2IoKSwgcmdiYSgpLCBoc2woKSwgaHNsYSgpLCBjb2xvcigpXG4gKiBAcmV0dXJucyB7b2JqZWN0fSAtIEEgTVVJIGNvbG9yIG9iamVjdDoge3R5cGU6IHN0cmluZywgdmFsdWVzOiBudW1iZXJbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29tcG9zZUNvbG9yKGNvbG9yKSB7XG4gIC8vIElkZW1wb3RlbnRcbiAgaWYgKGNvbG9yLnR5cGUpIHtcbiAgICByZXR1cm4gY29sb3I7XG4gIH1cbiAgaWYgKGNvbG9yLmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgcmV0dXJuIGRlY29tcG9zZUNvbG9yKGhleFRvUmdiKGNvbG9yKSk7XG4gIH1cbiAgY29uc3QgbWFya2VyID0gY29sb3IuaW5kZXhPZignKCcpO1xuICBjb25zdCB0eXBlID0gY29sb3Iuc3Vic3RyaW5nKDAsIG1hcmtlcik7XG4gIGlmICghWydyZ2InLCAncmdiYScsICdoc2wnLCAnaHNsYScsICdjb2xvciddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGBNVUk6IFVuc3VwcG9ydGVkIFxcYCR7Y29sb3J9XFxgIGNvbG9yLlxcbmAgKyAnVGhlIGZvbGxvd2luZyBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQ6ICNubm4sICNubm5ubm4sIHJnYigpLCByZ2JhKCksIGhzbCgpLCBoc2xhKCksIGNvbG9yKCkuJyA6IF9mb3JtYXRFcnJvck1lc3NhZ2UoOSwgY29sb3IpKTtcbiAgfVxuICBsZXQgdmFsdWVzID0gY29sb3Iuc3Vic3RyaW5nKG1hcmtlciArIDEsIGNvbG9yLmxlbmd0aCAtIDEpO1xuICBsZXQgY29sb3JTcGFjZTtcbiAgaWYgKHR5cGUgPT09ICdjb2xvcicpIHtcbiAgICB2YWx1ZXMgPSB2YWx1ZXMuc3BsaXQoJyAnKTtcbiAgICBjb2xvclNwYWNlID0gdmFsdWVzLnNoaWZ0KCk7XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDQgJiYgdmFsdWVzWzNdLmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgICB2YWx1ZXNbM10gPSB2YWx1ZXNbM10uc2xpY2UoMSk7XG4gICAgfVxuICAgIGlmICghWydzcmdiJywgJ2Rpc3BsYXktcDMnLCAnYTk4LXJnYicsICdwcm9waG90by1yZ2InLCAncmVjLTIwMjAnXS5pbmNsdWRlcyhjb2xvclNwYWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGBNVUk6IHVuc3VwcG9ydGVkIFxcYCR7Y29sb3JTcGFjZX1cXGAgY29sb3Igc3BhY2UuXFxuYCArICdUaGUgZm9sbG93aW5nIGNvbG9yIHNwYWNlcyBhcmUgc3VwcG9ydGVkOiBzcmdiLCBkaXNwbGF5LXAzLCBhOTgtcmdiLCBwcm9waG90by1yZ2IsIHJlYy0yMDIwLicgOiBfZm9ybWF0RXJyb3JNZXNzYWdlKDEwLCBjb2xvclNwYWNlKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhbHVlcyA9IHZhbHVlcy5zcGxpdCgnLCcpO1xuICB9XG4gIHZhbHVlcyA9IHZhbHVlcy5tYXAodmFsdWUgPT4gcGFyc2VGbG9hdCh2YWx1ZSkpO1xuICByZXR1cm4ge1xuICAgIHR5cGUsXG4gICAgdmFsdWVzLFxuICAgIGNvbG9yU3BhY2VcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2hhbm5lbCBjcmVhdGVkIGZyb20gdGhlIGlucHV0IGNvbG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciAtIENTUyBjb2xvciwgaS5lLiBvbmUgb2Y6ICNubm4sICNubm5ubm4sIHJnYigpLCByZ2JhKCksIGhzbCgpLCBoc2xhKCksIGNvbG9yKClcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGNoYW5uZWwgZm9yIHRoZSBjb2xvciwgdGhhdCBjYW4gYmUgdXNlZCBpbiByZ2JhIG9yIGhzbGEgY29sb3JzXG4gKi9cbmV4cG9ydCBjb25zdCBjb2xvckNoYW5uZWwgPSBjb2xvciA9PiB7XG4gIGNvbnN0IGRlY29tcG9zZWRDb2xvciA9IGRlY29tcG9zZUNvbG9yKGNvbG9yKTtcbiAgcmV0dXJuIGRlY29tcG9zZWRDb2xvci52YWx1ZXMuc2xpY2UoMCwgMykubWFwKCh2YWwsIGlkeCkgPT4gZGVjb21wb3NlZENvbG9yLnR5cGUuaW5jbHVkZXMoJ2hzbCcpICYmIGlkeCAhPT0gMCA/IGAke3ZhbH0lYCA6IHZhbCkuam9pbignICcpO1xufTtcbmV4cG9ydCBjb25zdCBwcml2YXRlX3NhZmVDb2xvckNoYW5uZWwgPSAoY29sb3IsIHdhcm5pbmcpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gY29sb3JDaGFubmVsKGNvbG9yKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAod2FybmluZyAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgfVxuICAgIHJldHVybi
1Bjb2xvcjtcbiAgfVxufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNvbG9yIG9iamVjdCB3aXRoIHR5cGUgYW5kIHZhbHVlcyB0byBhIHN0cmluZy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjb2xvciAtIERlY29tcG9zZWQgY29sb3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvci50eXBlIC0gT25lIG9mOiAncmdiJywgJ3JnYmEnLCAnaHNsJywgJ2hzbGEnLCAnY29sb3InXG4gKiBAcGFyYW0ge2FycmF5fSBjb2xvci52YWx1ZXMgLSBbbixuLG5dIG9yIFtuLG4sbixuXVxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgY29sb3Igc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvbXBvc2VDb2xvcihjb2xvcikge1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICBjb2xvclNwYWNlXG4gIH0gPSBjb2xvcjtcbiAgbGV0IHtcbiAgICB2YWx1ZXNcbiAgfSA9IGNvbG9yO1xuICBpZiAodHlwZS5pbmNsdWRlcygncmdiJykpIHtcbiAgICAvLyBPbmx5IGNvbnZlcnQgdGhlIGZpcnN0IDMgdmFsdWVzIHRvIGludCAoaS5lLiBub3QgYWxwaGEpXG4gICAgdmFsdWVzID0gdmFsdWVzLm1hcCgobiwgaSkgPT4gaSA8IDMgPyBwYXJzZUludChuLCAxMCkgOiBuKTtcbiAgfSBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKCdoc2wnKSkge1xuICAgIHZhbHVlc1sxXSA9IGAke3ZhbHVlc1sxXX0lYDtcbiAgICB2YWx1ZXNbMl0gPSBgJHt2YWx1ZXNbMl19JWA7XG4gIH1cbiAgaWYgKHR5cGUuaW5jbHVkZXMoJ2NvbG9yJykpIHtcbiAgICB2YWx1ZXMgPSBgJHtjb2xvclNwYWNlfSAke3ZhbHVlcy5qb2luKCcgJyl9YDtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZXMgPSBgJHt2YWx1ZXMuam9pbignLCAnKX1gO1xuICB9XG4gIHJldHVybiBgJHt0eXBlfSgke3ZhbHVlc30pYDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNvbG9yIGZyb20gQ1NTIHJnYiBmb3JtYXQgdG8gQ1NTIGhleCBmb3JtYXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBSR0IgY29sb3IsIGkuZS4gcmdiKG4sIG4sIG4pXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIENTUyByZ2IgY29sb3Igc3RyaW5nLCBpLmUuICNubm5ubm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvSGV4KGNvbG9yKSB7XG4gIC8vIElkZW1wb3RlbnRcbiAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuICBjb25zdCB7XG4gICAgdmFsdWVzXG4gIH0gPSBkZWNvbXBvc2VDb2xvcihjb2xvcik7XG4gIHJldHVybiBgIyR7dmFsdWVzLm1hcCgobiwgaSkgPT4gaW50VG9IZXgoaSA9PT0gMyA/IE1hdGgucm91bmQoMjU1ICogbikgOiBuKSkuam9pbignJyl9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNvbG9yIGZyb20gaHNsIGZvcm1hdCB0byByZ2IgZm9ybWF0LlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gSFNMIGNvbG9yIHZhbHVlc1xuICogQHJldHVybnMge3N0cmluZ30gcmdiIGNvbG9yIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaHNsVG9SZ2IoY29sb3IpIHtcbiAgY29sb3IgPSBkZWNvbXBvc2VDb2xvcihjb2xvcik7XG4gIGNvbnN0IHtcbiAgICB2YWx1ZXNcbiAgfSA9IGNvbG9yO1xuICBjb25zdCBoID0gdmFsdWVzWzBdO1xuICBjb25zdCBzID0gdmFsdWVzWzFdIC8gMTAwO1xuICBjb25zdCBsID0gdmFsdWVzWzJdIC8gMTAwO1xuICBjb25zdCBhID0gcyAqIE1hdGgubWluKGwsIDEgLSBsKTtcbiAgY29uc3QgZiA9IChuLCBrID0gKG4gKyBoIC8gMzApICUgMTIpID0+IGwgLSBhICogTWF0aC5tYXgoTWF0aC5taW4oayAtIDMsIDkgLSBrLCAxKSwgLTEpO1xuICBsZXQgdHlwZSA9ICdyZ2InO1xuICBjb25zdCByZ2IgPSBbTWF0aC5yb3VuZChmKDApICogMjU1KSwgTWF0aC5yb3VuZChmKDgpICogMjU1KSwgTWF0aC5yb3VuZChmKDQpICogMjU1KV07XG4gIGlmIChjb2xvci50eXBlID09PSAnaHNsYScpIHtcbiAgICB0eXBlICs9ICdhJztcbiAgICByZ2IucHVzaCh2YWx1ZXNbM10pO1xuICB9XG4gIHJldHVybiByZWNvbXBvc2VDb2xvcih7XG4gICAgdHlwZSxcbiAgICB2YWx1ZXM6IHJnYlxuICB9KTtcbn1cbi8qKlxuICogVGhlIHJlbGF0aXZlIGJyaWdodG5lc3Mgb2YgYW55IHBvaW50IGluIGEgY29sb3Igc3BhY2UsXG4gKiBub3JtYWxpemVkIHRvIDAgZm9yIGRhcmtlc3QgYmxhY2sgYW5kIDEgZm9yIGxpZ2h0ZXN0IHdoaXRlLlxuICpcbiAqIEZvcm11bGE6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAtVEVDSFMvRzE3Lmh0bWwjRzE3LXRlc3RzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBDU1MgY29sb3IsIGkuZS4gb25lIG9mOiAjbm5uLCAjbm5ubm5uLCByZ2IoKSwgcmdiYSgpLCBoc2woKSwgaHNsYSgpLCBjb2xvcigpXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgcmVsYXRpdmUgYnJpZ2h0bmVzcyBvZiB0aGUgY29sb3IgaW4gdGhlIHJhbmdlIDAgLSAxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMdW1pbmFuY2UoY29sb3IpIHtcbiAgY29sb3IgPSBkZWNvbXBvc2VDb2xvcihjb2xvcik7XG4gIGxldCByZ2IgPSBjb2xvci50eXBlID09PSAnaHNsJyB8fCBjb2xvci50eXBlID09PSAnaHNsYScgPyBkZWNvbXBvc2VDb2xvcihoc2xUb1JnYihjb2xvcikpLnZhbHVlcyA6IGNvbG9yLnZhbHVlcztcbiAgcmdiID0gcmdiLm1hcCh2YWwgPT4ge1xuICAgIGlmIChjb2xvci50eXBlICE9PSAnY29sb3InKSB7XG4gICAgICB2YWwgLz0gMjU1OyAvLyBub3JtYWxpemVkXG4gICAgfVxuICAgIHJldHVybiB2YWwgPD0gMC4wMzkyOCA/IHZhbCAvIDEyLjkyIDogKCh2YWwgKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40O1xuICB9KTtcblxuICAvLyBUcnVuY2F0ZSBhdCAzIGRpZ2l0c1xuICByZXR1cm4gTnVtYmVyKCgwLjIxMjYgKiByZ2JbMF0gKyAwLjcxNTIgKiByZ2JbMV0gKyAwLjA3MjIgKiByZ2JbMl0pLnRvRml4ZWQoMykpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGNvbnRyYXN0IHJhdGlvIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAqXG4gKiBGb3JtdWxhOiBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLVRFQ0hTL0cxNy5odG1sI0cxNy10ZXN0c1xuICogQHBhcmFtIHtzdHJpbmd9IGZvcmVncm91bmQgLSBDU1MgY29sb3IsIGkuZS4gb25lIG9mOiAjbm5uLCAjbm5ubm5uLCByZ2IoKSwgcmdiYSgpLCBoc2woKSwgaHNsYSgpXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFja2dyb3VuZCAtIENTUyBjb2xvciwgaS5lLiBvbmUgb2Y6ICNubm4sICNubm5ubm4sIHJnYigpLCByZ2JhKCksIGhzbCgpLCBoc2xhKClcbiAqIEByZXR1cm5zIHtudW1iZXJ9IEEgY29udHJhc3QgcmF0aW8gdmFsdWUgaW4gdGhlIHJhbmdlIDAgLSAyMS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyYXN0UmF0aW8oZm9yZWdyb3VuZCwgYmFja2dyb3VuZCkge1xuICBjb25zdCBsdW1BID0gZ2V0THVtaW5hbmNlKGZvcmVncm91bmQpO1xuICBjb25zdCBsdW1CI
1D0gZ2V0THVtaW5hbmNlKGJhY2tncm91bmQpO1xuICByZXR1cm4gKE1hdGgubWF4KGx1bUEsIGx1bUIpICsgMC4wNSkgLyAoTWF0aC5taW4obHVtQSwgbHVtQikgKyAwLjA1KTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBhYnNvbHV0ZSB0cmFuc3BhcmVuY3kgb2YgYSBjb2xvci5cbiAqIEFueSBleGlzdGluZyBhbHBoYSB2YWx1ZXMgYXJlIG92ZXJ3cml0dGVuLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gQ1NTIGNvbG9yLCBpLmUuIG9uZSBvZjogI25ubiwgI25ubm5ubiwgcmdiKCksIHJnYmEoKSwgaHNsKCksIGhzbGEoKSwgY29sb3IoKVxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gdmFsdWUgdG8gc2V0IHRoZSBhbHBoYSBjaGFubmVsIHRvIGluIHRoZSByYW5nZSAwIC0gMVxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgY29sb3Igc3RyaW5nLiBIZXggaW5wdXQgdmFsdWVzIGFyZSByZXR1cm5lZCBhcyByZ2JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFscGhhKGNvbG9yLCB2YWx1ZSkge1xuICBjb2xvciA9IGRlY29tcG9zZUNvbG9yKGNvbG9yKTtcbiAgdmFsdWUgPSBjbGFtcFdyYXBwZXIodmFsdWUpO1xuICBpZiAoY29sb3IudHlwZSA9PT0gJ3JnYicgfHwgY29sb3IudHlwZSA9PT0gJ2hzbCcpIHtcbiAgICBjb2xvci50eXBlICs9ICdhJztcbiAgfVxuICBpZiAoY29sb3IudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgIGNvbG9yLnZhbHVlc1szXSA9IGAvJHt2YWx1ZX1gO1xuICB9IGVsc2Uge1xuICAgIGNvbG9yLnZhbHVlc1szXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiByZWNvbXBvc2VDb2xvcihjb2xvcik7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZV9zYWZlQWxwaGEoY29sb3IsIHZhbHVlLCB3YXJuaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGFscGhhKGNvbG9yLCB2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHdhcm5pbmcgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgIH1cbiAgICByZXR1cm4gY29sb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXJrZW5zIGEgY29sb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBDU1MgY29sb3IsIGkuZS4gb25lIG9mOiAjbm5uLCAjbm5ubm5uLCByZ2IoKSwgcmdiYSgpLCBoc2woKSwgaHNsYSgpLCBjb2xvcigpXG4gKiBAcGFyYW0ge251bWJlcn0gY29lZmZpY2llbnQgLSBtdWx0aXBsaWVyIGluIHRoZSByYW5nZSAwIC0gMVxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgY29sb3Igc3RyaW5nLiBIZXggaW5wdXQgdmFsdWVzIGFyZSByZXR1cm5lZCBhcyByZ2JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhcmtlbihjb2xvciwgY29lZmZpY2llbnQpIHtcbiAgY29sb3IgPSBkZWNvbXBvc2VDb2xvcihjb2xvcik7XG4gIGNvZWZmaWNpZW50ID0gY2xhbXBXcmFwcGVyKGNvZWZmaWNpZW50KTtcbiAgaWYgKGNvbG9yLnR5cGUuaW5jbHVkZXMoJ2hzbCcpKSB7XG4gICAgY29sb3IudmFsdWVzWzJdICo9IDEgLSBjb2VmZmljaWVudDtcbiAgfSBlbHNlIGlmIChjb2xvci50eXBlLmluY2x1ZGVzKCdyZ2InKSB8fCBjb2xvci50eXBlLmluY2x1ZGVzKCdjb2xvcicpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpICs9IDEpIHtcbiAgICAgIGNvbG9yLnZhbHVlc1tpXSAqPSAxIC0gY29lZmZpY2llbnQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWNvbXBvc2VDb2xvcihjb2xvcik7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZV9zYWZlRGFya2VuKGNvbG9yLCBjb2VmZmljaWVudCwgd2FybmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBkYXJrZW4oY29sb3IsIGNvZWZmaWNpZW50KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAod2FybmluZyAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgfVxuICAgIHJldHVybiBjb2xvcjtcbiAgfVxufVxuXG4vKipcbiAqIExpZ2h0ZW5zIGEgY29sb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBDU1MgY29sb3IsIGkuZS4gb25lIG9mOiAjbm5uLCAjbm5ubm5uLCByZ2IoKSwgcmdiYSgpLCBoc2woKSwgaHNsYSgpLCBjb2xvcigpXG4gKiBAcGFyYW0ge251bWJlcn0gY29lZmZpY2llbnQgLSBtdWx0aXBsaWVyIGluIHRoZSByYW5nZSAwIC0gMVxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgY29sb3Igc3RyaW5nLiBIZXggaW5wdXQgdmFsdWVzIGFyZSByZXR1cm5lZCBhcyByZ2JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpZ2h0ZW4oY29sb3IsIGNvZWZmaWNpZW50KSB7XG4gIGNvbG9yID0gZGVjb21wb3NlQ29sb3IoY29sb3IpO1xuICBjb2VmZmljaWVudCA9IGNsYW1wV3JhcHBlcihjb2VmZmljaWVudCk7XG4gIGlmIChjb2xvci50eXBlLmluY2x1ZGVzKCdoc2wnKSkge1xuICAgIGNvbG9yLnZhbHVlc1syXSArPSAoMTAwIC0gY29sb3IudmFsdWVzWzJdKSAqIGNvZWZmaWNpZW50O1xuICB9IGVsc2UgaWYgKGNvbG9yLnR5cGUuaW5jbHVkZXMoJ3JnYicpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpICs9IDEpIHtcbiAgICAgIGNvbG9yLnZhbHVlc1tpXSArPSAoMjU1IC0gY29sb3IudmFsdWVzW2ldKSAqIGNvZWZmaWNpZW50O1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb2xvci50eXBlLmluY2x1ZGVzKCdjb2xvcicpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpICs9IDEpIHtcbiAgICAgIGNvbG9yLnZhbHVlc1tpXSArPSAoMSAtIGNvbG9yLnZhbHVlc1tpXSkgKiBjb2VmZmljaWVudDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlY29tcG9zZUNvbG9yKGNvbG9yKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlX3NhZmVMaWdodGVuKGNvbG9yLCBjb2VmZmljaWVudCwgd2FybmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBsaWdodGVuKGNvbG9yLCBjb2VmZmljaWVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHdhcm5pbmcgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgIH1cbiAgICByZXR1cm4gY29sb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBEYXJrZW4gb3IgbGlnaHRlbiBhIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGx1bWluYW5jZS5cbiAqIExpZ2h0IGNvbG9ycyBhcmUgZGFya2VuZWQsIGRhcmsgY29sb3JzIGFyZSBsaWdodGVuZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBDU1MgY29sb3IsIGkuZS4gb25lIG9mOiAjbm5uLCAjbm5ubm5uLCByZ2IoKSwgcmdiYSgpLCBoc2woKSwgaHNsYSgpLCBjb2xvcigpXG4gKiBAcGFyYW0ge251bWJlcn0gY29lZmZpY2llbnQ9MC4xNSAtIG11bHRpcGxpZXIgaW4gdGhlIHJhbmdlIDAgLSAxXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIENTUyBjb2xvciBzdHJpbmcuIEhleCBpbnB1dCB2YWx1ZXMgYXJlIHJldHVybmVkIGFzIHJnYlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW1waGFzaXplKGNvbG9yLCBjb2VmZmljaWVudCA9IDAuMTUpIHtcbiAgcmV0dXJuIGdldEx1bWluYW5jZShjb2xvcikgPiAwLjUgPyBkYXJrZW4oY29sb3IsIGNvZWZmaWNpZW50KSA6IGxpZ2h0ZW4oY29sb3IsIGNvZWZmaWNpZW50KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlX3NhZmVFbXBoYXNpemUoY29sb3IsIGNvZWZmaWNpZW50LCB3YXJuaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVtcGhhc2l6ZShjb2xvciwgY29lZmZpY2llbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh3YXJuaW5nICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbG9yO1xuICB9XG59XG5cbi8qKlxuICogQmxlbmQgYSB0cmFuc3B
1hcmVudCBvdmVybGF5IGNvbG9yIHdpdGggYSBiYWNrZ3JvdW5kIGNvbG9yLCByZXN1bHRpbmcgaW4gYSBzaW5nbGVcbiAqIFJHQiBjb2xvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBiYWNrZ3JvdW5kIC0gQ1NTIGNvbG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gb3ZlcmxheSAtIENTUyBjb2xvclxuICogQHBhcmFtIHtudW1iZXJ9IG9wYWNpdHkgLSBPcGFjaXR5IG11bHRpcGxpZXIgaW4gdGhlIHJhbmdlIDAgLSAxXG4gKiBAcGFyYW0ge251bWJlcn0gW2dhbW1hPTEuMF0gLSBHYW1tYSBjb3JyZWN0aW9uIGZhY3Rvci4gRm9yIGdhbW1hLWNvcnJlY3QgYmxlbmRpbmcsIDIuMiBpcyB1c3VhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kKGJhY2tncm91bmQsIG92ZXJsYXksIG9wYWNpdHksIGdhbW1hID0gMS4wKSB7XG4gIGNvbnN0IGJsZW5kQ2hhbm5lbCA9IChiLCBvKSA9PiBNYXRoLnJvdW5kKChiICoqICgxIC8gZ2FtbWEpICogKDEgLSBvcGFjaXR5KSArIG8gKiogKDEgLyBnYW1tYSkgKiBvcGFjaXR5KSAqKiBnYW1tYSk7XG4gIGNvbnN0IGJhY2tncm91bmRDb2xvciA9IGRlY29tcG9zZUNvbG9yKGJhY2tncm91bmQpO1xuICBjb25zdCBvdmVybGF5Q29sb3IgPSBkZWNvbXBvc2VDb2xvcihvdmVybGF5KTtcbiAgY29uc3QgcmdiID0gW2JsZW5kQ2hhbm5lbChiYWNrZ3JvdW5kQ29sb3IudmFsdWVzWzBdLCBvdmVybGF5Q29sb3IudmFsdWVzWzBdKSwgYmxlbmRDaGFubmVsKGJhY2tncm91bmRDb2xvci52YWx1ZXNbMV0sIG92ZXJsYXlDb2xvci52YWx1ZXNbMV0pLCBibGVuZENoYW5uZWwoYmFja2dyb3VuZENvbG9yLnZhbHVlc1syXSwgb3ZlcmxheUNvbG9yLnZhbHVlc1syXSldO1xuICByZXR1cm4gcmVjb21wb3NlQ29sb3Ioe1xuICAgIHR5cGU6ICdyZ2InLFxuICAgIHZhbHVlczogcmdiXG4gIH0pO1xufSIsImNvbnN0IGNvbW1vbiA9IHtcbiAgYmxhY2s6ICcjMDAwJyxcbiAgd2hpdGU6ICcjZmZmJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1vbjsiLCJjb25zdCBncmV5ID0ge1xuICA1MDogJyNmYWZhZmEnLFxuICAxMDA6ICcjZjVmNWY1JyxcbiAgMjAwOiAnI2VlZWVlZScsXG4gIDMwMDogJyNlMGUwZTAnLFxuICA0MDA6ICcjYmRiZGJkJyxcbiAgNTAwOiAnIzllOWU5ZScsXG4gIDYwMDogJyM3NTc1NzUnLFxuICA3MDA6ICcjNjE2MTYxJyxcbiAgODAwOiAnIzQyNDI0MicsXG4gIDkwMDogJyMyMTIxMjEnLFxuICBBMTAwOiAnI2Y1ZjVmNScsXG4gIEEyMDA6ICcjZWVlZWVlJyxcbiAgQTQwMDogJyNiZGJkYmQnLFxuICBBNzAwOiAnIzYxNjE2MSdcbn07XG5leHBvcnQgZGVmYXVsdCBncmV5OyIsImNvbnN0IHB1cnBsZSA9IHtcbiAgNTA6ICcjZjNlNWY1JyxcbiAgMTAwOiAnI2UxYmVlNycsXG4gIDIwMDogJyNjZTkzZDgnLFxuICAzMDA6ICcjYmE2OGM4JyxcbiAgNDAwOiAnI2FiNDdiYycsXG4gIDUwMDogJyM5YzI3YjAnLFxuICA2MDA6ICcjOGUyNGFhJyxcbiAgNzAwOiAnIzdiMWZhMicsXG4gIDgwMDogJyM2YTFiOWEnLFxuICA5MDA6ICcjNGExNDhjJyxcbiAgQTEwMDogJyNlYTgwZmMnLFxuICBBMjAwOiAnI2UwNDBmYicsXG4gIEE0MDA6ICcjZDUwMGY5JyxcbiAgQTcwMDogJyNhYTAwZmYnXG59O1xuZXhwb3J0IGRlZmF1bHQgcHVycGxlOyIsImNvbnN0IHJlZCA9IHtcbiAgNTA6ICcjZmZlYmVlJyxcbiAgMTAwOiAnI2ZmY2RkMicsXG4gIDIwMDogJyNlZjlhOWEnLFxuICAzMDA6ICcjZTU3MzczJyxcbiAgNDAwOiAnI2VmNTM1MCcsXG4gIDUwMDogJyNmNDQzMzYnLFxuICA2MDA6ICcjZTUzOTM1JyxcbiAgNzAwOiAnI2QzMmYyZicsXG4gIDgwMDogJyNjNjI4MjgnLFxuICA5MDA6ICcjYjcxYzFjJyxcbiAgQTEwMDogJyNmZjhhODAnLFxuICBBMjAwOiAnI2ZmNTI1MicsXG4gIEE0MDA6ICcjZmYxNzQ0JyxcbiAgQTcwMDogJyNkNTAwMDAnXG59O1xuZXhwb3J0IGRlZmF1bHQgcmVkOyIsImNvbnN0IG9yYW5nZSA9IHtcbiAgNTA6ICcjZmZmM2UwJyxcbiAgMTAwOiAnI2ZmZTBiMicsXG4gIDIwMDogJyNmZmNjODAnLFxuICAzMDA6ICcjZmZiNzRkJyxcbiAgNDAwOiAnI2ZmYTcyNicsXG4gIDUwMDogJyNmZjk4MDAnLFxuICA2MDA6ICcjZmI4YzAwJyxcbiAgNzAwOiAnI2Y1N2MwMCcsXG4gIDgwMDogJyNlZjZjMDAnLFxuICA5MDA6ICcjZTY1MTAwJyxcbiAgQTEwMDogJyNmZmQxODAnLFxuICBBMjAwOiAnI2ZmYWI0MCcsXG4gIEE0MDA6ICcjZmY5MTAwJyxcbiAgQTcwMDogJyNmZjZkMDAnXG59O1xuZXhwb3J0IGRlZmF1bHQgb3JhbmdlOyIsImNvbnN0IGJsdWUgPSB7XG4gIDUwOiAnI2UzZjJmZCcsXG4gIDEwMDogJyNiYmRlZmInLFxuICAyMDA6ICcjOTBjYWY5JyxcbiAgMzAwOiAnIzY0YjVmNicsXG4gIDQwMDogJyM0MmE1ZjUnLFxuICA1MDA6ICcjMjE5NmYzJyxcbiAgNjAwOiAnIzFlODhlNScsXG4gIDcwMDogJyMxOTc2ZDInLFxuICA4MDA6ICcjMTU2NWMwJyxcbiAgOTAwOiAnIzBkNDdhMScsXG4gIEExMDA6ICcjODJiMWZmJyxcbiAgQTIwMDogJyM0NDhhZmYnLFxuICBBNDAwOiAnIzI5NzlmZicsXG4gIEE3MDA6ICcjMjk2MmZmJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGJsdWU7IiwiY29uc3QgbGlnaHRCbHVlID0ge1xuICA1MDogJyNlMWY1ZmUnLFxuICAxMDA6ICcjYjNlNWZjJyxcbiAgMjAwOiAnIzgxZDRmYScsXG4gIDMwMDogJyM0ZmMzZjcnLFxuICA0MDA6ICcjMjliNmY2JyxcbiAgNTAwOiAnIzAzYTlmNCcsXG4gIDYwMDogJyMwMzliZTUnLFxuICA3MDA6ICcjMDI4OGQxJyxcbiAgODAwOiAnIzAyNzdiZCcsXG4gIDkwMDogJyMwMTU3OWInLFxuICBBMTAwOiAnIzgwZDhmZicsXG4gIEEyMDA6ICcjNDBjNGZmJyxcbiAgQTQwMDogJyMwMGIwZmYnLFxuICBBNzAwOiAnIzAwOTFlYSdcbn07XG5leHBvcnQgZGVmYXVsdCBsaWdodEJsdWU7IiwiY29uc3QgZ3JlZW4gPSB7XG4gIDUwOiAnI2U4ZjVlOScsXG4gIDEwMDogJyNjOGU2YzknLFxuICAyMDA6ICcjYTVkNmE3JyxcbiAgMzAwOiAnIzgxYzc4NCcsXG4gIDQwMDogJyM2NmJiNmEnLFxuICA1MDA6ICcjNGNhZjUwJyxcbiAgNjAwOiAnIzQzYTA0NycsXG4gIDcwMDogJyMzODhlM2MnLFxuICA4MDA6ICcjMmU3ZDMyJyxcbiAgOTAwOiAnIzFiNWUyMCcsXG4gIEExMDA6ICcjYjlmNmNhJyxcbiAgQTIwMDogJyM2OWYwYWUnLFxuICBBNDAwOiAnIzAwZTY3NicsXG4gIEE3MDA6ICcjMDBjODUzJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGdyZWVuOyIsImltcG9ydCBfZm9ybWF0RXJyb3JNZXNzYWdlIGZyb20gXCJAbXVpL3V0aWxzL2Zvcm1hdE11aUVycm9yTWVzc2FnZVwiO1xuaW1wb3J0IGRlZXBtZXJnZSBmcm9tICdAbXVpL3V0aWxzL2RlZXBtZXJnZSc7XG5pbXBvcnQgeyBkYXJrZW4sIGdldENvbnRyYXN0UmF0aW8sIGxpZ2h0ZW4gfSBmcm9tICdAbXVpL3N5c3RlbS9jb2xvck1hbmlwdWxhdG9yJztcbmltcG9ydCBjb21tb24gZnJvbSBcIi4uL2NvbG9ycy9jb21tb24uanNcIjtcbmltcG9ydCBncmV5IGZyb20gXCIuLi9jb2xvcnMvZ3JleS5qc1wiO1xuaW1wb3J0IHB1cnBsZSBmcm9tIFwiLi4vY29sb3JzL3B1cnBsZS5qc1wiO1xuaW1wb3J0IHJlZCBmcm9tIFwiLi4vY29sb3JzL3JlZC5qc1wiO1xuaW1wb3J0IG9yYW5nZSBmcm9tIFwiLi4vY29sb3JzL29yYW5nZS5qc1wiO1xuaW1wb3J0IGJsdWUgZnJvbSBcIi4uL2NvbG9ycy9ibHVlLmpzXCI7XG5pbXBvcnQgbGlnaHRCbHVlIGZyb20gXCIuLi9jb2xvcnMvbGlnaHRCbHVlLmpzXCI7XG5pbXBvcnQgZ3JlZW4gZnJvbSBcIi4uL2NvbG9ycy9ncmVlbi5qc1wiO1xuZnVuY3Rpb24gZ2V0TGlnaHQoKSB7XG4gIHJldHVybi
1B7XG4gICAgLy8gVGhlIGNvbG9ycyB1c2VkIHRvIHN0eWxlIHRoZSB0ZXh0LlxuICAgIHRleHQ6IHtcbiAgICAgIC8vIFRoZSBtb3N0IGltcG9ydGFudCB0ZXh0LlxuICAgICAgcHJpbWFyeTogJ3JnYmEoMCwgMCwgMCwgMC44NyknLFxuICAgICAgLy8gU2Vjb25kYXJ5IHRleHQuXG4gICAgICBzZWNvbmRhcnk6ICdyZ2JhKDAsIDAsIDAsIDAuNiknLFxuICAgICAgLy8gRGlzYWJsZWQgdGV4dCBoYXZlIGV2ZW4gbG93ZXIgdmlzdWFsIHByb21pbmVuY2UuXG4gICAgICBkaXNhYmxlZDogJ3JnYmEoMCwgMCwgMCwgMC4zOCknXG4gICAgfSxcbiAgICAvLyBUaGUgY29sb3IgdXNlZCB0byBkaXZpZGUgZGlmZmVyZW50IGVsZW1lbnRzLlxuICAgIGRpdmlkZXI6ICdyZ2JhKDAsIDAsIDAsIDAuMTIpJyxcbiAgICAvLyBUaGUgYmFja2dyb3VuZCBjb2xvcnMgdXNlZCB0byBzdHlsZSB0aGUgc3VyZmFjZXMuXG4gICAgLy8gQ29uc2lzdGVuY3kgYmV0d2VlbiB0aGVzZSB2YWx1ZXMgaXMgaW1wb3J0YW50LlxuICAgIGJhY2tncm91bmQ6IHtcbiAgICAgIHBhcGVyOiBjb21tb24ud2hpdGUsXG4gICAgICBkZWZhdWx0OiBjb21tb24ud2hpdGVcbiAgICB9LFxuICAgIC8vIFRoZSBjb2xvcnMgdXNlZCB0byBzdHlsZSB0aGUgYWN0aW9uIGVsZW1lbnRzLlxuICAgIGFjdGlvbjoge1xuICAgICAgLy8gVGhlIGNvbG9yIG9mIGFuIGFjdGl2ZSBhY3Rpb24gbGlrZSBhbiBpY29uIGJ1dHRvbi5cbiAgICAgIGFjdGl2ZTogJ3JnYmEoMCwgMCwgMCwgMC41NCknLFxuICAgICAgLy8gVGhlIGNvbG9yIG9mIGFuIGhvdmVyZWQgYWN0aW9uLlxuICAgICAgaG92ZXI6ICdyZ2JhKDAsIDAsIDAsIDAuMDQpJyxcbiAgICAgIGhvdmVyT3BhY2l0eTogMC4wNCxcbiAgICAgIC8vIFRoZSBjb2xvciBvZiBhIHNlbGVjdGVkIGFjdGlvbi5cbiAgICAgIHNlbGVjdGVkOiAncmdiYSgwLCAwLCAwLCAwLjA4KScsXG4gICAgICBzZWxlY3RlZE9wYWNpdHk6IDAuMDgsXG4gICAgICAvLyBUaGUgY29sb3Igb2YgYSBkaXNhYmxlZCBhY3Rpb24uXG4gICAgICBkaXNhYmxlZDogJ3JnYmEoMCwgMCwgMCwgMC4yNiknLFxuICAgICAgLy8gVGhlIGJhY2tncm91bmQgY29sb3Igb2YgYSBkaXNhYmxlZCBhY3Rpb24uXG4gICAgICBkaXNhYmxlZEJhY2tncm91bmQ6ICdyZ2JhKDAsIDAsIDAsIDAuMTIpJyxcbiAgICAgIGRpc2FibGVkT3BhY2l0eTogMC4zOCxcbiAgICAgIGZvY3VzOiAncmdiYSgwLCAwLCAwLCAwLjEyKScsXG4gICAgICBmb2N1c09wYWNpdHk6IDAuMTIsXG4gICAgICBhY3RpdmF0ZWRPcGFjaXR5OiAwLjEyXG4gICAgfVxuICB9O1xufVxuZXhwb3J0IGNvbnN0IGxpZ2h0ID0gZ2V0TGlnaHQoKTtcbmZ1bmN0aW9uIGdldERhcmsoKSB7XG4gIHJldHVybiB7XG4gICAgdGV4dDoge1xuICAgICAgcHJpbWFyeTogY29tbW9uLndoaXRlLFxuICAgICAgc2Vjb25kYXJ5OiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpJyxcbiAgICAgIGRpc2FibGVkOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpJyxcbiAgICAgIGljb246ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSknXG4gICAgfSxcbiAgICBkaXZpZGVyOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKScsXG4gICAgYmFja2dyb3VuZDoge1xuICAgICAgcGFwZXI6ICcjMTIxMjEyJyxcbiAgICAgIGRlZmF1bHQ6ICcjMTIxMjEyJ1xuICAgIH0sXG4gICAgYWN0aW9uOiB7XG4gICAgICBhY3RpdmU6IGNvbW1vbi53aGl0ZSxcbiAgICAgIGhvdmVyOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KScsXG4gICAgICBob3Zlck9wYWNpdHk6IDAuMDgsXG4gICAgICBzZWxlY3RlZDogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNiknLFxuICAgICAgc2VsZWN0ZWRPcGFjaXR5OiAwLjE2LFxuICAgICAgZGlzYWJsZWQ6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyknLFxuICAgICAgZGlzYWJsZWRCYWNrZ3JvdW5kOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKScsXG4gICAgICBkaXNhYmxlZE9wYWNpdHk6IDAuMzgsXG4gICAgICBmb2N1czogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiknLFxuICAgICAgZm9jdXNPcGFjaXR5OiAwLjEyLFxuICAgICAgYWN0aXZhdGVkT3BhY2l0eTogMC4yNFxuICAgIH1cbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBkYXJrID0gZ2V0RGFyaygpO1xuZnVuY3Rpb24gYWRkTGlnaHRPckRhcmsoaW50ZW50LCBkaXJlY3Rpb24sIHNoYWRlLCB0b25hbE9mZnNldCkge1xuICBjb25zdCB0b25hbE9mZnNldExpZ2h0ID0gdG9uYWxPZmZzZXQubGlnaHQgfHwgdG9uYWxPZmZzZXQ7XG4gIGNvbnN0IHRvbmFsT2Zmc2V0RGFyayA9IHRvbmFsT2Zmc2V0LmRhcmsgfHwgdG9uYWxPZmZzZXQgKiAxLjU7XG4gIGlmICghaW50ZW50W2RpcmVjdGlvbl0pIHtcbiAgICBpZiAoaW50ZW50Lmhhc093blByb3BlcnR5KHNoYWRlKSkge1xuICAgICAgaW50ZW50W2RpcmVjdGlvbl0gPSBpbnRlbnRbc2hhZGVdO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAnbGlnaHQnKSB7XG4gICAgICBpbnRlbnQubGlnaHQgPSBsaWdodGVuKGludGVudC5tYWluLCB0b25hbE9mZnNldExpZ2h0KTtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2RhcmsnKSB7XG4gICAgICBpbnRlbnQuZGFyayA9IGRhcmtlbihpbnRlbnQubWFpbiwgdG9uYWxPZmZzZXREYXJrKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1peExpZ2h0T3JEYXJrKGNvbG9yU3BhY2UsIGludGVudCwgZGlyZWN0aW9uLCBzaGFkZSwgdG9uYWxPZmZzZXQpIHtcbiAgY29uc3QgdG9uYWxPZmZzZXRMaWdodCA9IHRvbmFsT2Zmc2V0LmxpZ2h0IHx8IHRvbmFsT2Zmc2V0O1xuICBjb25zdCB0b25hbE9mZnNldERhcmsgPSB0b25hbE9mZnNldC5kYXJrIHx8IHRvbmFsT2Zmc2V0ICogMS41O1xuICBpZiAoIWludGVudFtkaXJlY3Rpb25dKSB7XG4gICAgaWYgKGludGVudC5oYXNPd25Qcm9wZXJ0eShzaGFkZSkpIHtcbiAgICAgIGludGVudFtkaXJlY3Rpb25dID0gaW50ZW50W3NoYWRlXTtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2xpZ2h0Jykge1xuICAgICAgaW50ZW50LmxpZ2h0ID0gYGNvbG9yLW1peChpbiAke2NvbG9yU3BhY2V9LCAke2ludGVudC5tYWlufSwgI2ZmZiAkeyh0b25hbE9mZnNldExpZ2h0ICogMTAwKS50b0ZpeGVkKDApfSUpYDtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2RhcmsnKSB7XG4gICAgICBpbnRlbnQuZGFyayA9IGBjb2xvci1taXgoaW4gJHtjb2xvclNwYWNlfSwgJHtpbnRlbnQubWFpbn0sICMwMDAgJHsodG9uYWxPZmZzZXREYXJrICogMTAwKS50b0ZpeGVkKDApfSUpYDtcbiAgICB9XG4gI
1H1cbn1cbmZ1bmN0aW9uIGdldERlZmF1bHRQcmltYXJ5KG1vZGUgPSAnbGlnaHQnKSB7XG4gIGlmIChtb2RlID09PSAnZGFyaycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWFpbjogYmx1ZVsyMDBdLFxuICAgICAgbGlnaHQ6IGJsdWVbNTBdLFxuICAgICAgZGFyazogYmx1ZVs0MDBdXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1haW46IGJsdWVbNzAwXSxcbiAgICBsaWdodDogYmx1ZVs0MDBdLFxuICAgIGRhcms6IGJsdWVbODAwXVxuICB9O1xufVxuZnVuY3Rpb24gZ2V0RGVmYXVsdFNlY29uZGFyeShtb2RlID0gJ2xpZ2h0Jykge1xuICBpZiAobW9kZSA9PT0gJ2RhcmsnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1haW46IHB1cnBsZVsyMDBdLFxuICAgICAgbGlnaHQ6IHB1cnBsZVs1MF0sXG4gICAgICBkYXJrOiBwdXJwbGVbNDAwXVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYWluOiBwdXJwbGVbNTAwXSxcbiAgICBsaWdodDogcHVycGxlWzMwMF0sXG4gICAgZGFyazogcHVycGxlWzcwMF1cbiAgfTtcbn1cbmZ1bmN0aW9uIGdldERlZmF1bHRFcnJvcihtb2RlID0gJ2xpZ2h0Jykge1xuICBpZiAobW9kZSA9PT0gJ2RhcmsnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1haW46IHJlZFs1MDBdLFxuICAgICAgbGlnaHQ6IHJlZFszMDBdLFxuICAgICAgZGFyazogcmVkWzcwMF1cbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbWFpbjogcmVkWzcwMF0sXG4gICAgbGlnaHQ6IHJlZFs0MDBdLFxuICAgIGRhcms6IHJlZFs4MDBdXG4gIH07XG59XG5mdW5jdGlvbiBnZXREZWZhdWx0SW5mbyhtb2RlID0gJ2xpZ2h0Jykge1xuICBpZiAobW9kZSA9PT0gJ2RhcmsnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1haW46IGxpZ2h0Qmx1ZVs0MDBdLFxuICAgICAgbGlnaHQ6IGxpZ2h0Qmx1ZVszMDBdLFxuICAgICAgZGFyazogbGlnaHRCbHVlWzcwMF1cbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbWFpbjogbGlnaHRCbHVlWzcwMF0sXG4gICAgbGlnaHQ6IGxpZ2h0Qmx1ZVs1MDBdLFxuICAgIGRhcms6IGxpZ2h0Qmx1ZVs5MDBdXG4gIH07XG59XG5mdW5jdGlvbiBnZXREZWZhdWx0U3VjY2Vzcyhtb2RlID0gJ2xpZ2h0Jykge1xuICBpZiAobW9kZSA9PT0gJ2RhcmsnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1haW46IGdyZWVuWzQwMF0sXG4gICAgICBsaWdodDogZ3JlZW5bMzAwXSxcbiAgICAgIGRhcms6IGdyZWVuWzcwMF1cbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbWFpbjogZ3JlZW5bODAwXSxcbiAgICBsaWdodDogZ3JlZW5bNTAwXSxcbiAgICBkYXJrOiBncmVlbls5MDBdXG4gIH07XG59XG5mdW5jdGlvbiBnZXREZWZhdWx0V2FybmluZyhtb2RlID0gJ2xpZ2h0Jykge1xuICBpZiAobW9kZSA9PT0gJ2RhcmsnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1haW46IG9yYW5nZVs0MDBdLFxuICAgICAgbGlnaHQ6IG9yYW5nZVszMDBdLFxuICAgICAgZGFyazogb3JhbmdlWzcwMF1cbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbWFpbjogJyNlZDZjMDInLFxuICAgIC8vIGNsb3Nlc3QgdG8gb3JhbmdlWzgwMF0gdGhhdCBwYXNzIDM6MS5cbiAgICBsaWdodDogb3JhbmdlWzUwMF0sXG4gICAgZGFyazogb3JhbmdlWzkwMF1cbiAgfTtcbn1cblxuLy8gVXNlIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV4cGVyaW1lbnRhbCBDU1MgYGNvbnRyYXN0LWNvbG9yYCBmdW5jdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBjb250cmFzdENvbG9yKGJhY2tncm91bmQpIHtcbiAgcmV0dXJuIGBva2xjaChmcm9tICR7YmFja2dyb3VuZH0gdmFyKC0tX19sKSAwIGggLyB2YXIoLS1fX2EpKWA7XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVQYWxldHRlKHBhbGV0dGUpIHtcbiAgY29uc3Qge1xuICAgIG1vZGUgPSAnbGlnaHQnLFxuICAgIGNvbnRyYXN0VGhyZXNob2xkID0gMyxcbiAgICB0b25hbE9mZnNldCA9IDAuMixcbiAgICBjb2xvclNwYWNlLFxuICAgIC4uLm90aGVyXG4gIH0gPSBwYWxldHRlO1xuICBjb25zdCBwcmltYXJ5ID0gcGFsZXR0ZS5wcmltYXJ5IHx8IGdldERlZmF1bHRQcmltYXJ5KG1vZGUpO1xuICBjb25zdCBzZWNvbmRhcnkgPSBwYWxldHRlLnNlY29uZGFyeSB8fCBnZXREZWZhdWx0U2Vjb25kYXJ5KG1vZGUpO1xuICBjb25zdCBlcnJvciA9IHBhbGV0dGUuZXJyb3IgfHwgZ2V0RGVmYXVsdEVycm9yKG1vZGUpO1xuICBjb25zdCBpbmZvID0gcGFsZXR0ZS5pbmZvIHx8IGdldERlZmF1bHRJbmZvKG1vZGUpO1xuICBjb25zdCBzdWNjZXNzID0gcGFsZXR0ZS5zdWNjZXNzIHx8IGdldERlZmF1bHRTdWNjZXNzKG1vZGUpO1xuICBjb25zdCB3YXJuaW5nID0gcGFsZXR0ZS53YXJuaW5nIHx8IGdldERlZmF1bHRXYXJuaW5nKG1vZGUpO1xuXG4gIC8vIFVzZSB0aGUgc2FtZSBsb2dpYyBhc1xuICAvLyBCb290c3RyYXA6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iLzFkNmUzNzEwZGQ0NDdkZTFhMjAwZjI5ZThmYTUyMWY4YTA5MDhmNzAvc2Nzcy9fZnVuY3Rpb25zLnNjc3MjTDU5XG4gIC8vIGFuZCBtYXRlcmlhbC1jb21wb25lbnRzLXdlYiBodHRwczovL2dpdGh1Yi5jb20vbWF0ZXJpYWwtY29tcG9uZW50cy9tYXRlcmlhbC1jb21wb25lbnRzLXdlYi9ibG9iL2FjNDZiODg2M2M0ZGFiOWZjMjJjNGM2NjJkYzZiZDFiNjVkZDY1MmYvcGFja2FnZXMvbWRjLXRoZW1lL19mdW5jdGlvbnMuc2NzcyNMNTRcbiAgZnVuY3Rpb24gZ2V0Q29udHJhc3RUZXh0KGJhY2tncm91bmQpIHtcbiAgICBpZiAoY29sb3JTcGFjZSkge1xuICAgICAgcmV0dXJuIGNvbnRyYXN0Q29sb3IoYmFja2dyb3VuZCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyYXN0VGV4dCA9IGdldENvbnRyYXN0UmF0aW8oYmFja2dyb3VuZCwgZGFyay50ZXh0LnByaW1hcnkpID49IGNvbnRyYXN0VGhyZXNob2xkID8gZGFyay50ZXh0LnByaW1hcnkgOiBsaWdodC50ZXh0LnByaW1hcnk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNvbnN0IGNvbnRyYXN0ID0gZ2V0Q29udHJhc3RSYXRpbyhiYWNrZ3JvdW5kLCBjb250cmFzdFRleHQpO1xuICAgICAgaWYgKGNvbnRyYXN0IDwgMykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFtgTVVJOiBUaGUgY29udHJhc3QgcmF0aW8gb2YgJHtjb250cmFzdH06MSBmb3IgJHtjb250cmFzdFRleHR9IG9uICR7YmFja2dyb3VuZH1gLCAnZmFsbHMgYmVsb3cgdGhlIFdDQUcgcmVjb21tZW5kZWQgYWJzb2x1dGUgbWluaW11bSBjb250cmFzdCByYXRpbyBvZiAzOjEuJywgJ2h0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDA4L1JFQy1X
1Q0FHMjAtMjAwODEyMTEvI3Zpc3VhbC1hdWRpby1jb250cmFzdC1jb250cmFzdCddLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyYXN0VGV4dDtcbiAgfVxuICBjb25zdCBhdWdtZW50Q29sb3IgPSAoe1xuICAgIGNvbG9yLFxuICAgIG5hbWUsXG4gICAgbWFpblNoYWRlID0gNTAwLFxuICAgIGxpZ2h0U2hhZGUgPSAzMDAsXG4gICAgZGFya1NoYWRlID0gNzAwXG4gIH0pID0+IHtcbiAgICBjb2xvciA9IHtcbiAgICAgIC4uLmNvbG9yXG4gICAgfTtcbiAgICBpZiAoIWNvbG9yLm1haW4gJiYgY29sb3JbbWFpblNoYWRlXSkge1xuICAgICAgY29sb3IubWFpbiA9IGNvbG9yW21haW5TaGFkZV07XG4gICAgfVxuICAgIGlmICghY29sb3IuaGFzT3duUHJvcGVydHkoJ21haW4nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IGBNVUk6IFRoZSBjb2xvciR7bmFtZSA/IGAgKCR7bmFtZX0pYCA6ICcnfSBwcm92aWRlZCB0byBhdWdtZW50Q29sb3IoY29sb3IpIGlzIGludmFsaWQuXFxuYCArIGBUaGUgY29sb3Igb2JqZWN0IG5lZWRzIHRvIGhhdmUgYSBcXGBtYWluXFxgIHByb3BlcnR5IG9yIGEgXFxgJHttYWluU2hhZGV9XFxgIHByb3BlcnR5LmAgOiBfZm9ybWF0RXJyb3JNZXNzYWdlKDExLCBuYW1lID8gYCAoJHtuYW1lfSlgIDogJycsIG1haW5TaGFkZSkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbG9yLm1haW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gYE1VSTogVGhlIGNvbG9yJHtuYW1lID8gYCAoJHtuYW1lfSlgIDogJyd9IHByb3ZpZGVkIHRvIGF1Z21lbnRDb2xvcihjb2xvcikgaXMgaW52YWxpZC5cXG5gICsgYFxcYGNvbG9yLm1haW5cXGAgc2hvdWxkIGJlIGEgc3RyaW5nLCBidXQgXFxgJHtKU09OLnN0cmluZ2lmeShjb2xvci5tYWluKX1cXGAgd2FzIHByb3ZpZGVkIGluc3RlYWQuXFxuYCArICdcXG4nICsgJ0RpZCB5b3UgaW50ZW5kIHRvIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBhcHByb2FjaGVzP1xcbicgKyAnXFxuJyArICdpbXBvcnQgeyBncmVlbiB9IGZyb20gXCJAbXVpL21hdGVyaWFsL2NvbG9yc1wiO1xcbicgKyAnXFxuJyArICdjb25zdCB0aGVtZTEgPSBjcmVhdGVUaGVtZSh7IHBhbGV0dGU6IHtcXG4nICsgJyAgcHJpbWFyeTogZ3JlZW4sXFxuJyArICd9IH0pO1xcbicgKyAnXFxuJyArICdjb25zdCB0aGVtZTIgPSBjcmVhdGVUaGVtZSh7IHBhbGV0dGU6IHtcXG4nICsgJyAgcHJpbWFyeTogeyBtYWluOiBncmVlbls1MDBdIH0sXFxuJyArICd9IH0pOycgOiBfZm9ybWF0RXJyb3JNZXNzYWdlKDEyLCBuYW1lID8gYCAoJHtuYW1lfSlgIDogJycsIEpTT04uc3RyaW5naWZ5KGNvbG9yLm1haW4pKSk7XG4gICAgfVxuICAgIGlmIChjb2xvclNwYWNlKSB7XG4gICAgICBtaXhMaWdodE9yRGFyayhjb2xvclNwYWNlLCBjb2xvciwgJ2xpZ2h0JywgbGlnaHRTaGFkZSwgdG9uYWxPZmZzZXQpO1xuICAgICAgbWl4TGlnaHRPckRhcmsoY29sb3JTcGFjZSwgY29sb3IsICdkYXJrJywgZGFya1NoYWRlLCB0b25hbE9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZExpZ2h0T3JEYXJrKGNvbG9yLCAnbGlnaHQnLCBsaWdodFNoYWRlLCB0b25hbE9mZnNldCk7XG4gICAgICBhZGRMaWdodE9yRGFyayhjb2xvciwgJ2RhcmsnLCBkYXJrU2hhZGUsIHRvbmFsT2Zmc2V0KTtcbiAgICB9XG4gICAgaWYgKCFjb2xvci5jb250cmFzdFRleHQpIHtcbiAgICAgIGNvbG9yLmNvbnRyYXN0VGV4dCA9IGdldENvbnRyYXN0VGV4dChjb2xvci5tYWluKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbG9yO1xuICB9O1xuICBsZXQgbW9kZUh5ZHJhdGVkO1xuICBpZiAobW9kZSA9PT0gJ2xpZ2h0Jykge1xuICAgIG1vZGVIeWRyYXRlZCA9IGdldExpZ2h0KCk7XG4gIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2RhcmsnKSB7XG4gICAgbW9kZUh5ZHJhdGVkID0gZ2V0RGFyaygpO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKCFtb2RlSHlkcmF0ZWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYE1VSTogVGhlIHBhbGV0dGUgbW9kZSBcXGAke21vZGV9XFxgIGlzIG5vdCBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHBhbGV0dGVPdXRwdXQgPSBkZWVwbWVyZ2Uoe1xuICAgIC8vIEEgY29sbGVjdGlvbiBvZiBjb21tb24gY29sb3JzLlxuICAgIGNvbW1vbjoge1xuICAgICAgLi4uY29tbW9uXG4gICAgfSxcbiAgICAvLyBwcmV2ZW50IG11dGFibGUgb2JqZWN0LlxuICAgIC8vIFRoZSBwYWxldHRlIG1vZGUsIGNhbiBiZSBsaWdodCBvciBkYXJrLlxuICAgIG1vZGUsXG4gICAgLy8gVGhlIGNvbG9ycyB1c2VkIHRvIHJlcHJlc2VudCBwcmltYXJ5IGludGVyZmFjZSBlbGVtZW50cyBmb3IgYSB1c2VyLlxuICAgIHByaW1hcnk6IGF1Z21lbnRDb2xvcih7XG4gICAgICBjb2xvcjogcHJpbWFyeSxcbiAgICAgIG5hbWU6ICdwcmltYXJ5J1xuICAgIH0pLFxuICAgIC8vIFRoZSBjb2xvcnMgdXNlZCB0byByZXByZXNlbnQgc2Vjb25kYXJ5IGludGVyZmFjZSBlbGVtZW50cyBmb3IgYSB1c2VyLlxuICAgIHNlY29uZGFyeTogYXVnbWVudENvbG9yKHtcbiAgICAgIGNvbG9yOiBzZWNvbmRhcnksXG4gICAgICBuYW1lOiAnc2Vjb25kYXJ5JyxcbiAgICAgIG1haW5TaGFkZTogJ0E0MDAnLFxuICAgICAgbGlnaHRTaGFkZTogJ0EyMDAnLFxuICAgICAgZGFya1NoYWRlOiAnQTcwMCdcbiAgICB9KSxcbiAgICAvLyBUaGUgY29sb3JzIHVzZWQgdG8gcmVwcmVzZW50IGludGVyZmFjZSBlbGVtZW50cyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBtYWRlIGF3YXJlIG9mLlxuICAgIGVycm9yOiBhdWdtZW50Q29sb3Ioe1xuICAgICAgY29sb3I6IGVycm9yLFxuICAgICAgbmFtZTogJ2Vycm9yJ1xuICAgIH0pLFxuICAgIC8vIFRoZSBjb2xvcnMgdXNlZCB0byByZXByZXNlbnQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGFjdGlvbnMgb3IgaW1wb3J0YW50IG1lc3NhZ2VzLlxuICAgIHdhcm5pbmc6IGF1Z21lbn
1RDb2xvcih7XG4gICAgICBjb2xvcjogd2FybmluZyxcbiAgICAgIG5hbWU6ICd3YXJuaW5nJ1xuICAgIH0pLFxuICAgIC8vIFRoZSBjb2xvcnMgdXNlZCB0byBwcmVzZW50IGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyIHRoYXQgaXMgbmV1dHJhbCBhbmQgbm90IG5lY2Vzc2FyaWx5IGltcG9ydGFudC5cbiAgICBpbmZvOiBhdWdtZW50Q29sb3Ioe1xuICAgICAgY29sb3I6IGluZm8sXG4gICAgICBuYW1lOiAnaW5mbydcbiAgICB9KSxcbiAgICAvLyBUaGUgY29sb3JzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBhbiBhY3Rpb24gdGhhdCB1c2VyIHRyaWdnZXJlZC5cbiAgICBzdWNjZXNzOiBhdWdtZW50Q29sb3Ioe1xuICAgICAgY29sb3I6IHN1Y2Nlc3MsXG4gICAgICBuYW1lOiAnc3VjY2VzcydcbiAgICB9KSxcbiAgICAvLyBUaGUgZ3JleSBjb2xvcnMuXG4gICAgZ3JleSxcbiAgICAvLyBVc2VkIGJ5IGBnZXRDb250cmFzdFRleHQoKWAgdG8gbWF4aW1pemUgdGhlIGNvbnRyYXN0IGJldHdlZW5cbiAgICAvLyB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIHRleHQuXG4gICAgY29udHJhc3RUaHJlc2hvbGQsXG4gICAgLy8gVGFrZXMgYSBiYWNrZ3JvdW5kIGNvbG9yIGFuZCByZXR1cm5zIHRoZSB0ZXh0IGNvbG9yIHRoYXQgbWF4aW1pemVzIHRoZSBjb250cmFzdC5cbiAgICBnZXRDb250cmFzdFRleHQsXG4gICAgLy8gR2VuZXJhdGUgYSByaWNoIGNvbG9yIG9iamVjdC5cbiAgICBhdWdtZW50Q29sb3IsXG4gICAgLy8gVXNlZCBieSB0aGUgZnVuY3Rpb25zIGJlbG93IHRvIHNoaWZ0IGEgY29sb3IncyBsdW1pbmFuY2UgYnkgYXBwcm94aW1hdGVseVxuICAgIC8vIHR3byBpbmRleGVzIHdpdGhpbiBpdHMgdG9uYWwgcGFsZXR0ZS5cbiAgICAvLyBFLmcuLCBzaGlmdCBmcm9tIFJlZCA1MDAgdG8gUmVkIDMwMCBvciBSZWQgNzAwLlxuICAgIHRvbmFsT2Zmc2V0LFxuICAgIC8vIFRoZSBsaWdodCBhbmQgZGFyayBtb2RlIG9iamVjdC5cbiAgICAuLi5tb2RlSHlkcmF0ZWRcbiAgfSwgb3RoZXIpO1xuICByZXR1cm4gcGFsZXR0ZU91dHB1dDtcbn0iLCIvKipcbiAqIFRoZSBiZW5lZml0IG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gaGVscCBkZXZlbG9wZXJzIGdldCBDU1MgdmFyIGZyb20gdGhlbWUgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSB3aG9sZSB2YXJpYWJsZVxuICogYW5kIHRoZXkgZG9lcyBub3QgbmVlZCB0byByZW1lbWJlciB0aGUgcHJlZml4IChkZWZpbmVkIG9uY2UpLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVHZXRDc3NWYXIocHJlZml4ID0gJycpIHtcbiAgZnVuY3Rpb24gYXBwZW5kVmFyKC4uLnZhcnMpIHtcbiAgICBpZiAoIXZhcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdmFyc1swXTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhdmFsdWUubWF0Y2goLygjfFxcKHxcXCl8KC0/KFxcZCpcXC4pP1xcZCspKHB4fGVtfCV8ZXh8Y2h8cmVtfHZ3fHZofHZtaW58dm1heHxjbXxtbXxpbnxwdHxwYykpfF4oLT8oXFxkKlxcLik/XFxkKykkfChcXGQrIFxcZCsgXFxkKykvKSkge1xuICAgICAgcmV0dXJuIGAsIHZhcigtLSR7cHJlZml4ID8gYCR7cHJlZml4fS1gIDogJyd9JHt2YWx1ZX0ke2FwcGVuZFZhciguLi52YXJzLnNsaWNlKDEpKX0pYDtcbiAgICB9XG4gICAgcmV0dXJuIGAsICR7dmFsdWV9YDtcbiAgfVxuXG4gIC8vIEFkZGl0aW9uYWxWYXJzIG1ha2VzIGBnZXRDc3NWYXJgIGxlc3Mgc3RyaWN0LCBzbyBpdCBjYW4gYmUgdXNlIGxpa2UgdGhpcyBgZ2V0Q3NzVmFyKCdub24tbXVpLXZhcmlhYmxlJylgIHdpdGhvdXQgdHlwZSBlcnJvci5cbiAgY29uc3QgZ2V0Q3NzVmFyID0gKGZpZWxkLCAuLi5mYWxsYmFja3MpID0+IHtcbiAgICByZXR1cm4gYHZhcigtLSR7cHJlZml4ID8gYCR7cHJlZml4fS1gIDogJyd9JHtmaWVsZH0ke2FwcGVuZFZhciguLi5mYWxsYmFja3MpfSlgO1xuICB9O1xuICByZXR1cm4gZ2V0Q3NzVmFyO1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHByZXBhcmVUeXBvZ3JhcGh5VmFycyh0eXBvZ3JhcGh5KSB7XG4gIGNvbnN0IHZhcnMgPSB7fTtcbiAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHR5cG9ncmFwaHk
1pO1xuICBlbnRyaWVzLmZvckVhY2goZW50cnkgPT4ge1xuICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5O1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXJzW2tleV0gPSBgJHt2YWx1ZS5mb250U3R5bGUgPyBgJHt2YWx1ZS5mb250U3R5bGV9IGAgOiAnJ30ke3ZhbHVlLmZvbnRWYXJpYW50ID8gYCR7dmFsdWUuZm9udFZhcmlhbnR9IGAgOiAnJ30ke3ZhbHVlLmZvbnRXZWlnaHQgPyBgJHt2YWx1ZS5mb250V2VpZ2h0fSBgIDogJyd9JHt2YWx1ZS5mb250U3RyZXRjaCA/IGAke3ZhbHVlLmZvbnRTdHJldGNofSBgIDogJyd9JHt2YWx1ZS5mb250U2l6ZSB8fCAnJ30ke3ZhbHVlLmxpbmVIZWlnaHQgPyBgLyR7dmFsdWUubGluZUhlaWdodH0gYCA6ICcnfSR7dmFsdWUuZm9udEZhbWlseSB8fCAnJ31gO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB2YXJzO1xufSIsIi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGUgYW4gb2JqZWN0IGZyb20ga2V5cywgdmFsdWUgYW5kIHRoZW4gYXNzaWduIHRvIHRhcmdldFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogOiB0aGUgdGFyZ2V0IG9iamVjdCB0byBiZSBhc3NpZ25lZFxuICogQHBhcmFtIHtzdHJpbmdbXX0ga2V5c1xuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHZhbHVlXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNvdXJjZSA9IHt9XG4gKiBhc3NpZ25OZXN0ZWRLZXlzKHNvdXJjZSwgWydwYWxldHRlJywgJ3ByaW1hcnknXSwgJ3ZhcigtLXBhbGV0dGUtcHJpbWFyeSknKVxuICogY29uc29sZS5sb2coc291cmNlKSAvLyB7IHBhbGV0dGU6IHsgcHJpbWFyeTogJ3ZhcigtLXBhbGV0dGUtcHJpbWFyeSknIH0gfVxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzb3VyY2UgPSB7IHBhbGV0dGU6IHsgcHJpbWFyeTogJ3ZhcigtLXBhbGV0dGUtcHJpbWFyeSknIH0gfVxuICogYXNzaWduTmVzdGVkS2V5cyhzb3VyY2UsIFsncGFsZXR0ZScsICdzZWNvbmRhcnknXSwgJ3ZhcigtLXBhbGV0dGUtc2Vjb25kYXJ5KScpXG4gKiBjb25zb2xlLmxvZyhzb3VyY2UpIC8vIHsgcGFsZXR0ZTogeyBwcmltYXJ5OiAndmFyKC0tcGFsZXR0ZS1wcmltYXJ5KScsIHNlY29uZGFyeTogJ3ZhcigtLXBhbGV0dGUtc2Vjb25kYXJ5KScgfSB9XG4gKi9cbmV4cG9ydCBjb25zdCBhc3NpZ25OZXN0ZWRLZXlzID0gKG9iaiwga2V5cywgdmFsdWUsIGFycmF5S2V5cyA9IFtdKSA9PiB7XG4gIGxldCB0ZW1wID0gb2JqO1xuICBrZXlzLmZvckVhY2goKGssIGluZGV4KSA9PiB7XG4gICAgaWYgKGluZGV4ID09PSBrZXlzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRlbXApKSB7XG4gICAgICAgIHRlbXBbTnVtYmVyKGspXSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIGlmICh0ZW1wICYmIHR5cGVvZiB0ZW1wID09PSAnb2JqZWN0Jykge1xuICAgICAgICB0ZW1wW2tdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0ZW1wICYmIHR5cGVvZiB0ZW1wID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKCF0ZW1wW2tdKSB7XG4gICAgICAgIHRlbXBba10gPSBhcnJheUtleXMuaW5jbHVkZXMoaykgPyBbXSA6IHt9O1xuICAgICAgfVxuICAgICAgdGVtcCA9IHRlbXBba107XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogOiBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayA6IGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gKiAgICAgICAgICAgICAgICAgICAtIHRoZSBkZWVwZXN0IGtleSBpbiBzb3VyY2Ugb2JqZWN0IGlzIHJlYWNoZWRcbiAqICAgICAgICAgICAgICAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSBkZWVwZXN0IGtleSBpcyBOT1QgYHVuZGVmaW5lZGAgfCBgbnVsbGBcbiAqXG4gKiBAZXhhbXBsZVxuICogd2Fsa09iamVjdERlZXAoeyBwYWxldHRlOiB7IHByaW1hcnk6IHsgbWFpbjogJyMwMDAwMDAnIH0gfSB9LCBjb25zb2xlLmxvZylcbiAqIC8vIFsncGFsZXR0ZScsICdwcmltYXJ5JywgJ21haW4nXSAnIzAwMDAwMCdcbiAqL1xuZXhwb3J0IGNvbnN0IHdhbGtPYmplY3REZWVwID0gKG9iaiwgY2FsbGJhY2ssIHNob3VsZFNraXBQYXRocykgPT4ge1xuICBmdW5jdGlvbiByZWN1cnNlKG9iamVjdCwgcGFyZW50S2V5cyA9IFtdLCBhcnJheUtleXMgPSBbXSkge1xuICAgIE9iamVjdC5lbnRyaWVzKG9iamVjdCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoIXNob3VsZFNraXBQYXRocyB8fCBzaG91bGRTa2lwUGF0aHMgJiYgIXNob3VsZFNraXBQYXRocyhbLi4ucGFyZW50S2V5cywga2V5XSkpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVjdXJzZSh2YWx1ZSwgWy4uLnBhcmVudEtleXMsIGtleV0sIEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLmFycmF5S2V5cywga2V5XSA6IGFycmF5S2V5cyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKFsuLi5wYXJlbnRLZXlzLCBrZXldLCB2YWx1ZSwgYXJyYXlLZXlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZWN1cnNlKG9iaik7XG59O1xuY29uc3QgZ2V0Q3NzVmFsdWUgPSAoa2V5cywgdmFsdWUpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoWydsaW5lSGVpZ2h0JywgJ2ZvbnRXZWlnaHQnLCAnb3BhY2l0eScsICd6SW5kZXgnXS5zb21lKHByb3AgPT4ga2V5cy5pbmNsdWRlcyhwcm9wKSkpIHtcbiAgICAgIC8vIENTUyBwcm9wZXJ0eSB0aGF0IGFyZSB1bml0bGVzc1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0S2V5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ29wYWNpdHknKSkge1xuICAgICAgLy8gb3BhY2l0eSB2YWx1ZXMgYXJlIHVuaXRsZXNzXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybi
1BgJHt2YWx1ZX1weGA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBhIGZ1bmN0aW9uIHRoYXQgcGFyc2UgdGhlbWUgYW5kIHJldHVybiB7IGNzcywgdmFycyB9XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHRoZW1lXG4gKiBAcGFyYW0ge3tcbiAqICBwcmVmaXg/OiBzdHJpbmcsXG4gKiAgc2hvdWxkU2tpcEdlbmVyYXRpbmdWYXI/OiAob2JqZWN0UGF0aEtleXM6IEFycmF5PHN0cmluZz4sIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW5cbiAqIH19IG9wdGlvbnMuXG4gKiAgYHByZWZpeGA6IFRoZSBwcmVmaXggb2YgdGhlIGdlbmVyYXRlZCBDU1MgdmFyaWFibGVzLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgdmFsdWUuXG4gKlxuICogQHJldHVybnMge3sgY3NzOiBPYmplY3QsIHZhcnM6IE9iamVjdCB9fSBgY3NzYCBpcyB0aGUgc3R5bGVzaGVldCwgYHZhcnNgIGlzIGFuIG9iamVjdCB0byBnZXQgY3NzIHZhcmlhYmxlIChzYW1lIHN0cnVjdHVyZSBhcyB0aGVtZSkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHsgY3NzLCB2YXJzIH0gPSBwYXJzZXIoe1xuICogICBmb250U2l6ZTogMTIsXG4gKiAgIGxpbmVIZWlnaHQ6IDEuMixcbiAqICAgcGFsZXR0ZTogeyBwcmltYXJ5OiB7IDUwMDogJ3ZhcigtLWNvbG9yKScgfSB9XG4gKiB9LCB7IHByZWZpeDogJ2ZvbycgfSlcbiAqXG4gKiBjb25zb2xlLmxvZyhjc3MpIC8vIHsgJy0tZm9vLWZvbnRTaXplJzogJzEycHgnLCAnLS1mb28tbGluZUhlaWdodCc6IDEuMiwgJy0tZm9vLXBhbGV0dGUtcHJpbWFyeS01MDAnOiAndmFyKC0tY29sb3IpJyB9XG4gKiBjb25zb2xlLmxvZyh2YXJzKSAvLyB7IGZvbnRTaXplOiAndmFyKC0tZm9vLWZvbnRTaXplKScsIGxpbmVIZWlnaHQ6ICd2YXIoLS1mb28tbGluZUhlaWdodCknLCBwYWxldHRlOiB7IHByaW1hcnk6IHsgNTAwOiAndmFyKC0tZm9vLXBhbGV0dGUtcHJpbWFyeS01MDApJyB9IH0gfVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjc3NWYXJzUGFyc2VyKHRoZW1lLCBvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBwcmVmaXgsXG4gICAgc2hvdWxkU2tpcEdlbmVyYXRpbmdWYXJcbiAgfSA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IGNzcyA9IHt9O1xuICBjb25zdCB2YXJzID0ge307XG4gIGNvbnN0IHZhcnNXaXRoRGVmYXVsdHMgPSB7fTtcbiAgd2Fsa09iamVjdERlZXAodGhlbWUsIChrZXlzLCB2YWx1ZSwgYXJyYXlLZXlzKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKCFzaG91bGRTa2lwR2VuZXJhdGluZ1ZhciB8fCAhc2hvdWxkU2tpcEdlbmVyYXRpbmdWYXIoa2V5cywgdmFsdWUpKSB7XG4gICAgICAgIC8vIG9ubHkgY3JlYXRlIGNzcyAmIHZhciBpZiBgc2hvdWxkU2tpcEdlbmVyYXRpbmdWYXJgIHJldHVybiBmYWxzZVxuICAgICAgICBjb25zdCBjc3NWYXIgPSBgLS0ke3ByZWZpeCA/IGAke3ByZWZpeH0tYCA6ICcnfSR7a2V5cy5qb2luKCctJyl9YDtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRWYWx1ZSA9IGdldENzc1ZhbHVlKGtleXMsIHZhbHVlKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjc3MsIHtcbiAgICAgICAgICBbY3NzVmFyXTogcmVzb2x2ZWRWYWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgYXNzaWduTmVzdGVkS2V5cyh2YXJzLCBrZXlzLCBgdmFyKCR7Y3NzVmFyfSlgLCBhcnJheUtleXMpO1xuICAgICAgICBhc3NpZ25OZXN0ZWRLZXlzKHZhcnNXaXRoRGVmYXVsdHMsIGtleXMsIGB2YXIoJHtjc3NWYXJ9LCAke3Jlc29sdmVkVmFsdWV9KWAsIGFycmF5S2V5cyk7XG4gICAgICB9XG4gICAgfVxuICB9LCBrZXlzID0+IGtleXNbMF0gPT09ICd2YXJzJyAvLyBza2lwICd2YXJzLyonIHBhdGhzXG4gICk7XG4gIHJldHVybiB7XG4gICAgY3NzLFxuICAgIHZhcnMsXG4gICAgdmFyc1dpdGhEZWZhdWx0c1xuICB9O1xufSIsImltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnQG11aS91dGlscy9kZWVwbWVyZ2UnO1xuaW1wb3J0IGNzc1ZhcnNQYXJzZXIgZnJvbSBcIi4vY3NzVmFyc1BhcnNlci5qc1wiO1xuZnVuY3Rpb24gcHJlcGFyZUNzc1ZhcnModGhlbWUsIHBhcnNlckNvbmZpZyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBnZXRTZWxlY3RvciA9IGRlZmF1bHRHZXRTZWxlY3RvcixcbiAgICBkaXNhYmxlQ3NzQ29sb3JTY2hlbWUsXG4gICAgY29sb3JTY2hlbWVTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgZW5hYmxlQ29udHJhc3RWYXJzXG4gIH0gPSBwYXJzZXJDb25maWc7XG4gIC8vIEB0cy1pZ25vcmUgLSBpZ25vcmUgY29tcG9uZW50cyBkbyBub3QgZXhpc3RcbiAgY29uc3Qge1xuICAgIGNvbG9yU2NoZW1lcyA9IHt9LFxuICAgIGNvbXBvbmVudHMsXG4gICAgZGVmYXVsdENvbG9yU2NoZW1lID0gJ2xpZ2h0JyxcbiAgICAuLi5vdGhlclRoZW1lXG4gIH0gPSB0aGVtZTtcbiAgY29uc3Qge1xuICAgIHZhcnM6IHJvb3RWYXJzLFxuICAgIGNzczogcm9vdENzcyxcbiAgICB2YXJzV2l0aERlZmF1bHRzOiByb290VmFyc1dpdGhEZWZhdWx0c1xuICB9ID0gY3NzVmFyc1BhcnNlcihvdGhlclRoZW1lLCBwYXJzZXJDb25maWcpO1xuICBsZXQgdGhlbWVWYXJzID0gcm9vdFZhcnNXaXRoRGVmYXVsdHM7XG4gIGNvbnN0IGNvbG9yU2NoZW1lc01hcCA9IHt9O1xuICBjb25zdCB7XG4gICAgW2RlZmF1bHRDb2xvclNjaGVtZV06IGRlZmF1bHRTY2hlbWUsXG4gICAgLi4ub3RoZXJDb2xvclNjaGVtZXNcbiAgfSA9IGNvbG9yU2NoZW1lcztcbiAgT2JqZWN0LmVud
1HJpZXMob3RoZXJDb2xvclNjaGVtZXMgfHwge30pLmZvckVhY2goKFtrZXksIHNjaGVtZV0pID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB2YXJzLFxuICAgICAgY3NzLFxuICAgICAgdmFyc1dpdGhEZWZhdWx0c1xuICAgIH0gPSBjc3NWYXJzUGFyc2VyKHNjaGVtZSwgcGFyc2VyQ29uZmlnKTtcbiAgICB0aGVtZVZhcnMgPSBkZWVwbWVyZ2UodGhlbWVWYXJzLCB2YXJzV2l0aERlZmF1bHRzKTtcbiAgICBjb2xvclNjaGVtZXNNYXBba2V5XSA9IHtcbiAgICAgIGNzcyxcbiAgICAgIHZhcnNcbiAgICB9O1xuICB9KTtcbiAgaWYgKGRlZmF1bHRTY2hlbWUpIHtcbiAgICAvLyBkZWZhdWx0IGNvbG9yIHNjaGVtZSB2YXJzIHNob3VsZCBiZSBtZXJnZWQgbGFzdCB0byBzZXQgYXMgZGVmYXVsdFxuICAgIGNvbnN0IHtcbiAgICAgIGNzcyxcbiAgICAgIHZhcnMsXG4gICAgICB2YXJzV2l0aERlZmF1bHRzXG4gICAgfSA9IGNzc1ZhcnNQYXJzZXIoZGVmYXVsdFNjaGVtZSwgcGFyc2VyQ29uZmlnKTtcbiAgICB0aGVtZVZhcnMgPSBkZWVwbWVyZ2UodGhlbWVWYXJzLCB2YXJzV2l0aERlZmF1bHRzKTtcbiAgICBjb2xvclNjaGVtZXNNYXBbZGVmYXVsdENvbG9yU2NoZW1lXSA9IHtcbiAgICAgIGNzcyxcbiAgICAgIHZhcnNcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGRlZmF1bHRHZXRTZWxlY3Rvcihjb2xvclNjaGVtZSwgY3NzT2JqZWN0KSB7XG4gICAgbGV0IHJ1bGUgPSBzZWxlY3RvcjtcbiAgICBpZiAoc2VsZWN0b3IgPT09ICdjbGFzcycpIHtcbiAgICAgIHJ1bGUgPSAnLiVzJztcbiAgICB9XG4gICAgaWYgKHNlbGVjdG9yID09PSAnZGF0YScpIHtcbiAgICAgIHJ1bGUgPSAnW2RhdGEtJXNdJztcbiAgICB9XG4gICAgaWYgKHNlbGVjdG9yPy5zdGFydHNXaXRoKCdkYXRhLScpICYmICFzZWxlY3Rvci5pbmNsdWRlcygnJXMnKSkge1xuICAgICAgLy8gJ2RhdGEtam95LWNvbG9yLXNjaGVtZScgLT4gJ1tkYXRhLWpveS1jb2xvci1zY2hlbWU9XCIlc1wiXSdcbiAgICAgIHJ1bGUgPSBgWyR7c2VsZWN0b3J9PVwiJXNcIl1gO1xuICAgIH1cbiAgICBpZiAoY29sb3JTY2hlbWUpIHtcbiAgICAgIGlmIChydWxlID09PSAnbWVkaWEnKSB7XG4gICAgICAgIGlmICh0aGVtZS5kZWZhdWx0Q29sb3JTY2hlbWUgPT09IGNvbG9yU2NoZW1lKSB7XG4gICAgICAgICAgcmV0dXJuICc6cm9vdCc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kZSA9IGNvbG9yU2NoZW1lc1tjb2xvclNjaGVtZV0/LnBhbGV0dGU/Lm1vZGUgfHwgY29sb3JTY2hlbWU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW2BAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiAke21vZGV9KWBdOiB7XG4gICAgICAgICAgICAnOnJvb3QnOiBjc3NPYmplY3RcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAocnVsZSkge1xuICAgICAgICBpZiAodGhlbWUuZGVmYXVsdENvbG9yU2NoZW1lID09PSBjb2xvclNjaGVtZSkge1xuICAgICAgICAgIHJldHVybiBgOnJvb3QsICR7cnVsZS5yZXBsYWNlKCclcycsIFN0cmluZyhjb2xvclNjaGVtZSkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ1bGUucmVwbGFjZSgnJXMnLCBTd
1HJpbmcoY29sb3JTY2hlbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICc6cm9vdCc7XG4gIH1cbiAgY29uc3QgZ2VuZXJhdGVUaGVtZVZhcnMgPSAoKSA9PiB7XG4gICAgbGV0IHZhcnMgPSB7XG4gICAgICAuLi5yb290VmFyc1xuICAgIH07XG4gICAgT2JqZWN0LmVudHJpZXMoY29sb3JTY2hlbWVzTWFwKS5mb3JFYWNoKChbLCB7XG4gICAgICB2YXJzOiBzY2hlbWVWYXJzXG4gICAgfV0pID0+IHtcbiAgICAgIHZhcnMgPSBkZWVwbWVyZ2UodmFycywgc2NoZW1lVmFycyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhcnM7XG4gIH07XG4gIGNvbnN0IGdlbmVyYXRlU3R5bGVTaGVldHMgPSAoKSA9PiB7XG4gICAgY29uc3Qgc3R5bGVzaGVldHMgPSBbXTtcbiAgICBjb25zdCBjb2xvclNjaGVtZSA9IHRoZW1lLmRlZmF1bHRDb2xvclNjaGVtZSB8fCAnbGlnaHQnO1xuICAgIGZ1bmN0aW9uIGluc2VydFN0eWxlU2hlZXQoa2V5LCBjc3MpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhjc3MpLmxlbmd0aCkge1xuICAgICAgICBzdHlsZXNoZWV0cy5wdXNoKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnID8ge1xuICAgICAgICAgIFtrZXldOiB7XG4gICAgICAgICAgICAuLi5jc3NcbiAgICAgICAgICB9XG4gICAgICAgIH0gOiBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpbnNlcnRTdHlsZVNoZWV0KGdldFNlbGVjdG9yKHVuZGVmaW5lZCwge1xuICAgICAgLi4ucm9vdENzc1xuICAgIH0pLCByb290Q3NzKTtcbiAgICBjb25zdCB7XG4gICAgICBbY29sb3JTY2hlbWVdOiBkZWZhdWx0U2NoZW1lVmFsLFxuICAgICAgLi4ub3RoZXJcbiAgICB9ID0gY29sb3JTY2hlbWVzTWFwO1xuICAgIGlmIChkZWZhdWx0U2NoZW1lVmFsKSB7XG4gICAgICAvLyBkZWZhdWx0IGNvbG9yIHNjaGVtZSBoYXMgdG8gY29tZSBiZWZvcmUgb3RoZXIgY29sb3Igc2NoZW1lc1xuICAgICAgY29uc3Qge1xuICAgICAgICBjc3NcbiAgICAgIH0gPSBkZWZhdWx0U2NoZW1lVmFsO1xuICAgICAgY29uc3QgY3NzQ29sb3JTaGVtZSA9IGNvbG9yU2NoZW1lc1tjb2xvclNjaGVtZV0/LnBhbGV0dGU/Lm1vZGU7XG4gICAgICBjb25zdCBmaW5hbENzcyA9ICFkaXNhYmxlQ3NzQ29sb3JTY2hlbWUgJiYgY3NzQ29sb3JTaGVtZSA/IHtcbiAgICAgICAgY29sb3JTY2hlbWU6IGNzc0NvbG9yU2hlbWUsXG4gICAgICAgIC4uLmNzc1xuICAgICAgfSA6IHtcbiAgICAgICAgLi4uY3NzXG4gICAgICB9O1xuICAgICAgaW5zZXJ0U3R5bGVTaGVldChnZXRTZWxlY3Rvcihjb2xvclNjaGVtZSwge1xuICAgICAgICAuLi5maW5hbENzc1xuICAgICAgfSksIGZpbmFsQ3NzKTtcbiAgICB9XG4gICAgT2JqZWN0LmVud
1HJpZXMob3RoZXIpLmZvckVhY2goKFtrZXksIHtcbiAgICAgIGNzc1xuICAgIH1dKSA9PiB7XG4gICAgICBjb25zdCBjc3NDb2xvclNoZW1lID0gY29sb3JTY2hlbWVzW2tleV0/LnBhbGV0dGU/Lm1vZGU7XG4gICAgICBjb25zdCBmaW5hbENzcyA9ICFkaXNhYmxlQ3NzQ29sb3JTY2hlbWUgJiYgY3NzQ29sb3JTaGVtZSA/IHtcbiAgICAgICAgY29sb3JTY2hlbWU6IGNzc0NvbG9yU2hlbWUsXG4gICAgICAgIC4uLmNzc1xuICAgICAgfSA6IHtcbiAgICAgICAgLi4uY3NzXG4gICAgICB9O1xuICAgICAgaW5zZXJ0U3R5bGVTaGVldChnZXRTZWxlY3RvcihrZXksIHtcbiAgICAgICAgLi4uZmluYWxDc3NcbiAgICAgIH0pLCBmaW5hbENzcyk7XG4gICAgfSk7XG4gICAgaWYgKGVuYWJsZUNvbnRyYXN0VmFycykge1xuICAgICAgc3R5bGVzaGVldHMucHVzaCh7XG4gICAgICAgICc6cm9vdCc6IHtcbiAgICAgICAgICAvLyB1c2UgZG91YmxlIHVuZGVyc2NvcmUgdG8gaW5kaWNhdGUgdGhhdCB0aGVzZSBhcmUgcHJpdmF0ZSB2YXJpYWJsZXNcbiAgICAgICAgICAnLS1fX2wtdGhyZXNob2xkJzogJzAuNycsXG4gICAgICAgICAgJy0tX19sJzogJ2NsYW1wKDAsIChsIC8gdmFyKC0tX19sLXRocmVzaG9sZCkgLSAxKSAqIC1pbmZpbml0eSwgMSknLFxuICAgICAgICAgICctLV9fYSc6ICdjbGFtcCgwLjg3LCAobCAvIHZhcigtLV9fbC10aHJlc2hvbGQpIC0gMSkgKiAtaW5maW5pdHksIDEpJyAvLyAwLjg3IGlzIHRoZSBkZWZhdWx0IGFscGhhIHZhbHVlIGZvciBibGFjayB0ZXh0LlxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlc2hlZXRzO1xuICB9O1xuICByZXR1cm4ge1xuICAgIHZhcnM6IHRoZW1lVmFycyxcbiAgICBnZW5lcmF0ZVRoZW1lVmFycyxcbiAgICBnZW5lcmF0ZVN0eWxlU2hlZXRzXG4gIH07XG59XG5leHBvcnQgZGVmYXVsdCBwcmVwYXJlQ3NzVmFyczsiLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvcHJlZmVyLWRlZmF1bHQtZXhwb3J0ICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2V0Q29sb3JTY2hlbWVTZWxlY3RvcihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0Q29sb3JTY2hlbWVTZWxlY3Rvcihjb2xvclNjaGVtZSkge1xuICAgIGlmIChzZWxlY3RvciA9PT0gJ21lZGlhJykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKGNvbG9yU2NoZW1lICE9PSAnbGlnaHQnICYmIGNvbG9yU2NoZW1lICE9PSAnZGFyaycpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBNVUk6IEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWUpIHN1cHBvcnRzIG9ubHkgJ2xpZ2h0JyBvciAnZGFyaycsIGJ1dCByZWNlaXZlICcke2NvbG9yU2NoZW1lfScuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogJHtjb2xvclNjaGVtZX0pYDtcbiAgICB9XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICBpZiAoc2VsZWN0b3Iuc3RhcnRzV2l0aCgnZGF0YS0nKSAmJiAhc2VsZWN0b3IuaW5jbHVkZXMoJyVzJykpIHtcbiAgICAgICAgcmV0dXJuIGBbJHtzZWxlY3Rvcn09XCIke2NvbG9yU2NoZW1lfVwiXSAmYDtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ2NsYXNzJykge1xuICAgICAgICByZXR1cm4gYC4ke2NvbG9yU2NoZW1lfSAmYDtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ2RhdGEnKSB7XG4gICAgICAgIHJldHVybiBgW2RhdGEtJHtjb2xvclNjaGVtZX1dICZgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke3NlbGVjdG9yLnJlcGxhY2UoJyVzJywgY29sb3JTY2hlbWUpfSAmYDtcbiAgICB9XG4gICAgcmV0dXJuICcmJztcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVNaXhpbnMoYnJlYWtwb2ludHMsIG1peGlucykge1xuICByZXR1cm4ge1xuICAgIHRvb2xiYXI6IHtcbiAgICAgIG1pbkhlaWdodDogNTYsXG4gICAgICBbYnJlYWtwb2ludHMudXAoJ3hzJyldOiB7XG4gICAgICAgICdAbWVkaWEgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpJzoge1xuICAgICAgICAgIG1pbkhlaWdodDogNDhcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFticmVha3BvaW50cy51cCgnc20nKV06IHtcbiAgICAgICAgbWluSGVpZ2h0OiA2NFxuICAgICAgfVxuICAgIH0sXG4gICAgLi4ubWl4aW5zXG4gIH07XG59IiwiaW1wb3J0IGRlZXBtZXJnZSBmcm9tICdAbXVpL3V0aWxzL2RlZXBtZXJnZSc7XG5mdW5jdGlvbiByb3VuZCh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDFlNSkgLyAxZTU7XG59XG5jb25zdCBjYXNlQWxsQ2FwcyA9IHtcbiAgdGV4dFRyYW5zZm9ybTogJ3VwcGVyY2FzZSdcbn07XG5jb25zdCBkZWZhdWx0Rm9udEZhbWlseSA9ICdcIlJvYm90b1wiLCBcIkhlbHZldGljYVwiLCBcIkFyaWFsXCIsIHNhbnMtc2VyaWYnO1xuXG4vKipcbiAqIEBzZWUgQGxpbmt7aHR0cHM6Ly9tMi5tYXRlcmlhbC5pby9kZXNpZ24vdHlwb2dyYXBoeS90aGUtdHlwZS1zeXN0ZW0uaHRtbH1cbiAqIEBzZWUgQGxpbmt7aHR0cHM6Ly9tMi5tYXRlcmlhbC5pby9kZXNpZ24vdHlwb2dyYXBoeS91bmRlcnN0YW5kaW5nLXR5cG9ncmFwaHkuaHRtbH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlVHlwb2dyYXBoeShwYWxldHRlLCB0eXBvZ3JhcGh5KSB7XG4gIGNvbnN0IHtcbiAgICBmb250RmFtaWx5ID0gZGVmYXVsdEZvbnRGYW1pbHksXG4gICAgLy8gVGhlIGRlZmF1bHQgZm9udCBzaXplIG9mIHRoZSBNYXRlcmlhbCBTcGVjaWZpY2F0aW9uLlxuICAgIGZvbnRTaXplID0gMTQsXG4gICAgLy8gcHhcbiAgICBmb250V2VpZ2h0TGlnaHQgPSAzMDAsXG4gICAgZm9udFdlaWdodFJlZ3VsYXIgPSA0MDAsXG4gICAgZm9udFdlaWdodE1lZGl1bSA9IDUwMCxcbiAgICBmb250V2VpZ2h0Qm9sZCA9IDcwMCxcbiAgICAvLyBUZWxsIE1VSSB3aGF0J3MgdGhlIGZvbnQtc2l6ZSBvbiB0aGUgaHRtbCBlbGVtZW50LlxuICAgIC8vIDE2cHggaXMgdGhlIGRlZmF1bHQgZm9udC1zaXplIHVzZWQgYnkgYnJvd3NlcnMuXG4gICAgaH
1RtbEZvbnRTaXplID0gMTYsXG4gICAgLy8gQXBwbHkgdGhlIENTUyBwcm9wZXJ0aWVzIHRvIGFsbCB0aGUgdmFyaWFudHMuXG4gICAgYWxsVmFyaWFudHMsXG4gICAgcHhUb1JlbTogcHhUb1JlbTIsXG4gICAgLi4ub3RoZXJcbiAgfSA9IHR5cGVvZiB0eXBvZ3JhcGh5ID09PSAnZnVuY3Rpb24nID8gdHlwb2dyYXBoeShwYWxldHRlKSA6IHR5cG9ncmFwaHk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBmb250U2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ01VSTogYGZvbnRTaXplYCBpcyByZXF1aXJlZCB0byBiZSBhIG51bWJlci4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBodG1sRm9udFNpemUgIT09ICdudW1iZXInKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdNVUk6IGBodG1sRm9udFNpemVgIGlzIHJlcXVpcmVkIHRvIGJlIGEgbnVtYmVyLicpO1xuICAgIH1cbiAgfVxuICBjb25zdCBjb2VmID0gZm9udFNpemUgLyAxNDtcbiAgY29uc3QgcHhUb1JlbSA9IHB4VG9SZW0yIHx8IChzaXplID0+IGAke3NpemUgLyBodG1sRm9udFNpemUgKiBjb2VmfXJlbWApO1xuICBjb25zdCBidWlsZFZhcmlhbnQgPSAoZm9udFdlaWdodCwgc2l6ZSwgbGluZUhlaWdodCwgbGV0dGVyU3BhY2luZywgY2FzaW5nKSA9PiAoe1xuICAgIGZvbnRGYW1pbHksXG4gICAgZm9udFdlaWdodCxcbiAgICBmb250U2l6ZTogcHhUb1JlbShzaXplKSxcbiAgICAvLyBVbml0bGVzcyBmb2xsb3dpbmcgaHR0cHM6Ly9tZXllcndlYi5jb20vZXJpYy90aG91Z2h0cy8yMDA2LzAyLzA4L3VuaXRsZXNzLWxpbmUtaGVpZ2h0cy9cbiAgICBsaW5lSGVpZ2h0LFxuICAgIC8vIFRoZSBsZXR0ZXIgc3BhY2luZyB3YXMgZGVzaWduZWQgZm9yIHRoZSBSb2JvdG8gZm9udC1mYW1pbHkuIFVzaW5nIHRoZSBzYW1lIGxldHRlci1zcGFjaW5nXG4gICAgLy8gYWNyb3NzIGZvbnQtZmFtaWxpZXMgY2FuIGNhdXNlIGlzc3VlcyB3aXRoIHRoZSBrZXJuaW5nLlxuICAgIC4uLihmb250RmFtaWx5ID09PSBkZWZhdWx0Rm9udEZhbWlseSA/IHtcbiAgICAgIGxldHRlclNwYWNpbmc6IGAke3JvdW5kKGxldHRlclNwYWNpbmcgLyBzaXplKX1lbWBcbiAgICB9IDoge30pLFxuICAgIC4uLmNhc2luZyxcbiAgICAuLi5hbGxWYXJpYW50c1xuICB9KTtcbiAgY29uc3QgdmFyaWFudHMgPSB7XG4gICAgaDE6IGJ1aWxkVmFyaWFudChmb250V2VpZ2h0TGlnaHQsIDk2LCAxLjE2NywgLTEuNSksXG4gICAgaDI6IGJ1aWxkVmFyaWFudChmb250V2VpZ2h0TGlnaHQsIDYwLCAxLjIsIC0wLjUpLFxuICAgIGgzOiBidWlsZFZhcmlhbnQoZm9udFdlaWdodFJlZ3VsYXIsIDQ4LCAxLjE2NywgMCksXG4gICAgaDQ6IGJ1aWxkVmFyaWFudChmb250V2VpZ2h0UmVndWxhciwgMzQsIDEuMjM1LCAwLjI1KSxcbiAgICBoNTogYnVpbGRWYXJpYW50KGZvbnRXZWlnaHRSZWd1bGFyLCAyNCwgMS4zMzQsIDApLFxuICAgIGg2OiBidWlsZFZhcmlhbnQoZm9udFdlaWdodE1lZGl1bSwgMjAsIDEuNiwgMC4xNSksXG4gICAgc3VidGl0bGUxOiBidWlsZFZhcmlhbnQoZm9udFdlaWdodFJlZ3VsYXIsIDE2LCAxLjc1LCAwLjE1KSxcbiAgICBzdWJ0aXRsZTI6IGJ1aWxkVmFyaWFudChmb250V2VpZ2h0TWVkaXVtLCAxNCwgMS41NywgMC4xKSxcbiAgICBib2R5MTogYnVpbGRWYXJpYW50KGZvbnRXZWlnaHRSZWd1bGFyLCAxNiwgMS41LCAwLjE1KSxcbiAgICBib2R5MjogYnVpbGRWYXJpYW50KGZvbnRXZWlnaHRSZWd1bGFyLCAxNCwgMS40MywgMC4xNSksXG4gICAgYnV0dG9uOiBidWlsZFZhcmlhbnQoZm9udFdlaWdodE1lZGl1bSwgMTQsIDEuNzUsIDAuNCwgY2FzZUFsbENhcHMpLFxuICAgIGNhcHRpb246IGJ1aWxkVmFyaWFudChmb250V2VpZ2h0UmVndWxhciwgMTIsIDEuNjYsIDAuNCksXG4gICAgb3ZlcmxpbmU6IGJ1aWxkVmFyaWFudChmb250V2VpZ2h0UmVndWxhciwgMTIsIDIuNjYsIDEsIGNhc2VBbGxDYXBzKSxcbiAgICAvLyBUT0RPIHY2OiBSZW1vdmUgaGFuZGxpbmcgb2YgJ2luaGVyaXQnIHZhcmlhbnQgZnJvbSB0aGUgdGhlbWUgYXMgaXQgaXMgYWxyZWFkeSBoYW5kbGVkIGluIE1hdGVyaWFsIFVJJ3MgVHlwb2dyYXBoeSBjb21wb25lbnQuIEFsc28sIHJlbWVtYmVyIHRvIHJlbW92ZSB0aGUgYXNzb2NpYXRlZCB0eXBlcy5cbiAgICBpbmhlcml0OiB7XG4gICAgICBmb250RmFtaWx5OiAnaW5oZXJpdCcsXG4gICAgICBmb250V2VpZ2h0OiAnaW5oZXJpdCcsXG4gICAgICBmb250U2l6ZTogJ2luaGVyaXQnLFxuICAgICAgbGluZUhlaWdodDogJ2luaGVyaXQnLFxuICAgICAgbGV0dGVyU3BhY2luZzogJ2luaGVyaXQnXG4gICAgfVxuICB9O1xuICByZXR1cm4gZGVlcG1lcmdlKHtcbiAgICBodG1sRm9udFNpemUsXG4gICAgcHhUb1JlbSxcbiAgICBmb250RmFtaWx5LFxuICAgIGZvbnRTaXplLFxuICAgIGZvbnRXZWlnaHRMaWdodCxcbiAgICBmb250V2VpZ2h0UmVndWxhcixcbiAgICBmb250V2VpZ2h0TWVkaXVtLFxuICAgIGZvbnRXZWlnaHRCb2xkLFxuICAgIC4uLnZhcmlhbnRzXG4gIH0sIG90aGVyLCB7XG4gICAgY2xvbmU6IGZhbHNlIC8vIE5vIG5lZWQgdG8gY2xvbmUgZGVlcFxuICB9KTtcbn0iLCJjb25zdCBzaGFkb3dLZXlVbWJyYU9wYWNpdHkgPSAwLjI7XG5jb25zdCBzaGFkb3dLZXlQZW51bWJyYU9wYWNpdHkgPSAwLjE0O1xuY29uc3Qgc2hhZG93QW1iaWVudFNoYWRvd09wYWNpdHkgPSAwLjEyO1xuZnVuY3Rpb24gY3JlYXRlU2hhZG93KC4uLnB4KSB7XG4gIHJldHVybiBbYCR7cHhbMF19cHggJHtweFsxXX1weCAke3B4WzJdfXB4ICR7cHhbM119cHggcmdiYSgwLDAsMCwke3NoYWRvd0tleVVtYnJhT3BhY2l0eX0pYCwgYCR7cHhbNF19cHggJHtweFs1XX1weCAke3B4WzZdfXB4ICR7cHhbN119cHggcmdiYSgwLDAsMCwke3NoYWRvd0tleVBlbnVtYnJhT3BhY2l0eX0pYCwgYCR7cHhbOF19cHggJHtweFs5XX1weCAke3B4WzEwXX1weCAke3B4WzExXX1weCByZ2JhKDAsMCwwLCR7c2hhZG93QW1iaWVudFNoYWRvd09wYWNpdHl9KWBdLmpvaW4oJywnKTtcbn1cblxuLy8gVmFsdWVzIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hdGVyaWFsLWNvbXBvbmVudHMvbWF0ZXJpYWwtY29tcG9uZW50cy13ZWIvYmxvYi9iZTg3NDdmOTQ1NzQ2NjljYjVlN2FkZDFhN2M1NGZhNDFhODljZWM3L3BhY2thZ2VzL21kYy1lbGV2YXRpb24vX3ZhcmlhYmxlcy5zY3NzXG5jb25zdCBzaGFkb3dzID0gW
1ydub25lJywgY3JlYXRlU2hhZG93KDAsIDIsIDEsIC0xLCAwLCAxLCAxLCAwLCAwLCAxLCAzLCAwKSwgY3JlYXRlU2hhZG93KDAsIDMsIDEsIC0yLCAwLCAyLCAyLCAwLCAwLCAxLCA1LCAwKSwgY3JlYXRlU2hhZG93KDAsIDMsIDMsIC0yLCAwLCAzLCA0LCAwLCAwLCAxLCA4LCAwKSwgY3JlYXRlU2hhZG93KDAsIDIsIDQsIC0xLCAwLCA0LCA1LCAwLCAwLCAxLCAxMCwgMCksIGNyZWF0ZVNoYWRvdygwLCAzLCA1LCAtMSwgMCwgNSwgOCwgMCwgMCwgMSwgMTQsIDApLCBjcmVhdGVTaGFkb3coMCwgMywgNSwgLTEsIDAsIDYsIDEwLCAwLCAwLCAxLCAxOCwgMCksIGNyZWF0ZVNoYWRvdygwLCA0LCA1LCAtMiwgMCwgNywgMTAsIDEsIDAsIDIsIDE2LCAxKSwgY3JlYXRlU2hhZG93KDAsIDUsIDUsIC0zLCAwLCA4LCAxMCwgMSwgMCwgMywgMTQsIDIpLCBjcmVhdGVTaGFkb3coMCwgNSwgNiwgLTMsIDAsIDksIDEyLCAxLCAwLCAzLCAxNiwgMiksIGNyZWF0ZVNoYWRvdygwLCA2LCA2LCAtMywgMCwgMTAsIDE0LCAxLCAwLCA0LCAxOCwgMyksIGNyZWF0ZVNoYWRvdygwLCA2LCA3LCAtNCwgMCwgMTEsIDE1LCAxLCAwLCA0LCAyMCwgMyksIGNyZWF0ZVNoYWRvdygwLCA3LCA4LCAtNCwgMCwgMTIsIDE3LCAyLCAwLCA1LCAyMiwgNCksIGNyZWF0ZVNoYWRvdygwLCA3LCA4LCAtNCwgMCwgMTMsIDE5LCAyLCAwLCA1LCAyNCwgNCksIGNyZWF0ZVNoYWRvdygwLCA3LCA5LCAtNCwgMCwgMTQsIDIxLCAyLCAwLCA1LCAyNiwgNCksIGNyZWF0ZVNoYWRvdygwLCA4LCA5LCAtNSwgMCwgMTUsIDIyLCAyLCAwLCA2LCAyOCwgNSksIGNyZWF0ZVNoYWRvdygwLCA4LCAxMCwgLTUsIDAsIDE2LCAyNCwgMiwgMCwgNiwgMzAsIDUpLCBjcmVhdGVTaGFkb3coMCwgOCwgMTEsIC01LCAwLCAxNywgMjYsIDIsIDAsIDYsIDMyLCA1KSwgY3JlYXRlU2hhZG93KDAsIDksIDExLCAtNSwgMCwgMTgsIDI4LCAyLCAwLCA3LCAzNCwgNiksIGNyZWF0ZVNoYWRvdygwLCA5LCAxMiwgLTYsIDAsIDE5LCAyOSwgMiwgMCwgNywgMzYsIDYpLCBjcmVhdGVTaGFkb3coMCwgMTAsIDEzLCAtNiwgMCwgMjAsIDMxLCAzLCAwLCA4LCAzOCwgNyksIGNyZWF0ZVNoYWRvdygwLCAxMCwgMTMsIC02LCAwLCAyMSwgMzMsIDMsIDAsIDgsIDQwLCA3KSwgY3JlYXRlU2hhZG93KDAsIDEwLCAxNCwgLTYsIDAsIDIyLCAzNSwgMywgMCwgOCwgNDIsIDcpLCBjcmVhdGVTaGFkb3coMCwgMTEsIDE0LCAtNywgMCwgMjMsIDM2LCAzLCAwLCA5LCA0NCwgOCksIGNyZWF0ZVNoYWRvdygwLCAxMSwgMTUsIC03LCAwLCAyNCwgMzgsIDMsIDAsIDksIDQ2LCA4KV07XG5leHBvcnQgZGVmYXVsdCBzaGFkb3dzOyIsIi8vIEZvbGxvdyBodHRwczovL21hdGVyaWFsLmdvb2dsZS5jb20vbW90aW9uL2R1cmF0aW9uLWVhc2luZy5odG1sI2R1cmF0aW9uLWVhc2luZy1uYXR1cmFsLWVhc2luZy1jdXJ2ZXNcbi8vIHRvIGxlYXJuIHRoZSBjb250ZXh0IGluIHdoaWNoIGVhY2ggZWFzaW5nIHNob3VsZCBiZSB1c2VkLlxuZXhwb3J0IGNvbnN0IGVhc2luZyA9IHtcbiAgLy8gVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gZWFzaW5nIGN1cnZlLlxuICBlYXNlSW5PdXQ6ICdjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpJyxcbiAgLy8gT2JqZWN0cyBlbnRlciB0aGUgc2NyZWVuIGF0IGZ1bGwgdmVsb2NpdHkgZnJvbSBvZmYtc2NyZWVuIGFuZFxuICAvLyBzbG93bHkgZGVjZWxlcmF0ZSB0byBhIHJlc3RpbmcgcG9pbnQuXG4gIGVhc2VPdXQ6ICdjdWJpYy1iZXppZXIoMC4wLCAwLCAwLjIsIDEpJyxcbiAgLy8gT2JqZWN0cyBsZWF2ZSB0aGUgc2NyZWVuIGF0IGZ1bGwgdmVsb2NpdHkuIFRoZXkgZG8gbm90IGRlY2VsZXJhdGUgd2hlbiBvZmYtc2NyZWVuLlxuICBlYXNlSW46ICdjdWJpYy1iZXppZXIoMC40LCAwLCAxLCAxKScsXG4gIC8vIFRoZSBzaGFycCBjdXJ2ZSBpcyB1c2VkIGJ5IG9iamVjdHMgdGhhdCBtYXkgcmV0dXJuIHRvIHRoZSBzY3JlZW4gYXQgYW55IHRpbWUuXG4gIHNoYXJwOiAnY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKSdcbn07XG5cbi8vIEZvbGxvdyBodHRwczovL20yLm1hdGVyaWFsLmlvL2d1aWRlbGluZXMvbW90aW9uL2R1cmF0aW9uLWVhc2luZy5odG1sI2R1cmF0aW9uLWVhc2luZy1jb21tb24tZHVyYXRpb25zXG4vLyB0byBsZWFybiB3aGVuIHVzZSB3aGF0IHRpbWluZ1xuZXhwb3J0IGNvbnN0IGR1cmF0aW9uID0ge1xuICBzaG9ydGVzdDogMTUwLFxuICBzaG9ydGVyOiAyMDAsXG4gIHNob3J0OiAyNTAsXG4gIC8vIG1vc3QgYmFzaWMgcmVjb21tZW5kZWQgdGltaW5nXG4gIHN0YW5kYXJkOiAzMDAsXG4gIC8vIHRoaXMgaXMgdG8gYmUgdXNlZCBpbiBjb21wbGV4IGFuaW1hdGlvbnNcbiAgY29tcGxleDogMzc1LFxuICAvLyByZWNvbW1lbmRlZCB3aGVuIHNvbWV0aGluZyBpcyBlbnRlcmluZyBzY3JlZW5cbiAgZW50ZXJpbmdTY3JlZW46IDIyNSxcbiAgLy8gcmVjb21tZW5kZWQgd2hlbiBzb21ldGhpbmcgaXMgbGVhdmluZyBzY3JlZW5cbiAgbGVhdmluZ1NjcmVlbjogMTk1XG59O1xuZnVuY3Rpb24gZm9ybWF0TXMobWlsbGlzZWNvbmRzKSB7XG4gIHJldHVybiBgJHtNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyl9bXNgO1xufVxuZnVuY3Rpb24gZ2V0QXV0b0hlaWdodER1cmF0aW9uKGhlaWdodCkge1xuICBpZiAoIWhlaWdodCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNvbnN0YW50ID0gaGVpZ2h0IC8gMzY7XG5cbiAgLy8gaHR0cHM6Ly93d3cuZGVzbW9zLmNvbS9jYWxjdWxhdG9yL3ZicnAzZ2dxZXRcbiAgcmV0dXJuIE1hdGgubWluKE1hdGgucm91bmQoKDQgKyAxNSAqIGNvbnN0YW50ICoqIDAuMjUgKyBjb25zdGFudCAvIDUpICogMTApLCAzMDAwKTtcbn1cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVRyYW5zaXRpb25zKGlucHV0VHJhbnNpdGlvbnMpIHtcbiAgY29uc3QgbWVyZ2VkRWFzaW5nID0ge1xuICAgIC4uLmVhc2luZyxcbiAgICAuLi5pbnB1dFRyYW5zaXRpb25zLmVhc2luZ1xuICB9O1xuICBjb25zdCBtZXJnZWREdXJhdGlvbiA9IHtcbiAgICAuLi5kdXJhdGlvbixcbiAgICAuLi5pbnB1dFRyYW5zaXRpb25zLmR1cmF0aW9uXG4gIH07XG4gIGNvbnN0IGNyZWF0ZSA9IChwcm9wcyA9IFsnYWxsJ10sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbk9wdGlvbiA9IG1lcmdlZER1cmF0aW9uLnN0YW5kYXJkLFxuICAgICAgZWFzaW5nOiBlYXNpbmdPcHRpb24gPSBtZXJnZWRFYXNpbmcuZWFzZUluT3V0LFxuICAgICAgZGVsYXkgPSAwLFxuICAgICAgLi4ub3RoZXJcbiAgICB9ID0gb3B0aW9ucztcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY29uc3QgaXNTdHJpbmcgPSB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgICAgY29uc3QgaXNOdW1iZXIgPSB2YWx1ZSA9PiAhTnVtYmVyLmlzTmFOKHBhcnNlRmxvYXQodmFsdWUpKTtcbiAgICAgIGlmICghaXNTdHJpbmcocHJvcHMpICYmICFBcnJheS5pc0FycmF
15KHByb3BzKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdNVUk6IEFyZ3VtZW50IFwicHJvcHNcIiBtdXN0IGJlIGEgc3RyaW5nIG9yIEFycmF5LicpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc051bWJlcihkdXJhdGlvbk9wdGlvbikgJiYgIWlzU3RyaW5nKGR1cmF0aW9uT3B0aW9uKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBNVUk6IEFyZ3VtZW50IFwiZHVyYXRpb25cIiBtdXN0IGJlIGEgbnVtYmVyIG9yIGEgc3RyaW5nIGJ1dCBmb3VuZCAke2R1cmF0aW9uT3B0aW9ufS5gKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNTdHJpbmcoZWFzaW5nT3B0aW9uKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdNVUk6IEFyZ3VtZW50IFwiZWFzaW5nXCIgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNOdW1iZXIoZGVsYXkpICYmICFpc1N0cmluZyhkZWxheSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTVVJOiBBcmd1bWVudCBcImRlbGF5XCIgbXVzdCBiZSBhIG51bWJlciBvciBhIHN0cmluZy4nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihbJ01VSTogU2Vjb25nIGFyZ3VtZW50IG9mIHRyYW5zaXRpb24uY3JlYXRlIG11c3QgYmUgYW4gb2JqZWN0LicsIFwiQXJndW1lbnRzIHNob3VsZCBiZSBlaXRoZXIgYGNyZWF0ZSgncHJvcDEnLCBvcHRpb25zKWAgb3IgYGNyZWF0ZShbJ3Byb3AxJywgJ3Byb3AyJ10sIG9wdGlvbnMpYFwiXS5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgICBpZiAoT2JqZWN0LmtleXMob3RoZXIpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBNVUk6IFVucmVjb2duaXplZCBhcmd1bWVudChzKSBbJHtPYmplY3Qua2V5cyhvdGhlcikuam9pbignLCcpfV0uYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoQXJyYXkuaXNBcnJheShwcm9wcykgPyBwcm9wcyA6IFtwcm9wc10pLm1hcChhbmltYXRlZFByb3AgPT4gYCR7YW5pbWF0ZWRQcm9wfSAke3R5cGVvZiBkdXJhdGlvbk9wdGlvbiA9PT0gJ3N0cmluZycgPyBkdXJhdGlvbk9wdGlvbiA6IGZvcm1hdE1zKGR1cmF0aW9uT3B0aW9uKX0gJHtlYXNpbmdPcHRpb259ICR7dHlwZW9mIGRlbGF5ID09PSAnc3RyaW5nJyA/IGRlbGF5IDogZm9ybWF0TXMoZGVsYXkpfWApLmpvaW4oJywnKTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBnZXRBdXRvSGVpZ2h0RHVyYXRpb24sXG4gICAgY3JlYXRlLFxuICAgIC4uLmlucHV0VHJhbnNpdGlvbnMsXG4gICAgZWFzaW5nOiBtZXJnZWRFYXNpbmcsXG4gICAgZHVyYXRpb246IG1lcmdlZER1cmF0aW9uXG4gIH07XG59IiwiLy8gV2UgbmVlZCB0byBjZW50cmFsaXplIHRoZSB6SW5kZXggZGVmaW5pdGlvbnMgYXMgdGhleSB3b3JrXG4vLyBsaWtlIGdsb2JhbCB2YWx1ZXMgaW4gdGhlIGJyb3dzZXIuXG5jb25zdCB6SW5kZXggPSB7XG4gIG1vYmlsZVN0ZXBwZXI6IDEwMDAsXG4gIGZhYjogMTA1MCxcbiAgc3BlZWREaWFsOiAxMDUwLFxuICBhcHBCYXI6IDExMDAsXG4gIGRyYXdlcjogMTIwMCxcbiAgbW9kYWw6IDEzMDAsXG4gIHNuYWNrYmFyOiAxNDAwLFxuICB0b29sdGlwOiAxNTAwXG59O1xuZXhwb3J0IGRlZmF1bHQgekluZGV4OyIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9wcmVmZXItZGVmYXVsdC1leHBvcnQgKi9cbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tICdAbXVpL3V0aWxzL2RlZXBtZXJnZSc7XG5mdW5jdGlvbiBpc1NlcmlhbGl6YWJsZSh2YWwpIHtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsKSB8fCB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicgfHwgQXJyYXkuaXNBcnJheSh2YWwpO1xufVxuXG4vKipcbiAqIGBiYXNlVGhlbWVgIHVzdWFsbHkgY29tZXMgZnJvbSBgY3JlYXRlVGhlbWUoKWAgb3IgYGV4dGVuZFRoZW1lKClgLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHplcm8tcnVudGltZSBDU1MtaW4tSlMgbGlrZSBQaWdtZW50IENTU1xuICogRm9yIGV4YW1wbGUsIGluIGEgTmV4dC5qcyBwcm9qZWN0OlxuICpcbiAqIGBgYGpzXG4gKiAvLyBuZXh0LmNvbmZpZy5qc1xuICogY29uc3QgeyBleHRlbmRUaGVtZSB9ID0gcmVxdWlyZSgnQG11aS9tYXRlcmlhbC9zdHlsZXMnKTtcbiAqXG4gKiBjb25zdCB0aGVtZSA9IGV4dGVuZFRoZW1lKCk7XG4gKiAvLyBgLnRvUnVudGltZVNvdXJjZWAgaXMgUGlnbWVudCBDU1Mgc3BlY2lmaWMgdG8gY3JlYXRlIGEgdGhlbWUgdGhhdCBpcyBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAqIHRoZW1lLnRvUnVudGltZVNvdXJjZSA9IHN0cmluZ2lmeVRoZW1lO1xuICpcbiAqIG1vZHVsZS5leHBvcnRzID0gd2l0aFBpZ21lbnQoe1xuICogIHRoZW1lLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVRoZW1lKGJhc2VUaGVtZSA9IHt9KSB7XG4gIGNvbnN0IHNlcmlhbGl6YWJsZVRoZW1lID0ge1xuICAgIC4uLmJhc2VUaGVtZVxuICB9O1xuICBmdW5jdGlvbiBzZXJpYWxpemVUaGVtZShvYmplY3QpIHtcbiAgICBjb25zdCBhcnJheSA9IE9iamVjdC5lbnRyaWVzKG9iamVjdCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKCFpc1NlcmlhbGl6YWJsZSh2YWx1ZSkgfHwga2V5LnN0YXJ0c1dpdGgoJ3Vuc3RhYmxlXycpKSB7XG4gICAgICAgIGRlbGV0ZSBvYmplY3Rba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSB7XG4gICAgICAgICAgLi4udmFsdWVcbiAgICAgICAgfTtcbiAgICAgICAgc2VyaWFsaXplVGhlbWUob2JqZWN0W2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBzZXJpYWxpemVUaGVtZShzZXJpYWxpemFibGVUaGVtZSk7XG4gIHJldHVybi
1BgaW1wb3J0IHsgdW5zdGFibGVfY3JlYXRlQnJlYWtwb2ludHMgYXMgY3JlYXRlQnJlYWtwb2ludHMsIGNyZWF0ZVRyYW5zaXRpb25zIH0gZnJvbSAnQG11aS9tYXRlcmlhbC9zdHlsZXMnO1xuXG5jb25zdCB0aGVtZSA9ICR7SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXphYmxlVGhlbWUsIG51bGwsIDIpfTtcblxudGhlbWUuYnJlYWtwb2ludHMgPSBjcmVhdGVCcmVha3BvaW50cyh0aGVtZS5icmVha3BvaW50cyB8fCB7fSk7XG50aGVtZS50cmFuc2l0aW9ucyA9IGNyZWF0ZVRyYW5zaXRpb25zKHRoZW1lLnRyYW5zaXRpb25zIHx8IHt9KTtcblxuZXhwb3J0IGRlZmF1bHQgdGhlbWU7YDtcbn0iLCJpbXBvcnQgX2Zvcm1hdEVycm9yTWVzc2FnZSBmcm9tIFwiQG11aS91dGlscy9mb3JtYXRNdWlFcnJvck1lc3NhZ2VcIjtcbmltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnQG11aS91dGlscy9kZWVwbWVyZ2UnO1xuaW1wb3J0IHN0eWxlRnVuY3Rpb25TeCwgeyB1bnN0YWJsZV9kZWZhdWx0U3hDb25maWcgYXMgZGVmYXVsdFN4Q29uZmlnIH0gZnJvbSAnQG11aS9zeXN0ZW0vc3R5bGVGdW5jdGlvblN4JztcbmltcG9ydCBzeXN0ZW1DcmVhdGVUaGVtZSBmcm9tICdAbXVpL3N5c3RlbS9jcmVhdGVUaGVtZSc7XG5pbXBvcnQgeyBhbHBoYSBhcyBzeXN0ZW1BbHBoYSwgbGlnaHRlbiBhcyBzeXN0ZW1MaWdodGVuLCBkYXJrZW4gYXMgc3lzdGVtRGFya2VuIH0gZnJvbSAnQG11aS9zeXN0ZW0vY29sb3JNYW5pcHVsYXRvcic7XG5pbXBvcnQgZ2VuZXJhdGVVdGlsaXR5Q2xhc3MgZnJvbSAnQG11aS91dGlscy9nZW5lcmF0ZVV0aWxpdHlDbGFzcyc7XG5pbXBvcnQgY3JlYXRlTWl4aW5zIGZyb20gXCIuL2NyZWF0ZU1peGlucy5qc1wiO1xuaW1wb3J0IGNyZWF0ZVBhbGV0dGUgZnJvbSBcIi4vY3JlYXRlUGFsZXR0ZS5qc1wiO1xuaW1wb3J0IGNyZWF0ZVR5cG9ncmFwaHkgZnJvbSBcIi4vY3JlYXRlVHlwb2dyYXBoeS5qc1wiO1xuaW1wb3J0IHNoYWRvd3MgZnJvbSBcIi4vc2hhZG93cy5qc1wiO1xuaW1wb3J0IGNyZWF0ZVRyYW5zaXRpb25zIGZyb20gXCIuL2NyZWF0ZVRyYW5zaXRpb25zLmpzXCI7XG5pbXBvcnQgekluZGV4IGZyb20gXCIuL3pJbmRleC5qc1wiO1xuaW1wb3J0IHsgc3RyaW5naWZ5VGhlbWUgfSBmcm9tIFwiLi9zdHJpbmdpZnlUaGVtZS5qc1wiO1xuZnVuY3Rpb24gY29lZmZpY2llbnRUb1BlcmNlbnRhZ2UoY29lZmZpY2llbnQpIHtcbiAgaWYgKHR5cGVvZiBjb2VmZmljaWVudCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gYCR7KGNvZWZmaWNpZW50ICogMTAwKS50b0ZpeGVkKDApfSVgO1xuICB9XG4gIHJldHVybiBgY2FsYygoJHtjb2VmZmljaWVudH0pICogMTAwJSlgO1xufVxuXG4vLyBUaGlzIGNhbiBiZSByZW1vdmVkIHdoZW4gbW92ZWQgdG8gYGNvbG9yLW1peCgpYCBlbnRpcmVseS5cbmNvbnN0IHBhcnNlQWRkaXRpb24gPSBzdHIgPT4ge1xuICBpZiAoIU51bWJlci5pc05hTigrc3RyKSkge1xuICAgIHJldHVybiArc3RyO1xuICB9XG4gIGNvbnN0IG51bWJlcnMgPSBzdHIubWF0Y2goL1xcZCpcXC4/XFxkKy9nKTtcbiAgaWYgKCFudW1iZXJzKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHN1bSArPSArbnVtYmVyc1tpXTtcbiAgfVxuICByZXR1cm4gc3VtO1xufTtcbmZ1bmN0aW9uIGF0dGFjaENvbG9yTWFuaXB1bGF0b3JzKHRoZW1lKSB7XG4gIE9iamVjdC5hc3NpZ24odGhlbWUsIHtcbiAgICBhbHBoYShjb2xvciwgY29lZmZpY2llbnQpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMgfHwgdGhlbWU7XG4gICAgICBpZiAob2JqLmNvbG9yU3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIGBva2xjaChmcm9tICR7Y29sb3J9IGwgYyBoIC8gJHt0eXBlb2YgY29lZmZpY2llbnQgPT09ICdzdHJpbmcnID8gYGNhbGMoJHtjb2VmZmljaWVudH0pYCA6IGNvZWZmaWNpZW50fSlgO1xuICAgICAgfVxuICAgICAgaWYgKG9iai52YXJzKSB7XG4gICAgICAgIC8vIFRvIHByZXNlcnZlIHRoZSBiZWhhdmlvciBvZiB0aGUgQ1NTIHRoZW1lIHZhcmlhYmxlc1xuICAgICAgICAvLyBJbiB0aGUgZnV0dXJlLCB0aGlzIGNvdWxkIGJlIHJlcGxhY2VkIGJ5IGBjb2xvci1taXhgICh3aGVuIGh0dHBzOi8vY2FuaXVzZS5jb20vP3NlYXJjaD1jb2xvci1taXggcmVhY2hlcyA5NSUpLlxuICAgICAgICByZXR1cm4gYHJnYmEoJHtjb2xvci5yZXBsYWNlKC92YXJcXCgtLShbXixcXHMpXSspKD86LFteKV0rKT9cXCkrL2csICd2YXIoLS0kMUNoYW5uZWwpJyl9IC8gJHt0eXBlb2YgY29lZmZpY2llbnQgPT09ICdzdHJpbmcnID8gYGNhbGMoJHtjb2VmZmljaWVudH0pYCA6IGNvZWZmaWNpZW50fSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN5c3RlbUFscGhhKGNvbG9yLCBwYXJzZUFkZGl0aW9uKGNvZWZmaWNpZW50KSk7XG4gICAgfSxcbiAgICBsaWdodGVuKGNvbG9yLCBjb2VmZmljaWVudCkge1xuICAgICAgY29uc3Qgb2JqID0gdGhpcyB8fCB0aG
1VtZTtcbiAgICAgIGlmIChvYmouY29sb3JTcGFjZSkge1xuICAgICAgICByZXR1cm4gYGNvbG9yLW1peChpbiAke29iai5jb2xvclNwYWNlfSwgJHtjb2xvcn0sICNmZmYgJHtjb2VmZmljaWVudFRvUGVyY2VudGFnZShjb2VmZmljaWVudCl9KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3lzdGVtTGlnaHRlbihjb2xvciwgY29lZmZpY2llbnQpO1xuICAgIH0sXG4gICAgZGFya2VuKGNvbG9yLCBjb2VmZmljaWVudCkge1xuICAgICAgY29uc3Qgb2JqID0gdGhpcyB8fCB0aGVtZTtcbiAgICAgIGlmIChvYmouY29sb3JTcGFjZSkge1xuICAgICAgICByZXR1cm4gYGNvbG9yLW1peChpbiAke29iai5jb2xvclNwYWNlfSwgJHtjb2xvcn0sICMwMDAgJHtjb2VmZmljaWVudFRvUGVyY2VudGFnZShjb2VmZmljaWVudCl9KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3lzdGVtRGFya2VuKGNvbG9yLCBjb2VmZmljaWVudCk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRoZW1lTm9WYXJzKG9wdGlvbnMgPSB7fSwgLi4uYXJncykge1xuICBjb25zdCB7XG4gICAgYnJlYWtwb2ludHM6IGJyZWFrcG9pbnRzSW5wdXQsXG4gICAgbWl4aW5zOiBtaXhpbnNJbnB1dCA9IHt9LFxuICAgIHNwYWNpbmc6IHNwYWNpbmdJbnB1dCxcbiAgICBwYWxldHRlOiBwYWxldHRlSW5wdXQgPSB7fSxcbiAgICB0cmFuc2l0aW9uczogdHJhbnNpdGlvbnNJbnB1dCA9IHt9LFxuICAgIHR5cG9ncmFwaHk6IHR5cG9ncmFwaHlJbnB1dCA9IHt9LFxuICAgIHNoYXBlOiBzaGFwZUlucHV0LFxuICAgIGNvbG9yU3BhY2UsXG4gICAgLi4ub3RoZXJcbiAgfSA9IG9wdGlvbnM7XG4gIGlmIChvcHRpb25zLnZhcnMgJiZcbiAgLy8gVGhlIGVycm9yIHNob3VsZCB0aHJvdyBvbmx5IGZvciB0aGUgcm9vdCB0aGVtZSBjcmVhdGlvbiBiZWNhdXNlIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gdXNlIGEgY3VzdG9tIG5vZGUgYHZhcnNgLlxuICAvLyBgZ2VuZXJhdGVUaGVtZVZhcnNgIGlzIHRoZSBjbG9zZXN0IGlkZW50aWZpZXIgZm9yIGNoZWNraW5nIHRoYXQgdGhlIGBvcHRpb25zYCBpcyBhIHJlc3VsdCBvZiBgY3JlYXRlVGhlbWVgIHdpdGggQ1NTIHZhcmlhYmxlcyBzbyB0aGF0IHVzZXIgY2FuIGNyZWF0ZSBuZXcgdGhlbWUgZm9yIG5lc3RlZCBUaGVtZVByb3ZpZGVyLlxuICBvcHRpb25zLmdlbmVyYXRlVGhlbWVWYXJzID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gJ01VSTogYHZhcnNgIGlzIGEgcHJpdmF0ZSBmaWVsZCB1c2VkIGZvciBDU1MgdmFyaWFibGVzIHN1cHBvcnQuXFxuJyArXG4gICAgLy8gI2hvc3QtcmVmZXJlbmNlXG4gICAgJ1BsZWFzZSB1c2UgYW5vdGhlciBuYW1lIG9yIGZvbGxvdyB0aGUgW2RvY3NdKGh0dHBzOi8vbXVpLmNvbS9tYXRlcmlhbC11aS9jdXN0b21pemF0aW9uL2Nzcy10aGVtZS12YXJpYWJsZXMvdXNhZ2UvKSB0byBlbmFibGUgdGhlIGZlYXR1cmUuJyA6IF9mb3JtYXRFcnJvck1lc3NhZ2UoMjApKTtcbiAgfVxuICBjb25zdCBwYWxldHRlID0gY3JlYXRlUGFsZXR0ZSh7XG4gICAgLi4ucGFsZXR0ZUlucHV0LFxuICAgIGNvbG9yU3BhY2VcbiAgfSk7XG4gIGNvbnN0IHN5c3RlbVRoZW1lID0gc3lzdGVtQ3JlYXRlVGhlbWUob3B0aW9ucyk7XG4gIGxldCBtdWlUaGVtZSA9IGRlZXBtZXJnZShzeXN0ZW1UaGVtZSwge1xuICAgIG1peGluczogY3JlYXRlTWl4aW5zKHN5c3RlbVRoZW1lLmJyZWFrcG9pbnRzLCBtaXhpbnNJbnB1dCksXG4gICAgcGFsZXR0ZSxcbiAgICAvLyBEb24ndCB1c2UgWy4uLnNoYWRvd3NdIHVudGlsIHlvdSd2ZSB2ZXJpZmllZCBpdHMgdHJhbnNwaWxlZCBjb2RlIGlzIG5vdCBpbnZva2luZyB0aGUgaXRlcmF0b3IgcHJvdG9jb2wuXG4gICAgc2hhZG93czogc2hhZG93cy5zbGljZSgpLFxuICAgIHR5cG9ncmFwaHk6IGNyZWF0ZVR5cG9ncmFwaHkocGFsZXR0ZSwgdHlwb2dyYXBoeUlucHV0KSxcbiAgICB0cmFuc2l0aW9uczogY3JlYXRlVHJhbnNpdGlvbnModHJhbnNpdGlvbnNJbnB1dCksXG4gICAgekluZGV4OiB7XG4gICAgICAuLi56SW5kZXhcbiAgICB9XG4gIH0pO1xuICBtdWlUaGVtZSA9IGRlZXBtZXJnZShtdWlUaGVtZSwgb3RoZXIpO1xuICBtdWlUaGVtZSA9IGFyZ3MucmVkdWNlKChhY2MsIGFyZ3VtZW50KSA9PiBkZWVwbWVyZ2UoYWNjLCBhcmd1bWVudCksIG11aVRoZW1lKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBUT0RPIHY2OiBSZWZhY3RvciB0byB1c2UgZ2xvYmFsU3RhdGVDbGFzc2VzTWFwcGluZyBmcm9tIEBtdWkvdXRpbHMgb25jZSBgcmVhZE9ubHlgIHN0YXRlIGNsYXNzIGlzIHVzZWQgaW4gUmF0aW5nIGNvbXBvbmVudC5cbiAgICBjb25zdCBzdGF0ZUNsYXNzZXMgPSBbJ2FjdGl2ZScsICdjaGVja2VkJywgJ2NvbXBsZXRlZCcsICdkaXNhYmxlZCcsICdlcnJvcicsICdleHBhbmRlZCcsICdmb2N1c2VkJywgJ2ZvY3VzVmlzaWJsZScsICdyZXF1aXJlZCcsICdzZWxlY3RlZCddO1xuICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGUsIGNvbXBvbmVudCkgPT4ge1xuICAgICAgbGV0IGtleTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pblxuICAgICAgZm9yIChrZXkgaW4gbm9kZSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG5vZGVba2V5XTtcbiAgICAgICAgaWYgKHN0YXRlQ2xhc3Nlcy5pbmNsdWRlcyhrZXkpICYmIE9iamVjdC5rZXlzKGNoaWxkKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlQ2xhc3MgPSBnZW5lcmF0ZVV0aWxpdHlDbGFzcygnJywga2V5KTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoW2BNVUk6IFRoZSBcXGAke2NvbXBvbmVudH1cXGAgY29tcG9uZW50IGluY3JlYXNlcyBgICsgYHRoZSBDU1Mgc3BlY2lmaWNpdHkgb2YgdGhlIFxcYCR7a2V5fVxcYCBpbnRlcm5hbCBzdGF0ZS5gLCAnWW91IGNhbiBub3Qgb3ZlcnJpZGUgaXQgbGlrZSB0aGlzOiAnLCBKU09OLnN0cmluZ2lmeShub2Rl
1LCBudWxsLCAyKSwgJycsIGBJbnN0ZWFkLCB5b3UgbmVlZCB0byB1c2UgdGhlICcmLiR7c3RhdGVDbGFzc30nIHN5bnRheDpgLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHJvb3Q6IHtcbiAgICAgICAgICAgICAgICBbYCYuJHtzdGF0ZUNsYXNzfWBdOiBjaGlsZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBudWxsLCAyKSwgJycsICdodHRwczovL211aS5jb20vci9zdGF0ZS1jbGFzc2VzLWd1aWRlJ10uam9pbignXFxuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBSZW1vdmUgdGhlIHN0eWxlIHRvIHByZXZlbnQgZ2xvYmFsIGNvbmZsaWN0cy5cbiAgICAgICAgICBub2RlW2tleV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgT2JqZWN0LmtleXMobXVpVGhlbWUuY29tcG9uZW50cykuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgY29uc3Qgc3R5bGVPdmVycmlkZXMgPSBtdWlUaGVtZS5jb21wb25lbnRzW2NvbXBvbmVudF0uc3R5bGVPdmVycmlkZXM7XG4gICAgICBpZiAoc3R5bGVPdmVycmlkZXMgJiYgY29tcG9uZW50LnN0YXJ0c1dpdGgoJ011aScpKSB7XG4gICAgICAgIHRyYXZlcnNlKHN0eWxlT3ZlcnJpZGVzLCBjb21wb25lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG11aVRoZW1lLnVuc3RhYmxlX3N4Q29uZmlnID0ge1xuICAgIC4uLmRlZmF1bHRTeENvbmZpZyxcbiAgICAuLi5vdGhlcj8udW5zdGFibGVfc3hDb25maWdcbiAgfTtcbiAgbXVpVGhlbWUudW5zdGFibGVfc3ggPSBmdW5jdGlvbiBzeChwcm9wcykge1xuICAgIHJldHVybiBzdHlsZUZ1bmN0aW9uU3goe1xuICAgICAgc3g6IHByb3BzLFxuICAgICAgdGhlbWU6IHRoaXNcbiAgICB9KTtcbiAgfTtcbiAgbXVpVGhlbWUudG9SdW50aW1lU291cmNlID0gc3RyaW5naWZ5VGhlbWU7IC8vIGZvciBQaWdtZW50IENTUyBpbnRlZ3JhdGlvblxuXG4gIGF0dGFjaENvbG9yTWFuaXB1bGF0b3JzKG11aVRoZW1lKTtcbiAgcmV0dXJuIG11aVRoZW1lO1xufVxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlVGhlbWVOb1ZhcnM7IiwiLy8gSW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL21hdGVyaWFsLWNvbXBvbmVudHMvbWF0ZXJpYWwtY29tcG9uZW50cy1pb3MvYmxvYi9iY2EzNjEwNzQwNTU5NGQ1YjdiMTYyNjVhNWIwZWQ2OThmODVhNWVlL2NvbXBvbmVudHMvRWxldmF0aW9uL3NyYy9VSUNvbG9yJTJCTWF0ZXJpYWxFbGV2YXRpb24ubSNMNjFcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE92ZXJsYXlBbHBoYShlbGV2YXRpb24pIHtcbiAgbGV0IGFscGhhVmFsdWU7XG4gIGlmIChlbGV2YXRpb24gPCAxKSB7XG4gICAgYWxwaGFWYWx1ZSA9IDUuMTE5MTYgKiBlbGV2YXRpb24gKiogMjtcbiAgfSBlbHNlIHtcbiAgICBhbHBoYVZhbHVlID0gNC41ICogTWF0aC5sb2coZWxldmF0aW9uICsgMSkgKyAyO1xuICB9XG4gIHJldHVybiBNYXRoLnJvdW5kKGFscGhhVmFsdWUgKiAxMCkgLyAxMDAwO1xufSIsImltcG9ydCBjcmVhdGVQYWxldHRlIGZyb20gXCIuL2NyZWF0ZVBhbGV0dGUuanNcIjtcbmltcG9ydCBnZXRPdmVybGF5QWxwaGEgZnJvbSBcIi4vZ2V0T3ZlcmxheUFscGhhLmpzXCI7XG5jb25zdCBkZWZhdWx0RGFya092ZXJsYXlzID0gWy4uLkFycmF5KDI1KV0ubWFwKChfLCBpbmRleCkgPT4ge1xuICBpZiAoaW5kZXggPT09IDApIHtcbiAgICByZXR1cm4gJ25vbmUnO1xuICB9XG4gIGNvbnN0IG92ZXJsYXkgPSBnZXRPdmVybGF5QWxwaGEoaW5kZXgpO1xuICByZXR1cm4gYGxpbmVhci1ncmFkaWVudChyZ2JhKDI1NSAyNTUgMjU1IC8gJHtvdmVybGF5fSksIHJnYmEoMjU1IDI1NSAyNTUgLyAke292ZXJsYXl9KSlgO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BhY2l0eShtb2RlKSB7XG4gIHJldHVybiB7XG4gICAgaW5wdXRQbGFjZWhvbGRlcjogbW9kZSA9PT0gJ2RhcmsnID8gMC41IDogMC40MixcbiAgICBpbnB1dFVuZGVybGluZTogbW9kZSA9PT0gJ2RhcmsnID8gMC43IDogMC40MixcbiAgICBzd2l0Y2hUcmFja0Rpc2FibGVkOiBtb2RlID09PSAnZGFyaycgPyAwLjIgOiAwLjEyLFxuICAgIHN3aXRjaFRyYWNrOiBtb2RlID09PSAnZGFyaycgPyAwLjMgOiAwLjM4XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0T3ZlcmxheXMobW9kZSkge1xuICByZXR1cm4gbW9kZSA9PT0gJ2RhcmsnID8gZGVmYXVsdERhcmtPdmVybGF5cyA6IFtdO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlQ29sb3JTY2hlbWUob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgcGFsZXR0ZTogcGFsZXR0ZUlucHV0ID0ge1xuICAgICAgbW9kZTogJ2xpZ2h0J1xuICAgIH0sXG4gICAgLy8gbmVlZCB0byBjYXN0IHRvIGF2b2lkIG1vZHVsZSBhdWdtZW50YXRpb24gdGVzdFxuICAgIG9wYWNpdHksXG4gICAgb3ZlcmxheXMsXG4gICAgY29sb3JTcGFjZSxcbiAgICAuLi5vdGhlclxuICB9ID0gb3B0aW9ucztcbiAgLy8gbmVlZCB0byBjYXN0IGJlY2F1c2UgYGNvbG9yU3BhY2VgIGlzIGNvbnNpZGVyZWQgaW50ZXJuYWwgYXQgdGhlIG1vbWVudC5cbiAgY29uc3QgcGFsZXR0ZSA9IGNyZWF0ZVBhbGV0dGUoe1xuICAgIC4uLnBhbGV0dGVJbnB1dCxcbiAgICBjb2xvclNwYWNlXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIHBhbGV0dGUsXG4gICAgb3BhY2l0eToge1xuICAgICAgLi4uZ2V0T3BhY2l0eShwYWxldHRlLm1vZGUpLFxuICAgICAgLi4ub3BhY2l0eVxuICAgIH0sXG4gICAgb3ZlcmxheXM6IG92ZXJsYXlzIHx8IGdldE92ZXJsYXlzKHBhbGV0dGUubW9kZSksXG4gICAgLi4ub3RoZXJcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaG91bGRTa2lwR2VuZXJhdGluZ1ZhcihrZXlzKSB7XG4gIHJldHVybiAhIWtleXNbMF0ubWF0Y2goLyhjc3NWYXJQcmVmaXh8Y29sb3JTY2hlbWVTZWxlY3Rvcnxtb2R1bGFyQ3NzTGF5ZXJzfHJvb3RTZWxlY3Rvcnx0eXBvZ3JhcGh5fG1peGluc3xicmVha3BvaW50c3xkaXJlY3Rpb258dHJhbnNpdGlvbnMpLykgfHwgISFrZXlzWzBdLm1hdGNoKC9zeENvbmZpZyQvKSB8fFxuICAvLyBlbmRzIHdpdGggc3hDb25maWdcbiAga2V5c1swXSA9PT0gJ3BhbGV0dGUnICYmICEha2V5c1sxXT8ubWF0Y2goLyhtb2RlfGNvbnRyYXN0VGhyZXNob2xkfHRvbmFsT2Zmc2V0KS8pO1xufSIsIi8qKlxuICogQGludGVybmFsIFRoZXNlIHZhcmlhYmxlcyBzaG91bGQgbm90IGFwcGVhciBpbiB0aGUgOnJvb3Qgc3R5bGVzaGVldCB3aGVuIHRoZSBgZGVmYXVsdENvbG9yU2NoZW1lPVwiZGFya1wiYFxuICovXG5jb25zdCBleGNsdWRlVmFyaWFibGVzRnJvbVJvb3QgPSBjc3NWYXJQcmVmaXggPT4gWy4uLlsuLi5BcnJheSgyNSldLm1hcCgoXywgaW5kZXgpID0+IGAtLSR7Y3NzVmFyUHJlZml4ID8gYCR7Y3NzVmFyUHJlZml4fS1gIDogJyd9b3ZlcmxheXMtJHtpbmRleH1gKSwgYC0tJHtjc3NWYXJQcmVmaXggPyBgJHtjc3NWYXJQcmVmaXh9LWAgOiAnJ31wYWxldHRlLUFwcEJhci1kYXJrQmdgLCBgLS0ke2Nzc1ZhclByZWZpeCA/IGAke2Nzc1ZhclByZWZpeH0tYCA6ICcnfXBhbGV0dGUtQXBwQmFyLWRhcmtDb2xvcmBdO1xuZXhwb3J0IGRlZmF1bHQgZXhjbHVkZVZhcmlhYmxlc0Zyb21Sb290OyIsImltcG9ydCBleGNsdWRlVmFyaWFibGVzRnJvbVJvb3QgZnJvbSBcIi4vZXhjbHVkZVZhcmlhYmxlc0Zyb21Sb290LmpzXCI7XG5leHBvcnQgZGVmYXVsdCB0aGVtZSA9PiAoY29sb3JTY2hlbWUsIGNzcykgPT4ge1xuICBjb25zdCByb290ID0gdGhlbWUucm9vdFNlbGVjdG9yIHx8ICc6cm9vdCc7XG4gIGNvbnN0IHNlbGVjdG9yID0gdGhlbWUuY29sb3JTY2hlbWVTZWxlY3RvcjtcbiAgbGV0IHJ1bGUgPSBzZWxlY3RvcjtcbiAgaWYgKHNlbGVjdG9yID09PSAnY2xhc3MnKSB7XG4gICAgcnVsZSA9ICcuJXMnO1xuICB9XG4gIGlmIChzZWxlY3RvciA9PT0gJ2RhdGEnKSB7XG4gICAgcnVsZSA9ICdbZGF0YS0lc10nO1xuICB9XG4gIGlmIChzZWxlY3Rvcj8uc3RhcnRzV2l0aCgnZGF0YS0nKSAmJiAhc2VsZWN0b3IuaW5jbHVkZXMoJyVzJykpIHtcbiAgICAvLyAnZGF0YS1tdWktY29sb3Itc2NoZW1lJyAtPiAnW2RhdGEtbXVpLWNvbG9yLXNjaGVtZT1cIiVzXCJdJ1xuICAgIHJ1bGUgPSBgWy
1R7c2VsZWN0b3J9PVwiJXNcIl1gO1xuICB9XG4gIGlmICh0aGVtZS5kZWZhdWx0Q29sb3JTY2hlbWUgPT09IGNvbG9yU2NoZW1lKSB7XG4gICAgaWYgKGNvbG9yU2NoZW1lID09PSAnZGFyaycpIHtcbiAgICAgIGNvbnN0IGV4Y2x1ZGVkVmFyaWFibGVzID0ge307XG4gICAgICBleGNsdWRlVmFyaWFibGVzRnJvbVJvb3QodGhlbWUuY3NzVmFyUHJlZml4KS5mb3JFYWNoKGNzc1ZhciA9PiB7XG4gICAgICAgIGV4Y2x1ZGVkVmFyaWFibGVzW2Nzc1Zhcl0gPSBjc3NbY3NzVmFyXTtcbiAgICAgICAgZGVsZXRlIGNzc1tjc3NWYXJdO1xuICAgICAgfSk7XG4gICAgICBpZiAocnVsZSA9PT0gJ21lZGlhJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtyb290XTogY3NzLFxuICAgICAgICAgIFtgQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaylgXToge1xuICAgICAgICAgICAgW3Jvb3RdOiBleGNsdWRlZFZhcmlhYmxlc1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChydWxlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW3J1bGUucmVwbGFjZSgnJXMnLCBjb2xvclNjaGVtZSldOiBleGNsdWRlZFZhcmlhYmxlcyxcbiAgICAgICAgICBbYCR7cm9vdH0sICR7cnVsZS5yZXBsYWNlKCclcycsIGNvbG9yU2NoZW1lKX1gXTogY3NzXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbcm9vdF06IHtcbiAgICAgICAgICAuLi5jc3MsXG4gICAgICAgICAgLi4uZXhjbHVkZWRWYXJpYWJsZXNcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHJ1bGUgJiYgcnVsZSAhPT0gJ21lZGlhJykge1xuICAgICAgcmV0dXJuIGAke3Jvb3R9LCAke3J1bGUucmVwbGFjZSgnJXMnLCBTd
1HJpbmcoY29sb3JTY2hlbWUpKX1gO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb2xvclNjaGVtZSkge1xuICAgIGlmIChydWxlID09PSAnbWVkaWEnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbYEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6ICR7U3RyaW5nKGNvbG9yU2NoZW1lKX0pYF06IHtcbiAgICAgICAgICBbcm9vdF06IGNzc1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocnVsZSkge1xuICAgICAgcmV0dXJuIHJ1bGUucmVwbGFjZSgnJXMnLCBTdHJpbmcoY29sb3JTY2hlbWUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJvb3Q7XG59OyIsImltcG9ydCBfZm9ybWF0RXJyb3JNZXNzYWdlIGZyb20gXCJAbXVpL3V0aWxzL2Zvcm1hdE11aUVycm9yTWVzc2FnZVwiO1xuaW1wb3J0IGRlZXBtZXJnZSBmcm9tICdAbXVpL3V0aWxzL2RlZXBtZXJnZSc7XG5pbXBvcnQgeyB1bnN0YWJsZV9jcmVhdGVHZXRDc3NWYXIgYXMgc3lzdGVtQ3JlYXRlR2V0Q3NzVmFyLCBjcmVhdGVTcGFjaW5nIH0gZnJvbSAnQG11aS9zeXN0ZW0nO1xuaW1wb3J0IHsgY3JlYXRlVW5hcnlTcGFjaW5nIH0gZnJvbSAnQG11aS9zeXN0ZW0vc3BhY2luZyc7XG5pbXBvcnQgeyBwcmVwYXJlQ3NzVmFycywgcHJlcGFyZVR5cG9ncmFwaHlWYXJzLCBjcmVhdGVHZXRDb2xvclNjaGVtZVNlbGVjdG9yIH0gZnJvbSAnQG11aS9zeXN0ZW0vY3NzVmFycyc7XG5pbXBvcnQgc3R5bGVGdW5jdGlvblN4LCB7IHVuc3RhYmxlX2RlZmF1bHRTeENvbmZpZyBhcyBkZWZhdWx0U3hDb25maWcgfSBmcm9tICdAbXVpL3N5c3RlbS9zdHlsZUZ1bmN0aW9uU3gnO1xuaW1wb3J0IHsgcHJpdmF0ZV9zYWZlQ29sb3JDaGFubmVsIGFzIHNhZmVDb2xvckNoYW5uZWwsIHByaXZhdGVfc2FmZUFscGhhIGFzIHNhZmVBbHBoYSwgcHJpdmF0ZV9zYWZlRGFya2VuIGFzIHNhZmVEYXJrZW4sIHByaXZhdGVfc2FmZUxpZ2h0ZW4gYXMgc2FmZUxpZ2h0ZW4sIHByaXZhdGVfc2FmZUVtcGhhc2l6ZSBhcyBzYWZlRW1waGFzaXplLCBoc2xUb1JnYiB9IGZyb20gJ0BtdWkvc3lzdGVtL2NvbG9yTWFuaXB1bGF0b3InO1xuaW1wb3J0IGNyZWF0ZVRoZW1lTm9WYXJzIGZyb20gXCIuL2NyZWF0ZVRoZW1lTm9WYXJzLmpzXCI7XG5pbXBvcnQgY3JlYXRlQ29sb3JTY2hlbWUsIHsgZ2V0T3BhY2l0eSwgZ2V0T3ZlcmxheXMgfSBmcm9tIFwiLi9jcmVhdGVDb2xvclNjaGVtZS5qc1wiO1xuaW1wb3J0IGRlZmF1bHRTaG91bGRTa2lwR2VuZXJhdGluZ1ZhciBmcm9tIFwiLi9zaG91bGRTa2lwR2VuZXJhdGluZ1Zhci5qc1wiO1xuaW1wb3J0IGRlZmF1bHRHZXRTZWxlY3RvciBmcm9tIFwiLi9jcmVhdGVHZXRTZWxlY3Rvci5qc1wiO1xuaW1wb3J0IHsgc3RyaW5naWZ5VGhlbWUgfSBmcm9tIFwiLi9zdHJpbmdpZnlUaGVtZS5qc1wiO1xuaW1wb3J0IHsgbGlnaHQsIGRhcmsgfSBmcm9tIFwiLi9jcmVhdGVQYWxldHRlLmpzXCI7XG5mdW5jdGlvbiBhc3NpZ25Ob2RlKG9iaiwga2V5cykge1xuICBrZXlzLmZvckVhY2goayA9PiB7XG4gICAgaWYgKCFvYmpba10pIHtcbiAgICAgIG9ialtrXSA9IHt9O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBzZXRDb2xvcihvYmosIGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gIGlmICghb2JqW2tleV0gJiYgZGVmYXVsdFZhbHVlKSB7XG4gICAgb2JqW2tleV0gPSBkZWZhdWx0VmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHRvUmdiKGNvbG9yKSB7XG4gIGlmICh0eXBlb2YgY29sb3IgIT09ICdzdHJpbmcnIHx8ICFjb2xvci5zdGFydHNXaXRoKCdoc2wnKSkge1xuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuICByZXR1cm4gaHNsVG9SZ2IoY29sb3IpO1xufVxuZnVuY3Rpb24gc2V0Q29sb3JDaGFubmVsKG9iaiwga2V5KSB7XG4gIGlmICghKGAke2tleX1DaGFubmVsYCBpbiBvYmopKSB7XG4gICAgLy8gY3VzdG9tIGNoYW5uZWwgdG9rZW4gaXMgbm90IHByb3ZpZGVkLCBnZW5lcmF0ZSBvbmUuXG4gICAgLy8gaWYgY2hhbm5lbCB0b2tlbiBjYW4ndCBiZSBnZW5lcmF0ZWQsIHNob3cgYSB3YXJuaW5nLlxuICAgIG9ialtgJHtrZXl9Q2hhbm5lbGBdID0gc2FmZUNvbG9yQ2hhbm5lbCh0b1JnYihvYmpba2V5XSksIGBNVUk6IENhbid0IGNyZWF0ZSBcXGBwYWxldHRlLiR7a2V5fUNoYW5uZWxcXGAgYmVjYXVzZSBcXGBwYWxldHRlLiR7a2V5fVxcYCBpcyBub3Qgb25lIG9mIHRoZXNlIGZvcm1hdHM6ICNubm4sICNubm5ubm4sIHJnYigpLCByZ2JhKCksIGhzbCgpLCBoc2xhKCksIGNvbG9yKCkuYCArICdcXG4nICsgYFRvIHN1cHByZXNzIHRoaXMgd2FybmluZywgeW91IG5lZWQgdG8gZXhwbGljaXRseSBwcm92aWRlIHRoZSBcXGBwYWxldHRlLiR7a2V5fUNoYW5uZWxcXGAgYXMgYSBzdHJpbmcgKGluIHJnYiBmb3JtYXQsIGZvciBleGFtcGxlIFwiMTIgMTIgMTJcIikgb3IgdW5kZWZpbmVkIGlmIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgY2hhbm5lbCB0b2tlbi5gKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U3BhY2luZ1ZhbChzcGFjaW5nSW5wdXQpIHtcbiAgaWYgKHR5cGVvZiBzcGFjaW5nSW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGAke3NwYWNpbmdJbnB1dH1weGA7XG4gIH1cbiAgaWYgKHR5cGVvZiBzcGFjaW5nSW5wdXQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBzcGFjaW5nSW5wdXQgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShzcGFjaW5nSW5wdXQpKSB7XG4gICAgcmV0dXJuIHNwYWNpbmdJbnB1dDtcbiAgfVxuICByZXR1cm4gJzhweCc7XG59XG5jb25zdCBzaWxlbnQgPSBmbiA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gaWdub3JlIGVycm9yXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5leHBvcnQgY29uc3QgY3JlYXRlR2V0Q3NzVmFyID0gKGNzc1ZhclByZWZpeCA9ICdtdWknKSA9PiBzeXN0ZW1DcmVhdGVHZXRDc3NWYXIoY3NzVmFyUHJlZml4KTtcbmZ1bmN0aW9uIGF0dGFjaENvbG9yU2NoZW1lKGNvbG9yU3BhY2UsIGNvbG9yU2NoZW1lcywgc2NoZW1lLCByZXN0VGhlbWUsIGNvbG9yU2NoZW1lKSB7XG4gIGlmICghc2NoZW1lKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBzY2hlbWUgPSBzY2hlbWUgPT09IHRydWUgPyB7fSA6IHNjaGVtZTtcbiAgY29uc3QgbW9kZSA9IGNvbG9yU2NoZW1lID09PSAnZGFyaycgPyAnZGFyaycgOiAnbGlnaHQnO1xuICBpZiAoIXJlc3RUaGVtZSkge1xuICAgIGNvbG9yU2NoZW1lc1tjb2xvclNjaGVtZV0gPSBjcmVhdGVDb2xvclNjaGVtZSh7XG4gICAgICAuLi5zY2hlbWUsXG4gICAgICBwYWxldHRlOiB7XG4gICAgICAgIG1vZGUsXG4gICAgICAgIC4uLnNjaGVtZT8ucGFsZXR0ZVxuICAgICAgfSxcbiAgICAgIGNvbG9yU3BhY2VcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHtcbiAgICBwYWxldHRlLFxuICAgIC4uLm11aVRoZW1lXG4gIH0gPSBjcmVhdGVUaGVtZU5vVmFycyh7XG4gICAgLi4ucmVzdFRoZW1lLFxuICAgIHBhbGV0dGU6IHtcbiAgICAgIG1vZGUsXG4gICAgICAuLi5zY2hlbWU/LnBhbGV0dGVcbiAgICB9LFxuICAgIGNvbG9yU3BhY2VcbiAgfSk7XG4gIGNvbG9yU2NoZW1lc1tjb2xvclNjaGVtZV0gPSB7XG4gICAgLi4uc2NoZW1lLFxuICAgIHBhbGV0dGUsXG4gICAgb3BhY2l0eToge1xuICAgICAgLi4uZ2V0T3BhY2l0eShtb2RlKSxcbiAgICAgIC4uLnNjaGVtZT8ub3BhY2l0eVxuICAgIH0sXG4gICAgb3ZlcmxheXM6IHNjaGVtZT8ub3ZlcmxheXMgfHwgZ2V0T3ZlcmxheXMobW9kZSlcbiAgfTtcbiAgcmV0dXJuIG11aVRoZW1lO1xufVxuXG4vKipcbiAqIEEgZGVmYXVsdCBgY3JlYXRlVGhlbWVXaXRoVmFyc2AgY29tZXMgd2l0aCBhIHNpbmdsZSBjb2xvciBzY2hlbWUsIG
1VpdGhlciBgbGlnaHRgIG9yIGBkYXJrYCBiYXNlZCBvbiB0aGUgYGRlZmF1bHRDb2xvclNjaGVtZWAuXG4gKiBUaGlzIGlzIGJldHRlciBzdWl0ZWQgZm9yIGFwcHMgdGhhdCBvbmx5IG5lZWQgYSBzaW5nbGUgY29sb3Igc2NoZW1lLlxuICpcbiAqIFRvIGVuYWJsZSBidWlsdC1pbiBgbGlnaHRgIGFuZCBgZGFya2AgY29sb3Igc2NoZW1lcywgZWl0aGVyOlxuICogMS4gcHJvdmlkZSBhIGBjb2xvclNjaGVtZVNlbGVjdG9yYCB0byBkZWZpbmUgaG93IHRoZSBjb2xvciBzY2hlbWVzIHdpbGwgY2hhbmdlLlxuICogMi4gcHJvdmlkZSBgY29sb3JTY2hlbWVzLmRhcmtgIHdpbGwgc2V0IGBjb2xvclNjaGVtZVNlbGVjdG9yOiAnbWVkaWEnYCBieSBkZWZhdWx0LlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVUaGVtZVdpdGhWYXJzKG9wdGlvbnMgPSB7fSwgLi4uYXJncykge1xuICBjb25zdCB7XG4gICAgY29sb3JTY2hlbWVzOiBjb2xvclNjaGVtZXNJbnB1dCA9IHtcbiAgICAgIGxpZ2h0OiB0cnVlXG4gICAgfSxcbiAgICBkZWZhdWx0Q29sb3JTY2hlbWU6IGRlZmF1bHRDb2xvclNjaGVtZUlucHV0LFxuICAgIGRpc2FibGVDc3NDb2xvclNjaGVtZSA9IGZhbHNlLFxuICAgIGNzc1ZhclByZWZpeCA9ICdtdWknLFxuICAgIG5hdGl2ZUNvbG9yID0gZmFsc2UsXG4gICAgc2hvdWxkU2tpcEdlbmVyYXRpbmdWYXIgPSBkZWZhdWx0U2hvdWxkU2tpcEdlbmVyYXRpbmdWYXIsXG4gICAgY29sb3JTY2hlbWVTZWxlY3Rvcjogc2VsZWN0b3IgPSBjb2xvclNjaGVtZXNJbnB1dC5saWdodCAmJiBjb2xvclNjaGVtZXNJbnB1dC5kYXJrID8gJ21lZGlhJyA6IHVuZGVmaW5lZCxcbiAgICByb290U2VsZWN0b3IgPSAnOnJvb3QnLFxuICAgIC4uLmlucHV0XG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBmaXJzdENvbG9yU2NoZW1lID0gT2JqZWN0LmtleXMoY29sb3JTY2hlbWVzSW5wdXQpWzBdO1xuICBjb25zdCBkZWZhdWx0Q29sb3JTY2hlbWUgPSBkZWZhdWx0Q29sb3JTY2hlbWVJbnB1dCB8fCAoY29sb3JTY2hlbWVzSW5wdXQubGlnaHQgJiYgZmlyc3RDb2xvclNjaGVtZSAhPT0gJ2xpZ2h0JyA/ICdsaWdodCcgOiBmaXJzdENvbG9yU2NoZW1lKTtcbiAgY29uc3QgZ2V0Q3NzVmFyID0gY3JlYXRlR2V0Q3NzVmFyKGNzc1ZhclByZWZpeCk7XG4gIGNvbnN0IHtcbiAgICBbZGVmYXVsdENvbG9yU2NoZW1lXTogZGVmYXVsdFNjaGVtZUlucHV0LFxuICAgIGxpZ2h0OiBidWlsdEluTGlnaHQsXG4gICAgZGFyazogYnVpbHRJbkRhcmssXG4gICAgLi4uY3VzdG9tQ29sb3JTY2hlbWVzXG4gIH0gPSBjb2xvclNjaGVtZXNJbnB1dDtcbiAgY29uc3QgY29sb3JTY2hlbWVzID0ge1xuICAgIC4uLmN1c3RvbUNvbG9yU2NoZW1lc1xuICB9O1xuICBsZXQgZGVmYXVsdFNjaGVtZSA9IGRlZmF1bHRTY2hlbWVJbnB1dDtcblxuICAvLyBGb3IgYnVpbHQtaW4gbGlnaHQgYW5kIGRhcmsgY29sb3Igc2NoZW1lcywgZW5zdXJlIHRoYXQgdGhlIHZhbHVlIGlzIHZhbGlkIGlmIHRoZXkgYXJlIHRoZSBkZWZhdWx0IGNvbG9yIHNjaGVtZS5cbiAgaWYgKGRlZmF1bHRDb2xvclNjaGVtZSA9PT0gJ2RhcmsnICYmICEoJ2RhcmsnIGluIGNvbG9yU2NoZW1lc0lucHV0KSB8fCBkZWZhdWx0Q29sb3JTY2hlbWUgPT09ICdsaWdodCcgJiYgISgnbGlnaHQnIGluIGNvbG9yU2NoZW1lc0lucHV0KSkge1xuICAgIGRlZmF1bHRTY2hlbWUgPSB0cnVlO1xuICB9XG4gIGlmICghZGVmYXVsdFNjaGVtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBgTVVJOiBUaGUgXFxgY29sb3JTY2hlbWVzLiR7ZGVmYXVsdENvbG9yU2NoZW1lfVxcYCBvcHRpb24gaXMgZWl0aGVyIG1pc3Npbmcgb3IgaW52YWxpZC5gIDogX2Zvcm1hdEVycm9yTWVzc2FnZSgyMSwgZGVmYXVsdENvbG9yU2NoZW1lKSk7XG4gIH1cblxuICAvLyBUaGUgcmVhc29uIHRvIHVzZSBgb2tsY2hgIGlzIHRoYXQgaXQgaXMgdGhlIG1vc3QgcGVyY2VwdHVhbGx5IHVuaWZvcm0gY29sb3Igc3BhY2UgYW5kIHdpZGVseSBzdXBwb3J0ZWQuXG4gIGxldCBjb2xvclNwYWNlO1xuICBpZiAobmF0aXZlQ29sb3IpIHtcbiAgICBjb2xvclNwYWNlID0gJ29rbGNoJztcbiAgfVxuXG4gIC8vIENyZWF0ZSB0aGUgcGFsZXR0ZSBmb3IgdGhlIGRlZmF1bHQgY29sb3Igc2NoZW1lLCBlaXRoZXIgYGxpZ2h0YCwgYGRhcmtgLCBvciBjdXN0b20gY29sb3Igc2NoZW1lLlxuICBjb25zdCBtdWlUaGVtZSA9IGF0dGFjaENvbG9yU2NoZW1lKGNvbG9yU3BhY2UsIGNvbG9yU2NoZW1lcywgZGVmYXVsdFNjaGVtZSwgaW5wdXQsIGRlZmF1bHRDb2xvclNjaGVtZSk7XG4gIGlmIChidWlsdEluTGlnaHQgJiYgIWNvbG9yU2NoZW1lcy5saWdodCkge1xuICAgIGF0dGFjaENvbG9yU2NoZW1lKGNvbG9yU3BhY2UsIGNvbG9yU2NoZW1lcywgYnVpbHRJbkxpZ2h0LCB1bmRlZmluZWQsICdsaWdodCcpO1xuICB9XG4gIGlmIChidWlsdEluRGFyayAmJiAhY29sb3JTY2hlbWVzLmRhcmspIHtcbiAgICBhdHRhY2hDb2xvclNjaGVtZShjb2xvclNwYWNlLCBjb2xvclNjaGVtZXMsIGJ1aWx0SW5EYXJrLCB1bmRlZmluZWQsICdkYXJrJyk
17XG4gIH1cbiAgbGV0IHRoZW1lID0ge1xuICAgIGRlZmF1bHRDb2xvclNjaGVtZSxcbiAgICAuLi5tdWlUaGVtZSxcbiAgICBjc3NWYXJQcmVmaXgsXG4gICAgY29sb3JTY2hlbWVTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgcm9vdFNlbGVjdG9yLFxuICAgIGdldENzc1ZhcixcbiAgICBjb2xvclNjaGVtZXMsXG4gICAgZm9udDoge1xuICAgICAgLi4ucHJlcGFyZVR5cG9ncmFwaHlWYXJzKG11aVRoZW1lLnR5cG9ncmFwaHkpLFxuICAgICAgLi4ubXVpVGhlbWUuZm9udFxuICAgIH0sXG4gICAgc3BhY2luZzogZ2V0U3BhY2luZ1ZhbChpbnB1dC5zcGFjaW5nKVxuICB9O1xuICBPYmplY3Qua2V5cyh0aGVtZS5jb2xvclNjaGVtZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCBwYWxldHRlID0gdGhlbWUuY29sb3JTY2hlbWVzW2tleV0ucGFsZXR0ZTtcbiAgICBjb25zdCBzZXRDc3NWYXJDb2xvciA9IGNzc1ZhciA9PiB7XG4gICAgICBjb25zdCB0b2tlbnMgPSBjc3NWYXIuc3BsaXQoJy0nKTtcbiAgICAgIGNvbnN0IGNvbG9yID0gdG9rZW5zWzFdO1xuICAgICAgY29uc3QgY29sb3JUb2tlbiA9IHRva2Vuc1syXTtcbiAgICAgIHJldHVybiBnZXRDc3NWYXIoY3NzVmFyLCBwYWxldHRlW2NvbG9yXVtjb2xvclRva2VuXSk7XG4gICAgfTtcblxuICAgIC8vIGF0dGFjaCBibGFjayAmIHdoaXRlIGNoYW5uZWxzIHRvIGNvbW1vbiBub2RlXG4gICAgaWYgKHBhbGV0dGUubW9kZSA9PT0gJ2xpZ2h0Jykge1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5jb21tb24sICdiYWNrZ3JvdW5kJywgJyNmZmYnKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuY29tbW9uLCAnb25CYWNrZ3JvdW5kJywgJyMwMDAnKTtcbiAgICB9XG4gICAgaWYgKHBhbGV0dGUubW9kZSA9PT0gJ2RhcmsnKSB7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLmNvbW1vbiwgJ2JhY2tncm91bmQnLCAnIzAwMCcpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5jb21tb24sICdvbkJhY2tncm91bmQnLCAnI2ZmZicpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb2xvck1peChtZXRob2QsIGNvbG9yLCBjb2VmZmljaWVudCkge1xuICAgICAgaWYgKGNvbG9yU3BhY2UpIHtcbiAgICAgICAgbGV0IG1peGVyO1xuICAgICAgICBpZiAobWV0aG9kID09PSBzYWZlQWxwaGEpIHtcbiAgICAgICAgICBtaXhlciA9IGB0cmFuc3BhcmVudCAkeygoMSAtIGNvZWZmaWNpZW50KSAqIDEwMCkudG9GaXhlZCgwKX0lYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0aG9kID09PSBzYWZlRGFya2VuKSB7XG4gICAgICAgICAgbWl4ZXIgPSBgIzAwMCAkeyhjb2VmZmljaWVudCAqIDEwMCkudG9GaXhlZCgwKX0lYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0aG9kID09PSBzYWZlTGlnaHRlbikge1xuICAgICAgICAgIG1peGVyID0gYCNmZmYgJHsoY29lZmZpY2llbnQgKiAxMDApLnRvRml4ZWQoMCl9JWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBjb2xvci1taXgoaW4gJHtjb2xvclNwYWNlfSwgJHtjb2xvcn0sICR7bWl4ZXJ9KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWV0aG9kKGNvbG9yLCBjb2VmZmljaWVudCk7XG4gICAgfVxuXG4gICAgLy8gYXNzaWduIGNvbXBvbmVudCB2YXJpYWJsZXNcbiAgICBhc3NpZ25Ob2RlKHBhbGV0dGUsIFsnQWxlcnQnLCAnQXBwQmFyJywgJ0F2YXRhcicsICdCdXR0b24nLCAnQ2hpcCcsICdGaWxsZWRJbnB1dCcsICdMaW5lYXJQcm9ncmVzcycsICdTa2VsZXRvbicsICdTbGlkZXInLCAnU25hY2tiYXJDb250ZW50JywgJ1NwZWVkRGlhbEFjdGlvbicsICdTdGVwQ29ubmVjdG9yJywgJ1N0ZXBDb250ZW50JywgJ1N3aXRjaCcsICdUYWJsZUNlbGwnLCAnVG9vbHRpcCddKTtcbiAgICBpZiAocGFsZXR0ZS5tb2RlID09PSAnbGlnaHQnKSB7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnZXJyb3JDb2xvcicsIGNvbG9yTWl4KHNhZmVEYXJrZW4sIHBhbGV0dGUuZXJyb3IubGlnaHQsIDAuNikpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ2luZm9Db2xvcicsIGNvbG9yTWl4KHNhZmVEYXJrZW4sIHBhbGV0dGUuaW5mby5saWdodCwgMC42KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnc3VjY2Vzc0NvbG9yJywgY29sb3JNaXgoc2FmZURhcmtlbiwgcGFsZXR0ZS5zdWNjZXNzLmxpZ2h0LCAwLjYpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQWxlcnQsICd3YXJuaW5nQ29sb3InLCBjb2xvck1peChzYWZlRGFya2VuLCBwYWxldHRlLndhcm5pbmcubGlnaHQsIDAuNikpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ2Vycm9yRmlsbGVkQmcnLCBzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS1lcnJvci1tYWluJykpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ2luZm9GaWxsZWRCZycsIHNldENzc1ZhckNvbG9yKCdwYWxldHRlLWluZm8tbWFpbicpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQWxlcnQsICdzdWNjZXNzRmlsbGVkQmcnLCBzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS1zdWNjZXNzLW1haW4nKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnd2FybmluZ0ZpbGxlZEJnJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtd2FybmluZy1tYWluJykpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ2Vycm9yRmlsbGVkQ29sb3InLCBzaWxlbnQoKCkgPT4gcGFsZXR0ZS5nZXRDb250cmFzdFRleHQocGFsZXR0ZS5lcnJvci5tYWluKSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ2luZm9GaWxsZWRDb2xvcicsIHNpbGVudCgoKSA9PiBwYWxldHRlLmdldENvbnRyYXN0VGV4dChwYWxldHRlLmluZm8ubWFpbikpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQWxlcnQsICdzdWNjZXNzRmlsbGVkQ29sb3InLCBzaWxlbnQoKCkgPT4gcGFsZXR0ZS5nZXRDb250cmFzdFRleHQocGFsZXR0ZS5zdWNjZXNzLm1haW4pKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnd2FybmluZ0ZpbGxlZENvbG9yJywgc2lsZW50KCgpID0+IHBhbGV0dGUuZ2V0Q29udHJhc3RUZXh0KHBhbGV0dGUud2FybmluZy5tYWluKSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ2Vycm9yU3RhbmRhcmRCZycsIGNvbG9yTWl4KHNhZmVMaWdodGVuLCBwYWxldHRlLmVycm9yLmxpZ2h0LCAwLjkpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQWxlcnQsICdpbmZvU3RhbmRhcmRCZycsIGNvbG9yTWl4KHNhZmVMaWdodGVuLCBwYWxldHRlLmluZm8ubGlnaHQsIDAuOSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ3N1Y2Nlc3NTdGFuZGFyZEJnJywgY29sb3JNaXgoc2FmZUxpZ2h0ZW4sIHBhbGV0dGUuc3VjY2Vzcy5saWdodCwgMC45KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnd2FybmluZ1N0YW5kYXJkQmcnLCBjb2xvck1peChzYWZlTGlnaHRlbiwgcGFsZXR0ZS53YXJuaW5nLmxpZ2h0LCAwLjkpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQWxlcnQsICdlcnJvckljb25Db2xvcicsIHNldENzc1ZhckNvbG9yKCdwYWxldHRlLWVycm9yLW1haW4nKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnaW5mb0ljb25Db2xvcicsIHNldENzc1ZhckNvbG9yKCdwYWxldHRlLWluZm8tbWFpbicpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQWxlcnQsICdzdWNjZXNzSWNvbkNvbG9yJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtc3VjY2Vzcy1tYWluJykpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ3dhcm5pbmdJY29uQ29sb3InLCBzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS13YXJuaW5nLW1haW4nKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFwcEJhciwgJ2RlZmF1bHRCZycsIHNldENzc1ZhckNvbG9yKCdwYWxldHRlLWdyZXktMTAwJykpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BdmF0YXIsICdkZWZhdWx0QmcnLCBzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS1ncmV5LTQwMCcpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQnV0dG9uLCAnaW5oZXJpdENvbnRhaW5lZEJnJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtZ3JleS0zMDAnKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkJ1dHRvbiwgJ2luaGVyaXRDb250YWluZWRIb3ZlckJnJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtZ3JleS1BMTAwJykpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5DaGlwLCAnZGVmYXVsdEJvcmRlcicsIHNldENzc1ZhckNvbG9yKCdwYWxldHRlLWdyZXktNDAwJykpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5DaGlwLCAnZGVmYXVsdEF2YXRhckNvbG9yJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtZ3JleS03MDAnKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkNoaXAsICdkZWZhdWx0SWNvbkNvbG9yJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtZ3JleS03MDAnKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkZpbGxlZElucHV0LCAnYmcnLCAncmdiYSgwLCAwLCAwLCAwLjA2KScpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5GaWxsZWRJbnB1dCwgJ2hvdmVyQmcnLCAncmdiYSgwLCAwLCAwLCAwLjA5KScpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5GaWxsZWRJbnB1dCwgJ2Rpc2FibGVkQmcnLCAncmdiYSgwLCAwLCAwLCAwLjEyKScpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5MaW5lYXJQcm9ncmVzcywgJ3ByaW1hcnlCZycsIGNvbG9yTWl4KHNhZmVMaWdodGVuLCBwYWxldHRlLnByaW1hcnkubWFpbiwgMC42MikpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5MaW5lYXJQcm9ncmVzcywgJ3NlY29uZGFyeUJnJywgY29sb3JNaXgoc2FmZUxpZ2h0ZW4sIHBhbGV0dGUuc2Vjb25kYXJ5Lm1haW4sIDAuNjIpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuTGluZWFyUHJvZ3Jlc3MsICdlcnJvckJnJ
1ywgY29sb3JNaXgoc2FmZUxpZ2h0ZW4sIHBhbGV0dGUuZXJyb3IubWFpbiwgMC42MikpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5MaW5lYXJQcm9ncmVzcywgJ2luZm9CZycsIGNvbG9yTWl4KHNhZmVMaWdodGVuLCBwYWxldHRlLmluZm8ubWFpbiwgMC42MikpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5MaW5lYXJQcm9ncmVzcywgJ3N1Y2Nlc3NCZycsIGNvbG9yTWl4KHNhZmVMaWdodGVuLCBwYWxldHRlLnN1Y2Nlc3MubWFpbiwgMC42MikpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5MaW5lYXJQcm9ncmVzcywgJ3dhcm5pbmdCZycsIGNvbG9yTWl4KHNhZmVMaWdodGVuLCBwYWxldHRlLndhcm5pbmcubWFpbiwgMC42MikpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5Ta2VsZXRvbiwgJ2JnJywgY29sb3JTcGFjZSA/IGNvbG9yTWl4KHNhZmVBbHBoYSwgcGFsZXR0ZS50ZXh0LnByaW1hcnksIDAuMTEpIDogYHJnYmEoJHtzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS10ZXh0LXByaW1hcnlDaGFubmVsJyl9IC8gMC4xMSlgKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU2xpZGVyLCAncHJpbWFyeVRyYWNrJywgY29sb3JNaXgoc2FmZUxpZ2h0ZW4sIHBhbGV0dGUucHJpbWFyeS5tYWluLCAwLjYyKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlNsaWRlciwgJ3NlY29uZGFyeVRyYWNrJywgY29sb3JNaXgoc2FmZUxpZ2h0ZW4sIHBhbGV0dGUuc2Vjb25kYXJ5Lm1haW4sIDAuNjIpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU2xpZGVyLCAnZXJyb3JUcmFjaycsIGNvbG9yTWl4KHNhZmVMaWdodGVuLCBwYWxldHRlLmVycm9yLm1haW4sIDAuNjIpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU2xpZGVyLCAnaW5mb1RyYWNrJywgY29sb3JNaXgoc2FmZUxpZ2h0ZW4sIHBhbGV0dGUuaW5mby5tYWluLCAwLjYyKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlNsaWRlciwgJ3N1Y2Nlc3NUcmFjaycsIGNvbG9yTWl4KHNhZmVMaWdodGVuLCBwYWxldHRlLnN1Y2Nlc3MubWFpbiwgMC42MikpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5TbGlkZXIsICd3YXJuaW5nVHJhY2snLCBjb2xvck1peChzYWZlTGlnaHRlbiwgcGFsZXR0ZS53YXJuaW5nLm1haW4sIDAuNjIpKTtcbiAgICAgIGNvbnN0IHNuYWNrYmFyQ29udGVudEJhY2tncm91bmQgPSBjb2xvclNwYWNlID8gY29sb3JNaXgoc2FmZURhcmtlbiwgcGFsZXR0ZS5iYWNrZ3JvdW5kLmRlZmF1bHQsIDAuNjgyNSkgLy8gdXNlIGAwLjY4MjVgIGluc3RlYWQgb2YgYDAuOGAgdG8gbWF0Y2ggdGhlIGNvbnRyYXN0IHJhdGlvIG9mIEpTIGltcGxlbWVudGF0aW9uXG4gICAgICA6IHNhZmVFbXBoYXNpemUocGFsZXR0ZS5iYWNrZ3JvdW5kLmRlZmF1bHQsIDAuOCk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlNuYWNrYmFyQ29udGVudCwgJ2JnJywgc25hY2tiYXJDb250ZW50QmFja2dyb3VuZCk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlNuYWNrYmFyQ29udGVudCwgJ2NvbG9yJywgc2lsZW50KCgpID0+IGNvbG9yU3BhY2UgPyBkYXJrLnRleHQucHJpbWFyeSA6IHBhbGV0dGUuZ2V0Q29udHJhc3RUZXh0KHNuYWNrYmFyQ29udGVudEJhY2tncm91bmQpKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlNwZWVkRGlhbEFjdGlvbiwgJ2ZhYkhvdmVyQmcnLCBzYWZlRW1waGFzaXplKHBhbGV0dGUuYmFja2dyb3VuZC5wYXBlciwgMC4xNSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5TdGVwQ29ubmVjdG9yLCAnYm9yZGVyJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtZ3JleS00MDAnKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlN0ZXBDb250ZW50LCAnYm9yZGVyJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtZ3JleS00MDAnKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlN3aXRjaCwgJ2RlZmF1bHRDb2xvcicsIHNldENzc1ZhckNvbG9yKCdwYWxldHRlLWNvbW1vbi13aGl0ZScpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU3dpdGNoLCAnZGVmYXVsdERpc2FibGVkQ29sb3InLCBzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS1ncmV5LTEwMCcpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU3dpdGNoLCAncHJpbWFyeURpc2FibGVkQ29sb3InLCBjb2xvck1peChzYWZlTGlnaHRlbiwgcGFsZXR0ZS5wcmltYXJ5Lm1haW4sIDAuNjIpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU3dpdGNoLCAnc2Vjb25kYXJ5RGlzYWJsZWRDb2xvcicsIGNvbG9yTWl4KHNhZmVMaWdodGVuLCBwYWxldHRlLnNlY29uZGFyeS5tYWluLCAwLjYyKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlN3aXRjaCwgJ2Vycm9yRGlzYWJsZWRDb2xvcicsIGNvbG9yTWl4KHNhZmVMaWdodGVuLCBwYWxldHRlLmVycm9yLm1haW4sIDAuNjIpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU3dpdGNoLCAnaW5mb0Rpc2FibGVkQ29sb3InLCBjb2xvck1peChzYWZlTGlnaHRlbiwgcGFsZXR0ZS5pbmZvLm1haW4sIDAuNjIpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU3dpdGNoLCAnc3VjY2Vzc0Rpc2FibGVkQ29sb3InLCBjb2xvck1peChzYWZlTGlnaHRlbiwgcGFsZXR0ZS5zdWNjZXNzLm1haW4sIDAuNjIpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU3dpdGNoLCAnd2FybmluZ0Rpc2FibGVkQ29sb3InLCBjb2xvck1peChzYWZlTGlnaHRlbiwgcGFsZXR0ZS53YXJuaW5nLm1haW4sIDAuNjIpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuVGFibGVDZWxsLCAnYm9yZGVyJywgY29sb3JNaXgoc2FmZUxpZ2h0ZW4sIGNvbG9yTWl4KHNhZmVBbHBoYSwgcGFsZXR0ZS5kaXZpZGVyLCAxKSwgMC44OCkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5Ub29sdGlwLCAnYmcnLCBjb2xvck1peChzYWZlQWxwaGEsIHBhbGV0dGUuZ3JleVs3MDBdLCAwLjkyKSk7XG4gICAgfVxuICAgIGlmIChwYWxldHRlLm1vZGUgPT09ICdkYXJrJykge1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ2Vycm9yQ29sb3InLCBjb2xvck1peChzYWZlTGlnaHRlbiwgcGFsZXR0ZS5lcnJvci5saWdodCwgMC42KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnaW5mb0NvbG9yJywgY29sb3JNaXgoc2FmZUxpZ2h0ZW4sIHBhbGV0dGUuaW5mby5saWdodCwgMC42KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnc3VjY2Vzc0NvbG9yJywgY29sb3JNaXgoc2FmZUxpZ2h0ZW4sIHBhbGV0dGUuc3VjY2Vzcy5saWdodCwgMC42KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnd2FybmluZ0NvbG9yJywgY29sb3JNaXgoc2FmZUxpZ2h0ZW4sIHBhbGV0dGUud2FybmluZy5saWdodCwgMC42KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnZXJyb3JGaWxsZWRCZycsIHNldENzc1ZhckNvbG9yKCdwYWxldHRlLWVycm9yLWRhcmsnKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnaW5mb0ZpbGxlZEJnJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtaW5mby1kYXJrJykpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ3N1Y2Nlc3NGaWxsZWRCZycsIHNldENzc1ZhckNvbG9yKCdwYWxldHRlLXN1Y2Nlc3MtZGFyaycpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQWxlcnQsICd3YXJuaW5nRmlsbGVkQmcnLCBzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS13YXJuaW5nLWRhcmsnKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnZXJyb3JGaWxsZWRDb2xvcicsIHNpbGVudCgoKSA9PiBwYWxldHRlLmdldENvbnRyYXN0VGV4dChwYWxldHRlLmVycm9yLmRhcmspKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnaW5mb0ZpbGxlZENvbG9yJywgc2lsZW50KCgpID0+IHBhbGV0dGUuZ2V0Q29udHJhc3RUZXh0KHBhbGV0dGUuaW5mby5kYXJrKSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ3N1Y2Nlc3NGaWxsZWRDb2xvcicsIHNpbGVudCgoKSA9PiBwYWxldHRlLmdldENvbnRyYXN0VGV4dChwYWxldHRlLnN1Y2Nlc3MuZGFyaykpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQWxlcnQsICd3YXJuaW5nRmlsbGVkQ29sb3InLCBzaWxlbnQoKCkgPT4gcGFsZXR0ZS5nZXRDb250cmFzdFRleHQocGFsZXR0ZS53YXJuaW5nLmRhcmspKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnZXJyb3JTdGFuZGFyZEJnJywgY29sb3JNaXgoc2FmZURhcmtlbiwgcGFsZXR0ZS5lcnJvci5saWdodCwgMC45KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnaW5mb1N0YW5kYXJkQmcnLCBjb2xvck1peChzYWZlRGFya2VuLCBwYWxldHRlLmluZm8ubGlnaHQsIDAuOSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ3N1Y2Nlc3NTdGFuZGFyZEJnJywgY29sb3JNaXgoc2FmZURhcmtlbiwgcGFsZXR0ZS5zdWNjZXNzLmxpZ2h0LCAwLjkpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQWxlcnQsICd3YXJuaW5nU3RhbmRhcmRCZycsIGNvbG9yTWl4KHNhZmVEYXJrZW4sIHBhbGV0dGUud2FybmluZy5saWdodCwgMC45KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnZXJyb3JJY29uQ29sb3InLCBzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS1lcnJvci1tYWluJykpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BbGVydCwgJ2luZm9JY29uQ29sb3InLCBzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS1pbmZvLW1haW4nKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkFsZXJ0LCAnc3VjY2Vzc0ljb25Db2xvcicsIHNldENzc1ZhckNvbG9yKCdwYWxldHRlLXN1Y2Nlc3MtbWFpbicpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQWxlcnQsICd3YXJuaW5nSWNvbkNvbG9yJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtd2FybmluZy1tYWluJykpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BcHBCYXIsICdkZWZhdWx0QmcnLCBzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS1ncmV5LTkwMCcpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQXBwQmFyLCAnZGFya0JnJ
1ywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtYmFja2dyb3VuZC1wYXBlcicpKTsgLy8gc3BlY2lmaWMgZm9yIGRhcmsgbW9kZVxuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5BcHBCYXIsICdkYXJrQ29sb3InLCBzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS10ZXh0LXByaW1hcnknKSk7IC8vIHNwZWNpZmljIGZvciBkYXJrIG1vZGVcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuQXZhdGFyLCAnZGVmYXVsdEJnJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtZ3JleS02MDAnKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkJ1dHRvbiwgJ2luaGVyaXRDb250YWluZWRCZycsIHNldENzc1ZhckNvbG9yKCdwYWxldHRlLWdyZXktODAwJykpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5CdXR0b24sICdpbmhlcml0Q29udGFpbmVkSG92ZXJCZycsIHNldENzc1ZhckNvbG9yKCdwYWxldHRlLWdyZXktNzAwJykpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5DaGlwLCAnZGVmYXVsdEJvcmRlcicsIHNldENzc1ZhckNvbG9yKCdwYWxldHRlLWdyZXktNzAwJykpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5DaGlwLCAnZGVmYXVsdEF2YXRhckNvbG9yJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtZ3JleS0zMDAnKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkNoaXAsICdkZWZhdWx0SWNvbkNvbG9yJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtZ3JleS0zMDAnKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkZpbGxlZElucHV0LCAnYmcnLCAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KScpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5GaWxsZWRJbnB1dCwgJ2hvdmVyQmcnLCAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEzKScpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5GaWxsZWRJbnB1dCwgJ2Rpc2FibGVkQmcnLCAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKScpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5MaW5lYXJQcm9ncmVzcywgJ3ByaW1hcnlCZycsIGNvbG9yTWl4KHNhZmVEYXJrZW4sIHBhbGV0dGUucHJpbWFyeS5tYWluLCAwLjUpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuTGluZWFyUHJvZ3Jlc3MsICdzZWNvbmRhcnlCZycsIGNvbG9yTWl4KHNhZmVEYXJrZW4sIHBhbGV0dGUuc2Vjb25kYXJ5Lm1haW4sIDAuNSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5MaW5lYXJQcm9ncmVzcywgJ2Vycm9yQmcnLCBjb2xvck1peChzYWZlRGFya2VuLCBwYWxldHRlLmVycm9yLm1haW4sIDAuNSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5MaW5lYXJQcm9ncmVzcywgJ2luZm9CZycsIGNvbG9yTWl4KHNhZmVEYXJrZW4sIHBhbGV0dGUuaW5mby5tYWluLCAwLjUpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuTGluZWFyUHJvZ3Jlc3MsICdzdWNjZXNzQmcnLCBjb2xvck1peChzYWZlRGFya2VuLCBwYWxldHRlLnN1Y2Nlc3MubWFpbiwgMC41KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLkxpbmVhclByb2dyZXNzLCAnd2FybmluZ0JnJywgY29sb3JNaXgoc2FmZURhcmtlbiwgcGFsZXR0ZS53YXJuaW5nLm1haW4sIDAuNSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5Ta2VsZXRvbiwgJ2JnJywgY29sb3JTcGFjZSA/IGNvbG9yTWl4KHNhZmVBbHBoYSwgcGFsZXR0ZS50ZXh0LnByaW1hcnksIDAuMTMpIDogYHJnYmEoJHtzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS10ZXh0LXByaW1hcnlDaGFubmVsJyl9IC8gMC4xMylgKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU2xpZGVyLCAncHJpbWFyeVRyYWNrJywgY29sb3JNaXgoc2FmZURhcmtlbiwgcGFsZXR0ZS5wcmltYXJ5Lm1haW4sIDAuNSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5TbGlkZXIsICdzZWNvbmRhcnlUcmFjaycsIGNvbG9yTWl4KHNhZmVEYXJrZW4sIHBhbGV0dGUuc2Vjb25kYXJ5Lm1haW4sIDAuNSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5TbGlkZXIsICdlcnJvclRyYWNrJywgY29sb3JNaXgoc2FmZURhcmtlbiwgcGFsZXR0ZS5lcnJvci5tYWluLCAwLjUpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU2xpZGVyLCAnaW5mb1RyYWNrJywgY29sb3JNaXgoc2FmZURhcmtlbiwgcGFsZXR0ZS5pbmZvLm1haW4sIDAuNSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5TbGlkZXIsICdzdWNjZXNzVHJhY2snLCBjb2xvck1peChzYWZlRGFya2VuLCBwYWxldHRlLnN1Y2Nlc3MubWFpbiwgMC41KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlNsaWRlciwgJ3dhcm5pbmdUcmFjaycsIGNvbG9yTWl4KHNhZmVEYXJrZW4sIHBhbGV0dGUud2FybmluZy5tYWluLCAwLjUpKTtcbiAgICAgIGNvbnN0IHNuYWNrYmFyQ29udGVudEJhY2tncm91bmQgPSBjb2xvclNwYWNlID8gY29sb3JNaXgoc2FmZUxpZ2h0ZW4sIHBhbGV0dGUuYmFja2dyb3VuZC5kZWZhdWx0LCAwLjk4NSkgLy8gdXNlIGAwLjk4NWAgaW5zdGVhZCBvZiBgMC45OGAgdG8gbWF0Y2ggdGhlIGNvbnRyYXN0IHJhdGlvIG9mIEpTIGltcGxlbWVudGF0aW9uXG4gICAgICA6IHNhZmVFbXBoYXNpemUocGFsZXR0ZS5iYWNrZ3JvdW5kLmRlZmF1bHQsIDAuOTgpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5TbmFja2JhckNvbnRlbnQsICdiZycsIHNuYWNrYmFyQ29udGVudEJhY2tncm91bmQpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5TbmFja2JhckNvbnRlbnQsICdjb2xvcicsIHNpbGVudCgoKSA9PiBjb2xvclNwYWNlID8gbGlnaHQudGV4dC5wcmltYXJ5IDogcGFsZXR0ZS5nZXRDb250cmFzdFRleHQoc25hY2tiYXJDb250ZW50QmFja2dyb3VuZCkpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU3BlZWREaWFsQWN0aW9uLCAnZmFiSG92ZXJCZycsIHNhZmVFbXBoYXNpemUocGFsZXR0ZS5iYWNrZ3JvdW5kLnBhcGVyLCAwLjE1KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlN0ZXBDb25uZWN0b3IsICdib3JkZXInLCBzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS1ncmV5LTYwMCcpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU3RlcENvbnRlbnQsICdib3JkZXInLCBzZXRDc3NWYXJDb2xvcigncGFsZXR0ZS1ncmV5LTYwMCcpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU3dpdGNoLCAnZGVmYXVsdENvbG9yJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtZ3JleS0zMDAnKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlN3aXRjaCwgJ2RlZmF1bHREaXNhYmxlZENvbG9yJywgc2V0Q3NzVmFyQ29sb3IoJ3BhbGV0dGUtZ3JleS02MDAnKSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlN3aXRjaCwgJ3ByaW1hcnlEaXNhYmxlZENvbG9yJywgY29sb3JNaXgoc2FmZURhcmtlbiwgcGFsZXR0ZS5wcmltYXJ5Lm1haW4sIDAuNTUpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU3dpdGNoLCAnc2Vjb25kYXJ5RGlzYWJsZWRDb2xvcicsIGNvbG9yTWl4KHNhZmVEYXJrZW4sIHBhbGV0dGUuc2Vjb25kYXJ5Lm1haW4sIDAuNTUpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU3dpdGNoLCAnZXJyb3JEaXNhYmxlZENvbG9yJywgY29sb3JNaXgoc2FmZURhcmtlbiwgcGFsZXR0ZS5lcnJvci5tYWluLCAwLjU1KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlN3aXRjaCwgJ2luZm9EaXNhYmxlZENvbG9yJywgY29sb3JNaXgoc2FmZURhcmtlbiwgcGFsZXR0ZS5pbmZvLm1haW4sIDAuNTUpKTtcbiAgICAgIHNldENvbG9yKHBhbGV0dGUuU3dpdGNoLCAnc3VjY2Vzc0Rpc2FibGVkQ29sb3InLCBjb2xvck1peChzYWZlRGFya2VuLCBwYWxldHRlLnN1Y2Nlc3MubWFpbiwgMC41NSkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5Td2l0Y2gsICd3YXJuaW5nRGlzYWJsZWRDb2xvcicsIGNvbG9yTWl4KHNhZmVEYXJrZW4sIHBhbGV0dGUud2FybmluZy5tYWluLCAwLjU1KSk7XG4gICAgICBzZXRDb2xvcihwYWxldHRlLlRhYmxlQ2VsbCwgJ2JvcmRlcicsIGNvbG9yTWl4KHNhZmVEYXJrZW4sIGNvbG9yTWl4KHNhZmVBbHBoYSwgcGFsZXR0ZS5kaXZpZGVyLCAxKSwgMC42OCkpO1xuICAgICAgc2V0Q29sb3IocGFsZXR0ZS5Ub29sdGlwLCAnYmcnLCBjb2xvck1peChzYWZlQWxwaGEsIHBhbGV0dGUuZ3JleVs3MDBdLCAwLjkyKSk7XG4gICAgfVxuXG4gICAgLy8gTVVJIFggLSBEYXRhR3JpZCBuZWVkcyB0aGlzIHRva2VuLlxuICAgIHNldENvbG9yQ2hhbm5lbChwYWxldHRlLmJhY2tncm91bmQsICdkZWZhdWx0Jyk7XG5cbiAgICAvLyBhZGRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgYGJhY2tncm91bmQuZGVmYXVsdGAgdG9rZW5cbiAgICBzZXRDb2xvckNoYW5uZWwocGFsZXR0ZS5iYWNrZ3JvdW5kLCAncGFwZXInKTtcbiAgICBzZXRDb2xvckNoYW5uZWwocGFsZXR0ZS5jb21tb24sICdiYWNrZ3JvdW5kJyk7XG4gICAgc2V0Q29sb3JDaGFubmVsKHBhbGV0dGUuY29tbW9uLCAnb25CYWNrZ3JvdW5kJyk7XG4gICAgc2V0Q29sb3JDaGFubmVsKHBhbGV0dGUsICdkaXZpZGVyJyk7XG4gICAgT2JqZWN0LmtleXMocGFsZXR0ZSkuZm9yRWFjaChjb2xvciA9PiB7XG4gICAgICBjb25zdCBjb2xvcnMgPSBwYWxldHRlW2NvbG9yXTtcblxuICAgICAgLy8gVGhlIGRlZmF1bHQgcGFsZXR0ZXMgKHByaW1hcnksIHNlY29uZGFyeSwgZXJyb3IsIGluZm8sIHN1Y2Nlc3MsIGFuZCB3YXJuaW5nKSBlcnJvcnMgYXJlIGhhbmRsZWQgYnkgdGhlIGFib3ZlIGBjcmVhdGVUaGVtZSguLi4pYC5cblxuICAgICAgaWYgKGNvbG9yICE9PSAndG9uYWxPZmZzZXQnICYmIGNvbG9ycyAmJiB0eXBlb2YgY29sb3JzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBTaWxlbnQgdGhlIGVycm9yIGZvciBjdXN0b20gcGFsZXR0ZXMuXG4gICAgICAgIGlmIChjb2xvcnMubWFpbikge1xuICAgICAgICAgI
1HNldENvbG9yKHBhbGV0dGVbY29sb3JdLCAnbWFpbkNoYW5uZWwnLCBzYWZlQ29sb3JDaGFubmVsKHRvUmdiKGNvbG9ycy5tYWluKSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2xvcnMubGlnaHQpIHtcbiAgICAgICAgICBzZXRDb2xvcihwYWxldHRlW2NvbG9yXSwgJ2xpZ2h0Q2hhbm5lbCcsIHNhZmVDb2xvckNoYW5uZWwodG9SZ2IoY29sb3JzLmxpZ2h0KSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2xvcnMuZGFyaykge1xuICAgICAgICAgIHNldENvbG9yKHBhbGV0dGVbY29sb3JdLCAnZGFya0NoYW5uZWwnLCBzYWZlQ29sb3JDaGFubmVsKHRvUmdiKGNvbG9ycy5kYXJrKSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2xvcnMuY29udHJhc3RUZXh0KSB7XG4gICAgICAgICAgc2V0Q29sb3IocGFsZXR0ZVtjb2xvcl0sICdjb250cmFzdFRleHRDaGFubmVsJywgc2FmZUNvbG9yQ2hhbm5lbCh0b1JnYihjb2xvcnMuY29udHJhc3RUZXh0KSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2xvciA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgLy8gVGV4dCBjb2xvcnM6IHRleHQucHJpbWFyeSwgdGV4dC5zZWNvbmRhcnlcbiAgICAgICAgICBzZXRDb2xvckNoYW5uZWwocGFsZXR0ZVtjb2xvcl0sICdwcmltYXJ5Jyk7XG4gICAgICAgICAgc2V0Q29sb3JDaGFubmVsKHBhbGV0dGVbY29sb3JdLCAnc2Vjb25kYXJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbG9yID09PSAnYWN0aW9uJykge1xuICAgICAgICAgIC8vIEFjdGlvbiBjb2xvcnM6IGFjdGlvbi5hY3RpdmUsIGFjdGlvbi5zZWxlY3RlZFxuICAgICAgICAgIGlmIChjb2xvcnMuYWN0aXZlKSB7XG4gICAgICAgICAgICBzZXRDb2xvckNoYW5uZWwocGFsZXR0ZVtjb2xvcl0sICdhY3RpdmUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbG9ycy5zZWxlY3RlZCkge1xuICAgICAgICAgICAgc2V0Q29sb3JDaGFubmVsKHBhbGV0dGVbY29sb3JdLCAnc2VsZWN0ZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHRoZW1lID0gYXJncy5yZWR1Y2UoKGFjYywgYXJndW1lbnQpID0+IGRlZXBtZXJnZShhY2MsIGFyZ3VtZW50KSwgdGhlbWUpO1xuICBjb25zdCBwYXJzZXJDb25maWcgPSB7XG4gICAgcHJlZml4OiBjc3NWYXJQcmVmaXgsXG4gICAgZGlzYWJsZUNzc0NvbG9yU2NoZW1lLFxuICAgIHNob3VsZFNraXBHZW5lcmF0aW5nVmFyLFxuICAgIGdldFNlbGVjdG9yOiBkZWZhdWx0R2V0U2VsZWN0b3IodGhlbWUpLFxuICAgIGVuYWJsZUNvbnRyYXN0VmFyczogbmF0aXZlQ29sb3JcbiAgfTtcbiAgY29uc3Qge1xuICAgIHZhcnMsXG4gICAgZ2VuZXJhdGVUaGVtZVZhcnMsXG4gICAgZ2VuZXJhdGVTdHlsZVNoZWV0c1xuICB9ID0gcHJlcGFyZUNzc1ZhcnModGhlbWUsIHBhcnNlckNvbmZpZyk7XG4gIHRoZW1lLnZhcnMgPSB2YXJzO1xuICBPYmplY3QuZW50cmllcyh0aGVtZS5jb2xvclNjaGVtZXNbdGhlbWUuZGVmYXVsdENvbG9yU2NoZW1lXSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgdGhlbWVba2V5XSA9IHZhbHVlO1xuICB9KTtcbiAgdGhlbWUuZ2VuZXJhdGVUaGVtZVZhcnMgPSBnZW5lcmF0ZVRoZW1lVmFycztcbiAgdGhlbWUuZ2VuZXJhdGVTdHlsZVNoZWV0cyA9IGdlbmVyYXRlU3R5bGVTaGVldHM7XG4gIHRoZW1lLmdlbmVyYXRlU3BhY2luZyA9IGZ1bmN0aW9uIGdlbmVyYXRlU3BhY2luZygpIHtcbiAgICByZXR1cm4gY3JlYXRlU3BhY2luZyhpbnB1dC5zcGFjaW5nLCBjcmVhdGVVbmFyeVNwYWNpbmcodGhpcykpO1xuICB9O1xuICB0aGVtZS5nZXRDb2xvclNjaGVtZVNlbGVjdG9yID0gY3JlYXRlR2V0Q29sb3JTY2hlbWVTZWxlY3RvcihzZWxlY3Rvcik7XG4gIHRoZW1lLnNwYWNpbmcgPSB0aGVtZS5nZW5lcmF0ZVNwYWNpbmcoKTtcbiAgdGhlbWUuc2hvdWxkU2tpcEdlbmVyYXRpbmdWYXIgPSBzaG91bGRTa2lwR2VuZXJhdGluZ1ZhcjtcbiAgdGhlbWUudW5zdGFibGVfc3hDb25maWcgPSB7XG4gICAgLi4uZGVmYXVsdFN4Q29uZmlnLFxuICAgIC4uLmlucHV0Py51bnN0YWJsZV9zeENvbmZpZ1xuICB9O1xuICB0aGVtZS51bnN0YWJsZV9zeCA9IGZ1bmN0aW9uIHN4KHByb3BzKSB7XG4gICAgcmV0dXJuIHN0eWxlRnVuY3Rpb25TeCh7XG4gICAgICBzeDogcHJvcHMsXG4gICAgICB0aGVtZTogdGhpc1xuICAgIH0pO1xuICB9O1xuICB0aGVtZS50b1J1bnRpbWVTb3VyY2UgPSBzdHJpbmdpZnlUaGVtZTsgLy8gZm9yIFBpZ21lbnQgQ1NTIGludGVncmF0aW9uXG5cbiAgcmV0dXJuIHRoZW1lO1xufSIsImltcG9ydCBjcmVhdGVQYWxldHRlIGZyb20gXCIuL2NyZWF0ZVBhbGV0dGUuanNcIjtcbmltcG9ydCBjcmVhdGVUaGVtZVdpdGhWYXJzIGZyb20gXCIuL2NyZWF0ZVRoZW1lV2l0aFZhcnMuanNcIjtcbmltcG9ydCBjcmVhdGVUaGVtZU5vVmFycyBmcm9tIFwiLi9jcmVhdGVUaGVtZU5vVmFycy5qc1wiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5mdW5jdGlvbiBhdHRhY2hDb2xvclNjaGVtZSh0aGVtZSwgc2NoZW1lLCBjb2xvclNjaGVtZSkge1xuICBpZiAoIXRoZW1lLmNvbG9yU2NoZW1lcykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGNvbG9yU2NoZW1lKSB7XG4gICAgdGhlbWUuY29sb3JTY2hlbWVzW3NjaGVtZV0gPSB7XG4gICAgICAuLi4oY29sb3JTY2hlbWUgIT09IHRydWUgJiYgY29sb3JTY2hlbWUpLFxuICAgICAgcGFsZXR0ZTogY3JlYXRlUGFsZXR0ZSh7XG4gICAgICAgIC4uLihjb2xvclNjaGVtZSA9PT0gdHJ1ZSA/IHt9IDogY29sb3JTY2hlbWUucGFsZXR0ZSksXG4gICAgICAgIG1vZGU6IHNjaGVtZVxuICAgICAgfSkgLy8gY2FzdCB0eXBlIHRvIHNraXAgbW9kdWxlIGF1Z21lbnRhdGlvbiB0ZXN0XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgdGhlbWUgYmFzZSBvbiB0aGUgb3B0aW9ucyByZWNlaXZlZC5cbiAqIEBwYXJhbSBvcHRpb25zIFRha2VzIGFuIGluY29tcGxldGUgdGhlbWUgb2JqZWN0IGFuZCBhZGRzIHRoZSBtaXNzaW5nIHBhcnRzLlxuICogQHBhcmFtIGFyZ3MgRGVlcCBtZXJnZSB0aGUgYXJndW1lbnRzIHdpdGggdGhlIGFib3V0IHRvIGJlIHJldHVybmVkIHRoZW1lLlxuICogQHJldHVybnMgQSBjb21wbGV0ZSwgcmVhZHktdG8tdXNlIHRoZW1lIG9iamVjdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlVGhlbWUob3B0aW9ucyA9IHt9LFxuLy8gY2FzdCB0eXBlIHRvIHNraXAgbW9kdWxlIGF1Z21lbn
1RhdGlvbiB0ZXN0XG4uLi5hcmdzKSB7XG4gIGNvbnN0IHtcbiAgICBwYWxldHRlLFxuICAgIGNzc1ZhcmlhYmxlcyA9IGZhbHNlLFxuICAgIGNvbG9yU2NoZW1lczogaW5pdGlhbENvbG9yU2NoZW1lcyA9ICFwYWxldHRlID8ge1xuICAgICAgbGlnaHQ6IHRydWVcbiAgICB9IDogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRDb2xvclNjaGVtZTogaW5pdGlhbERlZmF1bHRDb2xvclNjaGVtZSA9IHBhbGV0dGU/Lm1vZGUsXG4gICAgLi4ub3RoZXJcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGRlZmF1bHRDb2xvclNjaGVtZUlucHV0ID0gaW5pdGlhbERlZmF1bHRDb2xvclNjaGVtZSB8fCAnbGlnaHQnO1xuICBjb25zdCBkZWZhdWx0U2NoZW1lID0gaW5pdGlhbENvbG9yU2NoZW1lcz8uW2RlZmF1bHRDb2xvclNjaGVtZUlucHV0XTtcbiAgY29uc3QgY29sb3JTY2hlbWVzSW5wdXQgPSB7XG4gICAgLi4uaW5pdGlhbENvbG9yU2NoZW1lcyxcbiAgICAuLi4ocGFsZXR0ZSA/IHtcbiAgICAgIFtkZWZhdWx0Q29sb3JTY2hlbWVJbnB1dF06IHtcbiAgICAgICAgLi4uKHR5cGVvZiBkZWZhdWx0U2NoZW1lICE9PSAnYm9vbGVhbicgJiYgZGVmYXVsdFNjaGVtZSksXG4gICAgICAgIHBhbGV0dGVcbiAgICAgIH1cbiAgICB9IDogdW5kZWZpbmVkKVxuICB9O1xuICBpZiAoY3NzVmFyaWFibGVzID09PSBmYWxzZSkge1xuICAgIGlmICghKCdjb2xvclNjaGVtZXMnIGluIG9wdGlvbnMpKSB7XG4gICAgICAvLyBCZWhhdmVzIGV4YWN0bHkgYXMgdjVcbiAgICAgIHJldHVybiBjcmVhdGVUaGVtZU5vVmFycyhvcHRpb25zLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgbGV0IHBhbGV0dGVPcHRpb25zID0gcGFsZXR0ZTtcbiAgICBpZiAoISgncGFsZXR0ZScgaW4gb3B0aW9ucykpIHtcbiAgICAgIGlmIChjb2xvclNjaGVtZXNJbnB1dFtkZWZhdWx0Q29sb3JTY2hlbWVJbnB1dF0pIHtcbiAgICAgICAgaWYgKGNvbG9yU2NoZW1lc0lucHV0W2RlZmF1bHRDb2xvclNjaGVtZUlucHV0XSAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHBhbGV0dGVPcHRpb25zID0gY29sb3JTY2hlbWVzSW5wdXRbZGVmYXVsdENvbG9yU2NoZW1lSW5wdXRdLnBhbGV0dGU7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdENvbG9yU2NoZW1lSW5wdXQgPT09ICdkYXJrJykge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdG8gcHJldmVudCB0aGUgbW9kdWxlIGF1Z21lbnRhdGlvbiB0ZXN0IGZyb20gZmFpbGluZ1xuICAgICAgICAgIHBhbGV0dGVPcHRpb25zID0ge1xuICAgICAgICAgICAgbW9kZTogJ2RhcmsnXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0aGVtZSA9IGNyZWF0ZVRoZW1lTm9WYXJzKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBwYWxldHRlOiBwYWxldHRlT3B0aW9uc1xuICAgIH0sIC4uLmFyZ3MpO1xuICAgIHRoZW1lLmRlZmF1bHRDb2xvclNjaGVtZSA9IGRlZmF1bHRDb2xvclNjaGVtZUlucHV0O1xuICAgIHRoZW1lLmNvbG9yU2NoZW1lcyA9IGNvbG9yU2NoZW1lc0lucHV0O1xuICAgIGlmICh0aGVtZS5wYWxldHRlLm1vZGUgPT09ICdsaWdodCcpIHtcbiAgICAgIHRoZW1lLmNvbG9yU2NoZW1lcy5saWdodCA9IHtcbiAgICAgICAgLi4uKGNvbG9yU2NoZW1lc0lucHV0LmxpZ2h0ICE9PSB0cnVlICYmIGNvbG9yU2NoZW1lc0lucHV0LmxpZ2h0KSxcbiAgICAgICAgcGFsZXR0ZTogdGhlbWUucGFsZXR0ZVxuICAgICAgfTtcbiAgICAgIGF0dGFjaENvbG9yU2NoZW1lKHRoZW1lLCAnZGFyaycsIGNvbG9yU2NoZW1lc0lucHV0LmRhcmspO1xuICAgIH1cbiAgICBpZiAodGhlbWUucGFsZXR0ZS5tb2RlID09PSAnZGFyaycpIHtcbiAgICAgIHRoZW1lLmNvbG9yU2NoZW1lcy5kYXJrID0ge1xuICAgICAgICAuLi4oY29sb3JTY2hlbWVzSW5wdXQuZGFyayAhPT0gdHJ1ZSAmJiBjb2xvclNjaGVtZXNJbnB1dC5kYXJrKSxcbiAgICAgICAgcGFsZXR0ZTogdGhlbWUucGFsZXR0ZVxuICAgICAgfTtcbiAgICAgIGF0dGFjaENvbG9yU2NoZW1lKHRoZW1lLCAnbGlnaHQnLCBjb2xvclNjaGVtZXNJbnB1dC5saWdodCk7XG4gICAgfVxuICAgIHJldHVybiB0aGVtZTtcbiAgfVxuICBpZiAoIXBhbGV0dGUgJiYgISgnbGlnaHQnIGluIGNvbG9yU2NoZW1lc0lucHV0KSAmJiBkZWZhdWx0Q29sb3JTY2hlbWVJbnB1dCA9PT0gJ2xpZ2h0Jykge1xuICAgIGNvbG9yU2NoZW1lc0lucHV0LmxpZ2h0ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gY3JlYXRlVGhlbWVXaXRoVmFycyh7XG4gICAgLi4ub3RoZXIsXG4gICAgY29sb3JTY2hlbWVzOiBjb2xvclNjaGVtZXNJbnB1dCxcbiAgICBkZWZhdWx0Q29sb3JTY2hlbWU6IGRlZmF1bHRDb2xvclNjaGVtZUlucHV0LFxuICAgIC4uLih0eXBlb2YgY3NzVmFyaWFibGVzICE9PSAnYm9vbGVhbicgJiYgY3NzVmFyaWFibGVzKVxuICB9LCAuLi5hcmdzKTtcbn0iLCIndXNlIGNsaWVudCc7XG5cbmltcG9ydCBjcmVhdGVUaGVtZSBmcm9tIFwiLi9jcmVhdGVUaGVtZS5qc1wiO1xuY29uc3QgZGVmYXVsdFRoZW1lID0gY3JlYXRlVGhlbWUoKTtcbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRUaGVtZTsiLCJleHBvcnQgZGVmYXVsdCAnJCRtYXRlcmlhbCc7IiwiLy8gY29waWVkIGZyb20gQG11aS9zeXN0ZW0vY3JlYXRlU3R5bGVkXG5mdW5jdGlvbiBzbG90U2hvdWxkRm9yd2FyZFByb3AocHJvcCkge1xuICByZXR1cm4gcHJvcCAhPT0gJ293bmVyU3RhdGUnICYmIHByb3AgIT09ICd0aGVtZScgJiYgcHJvcCAhPT0gJ3N4JyAmJiBwcm9wICE9PSAnYXMnO1xufVxuZXhwb3J0IGRlZmF1bHQgc2xvdFNob3VsZEZvcndhcmRQcm9wOyIsImltcG9ydCBzbG90U2hvdWxkRm9yd2FyZFByb3AgZnJvbSBcIi4vc2xvdFNob3VsZEZvcndhcmRQcm9wLmpzXCI7XG5jb25zdCByb290U2hvdWxkRm9yd2FyZFByb3AgPSBwcm9wID0+IHNsb3RTaG91bGRGb3J3YXJkUHJvcChwcm9wKSAmJiBwcm9wICE9PSAnY2xhc3Nlcyc7XG5leHBvcnQgZGVmYXVsdCByb290U2hvdWxkRm9yd2FyZFByb3A7IiwiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgY3JlYXRlU3R5bGVkIGZyb20gJ0BtdWkvc3lzdGVtL2NyZWF0ZVN0eWxlZCc7XG5pbXBvcnQgZGVmYXVsdFRoZW1lIGZyb20gXCIuL2RlZmF1bHRUaGVtZS5qc1wiO1xuaW1wb3J0IFRIRU1
1FX0lEIGZyb20gXCIuL2lkZW50aWZpZXIuanNcIjtcbmltcG9ydCByb290U2hvdWxkRm9yd2FyZFByb3AgZnJvbSBcIi4vcm9vdFNob3VsZEZvcndhcmRQcm9wLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHNsb3RTaG91bGRGb3J3YXJkUHJvcCB9IGZyb20gXCIuL3Nsb3RTaG91bGRGb3J3YXJkUHJvcC5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByb290U2hvdWxkRm9yd2FyZFByb3AgfSBmcm9tIFwiLi9yb290U2hvdWxkRm9yd2FyZFByb3AuanNcIjtcbmNvbnN0IHN0eWxlZCA9IGNyZWF0ZVN0eWxlZCh7XG4gIHRoZW1lSWQ6IFRIRU1FX0lELFxuICBkZWZhdWx0VGhlbWUsXG4gIHJvb3RTaG91bGRGb3J3YXJkUHJvcFxufSk7XG5leHBvcnQgZGVmYXVsdCBzdHlsZWQ7IiwiaW1wb3J0IHByZXByb2Nlc3NTdHlsZXMgZnJvbSBcIi4vcHJlcHJvY2Vzc1N0eWxlcy5qc1wiO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cblxuLy8gV2UgbmVlZCB0byBwYXNzIGFuIGFyZ3VtZW50IGFzIGB7IHRoZW1lIH1gIGZvciBQaWdtZW50Q1NTLCBidXQgd2UgZG9uJ3Qgd2FudCB0b1xuLy8gYWxsb2NhdGUgbW9yZSBvYmplY3RzLlxuY29uc3QgYXJnID0ge1xuICB0aGVtZTogdW5kZWZpbmVkXG59O1xuXG4vKipcbiAqIE1lbW9pemUgc3R5bGUgZnVuY3Rpb24gb24gdGhlbWUuXG4gKiBJbnRlbmRlZCB0byBiZSB1c2VkIGluIHN0eWxlZCgpIGNhbGxzIHRoYXQgb25seSBuZWVkIGFjY2VzcyB0byB0aGUgdGhlbWUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVuc3RhYmxlX21lbW9UaGVtZShzdHlsZUZuKSB7XG4gIGxldCBsYXN0VmFsdWU7XG4gIGxldCBsYXN0VGhlbWU7XG4gIHJldHVybiBmdW5jdGlvbiBzdHlsZU1lbW9pemVkKHByb3BzKSB7XG4gICAgbGV0IHZhbHVlID0gbGFzdFZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnRoZW1lICE9PSBsYXN0VGhlbWUpIHtcbiAgICAgIGFyZy50aGVtZSA9IHByb3BzLnRoZW1lO1xuICAgICAgdmFsdWUgPSBwcmVwcm9jZXNzU3R5bGVzKHN0eWxlRm4oYXJnKSk7XG4gICAgICBsYXN0VmFsdWUgPSB2YWx1ZTtcbiAgICAgIGxhc3RUaGVtZSA9IHByb3BzLnRoZW1lO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59IiwiaW1wb3J0IHsgdW5zdGFibGVfbWVtb1RoZW1lIH0gZnJvbSAnQG11aS9zeXN0ZW0nO1xuY29uc3QgbWVtb1RoZW1lID0gdW5zdGFibGVfbWVtb1RoZW1lO1xuZXhwb3J0IGRlZmF1bHQgbWVtb1RoZW1lOyIsImltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuXG4vKipcbiAqIEFkZCBrZXlzLCB2YWx1ZXMgb2YgYGRlZmF1bHRQcm9wc2AgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBgcHJvcHNgXG4gKiBAcGFyYW0gZGVmYXVsdFByb3BzXG4gKiBAcGFyYW0gcHJvcHNcbiAqIEBwYXJhbSBtZXJnZUNsYXNzTmFtZUFuZFN0eWxlIElmIGB0cnVlYCwgbWVyZ2VzIGBjbGFzc05hbWVgIGFuZCBgc3R5bGVgIHByb3BzIGluc3RlYWQgb2Ygb3ZlcnJpZGluZyB0aGVtLlxuICogICBXaGVuIGBmYWxzZWAgKGRlZmF1bHQpLCBwcm9wcyBvdmVycmlkZSBkZWZhdWx0UHJvcHMuIFdoZW4gYHRydWVgLCBgY2xhc3NOYW1lYCB2YWx1ZXMgYXJlIGNvbmNhdGVuYXRlZFxuICogICBhbmQgYHN0eWxlYCBvYmplY3RzIGFyZSBtZXJnZWQgd2l0aCBwcm9wcyB0YWtpbmcgcHJlY2VkZW5jZS5cbiAqIEByZXR1cm5zIHJlc29sdmVkIHByb3BzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlc29sdmVQcm9wcyhkZWZhdWx0UHJvcHMsIHByb3BzLCBtZXJnZUNsYXNzTmFtZUFuZFN0eWxlID0gZmFsc2UpIHtcbiAgY29uc3Qgb3V0cHV0ID0ge1xuICAgIC4uLnByb3BzXG4gIH07XG4gIGZvciAoY29uc3Qga2V5IGluIGRlZmF1bHRQcm9wcykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmYXVsdFByb3BzLCBrZXkpKSB7XG4gICAgICBjb25zdCBwcm9wTmFtZSA9IGtleTtcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ2NvbXBvbmVudHMnIHx8IHByb3BOYW1lID09PSAnc2xvdHMnKSB7XG4gICAgICAgIG91dHB1dFtwcm9wTmFtZV0gPSB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzW3Byb3BOYW1lXSxcbiAgICAgICAgICAuLi5vdXRwdXRbcHJvcE5hbWVdXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHByb3BOYW1lID09PSAnY29tcG9uZW50c1Byb3BzJyB8fCBwcm9wTmFtZSA9PT0gJ3Nsb3RQcm9wcycpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFNsb3RQcm9wcyA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIGNvbnN0IHNsb3RQcm9wcyA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgaWYgKCFzbG90UHJvcHMpIHtcbiAgICAgICAgICBvdXRwdXRbcHJvcE5hbWVdID0gZGVmYXVsdFNsb3RQcm9wcyB8fCB7fTtcbiAgICAgICAgfSBlbHNlIGlmICghZGVmYXVsdFNsb3RQcm9wcykge1xuICAgICAgICAgIG91dHB1dFtwcm9wTmFtZV0gPSBzbG90UHJvcHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0cHV0W3Byb3BOYW1lXSA9IHtcbiAgICAgICAgICAgIC4uLnNsb3RQcm9wc1xuICAgICAgICAgIH07XG4gICAgICAgICAgZm9yIChjb25zdCBzbG90S2V5IGluIGRlZmF1bHRTbG90UHJvcHMpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmYXVsdFNsb3RQcm9wcywgc2xvdEtleSkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2xvdFByb3BOYW1lID0gc2xvdEtleTtcbiAgICAgICAgICAgICAgb3V0cHV0W3Byb3BOYW1lXVtzbG90UHJvcE5hbWVdID0gcmVzb2x2ZVByb3BzKGRlZmF1bHRTbG90UHJvcHNbc2xvdFByb3BOYW1lXSwgc2xvdFByb3BzW3Nsb3RQcm9wTmFtZV0sIG1lcmdlQ2xhc3NOYW1lQW5kU3R5bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZSA9PT0gJ2NsYXNzTmFtZScgJiYgbWVyZ2VDbGFzc05hbWVBbmRTdHlsZSAmJiBwcm9wcy5jbGFzc05hbWUpIHtcbiAgICAgICAgb3V0cHV0LmNsYXNzTmFtZSA9IGNsc3goZGVmYXVsdFByb3BzPy5jbGFzc05hbWUsIHByb3BzPy5jbGFzc05hbWUpO1xuICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZSA9PT0gJ3N0eWxlJyAmJiBtZXJnZUNsYXNzTmFtZUFuZFN0eWxlICYmIHByb3BzLnN0eWxlKSB7XG4gICAgICAgIG91
1dHB1dC5zdHlsZSA9IHtcbiAgICAgICAgICAuLi5kZWZhdWx0UHJvcHM/LnN0eWxlLFxuICAgICAgICAgIC4uLnByb3BzPy5zdHlsZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChvdXRwdXRbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3V0cHV0W3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59IiwiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHJlc29sdmVQcm9wcyBmcm9tICdAbXVpL3V0aWxzL3Jlc29sdmVQcm9wcyc7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuY29uc3QgUHJvcHNDb250ZXh0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUNvbnRleHQodW5kZWZpbmVkKTtcbmZ1bmN0aW9uIERlZmF1bHRQcm9wc1Byb3ZpZGVyKHtcbiAgdmFsdWUsXG4gIGNoaWxkcmVuXG59KSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChQcm9wc0NvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gIH0pO1xufVxucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRGVmYXVsdFByb3BzUHJvdmlkZXIucHJvcFR5cGVzIC8qIHJlbW92ZS1wcm9wdHlwZXMgKi8gPSB7XG4gIC8vIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBXYXJuaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAvLyDilIIgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zLiDilIJcbiAgLy8g4pSCIFRvIHVwZGF0ZSB0aGVtLCBlZGl0IHRoZSBUeXBlU2NyaXB0IHR5cGVzIGFuZCBydW4gYHBucG0gcHJvcHR5cGVzYC4g4pSCXG4gIC8vIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5vYmplY3Rcbn0gOiB2b2lkIDA7XG5mdW5jdGlvbiBnZXRUaGVtZVByb3BzKHBhcmFtcykge1xuICBjb25zdCB7XG4gICAgdGhlbWUsXG4gICAgbmFtZSxcbiAgICBwcm9wc1xuICB9ID0gcGFyYW1zO1xuICBpZiAoIXRoZW1lIHx8ICF0aGVtZS5jb21wb25lbnRzIHx8ICF0aGVtZS5jb21wb25lbnRzW25hbWVdKSB7XG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG4gIGNvbnN0IGNvbmZpZyA9IHRoZW1lLmNvbXBvbmVudHNbbmFtZV07XG4gIGlmIChjb25maWcuZGVmYXVsdFByb3BzKSB7XG4gICAgLy8gY29tcGF0aWJsZSB3aXRoIHY1IHNpZ25hdHVyZVxuICAgIHJldHVybiByZXNvbHZlUHJvcHMoY29uZmlnLmRlZmF1bHRQcm9wcywgcHJvcHMsIHRoZW1lLmNvbXBvbmVudHMubWVyZ2VDbGFzc05hbWVBbmRTdHlsZSk7XG4gIH1cbiAgaWYgKCFjb25maWcuc3R5bGVPdmVycmlkZXMgJiYgIWNvbmZpZy52YXJpYW50cykge1xuICAgIC8vIHY2IHNpZ25hdHVyZSwgbm8gcHJvcGVydHkgJ2RlZmF1bHRQcm9wcydcbiAgICByZXR1cm4gcmVzb2x2ZVByb3BzKGNvbmZpZywgcHJvcHMsIHRoZW1lLmNvbXBvbmVudHMubWVyZ2VDbGFzc05hbWVBbmRTdHlsZSk7XG4gIH1cbiAgcmV0dXJuIHByb3BzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVzZURlZmF1bHRQcm9wcyh7XG4gIHByb3BzLFxuICBuYW1lXG59KSB7XG4gIGNvbnN0IGN0eCA9IFJlYWN0LnVzZUNvbnRleHQoUHJvcHNDb250ZXh0KTtcbiAgcmV0dXJuIGdldFRoZW1lUHJvcHMoe1xuICAgIHByb3BzLFxuICAgIG5hbWUsXG4gICAgdGhlbWU6IHtcbiAgICAgIGNvbXBvbmVudHM6IGN0eFxuICAgIH1cbiAgfSk7XG59XG5leHBvcnQgZGVmYXVsdCBEZWZhdWx0UHJvcHNQcm92aWRlcjsiLCIndXNlIGNsaWVudCc7XG5cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgU3lzdGVtRGVmYXVsdFByb3BzUHJvdmlkZXIsIHsgdXNlRGVmYXVsdFByb3BzIGFzIHVzZVN5c3RlbURlZmF1bHRQcm9wcyB9IGZyb20gJ0BtdWkvc3lzdGVtL0RlZmF1bHRQcm9wc1Byb3ZpZGVyJztcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYW
1N0L2pzeC1ydW50aW1lXCI7XG5mdW5jdGlvbiBEZWZhdWx0UHJvcHNQcm92aWRlcihwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goU3lzdGVtRGVmYXVsdFByb3BzUHJvdmlkZXIsIHtcbiAgICAuLi5wcm9wc1xuICB9KTtcbn1cbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IERlZmF1bHRQcm9wc1Byb3ZpZGVyLnByb3BUeXBlcyAvKiByZW1vdmUtcHJvcHR5cGVzICovID0ge1xuICAvLyDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgV2FybmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgLy8g4pSCIFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucy4g4pSCXG4gIC8vIOKUgiBUbyB1cGRhdGUgdGhlbSwgZWRpdCB0aGUgVHlwZVNjcmlwdCB0eXBlcyBhbmQgcnVuIGBwbnBtIHByb3B0eXBlc2AuIOKUglxuICAvLyDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCBEZWZhdWx0UHJvcHNQcm92aWRlcjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VEZWZhdWx0UHJvcHMocGFyYW1zKSB7XG4gIHJldHVybiB1c2VTeXN0ZW1EZWZhdWx0UHJvcHMocGFyYW1zKTtcbn0iLCJjb25zdCBkZWZhdWx0R2VuZXJhdG9yID0gY29tcG9uZW50TmFtZSA9PiBjb21wb25lbnROYW1lO1xuY29uc3QgY3JlYXRlQ2xhc3NOYW1lR2VuZXJhdG9yID0gKCkgPT4ge1xuICBsZXQgZ2VuZXJhdGUgPSBkZWZhdWx0R2VuZXJhdG9yO1xuICByZXR1cm4ge1xuICAgIGNvbmZpZ3VyZShnZW5lcmF0b3IpIHtcbiAgICAgIGdlbmVyYXRlID0gZ2VuZXJhdG9yO1xuICAgIH0sXG4gICAgZ2VuZXJhdGUoY29tcG9uZW50TmFtZSkge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlKGNvbXBvbmVudE5hbWUpO1xuICAgIH0sXG4gICAgcmVzZXQoKSB7XG4gICAgICBnZW5lcmF0ZSA9IGRlZmF1bHRHZW5lcmF0b3I7XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IENsYXNzTmFtZUdlbmVyYXRvciA9IGNyZWF0ZUNsYXNzTmFtZUdlbmVyYXRvcigpO1xuZXhwb3J0IGRlZmF1bHQgQ2xhc3NOYW1lR2VuZXJhdG9yOyIsImltcG9ydCBDbGFzc05hbWVHZW5lcmF0b3IgZnJvbSBcIi4uL0NsYXNzTmFtZUdlbmVyYXRvci9pbmRleC5qc1wiO1xuZXhwb3J0IGNvbnN0IGdsb2JhbFN0YXRlQ2xhc3NlcyA9IHtcbiAgYWN0aXZlOiAnYWN0aXZlJyxcbiAgY2hlY2tlZDogJ2NoZWNrZWQnLFxuICBjb21wbGV0ZWQ6ICdjb21wbGV0ZWQnLFxuICBkaXNhYmxlZDogJ2Rpc2FibGVkJyxcbiAgZXJyb3I6ICdlcnJvcicsXG4gIGV4cGFuZGVkOiAnZXhwYW5kZWQnLFxuICBmb2N1c2VkOiAnZm9jdXNlZCcsXG4gIGZvY3VzVmlzaWJsZTogJ2ZvY3VzVmlzaWJsZScsXG4gIG9wZW46ICdvcGVuJyxcbiAgcmVhZE9ubHk6ICdyZWFkT25seScsXG4gIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICBzZWxlY3RlZDogJ3NlbGVjdGVkJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdlbmVyYXRlVXRpbGl0eUNsYXNzKGNvbXBvbmVudE5hbWUsIHNsb3QsIGdsb2JhbFN0YXRlUHJlZml4ID0gJ011aScpIHtcbiAgY29uc3QgZ2xvYmFsU3RhdGVDbGFzcyA9IGdsb2JhbFN0YXRlQ2xhc3Nlc1tzbG90XTtcbiAgcmV0dXJuIGdsb2JhbFN0YXRlQ2xhc3MgPyBgJHtnbG9iYWxTdGF0ZVByZWZpeH0tJHtnbG9iYWxTdGF0ZUNsYXNzfWAgOiBgJHtDbGFzc05hbWVHZW5lcmF0b3IuZ2VuZXJhdGUoY29tcG9uZW50TmFtZSl9LSR7c2xvdH1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzR2xvYmFsU3RhdGUoc2xvdCkge1xuICByZXR1cm4gZ2xvYmFsU3RhdGVDbGFzc2VzW3Nsb3RdICE9PSB1bmRlZmluZWQ7XG59IiwiaW1wb3J0IGdlbmVyYXRlVXRpbGl0eUNsYXNzIGZyb20gXCIuLi9nZW5lcmF0ZVV0aWxpdHlDbGFzcy9pbmRleC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2VuZXJhdGVVdGlsaXR5Q2xhc3Nlcyhjb21wb25lbnROYW1lLCBzbG90cywgZ2xvYmFsU3RhdGVQcmVmaXggPSAnTXVpJykge1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgc2xvdHMuZm9yRWFjaChzbG90ID0+IHtcbiAgICByZXN1bHRbc2xvdF0gPSBnZW5lcmF0ZVV0aWxpdHlDbGFzcyhjb21wb25lbnROYW1lLCBzbG90LCBnbG9iYWxTdGF0ZVByZWZpeCk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufSIsImltcG9ydCBnZW5lcmF0ZVV0aWxpdHlDbGFzc2VzIGZyb20gJ0BtdWkvdXRpbHMvZ2VuZXJhdGVVdGlsaXR5Q2xhc3Nlcyc7XG5pbXBvcnQgZ2VuZXJhdGVVdGlsaXR5Q2xhc3MgZnJvbSAnQG11aS91dGlscy9nZW5lcmF0ZVV0aWxpdHlDbGFzcyc7XG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ZnSWNvblV0aWxpdHlDbGFzcyhzbG90KSB7XG4gIHJldHVybiBnZW5lcmF0ZVV0aWxpdHlDbGFzcygnTXVpU3ZnSWNvbicsIHNsb3QpO1xufVxuY29uc3Qgc3ZnSWNvbkNsYXNzZXMgPSBnZW5lcmF0ZVV0aWxpdHlDbGFzc2VzKCdNdWlTdmdJY29uJywgWydyb290JywgJ2NvbG9yUHJpbWFyeScsICdjb2xvclNlY29uZGFyeScsICdjb2xvckFjdGlvbicsICdjb2xvckVycm9yJywgJ2NvbG9yRGlzYWJsZWQnLCAnZm9udFNpemVJbmhlcml0JywgJ2ZvbnRTaXplU21hbGwnLCAnZm9udFNpemVNZWRpdW0nLCAnZm9udFNpemVMYXJnZSddKTtcbmV4cG9ydCBkZWZhdWx0IHN2Z0ljb25DbGFzc2VzOyIsIid1c2UgY2xpZW50JztcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IGNvbXBvc2VDbGFzc2VzIGZyb20gJ0BtdWkvdXRpbHMvY29tcG9zZUNsYXNzZXMnO1xuaW1wb3J0IGNhcGl0YWxpemUgZnJvbSBcIi4uL3V0aWxzL2NhcGl0YWxpemUuanNcIjtcbmltcG9ydCB7
1IHN0eWxlZCB9IGZyb20gXCIuLi96ZXJvLXN0eWxlZC9pbmRleC5qc1wiO1xuaW1wb3J0IG1lbW9UaGVtZSBmcm9tIFwiLi4vdXRpbHMvbWVtb1RoZW1lLmpzXCI7XG5pbXBvcnQgeyB1c2VEZWZhdWx0UHJvcHMgfSBmcm9tIFwiLi4vRGVmYXVsdFByb3BzUHJvdmlkZXIvaW5kZXguanNcIjtcbmltcG9ydCB7IGdldFN2Z0ljb25VdGlsaXR5Q2xhc3MgfSBmcm9tIFwiLi9zdmdJY29uQ2xhc3Nlcy5qc1wiO1xuaW1wb3J0IHsganN4IGFzIF9qc3gsIGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmNvbnN0IHVzZVV0aWxpdHlDbGFzc2VzID0gb3duZXJTdGF0ZSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb2xvcixcbiAgICBmb250U2l6ZSxcbiAgICBjbGFzc2VzXG4gIH0gPSBvd25lclN0YXRlO1xuICBjb25zdCBzbG90cyA9IHtcbiAgICByb290OiBbJ3Jvb3QnLCBjb2xvciAhPT0gJ2luaGVyaXQnICYmIGBjb2xvciR7Y2FwaXRhbGl6ZShjb2xvcil9YCwgYGZvbnRTaXplJHtjYXBpdGFsaXplKGZvbnRTaXplKX1gXVxuICB9O1xuICByZXR1cm4gY29tcG9zZUNsYXNzZXMoc2xvdHMsIGdldFN2Z0ljb25VdGlsaXR5Q2xhc3MsIGNsYXNzZXMpO1xufTtcbmNvbnN0IFN2Z0ljb25Sb290ID0gc3R5bGVkKCdzdmcnLCB7XG4gIG5hbWU6ICdNdWlTdmdJY29uJyxcbiAgc2xvdDogJ1Jvb3QnLFxuICBvdmVycmlkZXNSZXNvbHZlcjogKHByb3BzLCBzdHlsZXMpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBvd25lclN0YXRlXG4gICAgfSA9IHByb3BzO1xuICAgIHJldHVybiBbc3R5bGVzLnJvb3QsIG93bmVyU3RhdGUuY29sb3IgIT09ICdpbmhlcml0JyAmJiBzdHlsZXNbYGNvbG9yJHtjYXBpdGFsaXplKG93bmVyU3RhdGUuY29sb3IpfWBdLCBzdHlsZXNbYGZvbnRTaXplJHtjYXBpdGFsaXplKG93bmVyU3RhdGUuZm9udFNpemUpfWBdXTtcbiAgfVxufSkobWVtb1RoZW1lKCh7XG4gIHRoZW1lXG59KSA9PiAoe1xuICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gIHdpZHRoOiAnMWVtJyxcbiAgaGVpZ2h0OiAnMWVtJyxcbiAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gIGZsZXhTaHJpbms6IDAsXG4gIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zPy5jcmVhdGU/LignZmlsbCcsIHtcbiAgICBkdXJhdGlvbjogKHRoZW1lLnZhcnMgPz8gdGhlbWUpLnRyYW5zaXRpb25zPy5kdXJhdGlvbj8uc2hvcnRlclxuICB9KSxcbiAgdmFyaWFudHM6IFt7XG4gICAgcHJvcHM6IHByb3BzID0+ICFwcm9wcy5oYXNTdmdBc0NoaWxkLFxuICAgIHN0eWxlOiB7XG4gICAgICAvLyB0aGUgPHN2Zz4gd2lsbCBkZWZpbmUgdGhlIHByb3BlcnR5IHRoYXQgaGFzIGBjdXJyZW50Q29sb3JgXG4gICAgICAvLyBmb3IgZXhhbXBsZSBoZXJvaWNvbnMgdXNlcyBmaWxsPVwibm9uZVwiIGFuZCBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgZmlsbDogJ2N1cnJlbnRDb2xvcidcbiAgICB9XG4gIH0sIHtcbiAgICBwcm9wczoge1xuICAgICAgZm9udFNpemU6ICdpbmhlcml0J1xuICAgIH0sXG4gICAgc3R5bGU6IHtcbiAgICAgIGZvbnRTaXplOiAnaW5oZXJpdCdcbiAgICB9XG4gIH0sIHtcbiAgICBwcm9wczoge1xuICAgICAgZm9udFNpemU6ICdzbWFsbCdcbiAgICB9LFxuICAgIHN0eWxlOiB7XG4gICAgICBmb250U2l6ZTogdGhlbWUudHlwb2dyYXBoeT8ucHhUb1JlbT8uKDIwKSB8fCAnMS4yNXJlbSdcbiAgICB9XG4gIH0sIHtcbiAgICBwcm9wczoge1xuICAgICAgZm9udFNpemU6ICdtZWRpdW0nXG4gICAgfSxcbiAgICBzdHlsZToge1xuICAgICAgZm9udFNpemU6IHRoZW1lLnR5cG9ncmFwaHk/LnB4VG9SZW0/LigyNCkgfHwgJzEuNXJlbSdcbiAgICB9XG4gIH0sIHtcbiAgICBwcm9wczoge1xuICAgICAgZm9udFNpemU6ICdsYXJnZSdcbiAgICB9LFxuICAgIHN0eWxlOiB7XG4gICAgICBmb250U2l6ZTogdGhlbWUudHlwb2dyYXBoeT8ucHhUb1JlbT8uKDM1KSB8fCAnMi4xODc1cmVtJ1xuICAgIH1cbiAgfSxcbiAgLy8gVE9ETyB2NSBkZXByZWNhdGUgY29sb3IgcHJvcCwgdjYgcmVtb3ZlIGZvciBzeFxuICAuLi5PYmplY3QuZW50cmllcygodGhlbWUudmFycyA/PyB0aGVtZSkucGFsZXR0ZSkuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlICYmIHZhbHVlLm1haW4pLm1hcCgoW2NvbG9yXSkgPT4gKHtcbiAgICBwcm9wczoge1xuICAgICAgY29sb3JcbiAgICB9LFxuICAgIHN0eWxlOiB7XG4gICAgICBjb2xvcjogKHRoZW1lLnZhcnMgPz8gdGhlbWUpLnBhbGV0dGU/Lltjb2xvcl0/Lm1haW5cbiAgICB9XG4gIH0pKSwge1xuICAgIHByb3BzOiB7XG4gICAgICBjb2xvcjogJ2FjdGlvbidcbiAgICB9LFxuICAgIHN0eWxlOiB7XG4gICAgICBjb2xvcjogKHRoZW1lLnZhcnMgPz8gdGhlbWUpLnBhbGV0dGU/LmFjdGlvbj8uYWN0aXZlXG4gICAgfVxuICB9LCB7XG4gICAgcHJvcHM6IHtcbiAgICAgIGNvbG9yOiAnZGlzYWJsZWQnXG4gICAgfSxcbiAgICBzdHlsZToge1xuICAgICAgY29sb3I6ICh0aGVtZS52YXJzID8/IHRoZW1lKS5wYWxldHRlPy5hY3Rpb24/LmRpc2FibGVkXG4gICAgfVxuICB9LCB7XG4gICAgcHJvcHM6IHtcbiAgICAgIGNvbG9yOiAnaW5oZXJpdCdcbiAgICB9LFxuICAgIHN0eWxlOiB7XG4gICAgICBjb2xvcjogdW5kZWZpbmVkXG4gICAgfVxuICB9XVxufSkpKTtcbmNvbnN0IFN2Z0ljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBTdmdJY29uKGluUHJvcHMsIHJlZikge1xuICBjb25zdCBwcm9wcyA9IHVzZURlZmF1bHRQcm9wcyh7XG4gICAgcHJvcHM6IGluUHJvcHMsXG4gICAgbmFtZTogJ011aVN2Z0ljb24nXG4gIH0pO1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW4sXG4gICAgY2xhc3NOYW1lLFxuICAgIGNvbG9yID0gJ2luaGVyaXQnLFxuICAgIGNvbXBvbmVudCA9ICdzdmcnLFxuICAgIGZvbnRTaXplID0gJ21lZGl1bScsXG4gICAgaHRtbENvbG9yLFxuICAgIGluaGVyaXRWaWV3Qm94ID0gZmFsc2UsXG4gICAgdGl0bGVBY2Nlc3MsXG4gICAgdmlld0JveCA9ICcwIDAgMjQgMjQnLFxuICAgIC4uLm90aGVyXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgaGFzU3ZnQXNDaGlsZCA9IC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikgJiYgY2hpbGRyZW4udHlwZSA9PT0gJ3N2Zyc7XG4gIGNvbnN0IG93bmVyU3RhdGUgPSB7XG4gICAgLi4ucHJvcHMsXG4gICAgY29sb3IsXG4gICAgY29tcG9uZW50LFxuICAgIGZvbnRTaXplLFxuICAgIGluc3RhbmNlRm9udFNpemU6IGluUHJvcHMuZm9udFNpemUsXG4gICAgaW5oZXJpdFZpZXdCb3gsXG4gICAgdmlld0JveCxcbiAgICBoYXNTdmdBc0NoaWxkXG4gIH07XG4gIGNvbnN0IG1vcmUgPSB7fTtcbiAgaWYgKCFpbmhlcml0Vmlld0JveCkge1xuICAgIG1vcmUudmlld0JveCA9IHZpZXdCb3g7XG4gIH1cbiAgY29uc3QgY2xhc3NlcyA9IHVzZVV0aWxpdHlDbGFzc2VzKG93bmVyU3RhdGUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3hzKFN2Z0ljb25Sb290LCB7XG4gICAgYXM6IGNvbXBvbmVudCxcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5yb290LCBjbGFzc05hbWUpLFxuICAgIGZvY3VzYWJsZTogXCJmYWxzZVwiLFxuICAgIGNvbG9yOiBodG
11sQ29sb3IsXG4gICAgXCJhcmlhLWhpZGRlblwiOiB0aXRsZUFjY2VzcyA/IHVuZGVmaW5lZCA6IHRydWUsXG4gICAgcm9sZTogdGl0bGVBY2Nlc3MgPyAnaW1nJyA6IHVuZGVmaW5lZCxcbiAgICByZWY6IHJlZixcbiAgICAuLi5tb3JlLFxuICAgIC4uLm90aGVyLFxuICAgIC4uLihoYXNTdmdBc0NoaWxkICYmIGNoaWxkcmVuLnByb3BzKSxcbiAgICBvd25lclN0YXRlOiBvd25lclN0YXRlLFxuICAgIGNoaWxkcmVuOiBbaGFzU3ZnQXNDaGlsZCA/IGNoaWxkcmVuLnByb3BzLmNoaWxkcmVuIDogY2hpbGRyZW4sIHRpdGxlQWNjZXNzID8gLyojX19QVVJFX18qL19qc3goXCJ0aXRsZVwiLCB7XG4gICAgICBjaGlsZHJlbjogdGl0bGVBY2Nlc3NcbiAgICB9KSA6IG51bGxdXG4gIH0pO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBTdmdJY29uLnByb3BUeXBlcyAvKiByZW1vdmUtcHJvcHR5cGVzICovID0ge1xuICAvLyDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgV2FybmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgLy8g4pSCIFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucy4g4pSCXG4gIC8vIOKUgiAgICBUbyB1cGRhdGUgdGhlbSwgZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gYHBucG0gcHJvcHR5cGVzYC4gICAgIOKUglxuICAvLyDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgLyoqXG4gICAqIE5vZGUgcGFzc2VkIGludG8gdGhlIFNWRyBlbGVtZW50LlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LlxuICAgKiBJdCBzdXBwb3J0cyBib3RoIGRlZmF1bHQgYW5kIGN1c3RvbSB0aGVtZSBjb2xvcnMsIHdoaWNoIGNhbiBiZSBhZGRlZCBhcyBzaG93biBpbiB0aGVcbiAgICogW3BhbGV0dGUgY3VzdG9taXphdGlvbiBndWlkZV0oaHR0cHM6Ly9tdWkuY29tL21hdGVyaWFsLXVpL2N1c3RvbWl6YXRpb24vcGFsZXR0ZS8jY3VzdG9tLWNvbG9ycykuXG4gICAqIFlvdSBjYW4gdXNlIHRoZSBgaHRtbENvbG9yYCBwcm9wIHRvIGFwcGx5IGEgY29sb3IgYXR0cmlidXRlIHRvIHRoZSBTVkcgZWxlbWVudC5cbiAgICogQGRlZmF1bHQgJ2luaGVyaXQnXG4gICAqL1xuICBjb2xvcjogUHJvcFR5cGVzIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi8ub25lT2ZUeXBlKFtQcm9wVHlwZXMub25lT2YoWydpbmhlcml0JywgJ2FjdGlvbicsICdkaXNhYmxlZCcsICdwcmltYXJ5JywgJ3NlY29uZGFyeScsICdlcnJvcicsICdpbmZvJywgJ3N1Y2Nlc3MnLCAnd2FybmluZyddKSwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCB1c2VkIGZvciB0aGUgcm9vdCBub2RlLlxuICAgKiBFaXRoZXIgYSBzdHJpbmcgdG8gdXNlIGEgSFRNTCBlbGVtZW50IG9yIGEgY29tcG9uZW50LlxuICAgKi9cbiAgY29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG4gIC8qKlxuICAgKiBUaGUgZm9udFNpemUgYXBwbGllZCB0byB0aGUgaWNvbi4gRGVmYXVsdHMgdG8gMjRweCwgYnV0IGNhbiBiZSBjb25maWd1cmUgdG8gaW5oZXJpdCBmb250IHNpemUuXG4gICAqIEBkZWZhdWx0ICdtZWRpdW0nXG4gICAqL1xuICBmb250U2l6ZTogUHJvcFR5cGVzIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi8ub25lT2ZUeXBlKFtQcm9wVHlwZXMub25lT2YoWydpbmhlcml0JywgJ2xhcmdlJywgJ21lZGl1bScsICdzbWFsbCddKSwgUHJvcFR5cGVzLnN0cmluZ10pLFxuICAvKipcbiAgICogQXBwbGllcyBhIGNvbG9yIGF0dHJpYnV0ZSB0byB0aGUgU1ZHIGVsZW1lbnQuXG4gICAqL1xuICBodG1sQ29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSByb290IG5vZGUgd2lsbCBpbmhlcml0IHRoZSBjdXN0b20gYGNvbXBvbmVudGAncyB2aWV3Qm94IGFuZCB0aGUgYHZpZXdCb3hgXG4gICAqIHByb3Agd2lsbCBiZSBpZ25vcmVkLlxuICAgKiBVc2VmdWwgd2hlbiB5b3Ugd2FudCB0byByZWZlcmVuY2UgYSBjdXN0b20gYGNvbXBvbmVudGAgYW5kIGhhdmUgYFN2Z0ljb25gIHBhc3MgdGhhdFxuICAgKiBgY29tcG9uZW50YCdzIHZpZXdCb3ggdG8gdGhlIHJvb3Qgbm9kZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGluaGVyaXRWaWV3Qm94OiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIFRoZSBzaGFwZS1yZW5kZXJpbmcgYXR0cmlidXRlLiBUaGUgYmVoYXZpb3Igb2YgdGhlIGRpZmZlcmVudCBvcHRpb25zIGlzIGRlc2NyaWJlZCBvbiB0aGVcbiAgICogW01ETiBXZWIgRG9jc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvU1ZHL1JlZmVyZW5jZS9BdHRyaWJ1dGUvc2hhcGUtcmVuZGVyaW5nKS5cbiAgICogSWYgeW91IGFyZSBoYXZpbmcgaXNzdWVzIHdpdGggYmx1cnJ5IGljb25zIHlvdSBzaG91bGQgaW52ZXN0aWdhdGUgdGhpcyBwcm9wLlxuICAgKi9cbiAgc2hhcGVSZW5kZXJpbmc6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiBUaGUgc3lzdGVtIHByb3AgdGhhdCBhbGxvd3MgZGVmaW5pbmcgc3lzdGVtIG92ZXJyaWRlcyBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgQ1NTIHN0eWxlcy5cbiAgICovXG4gIHN4OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLmJvb2xdKSksIFByb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMub2JqZWN0XSksXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIGh1bWFuLXJlYWRhYmxlIHRpdGxlIGZvciB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGl0LlxuICAgKiBodHRwczovL3d3dy53My5vcmcvVFIvU1ZHLWFjY2Vzcy8jRXF1aXZhbGVudFxuICAgKi9cbiAgdGl0bGVBY2Nlc3M6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiBBbGxvd3MgeW91IHRvIHJlZGVmaW5lIHdoYXQgdGhlIGNvb3JkaW5hdGVzIHdpdGhvdXQgdW5pdHMgbWVhbiBpbnNpZGUgYW4gU1ZHIGVsZW1lbnQuXG4gICAqIEZvciBleGFtcGxlLCBpZiB0aGUgU1ZHIGVsZW1lbnQgaXMgNTAwICh3aWR0aCkgYnkgMjAwIChoZWlnaHQpLFxuICAgKiBhbmQgeW91IHBhc3Mgdmlld0JveD1cIjAgMCA1MCAyMFwiLFxuICAgKiB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvb3JkaW5hdGVzIGluc2lkZSB0aGUgU1ZHIHdpbGwgZ28gZnJvbSB0aGUgdG9wIGxlZnQgY29ybmVyICgwLDApXG4gICAqIHRvIGJvdHRvbSByaWdodCAoNTAsMjApIGFuZCBlYWNoIHVuaXQgd2lsbCBiZSB3b3J0aCAxMHB4LlxuICAgKiBAZGVmYXVsdCAnMCAwIDI0IDI0J1xuICAgKi9cbiAgdmlld0JveDogUHJvcFR5cGVzLnN0cmluZ1xufSA6IHZvaWQgMDtcblN2Z0ljb24ubXVpTmFtZSA9ICdTdmdJY29uJztcbmV4cG9ydCBkZWZhdWx0IFN2Z0ljb247IiwiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU3ZnSWNvbiBmcm9tIFwiLi4vU3ZnSWNvbi9pbmRleC5qc1wiO1xuXG4vKipcbiAqIFByaXZhdGUgbW9kdWxlIHJlc2VydmVkIGZvciBAbXVpIHBhY2thZ2VzLlxuICovXG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlU3ZnSWNvbihwYXRoLCBkaXNwbGF5TmFtZSkge1xuICBmdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIHJlZikge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChTdmdJY29uLCB7XG4gICAgICBcImRhdGEtdGVzdGlkXCI6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBgJHtkaXNwbGF5TmFtZX1JY29uYCA6IHVuZGVmaW5lZCxcbiAgICAgIHJlZjogcmVmLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBjaGlsZHJlbjogcGF0aFxuICAgIH0pO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gTmVlZCB0byBzZXQgYGRpc3BsYXlOYW1lYCBvbiB0aGUgaW5uZXIgY29tcG9uZW50IGZvciBSZWFjdC5tZW1vLlxuICAgIC8vIFJlYWN0IHByaW9yIHRvIDE2LjE0IGlnbm9yZXMgYGRpc3BsYXlOYW1lYCBvbiB0aGUgd3JhcHBlci5cbiAgICBDb21wb25lbnQuZGlzcGxheU5hbWUgPSBgJHtkaXNwbGF5TmFtZX1JY29uYDtcbiAgfVxuICBDb21wb25lbnQubXVpTmFtZSA9IFN2Z0ljb24ubXVpTmFtZTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5tZW1vKC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKENvbXBvbmVudCkpO1xufSJdLCJuYW1lcyI6WyJjYXBpdGFsaXplIiwiY29tbW9uIiwiYmxhY2siLCJ3aGl0ZSIsImdyZXkiLCJBMTAwIiwiQTIwMCIsIkE0MDAiLCJBNzAwIiwicHVycGxlIiwicmVkIiwib3JhbmdlIiwiYmx1ZSIsImxpZ2h0Qmx1ZSIsImdyZWVuIiwiX2Zvcm1hdEVycm9yTWVzc2FnZSIsImRlZXBtZXJnZSIsImRhcmtlbiIsImdldENvbnRyYXN0UmF0aW8iLCJsaWdodGVuIiwiZ2V0TGlnaHQiLCJ0ZXh0IiwicHJpbWFyeSIsInNlY29uZGFyeSIsImRpc2FibGVkIiwiZGl2aWRlciIsImJhY2tncm91bmQiLCJwYXBlciIsImRlZmF1bHQiLCJhY3Rpb24iLCJhY3RpdmUiLCJob3ZlciIsImhvdmVyT3BhY2l0eSIsInNlbGVjdGVkIiwic2VsZWN0ZWRPcGFjaXR5IiwiZGlzYWJsZWRCYWNrZ3JvdW5kIiwiZGlzYWJsZWRPcGFjaXR5IiwiZm9jdXMiLCJmb2N1c09wYWNpdHkiLCJhY3RpdmF0ZWRPcGFjaXR5IiwibGlnaHQiLCJnZXREYXJrIiwiaWNvbiIsImRhcmsiLCJhZGRMaWdodE9yRGFyayIsImludGVudCIsImRpcmVjdGlvbiIsInNoYWRlIiwidG9uYWxPZmZzZXQiLCJ0b25hbE9mZnNldExpZ2h0IiwidG9uYWxPZmZzZXREYXJrIiwiaGFzT3duUHJvcGVydHkiLCJtYWluIiwibWl4TGlnaHRPckRhcmsiLCJjb2xvclNwYWNlIiwidG9GaXhlZCIsImdldERlZmF1bHRQcmltYXJ5IiwibW9kZSIsImdldERlZmF1bHRTZWNvbmRhcnkiLCJnZXREZWZhdWx0RXJyb3IiLCJnZXREZWZhdWx0SW5mbyIsImdldERlZmF1bHRTdWNjZXNzIiwiZ2V0RGVmYXVsdFdhcm5pbmciLCJ
1jb250cmFzdENvbG9yIiwiY3JlYXRlUGFsZXR0ZSIsInBhbGV0dGUiLCJjb250cmFzdFRocmVzaG9sZCIsIm90aGVyIiwiZXJyb3IiLCJpbmZvIiwic3VjY2VzcyIsIndhcm5pbmciLCJnZXRDb250cmFzdFRleHQiLCJjb250cmFzdFRleHQiLCJwcm9jZXNzIiwiY29udHJhc3QiLCJjb25zb2xlIiwiam9pbiIsImF1Z21lbnRDb2xvciIsImNvbG9yIiwibmFtZSIsIm1haW5TaGFkZSIsImxpZ2h0U2hhZGUiLCJkYXJrU2hhZGUiLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJtb2RlSHlkcmF0ZWQiLCJwYWxldHRlT3V0cHV0IiwiY3JlYXRlTWl4aW5zIiwiYnJlYWtwb2ludHMiLCJtaXhpbnMiLCJ0b29sYmFyIiwibWluSGVpZ2h0IiwidXAiLCJyb3VuZCIsInZhbHVlIiwiTWF0aCIsImNhc2VBbGxDYXBzIiwidGV4dFRyYW5zZm9ybSIsImRlZmF1bHRGb250RmFtaWx5IiwiY3JlYXRlVHlwb2dyYXBoeSIsInR5cG9ncmFwaHkiLCJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250V2VpZ2h0TGlnaHQiLCJmb250V2VpZ2h0UmVndWxhciIsImZvbnRXZWlnaHRNZWRpdW0iLCJmb250V2VpZ2h0Qm9sZCIsImh0bWxGb250U2l6ZSIsImFsbFZhcmlhbnRzIiwicHhUb1JlbSIsInB4VG9SZW0yIiwiY29lZiIsInNpemUiLCJidWlsZFZhcmlhbnQiLCJmb250V2VpZ2h0IiwibGluZUhlaWdodCIsImxldHRlclNwYWNpbmciLCJjYXNpbmciLCJ2YXJpYW50cyIsImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiIsInN1YnRpdGxlMSIsInN1YnRpdGxlMiIsImJvZHkxIiwiYm9keTIiLCJidXR0b24iLCJjYXB0aW9uIiwib3ZlcmxpbmUiLCJpbmhlcml0IiwiY2xvbmUiLCJzaGFkb3dLZXlVbWJyYU9wYWNpdHkiLCJzaGFkb3dLZXlQZW51bWJyYU9wYWNpdHkiLCJzaGFkb3dBbWJpZW50U2hhZG93T3BhY2l0eSIsImNyZWF0ZVNoYWRvdyIsInB4Iiwic2hhZG93cyIsImVhc2luZyIsImVhc2VJbk91dCIsImVhc2VPdXQiLCJlYXNlSW4iLCJzaGFycCIsImR1cmF0aW9uIiwic2hvcnRlc3QiLCJzaG9ydGVyIiwic2hvcnQiLCJzdGFuZGFyZCIsImNvbXBsZXgiLCJlbnRlcmluZ1NjcmVlbiIsImxlYXZpbmdTY3JlZW4iLCJmb3JtYXRNcyIsIm1pbGxpc2Vjb25kcyIsImdldEF1dG9IZWlnaHREdXJhdGlvbiIsImhlaWdodCIsImNvbnN0YW50IiwibWluIiwiY3JlYXRlVHJhbnNpdGlvbnMiLCJpbnB1dFRyYW5zaXRpb25zIiwibWVyZ2VkRWFzaW5nIiwibWVyZ2VkRHVyYXRpb24iLCJjcmVhdGUiLCJwcm9wcyIsIm9wdGlvbnMiLCJkdXJhdGlvbk9wdGlvbiIsImVhc2luZ09wdGlvbiIsImRlbGF5IiwiaXNTdHJpbmciLCJpc051bWJlciIsIk51bWJlciIsImlzTmFOIiwicGFyc2VGbG9hdCIsIkFycmF5IiwiaXNBcnJheSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJtYXAiLCJhbmltYXRlZFByb3AiLCJ6SW5kZXgiLCJtb2JpbGVTdGVwcGVyIiwiZmFiIiwic3BlZWREaWFsIiwiYXBwQmFyIiwiZHJhd2VyIiwibW9kYWwiLCJzbmFja2JhciIsInRvb2x0aXAiLCJpc1BsYWluT2JqZWN0IiwiaXNTZXJpYWxpemFibGUiLCJ2YWwiLCJzdHJpbmdpZnlUaGVtZSIsImJhc2VUaGVtZSIsInNlcmlhbGl6YWJsZVRoZW1lIiwic2VyaWFsaXplVGhlbWUiLCJvYmplY3QiLCJhcnJheSIsImVudHJpZXMiLCJpbmRleCIsImtleSIsInN0YXJ0c1dpdGgiLCJzdHlsZUZ1bmN0aW9uU3giLCJ1bnN0YWJsZV9kZWZhdWx0U3hDb25maWciLCJkZWZhdWx0U3hDb25maWciLCJzeXN0ZW1DcmVhdGVUaGVtZSIsImFscGhhIiwic3lzdGVtQWxwaGEiLCJzeXN0ZW1MaWdodGVuIiwic3lzdGVtRGFya2VuIiwiZ2VuZXJhdGVVdGlsaXR5Q2xhc3MiLCJjb2VmZmljaWVudFRvUGVyY2VudGFnZSIsImNvZWZmaWNpZW50IiwicGFyc2VBZGRpdGlvbiIsInN0ciIsIm51bWJlcnMiLCJtYXRjaCIsInN1bSIsImkiLCJhdHRhY2hDb2xvck1hbmlwdWxhdG9ycyIsInRoZW1lIiwiYXNzaWduIiwib2JqIiwidmFycyIsInJlcGxhY2UiLCJjcmVhdGVUaGVtZU5vVmFycyIsImFyZ3MiLCJicmVha3BvaW50c0lucHV0IiwibWl4aW5zSW5wdXQiLCJzcGFjaW5nIiwic3BhY2luZ0lucHV0IiwicGFsZXR0ZUlucHV0IiwidHJhbnNpdGlvbnMiLCJ0cmFuc2l0aW9uc0lucHV0IiwidHlwb2dyYXBoeUlucHV0Iiwic2hhcGUiLCJzaGFwZUlucHV0IiwiZ2VuZXJhdGVUaGVtZVZhcnMiLCJ1bmRlZmluZWQiLCJzeXN0ZW1UaGVtZSIsIm11aVRoZW1lIiwic2xpY2UiLCJyZWR1Y2UiLCJhY2MiLCJhcmd1bWVudCIsInN0YXRlQ2xhc3NlcyIsInRyYXZlcnNlIiwibm9kZSIsImNvbXBvbmVudCIsImNoaWxkIiwiaW5jbHVkZXMiLCJzdGF0ZUNsYXNzIiwicm9vdCIsImNvbXBvbmVudHMiLCJmb3JFYWNoIiwic3R5bGVPdmVycmlkZXMiLCJ1bnN0YWJsZV9zeENvbmZpZyIsInVuc3RhYmxlX3N4Iiwic3giLCJ0b1J1bnRpbWVTb3VyY2UiLCJnZXRPdmVybGF5QWxwaGEiLCJlbGV2YXRpb24iLCJhbHBoYVZhbHVlIiwibG9nIiwiZGVmYXVsdERhcmtPdmVybGF5cyIsIl8iLCJvdmVybGF5IiwiZ2V0T3BhY2l0eSIsImlucHV0UGxhY2Vob2xkZXIiLCJpbnB1dFVuZGVybGluZSIsInN3aXRjaFRyYWNrRGlzYWJsZWQiLCJzd2l0Y2hUcmFjayIsImdldE92ZXJsYXlzIiwiY3JlYXRlQ29sb3JTY2hlbWUiLCJvcGFjaXR5Iiwib3ZlcmxheXMiLCJzaG91bGRTa2lwR2VuZXJhdGluZ1ZhciIsImV4Y2x1ZGVWYXJpYWJsZXNGcm9tUm9vdCIsImNzc1ZhclByZWZpeCIsImNvbG9yU2NoZW1lIiwiY3NzIiwicm9vdFNlbGVjdG9yIiwic2VsZWN0b3IiLCJjb2xvclNjaGVtZVNlbGVjdG9yIiwicnVsZSIsImRlZmF1bHRDb2xvclNjaGVtZSIsImV4Y2x1ZGVkVmFyaWFibGVzIiwiY3NzVmFyIiwiU3RyaW5nIiwidW5zdGFibGVfY3JlYXRlR2V0Q3NzVmFyIiwic3lzdGVtQ3JlYXRlR2V0Q3NzVmFyIiwiY3JlYXRlU3BhY2luZyIsImNyZWF0ZVVuYXJ5U3BhY2luZyIsInByZXBhcmVDc3NWYXJzIiwicHJlcGFyZVR5cG9ncmFwaHlWYXJzIiwiY3JlYXRlR2V0Q29sb3JTY2hlbWVTZWxlY3RvciIsInByaXZhdGVfc2FmZUNvbG9yQ2hhbm5lbCIsInNhZmVDb2xvckNoYW5uZWwiLCJwcml2YXRlX3NhZmVBbHBoYSIsInNhZmVBbHBoYSIsInByaXZhdGVfc2FmZURhcmtlbiIsInNhZmVEYXJrZW4iLCJwcml2YXRlX3NhZmVMaWdodGVuIiwic2FmZUxpZ2h0ZW4iLCJwcml2YXRlX3NhZmVFbXBoYXNpemUiLCJzYWZlRW1waGFzaXplIiwiaHNsVG9SZ2IiLCJkZWZhdWx0U2hvdWxkU2tpcEdlbmVyYXRpbmdWYXIiLCJkZWZhdWx0R2V0U2VsZWN0b3IiLCJhc3NpZ25Ob2RlIiwiayIsInNldENvbG9yIiwiZGVmYXVsdFZhbHVlIiwidG9SZ2IiLCJzZXRDb2xvckNoYW5uZWwiLCJnZXRTcGFjaW5nVmFsIiwic2lsZW50Iiwi
1Zm4iLCJjcmVhdGVHZXRDc3NWYXIiLCJhdHRhY2hDb2xvclNjaGVtZSIsImNvbG9yU2NoZW1lcyIsInNjaGVtZSIsInJlc3RUaGVtZSIsImNyZWF0ZVRoZW1lV2l0aFZhcnMiLCJjb2xvclNjaGVtZXNJbnB1dCIsImRlZmF1bHRDb2xvclNjaGVtZUlucHV0IiwiZGlzYWJsZUNzc0NvbG9yU2NoZW1lIiwibmF0aXZlQ29sb3IiLCJpbnB1dCIsImZpcnN0Q29sb3JTY2hlbWUiLCJnZXRDc3NWYXIiLCJkZWZhdWx0U2NoZW1lSW5wdXQiLCJidWlsdEluTGlnaHQiLCJidWlsdEluRGFyayIsImN1c3RvbUNvbG9yU2NoZW1lcyIsImRlZmF1bHRTY2hlbWUiLCJmb250Iiwic2V0Q3NzVmFyQ29sb3IiLCJ0b2tlbnMiLCJzcGxpdCIsImNvbG9yVG9rZW4iLCJjb2xvck1peCIsIm1ldGhvZCIsIm1peGVyIiwiQWxlcnQiLCJBcHBCYXIiLCJBdmF0YXIiLCJCdXR0b24iLCJDaGlwIiwiRmlsbGVkSW5wdXQiLCJMaW5lYXJQcm9ncmVzcyIsIlNrZWxldG9uIiwiU2xpZGVyIiwic25hY2tiYXJDb250ZW50QmFja2dyb3VuZCIsIlNuYWNrYmFyQ29udGVudCIsIlNwZWVkRGlhbEFjdGlvbiIsIlN0ZXBDb25uZWN0b3IiLCJTdGVwQ29udGVudCIsIlN3aXRjaCIsIlRhYmxlQ2VsbCIsIlRvb2x0aXAiLCJjb2xvcnMiLCJwYXJzZXJDb25maWciLCJwcmVmaXgiLCJnZXRTZWxlY3RvciIsImVuYWJsZUNvbnRyYXN0VmFycyIsImdlbmVyYXRlU3R5bGVTaGVldHMiLCJnZW5lcmF0ZVNwYWNpbmciLCJnZXRDb2xvclNjaGVtZVNlbGVjdG9yIiwiY3JlYXRlVGhlbWUiLCJjc3NWYXJpYWJsZXMiLCJpbml0aWFsQ29sb3JTY2hlbWVzIiwiaW5pdGlhbERlZmF1bHRDb2xvclNjaGVtZSIsInBhbGV0dGVPcHRpb25zIiwiZGVmYXVsdFRoZW1lIiwic2xvdFNob3VsZEZvcndhcmRQcm9wIiwicHJvcCIsInJvb3RTaG91bGRGb3J3YXJkUHJvcCIsImNyZWF0ZVN0eWxlZCIsIlRIRU1FX0lEIiwic3R5bGVkIiwidGhlbWVJZCIsInVuc3RhYmxlX21lbW9UaGVtZSIsIm1lbW9UaGVtZSIsIlJlYWN0IiwiUHJvcFR5cGVzIiwiU3lzdGVtRGVmYXVsdFByb3BzUHJvdmlkZXIiLCJ1c2VEZWZhdWx0UHJvcHMiLCJ1c2VTeXN0ZW1EZWZhdWx0UHJvcHMiLCJqc3giLCJfanN4IiwiRGVmYXVsdFByb3BzUHJvdmlkZXIiLCJwcm9wVHlwZXMiLCJjaGlsZHJlbiIsImlzUmVxdWlyZWQiLCJwYXJhbXMiLCJnZW5lcmF0ZVV0aWxpdHlDbGFzc2VzIiwiZ2V0U3ZnSWNvblV0aWxpdHlDbGFzcyIsInNsb3QiLCJzdmdJY29uQ2xhc3NlcyIsImNsc3giLCJjb21wb3NlQ2xhc3NlcyIsImpzeHMiLCJfanN4cyIsInVzZVV0aWxpdHlDbGFzc2VzIiwib3duZXJTdGF0ZSIsImNsYXNzZXMiLCJzbG90cyIsIlN2Z0ljb25Sb290Iiwib3ZlcnJpZGVzUmVzb2x2ZXIiLCJzdHlsZXMiLCJ1c2VyU2VsZWN0Iiwid2lkdGgiLCJkaXNwbGF5IiwiZmxleFNocmluayIsInRyYW5zaXRpb24iLCJoYXNTdmdBc0NoaWxkIiwic3R5bGUiLCJmaWxsIiwiZmlsdGVyIiwiU3ZnSWNvbiIsImZvcndhcmRSZWYiLCJpblByb3BzIiwicmVmIiwiY2xhc3NOYW1lIiwiaHRtbENvbG9yIiwiaW5oZXJpdFZpZXdCb3giLCJ0aXRsZUFjY2VzcyIsInZpZXdCb3giLCJpc1ZhbGlkRWxlbWVudCIsInR5cGUiLCJpbnN0YW5jZUZvbnRTaXplIiwibW9yZSIsImFzIiwiZm9jdXNhYmxlIiwicm9sZSIsInN0cmluZyIsIm9uZU9mVHlwZSIsIm9uZU9mIiwiZWxlbWVudFR5cGUiLCJib29sIiwic2hhcGVSZW5kZXJpbmciLCJhcnJheU9mIiwiZnVuYyIsIm11aU5hbWUiLCJjcmVhdGVTdmdJY29uIiwicGF0aCIsImRpc3BsYXlOYW1lIiwiQ29tcG9uZW50IiwibWVtbyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6273\n"))},7639:(__unused_webpack_module,exports,__webpack_require__)=>{eval(__webpack_require__.ts('var __webpack_unused_export__;\n/**\n * @license React\n * react-is.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\nvar REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"),\n  REACT_PORTAL_TYPE = Symbol.for("react.portal"),\n  REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"),\n  REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"),\n  REACT_PROFILER_TYPE = Symbol.for("react.profiler"),\n  REACT_CONSUMER_TYPE = Symbol.for("react.consumer"),\n  REACT_CONTEXT_TYPE = Symbol.for("react.context"),\n  REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"),\n  REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"),\n  REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"),\n  REACT_MEMO_TYPE = Symbol.for("react.memo"),\n  REACT_LAZY_TYPE = Symbol.for("react.lazy"),\n  REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"),\n  REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference");\nfunction typeOf(object) {\n  if ("object" === typeof object && null !== object) {\n    var $$typeof = object.$$typeof;\n    switch ($$typeof) {\n      case REACT_ELEMENT_TYPE:\n        switch (((object = object.type), object)) {\n          case REACT_FRAGMENT_TYPE:\n          case REACT_PROFILER_TYPE:\n          case REACT_STRICT_MODE_TYPE:\n          case REACT_SUSPENSE_TYPE:\n          case REACT_SUSPENSE_LIST_TYPE:\n          case REACT_VIEW_TRANSITION_TYPE:\n            return object;\n          default:\n            switch (((object = object && object.$$typeof), object)) {\n              case REACT_CONTEXT_TYPE:\n              case REACT_FORWARD_REF_TYPE:\n              case REACT_LAZY_TYPE:\n              case REACT_MEMO_TYPE:\n                return object;\n              case REACT_CONSUMER_TYPE:\n                return object;\n              default:\n                return $$typeof;\n            }\n        }\n      case REACT_PORTAL_TYPE:\n        return $$typeof;\n    }\n  }\n}\n__webpack_unused_export__ = REACT_CONSUMER_TYPE;\n__webpack_unused_export__ = REACT_CONTEXT_TYPE;\n__webpack_unused_export__ = REACT_ELEMENT_TYPE;\n__webpack_unused_export__ = REACT_FORWARD_REF_TYPE;\n__webpack_unused_export__ = REACT_FRAGMENT_TYPE;\n__webpack_unused_export__ = REACT_LAZY_TYPE;\n__webpack_unused_export__ = REACT_MEMO_TYPE;\n__webpack_unused_export__ = REACT_PORTAL_TYPE;\n__webpack_unused_export__ = REACT_PROFILER_TYPE;\n__webpack_unused_export__ = REACT_STRICT_MODE_TYPE;\n__webpack_unused_export__ = REACT_SUSPENSE_TYPE;\n__webpack_unused_export__ = REACT_SUSPENSE_LIST_TYPE;\n__webpack_unused_export__ = function (object) {\n  return typeOf(object) === REACT_CONSUMER_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n  return typeOf(object) === REACT_CONTEXT_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n  return (\n    "object" === typeof object &&\n    null !== object &&\n    object.$$typeof === REACT_ELEMENT_TYPE\n  );\n};\n__webpack_unused_export__ = function (object) {\n  return typeOf(object) === REACT_FORWARD_REF_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n  return typeOf(object) === REACT_FRAGMENT_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n  return typeOf(object) === REACT_LAZY_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n  return typeOf(object) === REACT_MEMO_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n  return typeOf(object) === REACT_PORTAL_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n  return typeOf(object) === REACT_PROFILER_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n  return typeOf(object) === REACT_STRICT_MODE_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n  return typeOf(object) === REACT_SUSPENSE_TYPE;\n};\n__webpack_unused_export__ = function (object) {\n  return typeOf(object) === REACT_SUSPENSE_LIST_TYPE;\n};\nexports.Hy = function (type) {\n  return "string" === typeof type ||\n    "function" === typeof type ||\n    type === REACT_FRAGMENT_TYPE ||\n    type === REACT_PROFILER_TYPE ||\n    type === REACT_STRICT_MODE_TYPE ||\n    type === REACT_SUSPENSE_TYPE ||\n    type === REACT_SUSPENSE_LIST_TYPE ||\n    ("object" === typeof type &&\n      null !== type &&\n      (type.$$typeof === REACT_LAZY_TYPE ||\n        type.$$typeof === REACT_MEMO_TYPE ||\n        type.$$typeof === REACT_CONTEXT_TYPE ||\n        type.$$typeof === REACT_CONSUMER_TYPE ||\n        type.$$typeof === REACT_FORWARD_REF_TYPE ||\n        type.$$typeof === REACT_CLIENT_REFERENCE ||\n        void 0 !== type.getModuleId))\n    ? !0\n    : !1;\n};\n__webpack_unused_export__ = typeOf;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYzOS5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXVCO0FBQ3ZCLHlCQUF1QjtBQUN2Qix5QkFBZTtBQUNmLHlCQU
1FrQjtBQUNsQix5QkFBZ0I7QUFDaEIseUJBQVk7QUFDWix5QkFBWTtBQUNaLHlCQUFjO0FBQ2QseUJBQWdCO0FBQ2hCLHlCQUFrQjtBQUNsQix5QkFBZ0I7QUFDaEIseUJBQW9CO0FBQ3BCLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSx5QkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQSx5QkFBa0I7QUFDbEI7QUFDQTtBQUNBLHlCQUFjO0FBQ2Q7QUFDQTtBQUNBLHlCQUFjO0FBQ2Q7QUFDQTtBQUNBLHlCQUFnQjtBQUNoQjtBQUNBO0FBQ0EseUJBQWtCO0FBQ2xCO0FBQ0E7QUFDQSx5QkFBb0I7QUFDcEI7QUFDQTtBQUNBLHlCQUFrQjtBQUNsQjtBQUNBO0FBQ0EseUJBQXNCO0FBQ3RCO0FBQ0E7QUFDQSxVQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUFjIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5qcz83YmM2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWlzLnByb2R1Y3Rpb24uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblwidXNlIHN0cmljdFwiO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC50cmFuc2l0aW9uYWwuZWxlbWVudFwiKSxcbiAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpLFxuICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLFxuICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpLFxuICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpLFxuICBSRUFDVF9DT05TVU1FUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnN1bWVyXCIpLFxuICBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKSxcbiAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSxcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIiksXG4gIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpLFxuICBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSxcbiAgUkVBQ1RfVklFV19UUkFOU0lUSU9OX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Qudmlld190cmFuc2l0aW9uXCIpLFxuICBSRUFDVF9DTElFTlRfUkVGRVJFTkNFID0gU3ltYm9sLmZvcihcInJlYWN0LmNsaWVudC5yZWZlcmVuY2VcIik7XG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2Ygb2JqZWN0ICYmIG51bGwgIT09IG9iamVjdCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgc3dpdGNoICgoKG9iamVjdCA9IG9iamVjdC50eXBlKSwgb2JqZWN0KSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1ZJRVdfVFJBTlNJVElPTl9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc3dpdGNoICgoKG9iamVjdCA9IG9iamVjdCAmJi
1BvYmplY3QuJCR0eXBlb2YpLCBvYmplY3QpKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlNVTUVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OU1VNRVJfVFlQRTtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xuZXhwb3J0cy5FbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbmV4cG9ydHMuRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuZXhwb3J0cy5MYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xuZXhwb3J0cy5NZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xuZXhwb3J0cy5Qb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbmV4cG9ydHMuUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuZXhwb3J0cy5TdXNwZW5zZUxpc3QgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlNVTUVSX1RZUEU7XG59O1xuZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlciA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG59O1xuZXhwb3J0cy5pc0VsZW1lbnQgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiAoXG4gICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG9iamVjdCAmJlxuICAgIG51bGwgIT09IG9iamVjdCAmJlxuICAgIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFXG4gICk7XG59O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn07XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn07XG5leHBvcnRzLmlzTGF6eSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59O1xuZXhwb3J0cy5pc01lbW8gPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufTtcbmV4cG9ydHMuaXNQb3J0YWwgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59O1xuZXhwb3J0cy5pc1Byb2ZpbGVyID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59O1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn07XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn07XG5leHBvcnRzLmlzU3VzcGVuc2VMaXN0ID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbn07XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHJldHVybiBcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSB8fFxuICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHR5cGUgfHxcbiAgICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8XG4gICAgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fFxuICAgIHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHxcbiAgICB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8XG4gICAgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8XG4gICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlICYmXG4gICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8XG4gICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fFxuICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHxcbiAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OU1VNRVJfVFlQRSB8fFxuICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8XG4gICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgfHxcbiAgICAgICAgdm9pZCAwICE9PSB0eXBlLmdldE1vZHVsZUlkKSlcbiAgICA/ICEwXG4gICAgOiAhMTtcbn07XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7639\n'))},7660:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval(__webpack_require__.ts('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_createSvgIcon_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6273);\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7876);\n/* __next_internal_client_entry_do_not_use__ default auto */ \n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils_createSvgIcon_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A)(/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path", {\n    d: "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"\n}), \'Add\'));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzY2MC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs2REFFcUQ7QUFDTDtBQUNoRCxpRUFBZUEsNEVBQWFBLENBQUMsV0FBVyxHQUFFRSxzREFBSUEsQ0FBQyxRQUFRO0lBQ3JEQyxHQUFHO0FBQ0wsSUFBSSxNQUFNLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BtdWkvaWNvbnMtbWF0ZXJpYWwvZXNtL0FkZC5qcz8yNjAzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgY3JlYXRlU3ZnSWNvbiBmcm9tIFwiLi91dGlscy9jcmVhdGVTdmdJY29uLmpzXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3ZnSWNvbigvKiNfX1BVUkVfXyovX2pzeChcInBhdGhcIiwge1xuICBkOiBcIk0xOSAxM2gtNnY2aC0ydi02SDV2LTJoNlY1aDJ2Nmg2elwiXG59KSwgJ0FkZCcpOyJdLCJuYW1lcyI6WyJjcmVhdGVTdmdJY29uIiwianN4IiwiX2pzeCIsImQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7660\n'))},9241:(__unused_webpack___webpack_module__,__webpack_exports__,__webpack_require__)=>{eval(__webpack_require__.ts('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* unused harmony export clsx */\nfunction r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f)}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (clsx);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTI0MS5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUEsY0FBYyxhQUFhLCtDQUErQyxnREFBZ0QsZUFBZSxRQUFRLElBQUksMENBQTBDLHlDQUF5QyxTQUFnQixnQkFBZ0Isd0NBQXdDLElBQUksbURBQW1ELFNBQVMsaUVBQWUsSUFBSSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvY2xzeC9kaXN0L2Nsc3gubWpzP2FjZDMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gcihlKXt2YXIgdCxmLG49XCJcIjtpZihcInN0cmluZ1wiPT10eXBlb2YgZXx8XCJudW1iZXJcIj09dHlwZW9mIGUpbis9ZTtlbHNlIGlmKFwib2JqZWN0XCI9PXR5cGVvZiBlKWlmKEFycmF
15LmlzQXJyYXkoZSkpe3ZhciBvPWUubGVuZ3RoO2Zvcih0PTA7dDxvO3QrKyllW3RdJiYoZj1yKGVbdF0pKSYmKG4mJihuKz1cIiBcIiksbis9Zil9ZWxzZSBmb3IoZiBpbiBlKWVbZl0mJihuJiYobis9XCIgXCIpLG4rPWYpO3JldHVybiBufWV4cG9ydCBmdW5jdGlvbiBjbHN4KCl7Zm9yKHZhciBlLHQsZj0wLG49XCJcIixvPWFyZ3VtZW50cy5sZW5ndGg7ZjxvO2YrKykoZT1hcmd1bWVudHNbZl0pJiYodD1yKGUpKSYmKG4mJihuKz1cIiBcIiksbis9dCk7cmV0dXJuIG59ZXhwb3J0IGRlZmF1bHQgY2xzeDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9241\n'))}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.