25 lines
134 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
/*
* ATTENTION: An "eval-source-map" devtool has been used.
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
exports.id = "vendor-chunks/mdast-util-from-markdown";
exports.ids = ["vendor-chunks/mdast-util-from-markdown"];
exports.modules = {
/***/ "(ssr)/./node_modules/mdast-util-from-markdown/dev/lib/index.js":
/*!****************************************************************!*\
!*** ./node_modules/mdast-util-from-markdown/dev/lib/index.js ***!
\****************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ fromMarkdown: () => (/* binding */ fromMarkdown)\n/* harmony export */ });\n/* harmony import */ var devlop__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! devlop */ \"(ssr)/./node_modules/devlop/lib/development.js\");\n/* harmony import */ var mdast_util_to_string__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! mdast-util-to-string */ \"(ssr)/./node_modules/mdast-util-to-string/lib/index.js\");\n/* harmony import */ var micromark__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! micromark */ \"(ssr)/./node_modules/micromark/dev/lib/postprocess.js\");\n/* harmony import */ var micromark__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! micromark */ \"(ssr)/./node_modules/micromark/dev/lib/parse.js\");\n/* harmony import */ var micromark__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! micromark */ \"(ssr)/./node_modules/micromark/dev/lib/preprocess.js\");\n/* harmony import */ var micromark_util_decode_numeric_character_reference__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! micromark-util-decode-numeric-character-reference */ \"(ssr)/./node_modules/micromark-util-decode-numeric-character-reference/dev/index.js\");\n/* harmony import */ var micromark_util_decode_string__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! micromark-util-decode-string */ \"(ssr)/./node_modules/micromark-util-decode-string/dev/index.js\");\n/* harmony import */ var micromark_util_normalize_identifier__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! micromark-util-normalize-identifier */ \"(ssr)/./node_modules/micromark-util-normalize-identifier/dev/index.js\");\n/* harmony import */ var micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! micromark-util-symbol */ \"(ssr)/./node_modules/micromark-util-symbol/lib/types.js\");\n/* harmony import */ var micromark_util_symbol__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! micromark-util-symbol */ \"(ssr)/./node_modules/micromark-util-symbol/lib/constants.js\");\n/* harmony import */ var micromark_util_symbol__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! micromark-util-symbol */ \"(ssr)/./node_modules/micromark-util-symbol/lib/codes.js\");\n/* harmony import */ var decode_named_character_reference__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! decode-named-character-reference */ \"(ssr)/./node_modules/decode-named-character-reference/index.js\");\n/* harmony import */ var unist_util_stringify_position__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! unist-util-stringify-position */ \"(ssr)/./node_modules/unist-util-stringify-position/lib/index.js\");\n/**\n * @typedef {import('mdast').Break} Break\n * @typedef {import('mdast').Blockquote} Blockquote\n * @typedef {import('mdast').Code} Code\n * @typedef {import('mdast').Definition} Definition\n * @typedef {import('mdast').Emphasis} Emphasis\n * @typedef {import('mdast').Heading} Heading\n * @typedef {import('mdast').Html} Html\n * @typedef {import('mdast').Image} Image\n * @typedef {import('mdast').InlineCode} InlineCode\n * @typedef {import('mdast').Link} Link\n * @typedef {import('mdast').List} List\n * @typedef {import('mdast').ListItem} ListItem\n * @typedef {import('mdast').Nodes} Nodes\n * @typedef {import('mdast').Paragraph} Paragraph\n * @typedef {import('mdast').Parent} Parent\n * @typedef {import('mdast').PhrasingContent} PhrasingContent\n * @typedef {import('mdast').ReferenceType} ReferenceType\n * @typedef {import('mdast').Root} Root\n * @typedef {import('mdast').Strong} Strong\n * @typedef {import('mdast').Text} Text\n * @typedef {import('mdast').ThematicBreak} ThematicBreak\n *\n * @typedef {import('micromark-util-types').Encoding} Encoding\n * @typedef {import('micromark-util-types').Event} Event\n * @typedef {import('micromark-util-types').ParseOptions} ParseOptions\n * @typedef {import('micromark-util-types').Token} Token\n * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext\n * @typedef {import('micromark-util-types').Value} Value\n *\n * @typedef {import('unist').Point} Point\n *\n * @typedef {import('../index.js').CompileData} CompileData\n */ /**\n * @typedef {Omit<Parent, 'children' | 'type'> & {type: 'fragment', children: Array<PhrasingContent>}} Fragment\n */ /**\n * @callback Transform\n * Extra transform, to change the AST afterwards.\n * @param {Root} tree\n * Tree to transform.\n * @returns {Root | null | undefined | void}\n * New tree or nothing (in which case the current tree is used).\n *\n * @callback Handle\n * Handle a token.\n * @param {CompileContext} this\n * Context.\n * @param {Token} token\n * Current token.\n * @returns {undefined | void}\n * Nothing.\n *\n * @typedef {Record<string, Handle>} Handles\n * Token types mapping to handles\n *\n * @callback OnEnterError\n * Handle the case where the `right` token is open, but it is closed (by the\n * `left` token) or because we reached the end of the document.\n * @param {Omit<CompileContext, 'sliceSerialize'>} this\n * Context.\n * @param {Token | undefined} left\n * Left token.\n * @param {Token} right\n * Right token.\n * @returns {undefined}\n * Nothing.\n *\n * @callback OnExitError\n * Handle the case where the `right` token is open but it is closed by\n * exiting the `left` token.\n * @param {Omit<CompileContext, 'sliceSerialize'>} this\n * Context.\n * @param {Token} left\n * Left token.\n * @param {Token} right\n * Right token.\n * @returns {undefined}\n * Nothing.\n *\n * @typedef {[Token, OnEnterError | undefined]} TokenTuple\n * Open token on the stack, with an optional error handler for when\n * that token isnt closed properly.\n */ /**\n * @typedef Config\n * Configuration.\n *\n * We have our defaults, but extensions will add more.\n * @property {Array<string>} canContainEols\n * Token types where line endings are used.\n * @property {Handles} enter\n * Opening handles.\n * @property {Handles} exit\n * Closing handles.\n * @property {Array<Transform>} transforms\n * Tree transforms.\n *\n * @typedef {Partial<Config>} Extension\n * Change how markdown tokens from micromark are turned into mdast.\n *\n * @typedef CompileContext\n * mdast compiler context.\n * @property {Array<Fragment | Nodes>} stack\n * Stack of nodes.\n * @property {Array<TokenTuple>} tokenStack\n * Stack of tokens.\n * @property {(this: CompileContext) => undefined} buffer\n * Capture some of the output data.\n * @property {(this: CompileContext) => string} resume\n * Stop capturing and access the output data.\n * @property {(this: CompileContext, node: Nodes, token: Token, onError?: OnEnterError) => undefined} enter\n * Enter a node.\n * @property {(this: CompileContext, token: Token, onError?: OnExitError) => undefined} exit\n * Exit a node.\n * @property {TokenizeContext['sliceSerialize']} sliceSerialize\n * Get the string value of a token.\n * @property {Config} config\n * Configuration.\n * @property {CompileData} data\n * Info passed around; key/value store.\n *\n * @typedef FromMarkdownOptions\n * Configuration for how to build mdast.\n * @property {Array<Extension | Array<Extension>> | null | undefined} [mdastExtensions]\n * Extensions for this utility to change how tokens are turned into a tree.\n *\n * @typedef {ParseOptions & FromMarkdownOptions} Options\n * Configuration.\n */ \n\n\n\n\n\n\n\n\nconst own = {}.hasOwnProperty;\n/**\n * Turn markdown into a syntax tree.\n *\n * @overload\n * @param {Value} value\n * @param {Encoding | null | undefined} [encoding]\n * @param {Options | null | undefined} [options]\n * @returns {Root}\n *\n * @overload\n * @param {Value} value\n * @param {Options | null | undefined} [options]\n * @returns {Root}\n *\n * @param {Value} value\n * Markdown to parse.\n * @param {Encoding | Options | null | undefined} [encoding]\n * Character encoding for when `value` is `Buffer`.\n * @param {Options | null | undefined} [options]\n * Configuration.\n * @returns {Root}\n * mdast tree.\n */ function fromMarkdown(value, encoding, options) {\n if (typeof encoding !== \"string\") {\n options = encoding;\n encoding = undefined;\n }\n return compiler(options)((0,micromark__WEBPACK_IMPORTED_MODULE_0__.postprocess)((0,micromark__WEBPACK_IMPORTED_MODULE_1__.parse)(options).document().write((0,micromark__WEBPACK_IMPORTED_MODULE_2__.preprocess)()(value, encoding, true))));\n}\n/**\n * Note this compiler only understand complete buffering, not streaming.\n *\n * @param {Options | null | undefined} [options]\n */ function compiler(options) {\n /** @type {Config} */ const config = {\n transforms: [],\n canContainEols: [\n \"emphasis\",\n \"fragment\",\n \"heading\",\n \"paragraph\",\n \"strong\"\n ],\n enter: {\n autolink: opener(link),\n autolinkProtocol: onenterdata,\n autolinkEmail: onenterdata,\n atxHeading: opener(heading),\n blockQuote: opener(blockQuote),\n characterEscape: onenterdata,\n characterReference: onenterdata,\n codeFenced: opener(codeFlow),\n codeFencedFenceInfo: buffer,\n codeFencedFenceMeta: buffer,\n codeIndented: opener(codeFlow, buffer),\n codeText: opener(codeText, buffer),\n codeTextData: onenterdata,\n data: onenterdata,\n codeFlowValue: onenterdata,\n definition: opener(definition),\n definitionDestinationString: buffer,\n definitionLabelString: buffer,\n definitionTitleString: buffer,\n emphasis: opener(emphasis),\n hardBreakEscape: opener(hardBreak),\n hardBreakTrailing: opener(hardBreak),\n htmlFlow: opener(html, buffer),\n htmlFlowData: onenterdata,\n htmlText: opener(html, buffer),\n htmlTextData: onenterdata,\n image: opener(image),\n label: buffer,\n link: opener(link),\n listItem: opener(listItem),\n listItemValue: onenterlistitemvalue,\n listOrdered: opener(list, onenterlistordered),\n listUnordered: opener(list),\n paragraph: opener(paragraph),\n reference: onenterreference,\n referenceString: buffer,\n resourceDestinationString: buffer,\n resourceTitleString: buffer,\n setextHeading: opener(heading),\n strong: opener(strong),\n thematicBreak: opener(thematicBreak)\n },\n exit: {\n atxHeading: closer(),\n atxHeadingSequence: onexitatxheadingsequence,\n autolink: closer(),\n autolinkEmail: onexitautolinkemail,\n autolinkProtocol: onexitautolinkprotocol,\n blockQuote: closer(),\n characterEscapeValue: onexitdata,\n characterReferenceMarkerHexadecimal: onexitcharacterreferencemarker,\n characterReferenceMarkerNumeric: onexitcharacterreferencemarker,\n characterReferenceValue: onexitcharacterreferencevalue,\n codeFenced: closer(onexitcodefenced),\n codeFencedFence: onexitcodefencedfence,\n codeFencedFenceInfo: onexitcodefencedfenceinfo,\n codeFencedFenceMeta: onexitcodefencedfencemeta,\n codeFlowValue: onexitdata,\n codeIndented: closer(onexitcodeindented),\n codeText: closer(onexitcodetext),\n codeTextData: onexitdata,\n data: onexitdata,\n definition: closer(),\n definitionDestinationString: onexitdefinitiondestinationstring,\n definitionLabelString: onexitdefinitionlabelstring,\n definitionTitleString: onexitdefinitiontitlestring,\n emphasis: closer(),\n hardBreakEscape: closer(onexithardbreak),\n hardBreakTrailing: closer(onexithardbreak),\n htmlFlow: closer(onexithtmlflow),\n htmlFlowData: onexitdata,\n htmlText: closer(onexithtmltext),\n htmlTextData: onexitdata,\n image: closer(onexitimage),\n label: onexitlabel,\n labelText: onexitlabeltext,\n lineEnding: onexitlineending,\n link: closer(onexitlink),\n listItem: closer(),\n listOrdered: closer(),\n listUnordered: closer(),\n paragraph: closer(),\n referenceString: onexitreferencestring,\n resourceDestinationString: onexitresourcedestinationstring,\n resourceTitleString: onexitresourcetitlestring,\n resource: onexitresource,\n setextHeading: closer(onexitsetextheading),\n setextHeadingLineSequence: onexitsetextheadinglinesequence,\n setextHeadingText: onexitsetextheadingtext,\n strong: closer(),\n thematicBreak: closer()\n }\n };\n configure(config, (options || {}).mdastExtensions || []);\n /** @type {CompileData} */ const data = {};\n return compile;\n /**\n * Turn micromark events into an mdast tree.\n *\n * @param {Array<Event>} events\n * Events.\n * @returns {Root}\n * mdast tree.\n */ function compile(events) {\n /** @type {Root} */ let tree = {\n type: \"root\",\n children: []\n };\n /** @type {Omit<CompileContext, 'sliceSerialize'>} */ const context = {\n stack: [\n tree\n ],\n tokenStack: [],\n config,\n enter,\n exit,\n buffer,\n resume,\n data\n };\n /** @type {Array<number>} */ const listStack = [];\n let index = -1;\n while(++index < events.length){\n // We preprocess lists to add `listItem` tokens, and to infer whether\n // items the list itself are spread out.\n if (events[index][1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listOrdered || events[index][1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listUnordered) {\n if (events[index][0] === \"enter\") {\n listStack.push(index);\n } else {\n const tail = listStack.pop();\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(typeof tail === \"number\", \"expected list ot be open\");\n index = prepareList(events, tail, index);\n }\n }\n }\n index = -1;\n while(++index < events.length){\n const handler = config[events[index][0]];\n if (own.call(handler, events[index][1].type)) {\n handler[events[index][1].type].call(Object.assign({\n sliceSerialize: events[index][2].sliceSerialize\n }, context), events[index][1]);\n }\n }\n // Handle tokens still being open.\n if (context.tokenStack.length > 0) {\n const tail = context.tokenStack[context.tokenStack.length - 1];\n const handler = tail[1] || defaultOnError;\n handler.call(context, undefined, tail[0]);\n }\n // Figure out `root` position.\n tree.position = {\n start: point(events.length > 0 ? events[0][1].start : {\n line: 1,\n column: 1,\n offset: 0\n }),\n end: point(events.length > 0 ? events[events.length - 2][1].end : {\n line: 1,\n column: 1,\n offset: 0\n })\n };\n // Call transforms.\n index = -1;\n while(++index < config.transforms.length){\n tree = config.transforms[index](tree) || tree;\n }\n return tree;\n }\n /**\n * @param {Array<Event>} events\n * @param {number} start\n * @param {number} length\n * @returns {number}\n */ function prepareList(events, start, length) {\n let index = start - 1;\n let containerBalance = -1;\n let listSpread = false;\n /** @type {Token | undefined} */ let listItem;\n /** @type {number | undefined} */ let lineIndex;\n /** @type {number | undefined} */ let firstBlankLineIndex;\n /** @type {boolean | undefined} */ let atMarker;\n while(++index <= length){\n const event = events[index];\n switch(event[1].type){\n case micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listUnordered:\n case micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listOrdered:\n case micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.blockQuote:\n {\n if (event[0] === \"enter\") {\n containerBalance++;\n } else {\n containerBalance--;\n }\n atMarker = undefined;\n break;\n }\n case micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.lineEndingBlank:\n {\n if (event[0] === \"enter\") {\n if (listItem && !atMarker && !containerBalance && !firstBlankLineIndex) {\n firstBlankLineIndex = index;\n }\n atMarker = undefined;\n }\n break;\n }\n case micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.linePrefix:\n case micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listItemValue:\n case micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listItemMarker:\n case micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listItemPrefix:\n case micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listItemPrefixWhitespace:\n {\n break;\n }\n default:\n {\n atMarker = undefined;\n }\n }\n if (!containerBalance && event[0] === \"enter\" && event[1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listItemPrefix || containerBalance === -1 && event[0] === \"exit\" && (event[1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listUnordered || event[1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listOrdered)) {\n if (listItem) {\n let tailIndex = index;\n lineIndex = undefined;\n while(tailIndex--){\n const tailEvent = events[tailIndex];\n if (tailEvent[1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.lineEnding || tailEvent[1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.lineEndingBlank) {\n if (tailEvent[0] === \"exit\") continue;\n if (lineIndex) {\n events[lineIndex][1].type = micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.lineEndingBlank;\n listSpread = true;\n }\n tailEvent[1].type = micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.lineEnding;\n lineIndex = tailIndex;\n } else if (tailEvent[1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.linePrefix || tailEvent[1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.blockQuotePrefix || tailEvent[1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.blockQuotePrefixWhitespace || tailEvent[1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.blockQuoteMarker || tailEvent[1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listItemIndent) {\n // Empty\n } else {\n break;\n }\n }\n if (firstBlankLineIndex && (!lineIndex || firstBlankLineIndex < lineIndex)) {\n listItem._spread = true;\n }\n // Fix position.\n listItem.end = Object.assign({}, lineIndex ? events[lineIndex][1].start : event[1].end);\n events.splice(lineIndex || index, 0, [\n \"exit\",\n listItem,\n event[2]\n ]);\n index++;\n length++;\n }\n // Create a new list item.\n if (event[1].type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.listItemPrefix) {\n /** @type {Token} */ const item = {\n type: \"listItem\",\n _spread: false,\n start: Object.assign({}, event[1].start),\n // @ts-expect-error: well add `end` in a second.\n end: undefined\n };\n listItem = item;\n events.splice(index, 0, [\n \"enter\",\n item,\n event[2]\n ]);\n index++;\n length++;\n firstBlankLineIndex = undefined;\n atMarker = true;\n }\n }\n }\n events[start][1]._spread = listSpread;\n return length;\n }\n /**\n * Create an opener handle.\n *\n * @param {(token: Token) => Nodes} create\n * Create a node.\n * @param {Handle | undefined} [and]\n * Optional function to also run.\n * @returns {Handle}\n * Handle.\n */ function opener(create, and) {\n return open;\n /**\n * @this {CompileContext}\n * @param {Token} token\n * @returns {undefined}\n */ function open(token) {\n enter.call(this, create(token), token);\n if (and) and.call(this, token);\n }\n }\n /**\n * @this {CompileContext}\n * @returns {undefined}\n */ function buffer() {\n this.stack.push({\n type: \"fragment\",\n children: []\n });\n }\n /**\n * @this {CompileContext}\n * Context.\n * @param {Nodes} node\n * Node to enter.\n * @param {Token} token\n * Corresponding token.\n * @param {OnEnterError | undefined} [errorHandler]\n * Handle the case where this token is open, but it is closed by something else.\n * @returns {undefined}\n * Nothing.\n */ function enter(node, token, errorHandler) {\n const parent = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(parent, \"expected `parent`\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(\"children\" in parent, \"expected `parent`\");\n /** @type {Array<Nodes>} */ const siblings = parent.children;\n siblings.push(node);\n this.stack.push(node);\n this.tokenStack.push([\n token,\n errorHandler\n ]);\n node.position = {\n start: point(token.start),\n // @ts-expect-error: `end` will be patched later.\n end: undefined\n };\n }\n /**\n * Create a closer handle.\n *\n * @param {Handle | undefined} [and]\n * Optional function to also run.\n * @returns {Handle}\n * Handle.\n */ function closer(and) {\n return close;\n /**\n * @this {CompileContext}\n * @param {Token} token\n * @returns {undefined}\n */ function close(token) {\n if (and) and.call(this, token);\n exit.call(this, token);\n }\n }\n /**\n * @this {CompileContext}\n * Context.\n * @param {Token} token\n * Corresponding token.\n * @param {OnExitError | undefined} [onExitError]\n * Handle the case where another token is open.\n * @returns {undefined}\n * Nothing.\n */ function exit(token, onExitError) {\n const node = this.stack.pop();\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected `node`\");\n const open = this.tokenStack.pop();\n if (!open) {\n throw new Error(\"Cannot close `\" + token.type + \"` (\" + (0,unist_util_stringify_position__WEBPACK_IMPORTED_MODULE_5__.stringifyPosition)({\n start: token.start,\n end: token.end\n }) + \"): its not open\");\n } else if (open[0].type !== token.type) {\n if (onExitError) {\n onExitError.call(this, token, open[0]);\n } else {\n const handler = open[1] || defaultOnError;\n handler.call(this, token, open[0]);\n }\n }\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type !== \"fragment\", \"unexpected fragment `exit`ed\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.position, \"expected `position` to be defined\");\n node.position.end = point(token.end);\n }\n /**\n * @this {CompileContext}\n * @returns {string}\n */ function resume() {\n return (0,mdast_util_to_string__WEBPACK_IMPORTED_MODULE_6__.toString)(this.stack.pop());\n }\n //\n // Handlers.\n //\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onenterlistordered() {\n this.data.expectingFirstListItemValue = true;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onenterlistitemvalue(token) {\n if (this.data.expectingFirstListItemValue) {\n const ancestor = this.stack[this.stack.length - 2];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(ancestor, \"expected nodes on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(ancestor.type === \"list\", \"expected list on stack\");\n ancestor.start = Number.parseInt(this.sliceSerialize(token), micromark_util_symbol__WEBPACK_IMPORTED_MODULE_7__.constants.numericBaseDecimal);\n this.data.expectingFirstListItemValue = undefined;\n }\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitcodefencedfenceinfo() {\n const data = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"code\", \"expected code on stack\");\n node.lang = data;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitcodefencedfencemeta() {\n const data = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"code\", \"expected code on stack\");\n node.meta = data;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitcodefencedfence() {\n // Exit if this is the closing fence.\n if (this.data.flowCodeInside) return;\n this.buffer();\n this.data.flowCodeInside = true;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitcodefenced() {\n const data = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"code\", \"expected code on stack\");\n node.value = data.replace(/^(\\r?\\n|\\r)|(\\r?\\n|\\r)$/g, \"\");\n this.data.flowCodeInside = undefined;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitcodeindented() {\n const data = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"code\", \"expected code on stack\");\n node.value = data.replace(/(\\r?\\n|\\r)$/g, \"\");\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitdefinitionlabelstring(token) {\n const label = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"definition\", \"expected definition on stack\");\n node.label = label;\n node.identifier = (0,micromark_util_normalize_identifier__WEBPACK_IMPORTED_MODULE_8__.normalizeIdentifier)(this.sliceSerialize(token)).toLowerCase();\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitdefinitiontitlestring() {\n const data = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"definition\", \"expected definition on stack\");\n node.title = data;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitdefinitiondestinationstring() {\n const data = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"definition\", \"expected definition on stack\");\n node.url = data;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitatxheadingsequence(token) {\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"heading\", \"expected heading on stack\");\n if (!node.depth) {\n const depth = this.sliceSerialize(token).length;\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(depth === 1 || depth === 2 || depth === 3 || depth === 4 || depth === 5 || depth === 6, \"expected `depth` between `1` and `6`\");\n node.depth = depth;\n }\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitsetextheadingtext() {\n this.data.setextHeadingSlurpLineEnding = true;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitsetextheadinglinesequence(token) {\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"heading\", \"expected heading on stack\");\n node.depth = this.sliceSerialize(token).codePointAt(0) === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_9__.codes.equalsTo ? 1 : 2;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitsetextheading() {\n this.data.setextHeadingSlurpLineEnding = undefined;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onenterdata(token) {\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(\"children\" in node, \"expected parent on stack\");\n /** @type {Array<Nodes>} */ const siblings = node.children;\n let tail = siblings[siblings.length - 1];\n if (!tail || tail.type !== \"text\") {\n // Add a new text node.\n tail = text();\n tail.position = {\n start: point(token.start),\n // @ts-expect-error: well add `end` later.\n end: undefined\n };\n siblings.push(tail);\n }\n this.stack.push(tail);\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitdata(token) {\n const tail = this.stack.pop();\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(tail, \"expected a `node` to be on the stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(\"value\" in tail, \"expected a `literal` to be on the stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(tail.position, \"expected `node` to have an open position\");\n tail.value += this.sliceSerialize(token);\n tail.position.end = point(token.end);\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitlineending(token) {\n const context = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(context, \"expected `node`\");\n // If were at a hard break, include the line ending in there.\n if (this.data.atHardBreak) {\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(\"children\" in context, \"expected `parent`\");\n const tail = context.children[context.children.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(tail.position, \"expected tail to have a starting position\");\n tail.position.end = point(token.end);\n this.data.atHardBreak = undefined;\n return;\n }\n if (!this.data.setextHeadingSlurpLineEnding && config.canContainEols.includes(context.type)) {\n onenterdata.call(this, token);\n onexitdata.call(this, token);\n }\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexithardbreak() {\n this.data.atHardBreak = true;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexithtmlflow() {\n const data = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"html\", \"expected html on stack\");\n node.value = data;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexithtmltext() {\n const data = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"html\", \"expected html on stack\");\n node.value = data;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitcodetext() {\n const data = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"inlineCode\", \"expected inline code on stack\");\n node.value = data;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitlink() {\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"link\", \"expected link on stack\");\n // Note: there are also `identifier` and `label` fields on this link node!\n // These are used / cleaned here.\n // To do: clean.\n if (this.data.inReference) {\n /** @type {ReferenceType} */ const referenceType = this.data.referenceType || \"shortcut\";\n node.type += \"Reference\";\n // @ts-expect-error: mutate.\n node.referenceType = referenceType;\n // @ts-expect-error: mutate.\n delete node.url;\n delete node.title;\n } else {\n // @ts-expect-error: mutate.\n delete node.identifier;\n // @ts-expect-error: mutate.\n delete node.label;\n }\n this.data.referenceType = undefined;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitimage() {\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"image\", \"expected image on stack\");\n // Note: there are also `identifier` and `label` fields on this link node!\n // These are used / cleaned here.\n // To do: clean.\n if (this.data.inReference) {\n /** @type {ReferenceType} */ const referenceType = this.data.referenceType || \"shortcut\";\n node.type += \"Reference\";\n // @ts-expect-error: mutate.\n node.referenceType = referenceType;\n // @ts-expect-error: mutate.\n delete node.url;\n delete node.title;\n } else {\n // @ts-expect-error: mutate.\n delete node.identifier;\n // @ts-expect-error: mutate.\n delete node.label;\n }\n this.data.referenceType = undefined;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitlabeltext(token) {\n const string = this.sliceSerialize(token);\n const ancestor = this.stack[this.stack.length - 2];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(ancestor, \"expected ancestor on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(ancestor.type === \"image\" || ancestor.type === \"link\", \"expected image or link on stack\");\n // @ts-expect-error: stash this on the node, as it might become a reference\n // later.\n ancestor.label = (0,micromark_util_decode_string__WEBPACK_IMPORTED_MODULE_10__.decodeString)(string);\n // @ts-expect-error: same as above.\n ancestor.identifier = (0,micromark_util_normalize_identifier__WEBPACK_IMPORTED_MODULE_8__.normalizeIdentifier)(string).toLowerCase();\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitlabel() {\n const fragment = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(fragment, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(fragment.type === \"fragment\", \"expected fragment on stack\");\n const value = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"image\" || node.type === \"link\", \"expected image or link on stack\");\n // Assume a reference.\n this.data.inReference = true;\n if (node.type === \"link\") {\n /** @type {Array<PhrasingContent>} */ const children = fragment.children;\n node.children = children;\n } else {\n node.alt = value;\n }\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitresourcedestinationstring() {\n const data = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"image\" || node.type === \"link\", \"expected image or link on stack\");\n node.url = data;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitresourcetitlestring() {\n const data = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"image\" || node.type === \"link\", \"expected image or link on stack\");\n node.title = data;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitresource() {\n this.data.inReference = undefined;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onenterreference() {\n this.data.referenceType = \"collapsed\";\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitreferencestring(token) {\n const label = this.resume();\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"image\" || node.type === \"link\", \"expected image reference or link reference on stack\");\n // @ts-expect-error: stash this on the node, as it might become a reference\n // later.\n node.label = label;\n // @ts-expect-error: same as above.\n node.identifier = (0,micromark_util_normalize_identifier__WEBPACK_IMPORTED_MODULE_8__.normalizeIdentifier)(this.sliceSerialize(token)).toLowerCase();\n this.data.referenceType = \"full\";\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitcharacterreferencemarker(token) {\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(token.type === \"characterReferenceMarkerNumeric\" || token.type === \"characterReferenceMarkerHexadecimal\");\n this.data.characterReferenceType = token.type;\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitcharacterreferencevalue(token) {\n const data = this.sliceSerialize(token);\n const type = this.data.characterReferenceType;\n /** @type {string} */ let value;\n if (type) {\n value = (0,micromark_util_decode_numeric_character_reference__WEBPACK_IMPORTED_MODULE_11__.decodeNumericCharacterReference)(data, type === micromark_util_symbol__WEBPACK_IMPORTED_MODULE_3__.types.characterReferenceMarkerNumeric ? micromark_util_symbol__WEBPACK_IMPORTED_MODULE_7__.constants.numericBaseDecimal : micromark_util_symbol__WEBPACK_IMPORTED_MODULE_7__.constants.numericBaseHexadecimal);\n this.data.characterReferenceType = undefined;\n } else {\n const result = (0,decode_named_character_reference__WEBPACK_IMPORTED_MODULE_12__.decodeNamedCharacterReference)(data);\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(result !== false, \"expected reference to decode\");\n value = result;\n }\n const tail = this.stack.pop();\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(tail, \"expected `node`\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(tail.position, \"expected `node.position`\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(\"value\" in tail, \"expected `node.value`\");\n tail.value += value;\n tail.position.end = point(token.end);\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitautolinkprotocol(token) {\n onexitdata.call(this, token);\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"link\", \"expected link on stack\");\n node.url = this.sliceSerialize(token);\n }\n /**\n * @this {CompileContext}\n * @type {Handle}\n */ function onexitautolinkemail(token) {\n onexitdata.call(this, token);\n const node = this.stack[this.stack.length - 1];\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node, \"expected node on stack\");\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(node.type === \"link\", \"expected link on stack\");\n node.url = \"mailto:\" + this.sliceSerialize(token);\n }\n //\n // Creaters.\n //\n /** @returns {Blockquote} */ function blockQuote() {\n return {\n type: \"blockquote\",\n children: []\n };\n }\n /** @returns {Code} */ function codeFlow() {\n return {\n type: \"code\",\n lang: null,\n meta: null,\n value: \"\"\n };\n }\n /** @returns {InlineCode} */ function codeText() {\n return {\n type: \"inlineCode\",\n value: \"\"\n };\n }\n /** @returns {Definition} */ function definition() {\n return {\n type: \"definition\",\n identifier: \"\",\n label: null,\n title: null,\n url: \"\"\n };\n }\n /** @returns {Emphasis} */ function emphasis() {\n return {\n type: \"emphasis\",\n children: []\n };\n }\n /** @returns {Heading} */ function heading() {\n return {\n type: \"heading\",\n // @ts-expect-error `depth` will be set later.\n depth: 0,\n children: []\n };\n }\n /** @returns {Break} */ function hardBreak() {\n return {\n type: \"break\"\n };\n }\n /** @returns {Html} */ function html() {\n return {\n type: \"html\",\n value: \"\"\n };\n }\n /** @returns {Image} */ function image() {\n return {\n type: \"image\",\n title: null,\n url: \"\",\n alt: null\n };\n }\n /** @returns {Link} */ function link() {\n return {\n type: \"link\",\n title: null,\n url: \"\",\n children: []\n };\n }\n /**\n * @param {Token} token\n * @returns {List}\n */ function list(token) {\n return {\n type: \"list\",\n ordered: token.type === \"listOrdered\",\n start: null,\n spread: token._spread,\n children: []\n };\n }\n /**\n * @param {Token} token\n * @returns {ListItem}\n */ function listItem(token) {\n return {\n type: \"listItem\",\n spread: token._spread,\n checked: null,\n children: []\n };\n }\n /** @returns {Paragraph} */ function paragraph() {\n return {\n type: \"paragraph\",\n children: []\n };\n }\n /** @returns {Strong} */ function strong() {\n return {\n type: \"strong\",\n children: []\n };\n }\n /** @returns {Text} */ function text() {\n return {\n type: \"text\",\n value: \"\"\n };\n }\n /** @returns {ThematicBreak} */ function thematicBreak() {\n return {\n type: \"thematicBreak\"\n };\n }\n}\n/**\n * Copy a point-like value.\n *\n * @param {Point} d\n * Point-like value.\n * @returns {Point}\n * unist point.\n */ function point(d) {\n return {\n line: d.line,\n column: d.column,\n offset: d.offset\n };\n}\n/**\n * @param {Config} combined\n * @param {Array<Array<Extension> | Extension>} extensions\n * @returns {undefined}\n */ function configure(combined, extensions) {\n let index = -1;\n while(++index < extensions.length){\n const value = extensions[index];\n if (Array.isArray(value)) {\n configure(combined, value);\n } else {\n extension(combined, value);\n }\n }\n}\n/**\n * @param {Config} combined\n * @param {Extension} extension\n * @returns {undefined}\n */ function extension(combined, extension) {\n /** @type {keyof Extension} */ let key;\n for(key in extension){\n if (own.call(extension, key)) {\n switch(key){\n case \"canContainEols\":\n {\n const right = extension[key];\n if (right) {\n combined[key].push(...right);\n }\n break;\n }\n case \"transforms\":\n {\n const right = extension[key];\n if (right) {\n combined[key].push(...right);\n }\n break;\n }\n case \"enter\":\n case \"exit\":\n {\n const right = extension[key];\n if (right) {\n Object.assign(combined[key], right);\n }\n break;\n }\n }\n }\n }\n}\n/** @type {OnEnterError} */ function defaultOnError(left, right) {\n if (left) {\n throw new Error(\"Cannot close `\" + left.type + \"` (\" + (0,unist_util_stringify_position__WEBPACK_IMPORTED_MODULE_5__.stringifyPosition)({\n start: left.start,\n end: left.end\n }) + \"): a different token (`\" + right.type + \"`, \" + (0,unist_util_stringify_position__WEBPACK_IMPORTED_MODULE_5__.stringifyPosition)({\n start: right.start,\n end: right.end\n }) + \") is open\");\n } else {\n throw new Error(\"Cannot close document, a token (`\" + right.type + \"`, \" + (0,unist_util_stringify_position__WEBPACK_IMPORTED_MODULE_5__.stringifyPosition)({\n start: right.start,\n end: right.end\n }) + \") is still open\");\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvbWRhc3QtdXRpbC1mcm9tLW1hcmtkb3duL2Rldi9saWIvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUNDLEdBRUQ7O0NBRUMsR0FFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0ErQ0MsR0FFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBNkNDLEdBRWtDO0FBQ1U7QUFDVztBQUN5QztBQUN4QztBQUNjO0FBQ1Y7QUFDaUI7QUFDZjtBQUUvRCxNQUFNYyxNQUFNLENBQUMsRUFBRUMsY0FBYztBQUU3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXNCQyxHQUNNLFNBQVNDLGFBQWFDLEtBQUssRUFBRUMsUUFBUSxFQUFFQyxPQUFPO0lBQ25ELElBQUksT0FBT0QsYUFBYSxVQUFVO1FBQ2hDQyxVQUFVRDtRQUNWQSxXQUFXRTtJQUNiO0lBRUEsT0FBT0MsU0FBU0YsU0FDZGYsc0RBQVdBLENBQ1RELGdEQUFLQSxDQUFDZ0IsU0FBU0csUUFBUSxHQUFHQyxLQUFLLENBQUNsQixxREFBVUEsR0FBR1ksT0FBT0MsVUFBVTtBQUdwRTtBQUVBOzs7O0NBSUMsR0FDRCxTQUFTRyxTQUFTRixPQUFPO0lBQ3ZCLG1CQUFtQixHQUNuQixNQUFNSyxTQUFTO1FBQ2JDLFlBQVksRUFBRTtRQUNkQyxnQkFBZ0I7WUFBQztZQUFZO1lBQVk7WUFBVztZQUFhO1NBQVM7UUFDMUVDLE9BQU87WUFDTEMsVUFBVUMsT0FBT0M7WUFDakJDLGtCQUFrQkM7WUFDbEJDLGVBQWVEO1lBQ2ZFLFlBQVlMLE9BQU9NO1lBQ25CQyxZQUFZUCxPQUFPTztZQUNuQkMsaUJBQWlCTDtZQUNqQk0sb0JBQW9CTjtZQUNwQk8sWUFBWVYsT0FBT1c7WUFDbkJDLHFCQUFxQkM7WUFDckJDLHFCQUFx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UixzQ0FDRXVDLE1BQU0vRixJQUFJLEdBQ1YsUUFDQW5ILGdGQUFpQkEsQ0FBQztZQUFDdUksT0FBTzJFLE1BQU0zRSxLQUFLO1lBQUVLLEtBQUtzRSxNQUFNdEUsR0FBRztRQUFBLEtBQ3JEO0lBRU47QUFDRiIsInNvdXJjZXMiOlsid2VicGFjazovL2ZsdXNoLW5vdGVzLy4vbm9kZV9tb2R1bGVzL21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bi9kZXYvbGliL2luZGV4LmpzP2JlYjUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtZGFzdCcpLkJyZWFrfSBCcmVha1xuICogQHR5cGVkZWYge2ltcG9ydCgnbWRhc3QnKS5CbG9ja3F1b3RlfSBCbG9ja3F1b3RlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtZGFzdCcpLkNvZGV9IENvZGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ21kYXN0JykuRGVmaW5pdGlvbn0gRGVmaW5pdGlvblxuICogQHR5cGVkZWYge2ltcG9ydCgnbWRhc3QnKS5FbXBoYXNpc30gRW1waGFzaXNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ21kYXN0JykuSGVhZGluZ30gSGVhZGluZ1xuICogQHR5cGVkZWYge2ltcG9ydCgnbWRhc3QnKS5IdG1sfSBIdG1sXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtZGFzdCcpLkltYWdlfSBJbWFnZVxuICogQHR5cGVkZWYge2ltcG9ydCgnbWRhc3QnKS5JbmxpbmVDb2RlfSBJbmxpbmVDb2RlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtZGFzdCcpLkxpbmt9IExpbmtcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ21kYXN0JykuTGlzdH0gTGlzdFxuICogQHR5cGVkZWYge2ltcG9ydCgnbWRhc3QnKS5MaXN0SXRlbX0gTGlzdEl0ZW1cbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ21kYXN0JykuTm9kZXN9IE5vZGVzXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtZGFzdCcpLlBhcmFncmFwaH0gUGFyYWdyYXBoXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtZGFzdCcpLlBhcmVudH0gUGFyZW50XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtZGFzdCcpLlBocmFzaW5nQ29udGVudH0gUGhyYXNpbmdDb250ZW50XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtZGFzdCcpLlJlZmVyZW5jZVR5cGV9IFJlZmVyZW5jZVR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ21kYXN0JykuUm9vdH0gUm9vdFxuICogQHR5cGVkZWYge2ltcG9ydCgnbWRhc3QnKS5TdHJvbmd9IFN0cm9uZ1xuICogQHR5cGVkZWYge2ltcG9ydCgnbWRhc3QnKS5UZXh0fSBUZXh0XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtZGFzdCcpLlRoZW1hdGljQnJlYWt9IFRoZW1hdGljQnJlYWtcbiAqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtaWNyb21hcmstdXRpbC10eXBlcycpLkVuY29kaW5nfSBFbmNvZGluZ1xuICogQHR5cGVkZWYge2ltcG9ydCgnbWljcm9tYXJrLXV0aWwtdHlwZXMnKS5FdmVudH0gRXZlbnRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ21pY3JvbWFyay11dGlsLXR5cGVzJykuUGFyc2VPcHRpb25zfSBQYXJzZU9wdGlvbnNcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ21pY3JvbWFyay11dGlsLXR5cGVzJykuVG9rZW59IFRva2VuXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtaWNyb21hcmstdXRpbC10eXBlcycpLlRva2VuaXplQ29udGV4dH0gVG9rZW5pemVDb250ZXh0XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdtaWNyb21hcmstdXRpbC10eXBlcycpLlZhbHVlfSBWYWx1ZVxuICpcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ3VuaXN0JykuUG9pbnR9IFBvaW50XG4gKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vaW5kZXguanMnKS5Db21waWxlRGF0YX0gQ29tcGlsZURhdGFcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPbWl0PFBhcmVudCwgJ2NoaWxkcmVuJyB8ICd0eXBlJz4gJiB7dHlwZTogJ2ZyYWdtZW50JywgY2hpbGRyZW46IEFycmF5PFBocmFzaW5nQ29udGVudD59fSBGcmFnbWVudFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFRyYW5zZm9ybVxuICogICBFeHRyYSB0cmFuc2Zvcm0sIHRvIGNoYW5nZSB0aGUgQVNUIGFmdGVyd2FyZHMuXG4gKiBAcGFyYW0ge1Jvb3R9IHRyZWVcbiAqICAgVHJlZSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7Um9vdCB8IG51bGwgfCB1bmRlZmluZWQgfCB2b2lkfVxuICogICBOZXcgdHJlZSBvciBub3RoaW5nIChpbiB3aGljaCBjYXNlIHRoZSBjdXJyZW50IHRyZWUgaXMgdXNlZCkuXG4gKlxuICogQGNhbGxiYWNrIEhhbmRsZVxuICogICBIYW5kbGUgYSB0b2tlbi5cbiAqIEBwYXJhbSB7Q29tcGlsZUNvbnRleHR9IHRoaXNcbiAqICAgQ29udGV4dC5cbiAqIEBwYXJhbSB7VG9rZW59IHRva2VuXG4gKiAgIEN1cnJlbnQgdG9rZW4uXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkIHwgdm9pZH1cbiAqICAgTm90aGluZy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgSGFuZGxlPn0gSGFuZGxlc1xuICogICBUb2tlbiB0eXBlcyBtYXBwaW5nIHRvIGhhbmRsZXNcbiAqXG4gKiBAY2FsbGJhY2sgT25FbnRlckVycm9yXG4gKiAgIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgYHJpZ2h0YCB0b2tlbiBpcyBvcGVuLCBidXQgaXQgaXMgY2xvc2VkIChieSB0aGVcbiAqICAgYGxlZnRgIHRva2VuKSBvciBiZWNhdXNlIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuXG4gKiBAcGFyYW0ge09taXQ8Q29tcGlsZUNvbnRleHQsICdzbGljZVNlcmlhbGl6ZSc+fSB0aGlzXG4gKiAgIENvbnRleHQuXG4gKiBAcGFyYW0ge1Rva2VuIHwgdW5kZWZpbmVkfSBsZWZ0XG4gKiAgIExlZnQgdG9rZW4uXG4gKiBAcGFyYW0ge1Rva2VufSByaWdodFxuICogICBSaWdodCB0b2tlbi5cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKiAgIE5vdGhpbmcuXG4gKlxuICogQGNhbGxiYWNrIE9uRXhpdEVycm9yXG4gKiAgIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgYHJpZ2h0YCB0b2tlbiBpcyBvcGVuIGJ1dCBpdCBpcyBjbG9zZWQgYnlcbiAqICAgZXhpdGluZyB0aGUgYGxlZnRgIHRva2VuLlxuICogQHBhcmFtIHtPbWl0PENvbXBpbGVDb250ZXh0LCAnc2xpY2VTZXJpYWxpemUnPn0gdGhpc1xuICogICBDb250ZXh0LlxuICogQHBhcmFtIHtUb2tlbn0gbGVmdFxuICogICBMZWZ0IHRva2VuLlxuICogQHBhcmFtIHtUb2tlbn0gcmlnaHRcbiAqICAgUmlnaHQgdG9rZW4uXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICogICBOb3RoaW5nLlxuICpcbiAqIEB0eXBlZGVmIHtbVG9rZW4sIE9uRW50ZXJFcnJvciB8IHVuZGVmaW5lZF19IFRva2VuVHVwbGVcbiAqICAgT3BlbiB0b2tlbiBvbiB0aGUgc3RhY2ssIHdpdGggYW4gb3B0aW9uYWwgZXJyb3IgaGFuZGxlciBmb3Igd2hlblxuICogICB0aGF0IHRva2VuIGlzbuKAmXQgY2xvc2VkIHByb3Blcmx5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29uZmlnXG4gKiAgIENvbmZpZ3VyYXRpb24uXG4gKlxuICogICBXZSBoYXZlIG91ciBkZWZhdWx0cywgYnV0IGV4dGVuc2lvbnMgd2lsbCBhZGQgbW9yZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gY2FuQ29udGFpbkVvbHNcbiAqICAgVG9rZW4gdHlwZXMgd2hlcmUgbGluZSBlbmRpbmdzIGFyZSB1c2VkLlxuICogQHByb3BlcnR5IHtIYW5kbGVzfSBlbnRlclxuICogICBPcGVuaW5nIGhhbmRsZXMuXG4gKiBAcHJvcGVydHkge0hhbmRsZXN9IGV4aXRcbiAqICAgQ2xvc2luZyBoYW5kbGVzLlxuICogQHByb3BlcnR5IHtBcnJheTxUcmFuc2Zvcm0+fSB0cmFuc2Zvcm1zXG4gKiAgIFRyZWUgdHJhbnNmb3Jtcy5cbiAqXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxDb25maWc+fSBFeHRlbnNpb25cbiAqICAgQ2hhbmdlIGhvdyBtYXJrZG93biB0b2tlbnMgZnJvbSBtaWNyb21hcmsgYXJlIHR1cm5lZCBpbnRvIG1kYXN0LlxuICpcbiAqIEB0eXBlZGVmIENvbXBpbGVDb250ZXh0XG4gKiAgIG1kYXN0IGNvbXBpbGVyIGNvbnRleHQuXG4gKiBAcHJvcGVydHkge0FycmF5PEZyYWdtZW50IHwgTm9kZXM+fSBzdGFja1xuICogICBTdGFjayBvZiBub2Rlcy5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8VG9rZW5UdXBsZT59IHRva2VuU3RhY2tcbiAqICAgU3RhY2sgb2YgdG9rZW5zLlxuICogQHByb3BlcnR5IHsodGhpczogQ29tcGlsZUNvbnRleHQpID0+IHVuZGVmaW5lZH0gYnVmZmVyXG4gKiAgIENhcHR1cmUgc29tZSBvZiB0aGUgb3V0cHV0IGRhdGEuXG4gKiBAcHJvcGVydHkgeyh0aGlzOiBDb21waWxlQ29udGV4dCkgPT4gc3RyaW5nfSByZXN1bWVcbiAqICAgU3RvcCBjYXB0dXJpbmcgYW5kIGFjY2VzcyB0aGUgb3V0cHV0IGRhdGEuXG4gKiBAcHJvcGVydHkgeyh0aGlzOiBDb21waWxlQ29udGV4dCwgbm9kZTogTm9kZXMsIHRva2VuOiBUb2tlbiwgb25FcnJvcj86IE9uRW50ZXJFcnJvcikgPT4gdW5kZWZpbmVkfSBlbnRlclxuICogICBFbnRlciBhIG5vZGUuXG4gKiBAcHJvcGVydHkgeyh0aGlzOiBDb21waWxlQ29udGV4dCwgdG9rZW46IFRva2VuLCBvbkVycm9yPzogT25FeGl0RXJyb3IpID0+IHVuZGVmaW5lZH0gZXhpdFxuICogICBFeGl0IGEgbm9kZS5cbiAqIEBwcm9wZXJ0eSB7VG9rZW5pemVDb250ZXh0WydzbGljZVNlcmlhbGl6ZSddfSBzbGljZVNlcmlhbGl6ZVxuICogICBHZXQgdGhlIHN0cmluZyB2YWx1ZSBvZiBhIHRva2VuLlxuICogQHByb3BlcnR5IHtDb25maWd9IGNvbmZpZ1xuICogICBDb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtDb21waWxlRGF0YX0gZGF0YVxuICogICBJbmZvIHBhc3NlZCBhcm91bmQ7IGtleS92YWx1ZSBzdG9yZS5cbiAqXG4gKiBAdHlwZWRlZiBGcm9tTWFya2Rvd25PcHRpb25zXG4gKiAgIENvbmZpZ3VyYXRpb24gZm9yIGhvdyB0byBidWlsZCBtZGFzdC5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8RXh0ZW5zaW9uIHwgQXJyYXk8RXh0ZW5zaW9uPj4gfCBudWxsIHwgdW5kZWZpbmVkfSBbbWRhc3RFeHRlbnNpb25zXVxuICogICBFeHRlbnNpb25zIGZvciB0aGlzIHV0aWxpdHkgdG8gY2hhbmdlIGhvdyB0b2tlbnMgYXJlIHR1cm5lZCBpbnRvIGEgdHJlZS5cbiAqXG4gKiBAdHlwZWRlZiB7UGFyc2VPcHRpb25zICYgRnJvbU1hcmtkb3duT3B0aW9uc30gT3B0aW9uc1xuICogICBDb25maWd1cmF0aW9uLlxuICovXG5cbmltcG9ydCB7b2sgYXMgYXNzZXJ0fSBmcm9tICdkZXZsb3AnXG5pbXBvcnQge3RvU3RyaW5nfSBmcm9tICdtZGFzdC11dGlsLXRvLXN0cmluZydcbmltcG9ydCB7cGFyc2UsIHBvc3Rwcm9jZXNzLCBwcmVwcm9jZXNzfSBmcm9tICdtaWNyb21hcmsnXG5pbXBvcnQge2RlY29kZU51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2V9IGZyb20gJ21pY3JvbWFyay11dGlsLWRlY29kZS1udW1lcmljLWNoYXJhY3Rlci1yZWZlcmVuY2UnXG5pbXBvcnQge2RlY29kZVN0cmluZ30gZnJvbSAnbWljcm9tYXJrLXV0aWwtZGVjb2RlLXN0cmluZydcbmltcG9ydCB7bm9ybWFsaXplSWRlbnRpZmllcn0gZnJvbSAnbWljcm9tYXJrLXV0aWwtbm9ybWFsaXplLWlkZW50aWZpZXInXG5pbXBvcnQge2NvZGVzLCBjb25zdGFudHMsIHR5cGVzfSBmcm9tICdtaWNyb21hcmstdXRpbC1zeW1ib2wnXG5pbXBvcnQge2RlY29kZU5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlfSBmcm9tICdkZWNvZGUtbmFtZWQtY2hhcmFjdGVyLXJlZmVyZW5jZSdcbmltcG9ydCB7c3RyaW5naWZ5UG9zaXRpb259IGZyb20gJ3VuaXN0LXV0aWwtc3RyaW5naWZ5LXBvc2l0aW9uJ1xuXG5jb25zdCBvd24gPSB7fS5oYXNPd25Qcm9wZXJ0eVxuXG4vKipcbiAqIFR1cm4gbWFya2Rvd24gaW50byBhIHN5bnRheCB0cmVlLlxuICpcbiAqIEBvdmVybG9hZFxuICogQHBhcmFtIHtWYWx1ZX0gdmFsdWVcbiAqIEBwYXJhbSB7RW5jb2RpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbZW5jb2RpbmddXG4gKiBAcGFyYW0ge09wdGlvbnMgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtSb290fVxuICpcbiAqIEBvdmVybG9hZFxuICogQHBhcmFtIHtWYWx1ZX0gdmFsdWVcbiAqIEBwYXJhbSB7T3B0aW9ucyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRpb25zXVxuICogQHJldHVybnMge1Jvb3R9XG4gKlxuICogQHBhcmFtIHtWYWx1ZX0gdmFsdWVcbiAqICAgTWFya2Rvd24gdG8gcGFyc2UuXG4gKiBAcGFyYW0ge0VuY29kaW5nIHwgT3B0aW9ucyB8IG51bGwgfCB1bmRlZmluZWR9IFtlbmNvZGluZ11cbiAqICAgQ2hhcmFjdGVyIGVuY29kaW5nIGZvciB3aGVuIGB2YWx1ZWAgaXMgYEJ1ZmZlcmAuXG4gKiBAcGFyYW0ge09wdGlvbnMgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0aW9uc11cbiAqICAgQ29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHtSb290fVxuICogICBtZGFzdCB0cmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbU1hcmtkb3duKHZhbHVlLCBlbmNvZGluZywgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMgPSBlbmNvZGluZ1xuICAgIGVuY29kaW5nID0gdW5kZWZpbmVkXG4gIH1cblxuICByZXR1cm4gY29tcGlsZXIob3B0aW9ucykoXG4gICAgcG9zdHByb2Nlc3MoXG4gICAgICBwYXJzZShvcHRpb25zKS5kb2N1bWVudCgpLndyaXRlKHByZXByb2Nlc3MoKSh2YWx1ZSwgZW5jb2RpbmcsIHRydWUpKVxuICAgIClcbiAgKVxufVxuXG4vKipcbiAqIE5vdGUgdGhpcyBjb21waWxlciBvbmx5IHVuZGVyc3RhbmQgY29tcGxldGUgYnVmZmVyaW5nLCBub3Qgc3RyZWFtaW5nLlxuICpcbiAqIEBwYXJhbSB7T3B0aW9ucyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRpb25zXVxuICovXG5mdW5jdGlvbiBjb21waWxlcihvcHRpb25zKSB7XG4gIC8qKiBAdHlwZSB7Q29uZmlnfSAqL1xuICBjb25zdCBjb25maWcgPSB7XG4gICAgdHJhbnNmb3JtczogW10sXG4gICAgY2FuQ29udGFpbkVvbHM6IFsnZW1waGFzaXMnLCAnZnJhZ21lbnQnLCAnaGVhZGluZycsICdwYXJhZ3JhcGgnLCAnc3Ryb25nJ10sXG4gICAgZW50ZXI6IHtcbiAgICAgIGF1dG9saW5rOiBvcGVuZXIobGluayksXG4gICAgICBhdXRvbGlua1Byb3RvY29sOiBvbmVudGVyZGF0YSxcbiAgICAgIGF1dG9saW5rRW1haWw6IG9uZW50ZXJkYXRhLFxuICAgICAgYXR4SGVhZGluZzogb3BlbmVyKGhlYWRpbmcpLFxuICAgICAgYmxvY2tRdW90ZTogb3BlbmVyKGJsb2NrUXVvdGUpLFxuICAgICAgY2hhcmFjdGVyRXNjYXBlOiBvbmVudGVyZGF0YSxcbiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZTogb25lbnRlcmRhdGEsXG4gICAgICBjb2RlRmVuY2VkOiBvcGVuZXIoY29kZUZsb3cpLFxuICAgICAgY29kZUZlbmNlZEZlbmNlSW5mbzogYnVmZmVyLFxuICAgICAgY29kZUZlbmNlZEZlbmNlTWV0YTogYnVmZmVyLFxuICAgICAgY29kZUluZGVudGVkOiBvcGVuZXIoY29kZUZsb3csIGJ1ZmZlciksXG4gICAgICBjb2RlVGV4dDogb3BlbmVyKGNvZGVUZXh0LCBidWZmZXIpLFxuICAgICAgY29kZVRleHREYXRhOiBvbmVudGVyZGF0YSxcbiAgICAgIGRhdGE6IG9uZW50ZXJkYXRhLFxuICAgICAgY29kZUZsb3dWYWx1ZTogb25lbnRlcmRhdGEsXG4gICAgICBkZWZpbml0aW9uOiBvcGVuZXIoZGVmaW5pdGlvbiksXG4gICAgICBkZWZpbml0aW9uRGVzdGluYXRpb25TdHJpbmc6IGJ1ZmZlcixcbiAgICAgIGRlZmluaXRpb25MYWJlbFN0cmluZzogYnVmZmVyLFxuICAgICAgZGVmaW5pdGlvblRpdGxlU3RyaW5nOiBidWZmZXIsXG4gICAgICBlbXBoYXNpczogb3BlbmVyKGVtcGhhc2lzKSxcbiAgICAgIGhhcmRCcmVha0VzY2FwZTogb3BlbmVyKGhhcmRCcmVhayksXG4gICAgICBoYXJkQnJlYWtUcmFpbGluZzogb3BlbmVyKGhhcmRCcmVhayksXG4gICAgICBodG1sRmxvdzogb3BlbmVyKGh0bWwsIGJ1ZmZlciksXG4gICAgICBodG1sRmxvd0RhdGE6IG9uZW50ZXJkYXRhLFxuICAgICAgaHRtbFRleHQ6IG9wZW5lcihodG1sLCBidWZmZXIpLFxuICAgICAgaHRtbFRleHREYXRhOiBvbmVudGVyZGF0YSxcbiAgICAgIGltYWdlOiBvcGVuZXIoaW1hZ2UpLFxuICAgICAgbGFiZWw6IGJ1ZmZlcixcbiAgICAgIGxpbms6IG9wZW5lcihsaW5rKSxcbiAgICAgIGxpc3RJdGVtOiBvcGVuZXIobGlzdEl0ZW0pLFxuICAgICAgbGlzdEl0ZW1WYWx1ZTogb25lbnRlcmxpc3RpdGVtdmFsdWUsXG4gICAgICBsaXN0T3JkZXJlZDogb3BlbmVyKGxpc3QsIG9uZW50ZXJsaXN0b3JkZXJlZCksXG4gICAgICBsaXN0VW5vcmRlcmVkOiBvcGVuZXIobGlzdCksXG4gICAgICBwYXJhZ3JhcGg6IG9wZW5lcihwYXJhZ3JhcGgpLFxuICAgICAgcmVmZXJlbmNlOiBvbmVudGVycmVmZXJlbmNlLFxuICAgICAgcmVmZXJlbmNlU3RyaW5nOiBidWZmZXIsXG4gICAgICByZXNvdXJjZURlc3RpbmF0aW9uU3RyaW5nOiBidWZmZXIsXG4gICAgICByZXNvdXJjZVRpdGxlU3RyaW5nOiBidWZmZXIsXG4gICAgICBzZXRleHRIZWFkaW5nOiBvcGVuZXIoaGVhZGluZyksXG4gICAgICBzdHJvbmc6IG9wZW5lcihzdHJvbmcpLFxuICAgICAgdGhlbWF0aWNCcmVhazogb3BlbmVyKHRoZW1hdGljQnJlYWspXG4gICAgfSxcbiAgICBleGl0OiB7XG4gICAgICBhdHhIZWFkaW5nOiBjbG9zZXIoKSxcbiAgICAgIGF0eEhlYWRpbmdTZXF1ZW5jZTogb25leGl0YXR4aGVhZGluZ3NlcXVlbmNlLFxuICAgICAgYXV0b2xpbms6IGNsb3NlcigpLFxuICAgICAgYXV0b2xpbmtFbWFpbDogb25leGl0YXV0b2xpbmtlbWFpbCxcbiAgICAgIGF1dG9saW5rUHJvdG9jb2w6IG9uZXhpdGF1dG9saW5rcHJvdG9jb2wsXG4gICAgICBibG9ja1F1b3RlOiBjbG9zZXIoKSxcbiAgICAgIGNoYXJhY3RlckVzY2FwZVZhbHVlOiBvbmV4aXRkYXRhLFxuICAgICAgY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VySGV4YWRlY2ltYWw6IG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlcixcbiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZU1hcmtlck51bWVyaWM6IG9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlcixcbiAgICAgIGNoYXJhY3RlclJlZmVyZW5jZVZhbHVlOiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2V2YWx1ZSxcbiAgICAgIGNvZGVGZW5jZWQ6IGNsb3NlcihvbmV4aXRjb2RlZmVuY2VkKSxcbiAgICAgIGNvZGVGZW5jZWRGZW5jZTogb25leGl0Y29kZWZlbmNlZGZlbmNlLFxuICAgICAgY29kZUZlbmNlZEZlbmNlSW5mbzogb25leGl0Y29kZWZlbmNlZGZlbmNlaW5mbyxcbiAgICAgIGNvZGVGZW5jZWRGZW5jZU1ldGE6IG9uZXhpdGNvZGVmZW5jZWRmZW5jZW1ldGEsXG4gICAgICBjb2RlRmxvd1ZhbHVlOiBvbmV4aXRkYXRhLFxuICAgICAgY29kZUluZGVudGVkOiBjbG9zZXIob25leGl0Y29kZWluZGVudGVkKSxcbiAgICAgIGNvZGVUZXh0OiBjbG9zZXIob25leGl0Y29kZXRleHQpLFxuICAgICAgY29kZVRleHREYXRhOiBvbmV4aXRkYXRhLFxuICAgICAgZGF0YTogb25leGl0ZGF0YSxcbiAgICAgIGRlZmluaXRpb246IGNsb3NlcigpLFxuICAgICAgZGVmaW5pdGlvbkRlc3RpbmF0aW9uU3RyaW5nOiBvbmV4aXRkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmcsXG4gICAgICBkZWZpbml0aW9uTGFiZWxTdHJpbmc6IG9uZXhpdGRlZmluaXRpb25sYWJlbHN0cmluZyxcbiAgICAgIGRlZmluaXRpb25UaXRsZVN0cmluZzogb25leGl0ZGVmaW5pdGlvbnRpdGxlc3RyaW5nLFxuICAgICAgZW1waGFzaXM6IGNsb3NlcigpLFxuICAgICAgaGFyZEJyZWFrRXNjYXBlOiBjbG9zZXIob25leGl0aGFyZGJyZWFrKSxcbiAgICAgIGhhcmRCcmVha1RyYWlsaW5nOiBjbG9zZXIob25leGl0aGFyZGJyZWFrKSxcbiAgICAgIGh0bWxGbG93OiBjbG9zZXIob25leGl0aHRtbGZsb3cpLFxuICAgICAgaHRtbEZsb3dEYXRhOiBvbmV4aXRkYXRhLFxuICAgICAgaHRtbFRleHQ6IGNsb3NlcihvbmV4aXRodG1sdGV4dCksXG4gICAgICBodG1sVGV4dERhdGE6IG9uZXhpdGRhdGEsXG4gICAgICBpbWFnZTogY2xvc2VyKG9uZXhpdGltYWdlKSxcbiAgICAgIGxhYmVsOiBvbmV4aXRsYWJlbCxcbiAgICAgIGxhYmVsVGV4dDogb25leGl0bGFiZWx0ZXh0LFxuICAgICAgbGluZUVuZGluZzogb25leGl0bGluZWVuZGluZyxcbiAgICAgIGxpbms6IGNsb3NlcihvbmV4aXRsaW5rKSxcbiAgICAgIGxpc3RJdGVtOiBjbG9zZXIoKSxcbiAgICAgIGxpc3RPcmRlcmVkOiBjbG9zZXIoKSxcbiAgICAgIGxpc3RVbm9yZGVyZWQ6IGNsb3NlcigpLFxuICAgICAgcGFyYWdyYXBoOiBjbG9zZXIoKSxcbiAgICAgIHJlZmVyZW5jZVN0cmluZzogb25leGl0cmVmZXJlbmNlc3RyaW5nLFxuICAgICAgcmVzb3VyY2VEZXN0aW5hdGlvblN0cmluZzogb25leGl0cmVzb3VyY2VkZXN0aW5hdGlvbnN0cmluZyxcbiAgICAgIHJlc291cmNlVGl0bGVTdHJpbmc6IG9uZXhpdHJlc291cmNldGl0bGVzdHJpbmcsXG4gICAgICByZXNvdXJjZTogb25leGl0cmVzb3VyY2UsXG4gICAgICBzZXRleHRIZWFkaW5nOiBjbG9zZXIob25leGl0c2V0ZXh0aGVhZGluZyksXG4gICAgICBzZXRleHRIZWFkaW5nTGluZVNlcXVlbmNlOiBvbmV4aXRzZXRleHRoZWFkaW5nbGluZXNlcXVlbmNlLFxuICAgICAgc2V0ZXh0SGVhZGluZ1RleHQ6IG9uZXhpdHNldGV4dGhlYWRpbmd0ZXh0LFxuICAgICAgc3Ryb25nOiBjbG9zZXIoKSxcbiAgICAgIHRoZW1hdGljQnJlYWs6IGNsb3NlcigpXG4gICAgfVxuICB9XG5cbiAgY29uZmlndXJlKGNvbmZpZywgKG9wdGlvbnMgfHwge30pLm1kYXN0RXh0ZW5zaW9ucyB8fCBbXSlcblxuICAvKiogQHR5cGUge0NvbXBpbGVEYXRhfSAqL1xuICBjb25zdCBkYXRhID0ge31cblxuICByZXR1cm4gY29tcGlsZVxuXG4gIC8qKlxuICAgKiBUdXJuIG1pY3JvbWFyayBldmVudHMgaW50byBhbiBtZGFzdCB0cmVlLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PEV2ZW50Pn0gZXZlbnRzXG4gICAqICAgRXZlbnRzLlxuICAgKiBAcmV0dXJucyB7Um9vdH1cbiAgICogICBtZGFzdCB0cmVlLlxuICAgKi9cbiAgZnVuY3Rpb24gY29tcGlsZShldmVudHMpIHtcbiAgICAvKiogQHR5cGUge1Jvb3R9ICovXG4gICAgbGV0IHRyZWUgPSB7dHlwZTogJ3Jvb3QnLCBjaGlsZHJlbjogW119XG4gICAgLyoqIEB0eXBlIHtPbWl0PENvbXBpbGVDb250ZXh0LCAnc2xpY2VTZXJpYWxpemUnPn0gKi9cbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgc3RhY2s6IFt0cmVlXSxcbiAgICAgIHRva2VuU3RhY2s6IFtdLFxuICAgICAgY29uZmlnLFxuICAgICAgZW50ZXIsXG4gICAgICBleGl0LFxuICAgICAgYnVmZmVyLFxuICAgICAgcmVzdW1lLFxuICAgICAgZGF0YVxuICAgIH1cbiAgICAvKiogQHR5cGUge0FycmF5PG51bWJlcj59ICovXG4gICAgY29uc3QgbGlzdFN0YWNrID0gW11cbiAgICBsZXQgaW5kZXggPSAtMVxuXG4gICAgd2hpbGUgKCsraW5kZXggPCBldmVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBXZSBwcmVwcm9jZXNzIGxpc3RzIHRvIGFkZCBgbGlzdEl0ZW1gIHRva2VucywgYW5kIHRvIGluZmVyIHdoZXRoZXJcbiAgICAgIC8vIGl0ZW1zIHRoZSBsaXN0IGl0c2VsZiBhcmUgc3ByZWFkIG91dC5cbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnRzW2luZGV4XVsxXS50eXBlID09PSB0eXBlcy5saXN0T3JkZXJlZCB8fFxuICAgICAgICBldmVudHNbaW5kZXhdWzFdLnR5cGUgPT09IHR5cGVzLmxpc3RVbm9yZGVyZWRcbiAgICAgICkge1xuICAgICAgICBpZiAoZXZlbnRzW2luZGV4XVswXSA9PT0gJ2VudGVyJykge1xuICAgICAgICAgIGxpc3RTdGFjay5wdXNoKGluZGV4KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRhaWwgPSBsaXN0U3RhY2sucG9wKClcbiAgICAgICAgICBhc3NlcnQodHlwZW9mIHRhaWwgPT09ICdudW1iZXInLCAnZXhwZWN0ZWQgbGlzdCBvdCBiZSBvcGVuJylcbiAgICAgICAgICBpbmRleCA9IHByZXBhcmVMaXN0KGV2ZW50cywgdGFpbCwgaW5kZXgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbmRleCA9IC0xXG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBjb25maWdbZXZlbnRzW2luZGV4XVswXV1cblxuICAgICAgaWYgKG93bi5jYWxsKGhhbmRsZXIsIGV2ZW50c1tpbmRleF1bMV0udHlwZSkpIHtcbiAgICAgICAgaGFuZGxlcltldmVudHNbaW5kZXhdWzFdLnR5cGVdLmNhbGwoXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtzbGljZVNlcmlhbGl6ZTogZXZlbnRzW2luZGV4XVsyXS5zbGljZVNlcmlhbGl6ZX0sXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgKSxcbiAgICAgICAgICBldmVudHNbaW5kZXhdWzFdXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdG9rZW5zIHN0aWxsIGJlaW5nIG9wZW4uXG4gICAgaWYgKGNvbnRleHQudG9rZW5TdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0YWlsID0gY29udGV4dC50b2tlblN0YWNrW2NvbnRleHQudG9rZW5TdGFjay5sZW5ndGggLSAxXVxuICAgICAgY29uc3QgaGFuZGxlciA9IHRhaWxbMV0gfHwgZGVmYXVsdE9uRXJyb3JcbiAgICAgIGhhbmRsZXIuY2FsbChjb250ZXh0LCB1bmRlZmluZWQsIHRhaWxbMF0pXG4gICAgfVxuXG4gICAgLy8gRmlndXJlIG91dCBgcm9vdGAgcG9zaXRpb24uXG4gICAgdHJlZS5wb3NpdGlvbiA9IHtcbiAgICAgIHN0YXJ0OiBwb2ludChcbiAgICAgICAgZXZlbnRzLmxlbmd0aCA+IDAgPyBldmVudHNbMF1bMV0uc3RhcnQgOiB7bGluZTogMSwgY29sdW1uOiAxLCBvZmZzZXQ6IDB9XG4gICAgICApLFxuICAgICAgZW5kOiBwb2ludChcbiAgICAgICAgZXZlbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMl1bMV0uZW5kXG4gICAgICAgICAgOiB7bGluZTogMSwgY29sdW1uOiAxLCBvZmZzZXQ6IDB9XG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gQ2FsbCB0cmFuc2Zvcm1zLlxuICAgIGluZGV4ID0gLTFcbiAgICB3aGlsZSAoKytpbmRleCA8IGNvbmZpZy50cmFuc2Zvcm1zLmxlbmd0aCkge1xuICAgICAgdHJlZSA9IGNvbmZpZy50cmFuc2Zvcm1zW2luZGV4XSh0cmVlKSB8fCB0cmVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRyZWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FycmF5PEV2ZW50Pn0gZXZlbnRzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFxuICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBwcmVwYXJlTGlzdChldmVudHMsIHN0YXJ0LCBsZW5ndGgpIHtcbiAgICBsZXQgaW5kZXggPSBzdGFydCAtIDFcbiAgICBsZXQgY29udGFpbmVyQmFsYW5jZSA9IC0xXG4gICAgbGV0IGxpc3RTcHJlYWQgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7VG9rZW4gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGxpc3RJdGVtXG4gICAgLyoqIEB0eXBlIHtudW1iZXIgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGxpbmVJbmRleFxuICAgIC8qKiBAdHlwZSB7bnVtYmVyIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBmaXJzdEJsYW5rTGluZUluZGV4XG4gICAgLyoqIEB0eXBlIHtib29sZWFuIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBhdE1hcmtlclxuXG4gICAgd2hpbGUgKCsraW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBldmVudCA9IGV2ZW50c1tpbmRleF1cblxuICAgICAgc3dpdGNoIChldmVudFsxXS50eXBlKSB7XG4gICAgICAgIGNhc2UgdHlwZXMubGlzdFVub3JkZXJlZDpcbiAgICAgICAgY2FzZSB0eXBlcy5saXN0T3JkZXJlZDpcbiAgICAgICAgY2FzZSB0eXBlcy5ibG9ja1F1b3RlOiB7XG4gICAgICAgICAgaWYgKGV2ZW50WzBdID09PSAnZW50ZXInKSB7XG4gICAgICAgICAgICBjb250YWluZXJCYWxhbmNlKytcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGFpbmVyQmFsYW5jZS0tXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXRNYXJrZXIgPSB1bmRlZmluZWRcblxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIHR5cGVzLmxpbmVFbmRpbmdCbGFuazoge1xuICAgICAgICAgIGlmIChldmVudFswXSA9PT0gJ2VudGVyJykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBsaXN0SXRlbSAmJlxuICAgICAgICAgICAgICAhYXRNYXJrZXIgJiZcbiAgICAgICAgICAgICAgIWNvbnRhaW5lckJhbGFuY2UgJiZcbiAgICAgICAgICAgICAgIWZpcnN0QmxhbmtMaW5lSW5kZXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmaXJzdEJsYW5rTGluZUluZGV4ID0gaW5kZXhcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXRNYXJrZXIgPSB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSB0eXBlcy5saW5lUHJlZml4OlxuICAgICAgICBjYXNlIHR5cGVzLmxpc3RJdGVtVmFsdWU6XG4gICAgICAgIGNhc2UgdHlwZXMubGlzdEl0ZW1NYXJrZXI6XG4gICAgICAgIGNhc2UgdHlwZXMubGlzdEl0ZW1QcmVmaXg6XG4gICAgICAgIGNhc2UgdHlwZXMubGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlOiB7XG4gICAgICAgICAgLy8gRW1wdHkuXG5cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGF0TWFya2VyID0gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAoIWNvbnRhaW5lckJhbGFuY2UgJiZcbiAgICAgICAgICBldmVudFswXSA9PT0gJ2VudGVyJyAmJlxuICAgICAgICAgIGV2ZW50WzFdLnR5cGUgPT09IHR5cGVzLmxpc3RJdGVtUHJlZml4KSB8fFxuICAgICAgICAoY29udGFpbmVyQmFsYW5jZSA9PT0gLTEgJiZcbiAgICAgICAgICBldmVudFswXSA9PT0gJ2V4aXQnICYmXG4gICAgICAgICAgKGV2ZW50WzFdLnR5cGUgPT09IHR5cGVzLmxpc3RVbm9yZGVyZWQgfHxcbiAgICAgICAgICAgIGV2ZW50WzFdLnR5cGUgPT09IHR5cGVzLmxpc3RPcmRlcmVkKSlcbiAgICAgICkge1xuICAgICAgICBpZiAobGlzdEl0ZW0pIHtcbiAgICAgICAgICBsZXQgdGFpbEluZGV4ID0gaW5kZXhcbiAgICAgICAgICBsaW5lSW5kZXggPSB1bmRlZmluZWRcblxuICAgICAgICAgIHdoaWxlICh0YWlsSW5kZXgtLSkge1xuICAgICAgICAgICAgY29uc3QgdGFpbEV2ZW50ID0gZXZlbnRzW3RhaWxJbmRleF1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0YWlsRXZlbnRbMV0udHlwZSA9PT0gdHlwZXMubGluZUVuZGluZyB8fFxuICAgICAgICAgICAgICB0YWlsRXZlbnRbMV0udHlwZSA9PT0gdHlwZXMubGluZUVuZGluZ0JsYW5rXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKHRhaWxFdmVudFswXSA9PT0gJ2V4aXQnKSBjb250aW51ZVxuXG4gICAgICAgICAgICAgIGlmIChsaW5lSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBldmVudHNbbGluZUluZGV4XVsxXS50eXBlID0gdHlwZXMubGluZUVuZGluZ0JsYW5rXG4gICAgICAgICAgICAgICAgbGlzdFNwcmVhZCA9IHRydWVcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRhaWxFdmVudFsxXS50eXBlID0gdHlwZXMubGluZUVuZGluZ1xuICAgICAgICAgICAgICBsaW5lSW5kZXggPSB0YWlsSW5kZXhcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIHRhaWxFdmVudFsxXS50eXBlID09PSB0eXBlcy5saW5lUHJlZml4IHx8XG4gICAgICAgICAgICAgIHRhaWxFdmVudFsxXS50eXBlID09PSB0eXBlcy5ibG9ja1F1b3RlUHJlZml4IHx8XG4gICAgICAgICAgICAgIHRhaWxFdmVudFsxXS50eXBlID09PSB0eXBlcy5ibG9ja1F1b3RlUHJlZml4V2hpdGVzcGFjZSB8fFxuICAgICAgICAgICAgICB0YWlsRXZlbnRbMV0udHlwZSA9PT0gdHlwZXMuYmxvY2tRdW90ZU1hcmtlciB8fFxuICAgICAgICAgICAgICB0YWlsRXZlbnRbMV0udHlwZSA9PT0gdHlwZXMubGlzdEl0ZW1JbmRlbnRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBFbXB0eVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaXJzdEJsYW5rTGluZUluZGV4ICYmXG4gICAgICAgICAgICAoIWxpbmVJbmRleCB8fCBmaXJzdEJsYW5rTGluZUluZGV4IDwgbGluZUluZGV4KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbGlzdEl0ZW0uX3NwcmVhZCA9IHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGaXggcG9zaXRpb24uXG4gICAgICAgICAgbGlzdEl0ZW0uZW5kID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgbGluZUluZGV4ID8gZXZlbnRzW2xpbmVJbmRleF1bMV0uc3RhcnQgOiBldmVudFsxXS5lbmRcbiAgICAgICAgICApXG5cbiAgICAgICAgICBldmVudHMuc3BsaWNlKGxpbmVJbmRleCB8fCBpbmRleCwgMCwgWydleGl0JywgbGlzdEl0ZW0sIGV2ZW50WzJdXSlcbiAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgbGVuZ3RoKytcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBsaXN0IGl0ZW0uXG4gICAgICAgIGlmIChldmVudFsxXS50eXBlID09PSB0eXBlcy5saXN0SXRlbVByZWZpeCkge1xuICAgICAgICAgIC8qKiBAdHlwZSB7VG9rZW59ICovXG4gICAgICAgICAgY29uc3QgaXRlbSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdsaXN0SXRlbScsXG4gICAgICAgICAgICBfc3ByZWFkOiBmYWxzZSxcbiAgICAgICAgICAgIHN0YXJ0OiBPYmplY3QuYXNzaWduKHt9LCBldmVudFsxXS5zdGFydCksXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiB3ZeKAmWxsIGFkZCBgZW5kYCBpbiBhIHNlY29uZC5cbiAgICAgICAgICAgIGVuZDogdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGxpc3RJdGVtID0gaXRlbVxuICAgICAgICAgIGV2ZW50cy5zcGxpY2UoaW5kZXgsIDAsIFsnZW50ZXInLCBpdGVtLCBldmVudFsyXV0pXG4gICAgICAgICAgaW5kZXgrK1xuICAgICAgICAgIGxlbmd0aCsrXG4gICAgICAgICAgZmlyc3RCbGFua0xpbmVJbmRleCA9IHVuZGVmaW5lZFxuICAgICAgICAgIGF0TWFya2VyID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZXZlbnRzW3N0YXJ0XVsxXS5fc3ByZWFkID0gbGlzdFNwcmVhZFxuICAgIHJldHVybiBsZW5ndGhcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gb3BlbmVyIGhhbmRsZS5cbiAgICpcbiAgICogQHBhcmFtIHsodG9rZW46IFRva2VuKSA9PiBOb2Rlc30gY3JlYXRlXG4gICAqICAgQ3JlYXRlIGEgbm9kZS5cbiAgICogQHBhcmFtIHtIYW5kbGUgfCB1bmRlZmluZWR9IFthbmRdXG4gICAqICAgT3B0aW9uYWwgZnVuY3Rpb24gdG8gYWxzbyBydW4uXG4gICAqIEByZXR1cm5zIHtIYW5kbGV9XG4gICAqICAgSGFuZGxlLlxuICAgKi9cbiAgZnVuY3Rpb24gb3BlbmVyKGNyZWF0ZSwgYW5kKSB7XG4gICAgcmV0dXJuIG9wZW5cblxuICAgIC8qKlxuICAgICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICAgKiBAcGFyYW0ge1Rva2VufSB0b2tlblxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAgICovXG4gICAgZnVuY3Rpb24gb3Blbih0b2tlbikge1xuICAgICAgZW50ZXIuY2FsbCh0aGlzLCBjcmVhdGUodG9rZW4pLCB0b2tlbilcbiAgICAgIGlmIChhbmQpIGFuZC5jYWxsKHRoaXMsIHRva2VuKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBidWZmZXIoKSB7XG4gICAgdGhpcy5zdGFjay5wdXNoKHt0eXBlOiAnZnJhZ21lbnQnLCBjaGlsZHJlbjogW119KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogICBDb250ZXh0LlxuICAgKiBAcGFyYW0ge05vZGVzfSBub2RlXG4gICAqICAgTm9kZSB0byBlbnRlci5cbiAgICogQHBhcmFtIHtUb2tlbn0gdG9rZW5cbiAgICogICBDb3JyZXNwb25kaW5nIHRva2VuLlxuICAgKiBAcGFyYW0ge09uRW50ZXJFcnJvciB8IHVuZGVmaW5lZH0gW2Vycm9ySGFuZGxlcl1cbiAgICogICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhpcyB0b2tlbiBpcyBvcGVuLCBidXQgaXQgaXMgY2xvc2VkIGJ5IHNvbWV0aGluZyBlbHNlLlxuICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgKiAgIE5vdGhpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBlbnRlcihub2RlLCB0b2tlbiwgZXJyb3JIYW5kbGVyKSB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG4gICAgYXNzZXJ0KHBhcmVudCwgJ2V4cGVjdGVkIGBwYXJlbnRgJylcbiAgICBhc3NlcnQoJ2NoaWxkcmVuJyBpbiBwYXJlbnQsICdleHBlY3RlZCBgcGFyZW50YCcpXG4gICAgLyoqIEB0eXBlIHtBcnJheTxOb2Rlcz59ICovXG4gICAgY29uc3Qgc2libGluZ3MgPSBwYXJlbnQuY2hpbGRyZW5cbiAgICBzaWJsaW5ncy5wdXNoKG5vZGUpXG4gICAgdGhpcy5zdGFjay5wdXNoKG5vZGUpXG4gICAgdGhpcy50b2tlblN0YWNrLnB1c2goW3Rva2VuLCBlcnJvckhhbmRsZXJdKVxuICAgIG5vZGUucG9zaXRpb24gPSB7XG4gICAgICBzdGFydDogcG9pbnQodG9rZW4uc3RhcnQpLFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogYGVuZGAgd2lsbCBiZSBwYXRjaGVkIGxhdGVyLlxuICAgICAgZW5kOiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY2xvc2VyIGhhbmRsZS5cbiAgICpcbiAgICogQHBhcmFtIHtIYW5kbGUgfCB1bmRlZmluZWR9IFthbmRdXG4gICAqICAgT3B0aW9uYWwgZnVuY3Rpb24gdG8gYWxzbyBydW4uXG4gICAqIEByZXR1cm5zIHtIYW5kbGV9XG4gICAqICAgSGFuZGxlLlxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VyKGFuZCkge1xuICAgIHJldHVybiBjbG9zZVxuXG4gICAgLyoqXG4gICAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgICAqIEBwYXJhbSB7VG9rZW59IHRva2VuXG4gICAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9zZSh0b2tlbikge1xuICAgICAgaWYgKGFuZCkgYW5kLmNhbGwodGhpcywgdG9rZW4pXG4gICAgICBleGl0LmNhbGwodGhpcywgdG9rZW4pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogICBDb250ZXh0LlxuICAgKiBAcGFyYW0ge1Rva2VufSB0b2tlblxuICAgKiAgIENvcnJlc3BvbmRpbmcgdG9rZW4uXG4gICAqIEBwYXJhbSB7T25FeGl0RXJyb3IgfCB1bmRlZmluZWR9IFtvbkV4aXRFcnJvcl1cbiAgICogICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYW5vdGhlciB0b2tlbiBpcyBvcGVuLlxuICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgKiAgIE5vdGhpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBleGl0KHRva2VuLCBvbkV4aXRFcnJvcikge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YWNrLnBvcCgpXG4gICAgYXNzZXJ0KG5vZGUsICdleHBlY3RlZCBgbm9kZWAnKVxuICAgIGNvbnN0IG9wZW4gPSB0aGlzLnRva2VuU3RhY2sucG9wKClcblxuICAgIGlmICghb3Blbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGNsb3NlIGAnICtcbiAgICAgICAgICB0b2tlbi50eXBlICtcbiAgICAgICAgICAnYCAoJyArXG4gICAgICAgICAgc3RyaW5naWZ5UG9zaXRpb24oe3N0YXJ0OiB0b2tlbi5zdGFydCwgZW5kOiB0b2tlbi5lbmR9KSArXG4gICAgICAgICAgJyk6IGl04oCZcyBub3Qgb3BlbidcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKG9wZW5bMF0udHlwZSAhPT0gdG9rZW4udHlwZSkge1xuICAgICAgaWYgKG9uRXhpdEVycm9yKSB7XG4gICAgICAgIG9uRXhpdEVycm9yLmNhbGwodGhpcywgdG9rZW4sIG9wZW5bMF0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gb3BlblsxXSB8fCBkZWZhdWx0T25FcnJvclxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgdG9rZW4sIG9wZW5bMF0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgYXNzZXJ0KG5vZGUudHlwZSAhPT0gJ2ZyYWdtZW50JywgJ3VuZXhwZWN0ZWQgZnJhZ21lbnQgYGV4aXRgZWQnKVxuICAgIGFzc2VydChub2RlLnBvc2l0aW9uLCAnZXhwZWN0ZWQgYHBvc2l0aW9uYCB0byBiZSBkZWZpbmVkJylcbiAgICBub2RlLnBvc2l0aW9uLmVuZCA9IHBvaW50KHRva2VuLmVuZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiByZXN1bWUoKSB7XG4gICAgcmV0dXJuIHRvU3RyaW5nKHRoaXMuc3RhY2sucG9wKCkpXG4gIH1cblxuICAvL1xuICAvLyBIYW5kbGVycy5cbiAgLy9cblxuICAvKipcbiAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgKiBAdHlwZSB7SGFuZGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gb25lbnRlcmxpc3RvcmRlcmVkKCkge1xuICAgIHRoaXMuZGF0YS5leHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgKiBAdHlwZSB7SGFuZGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gb25lbnRlcmxpc3RpdGVtdmFsdWUodG9rZW4pIHtcbiAgICBpZiAodGhpcy5kYXRhLmV4cGVjdGluZ0ZpcnN0TGlzdEl0ZW1WYWx1ZSkge1xuICAgICAgY29uc3QgYW5jZXN0b3IgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMl1cbiAgICAgIGFzc2VydChhbmNlc3RvciwgJ2V4cGVjdGVkIG5vZGVzIG9uIHN0YWNrJylcbiAgICAgIGFzc2VydChhbmNlc3Rvci50eXBlID09PSAnbGlzdCcsICdleHBlY3RlZCBsaXN0IG9uIHN0YWNrJylcbiAgICAgIGFuY2VzdG9yLnN0YXJ0ID0gTnVtYmVyLnBhcnNlSW50KFxuICAgICAgICB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKSxcbiAgICAgICAgY29uc3RhbnRzLm51bWVyaWNCYXNlRGVjaW1hbFxuICAgICAgKVxuICAgICAgdGhpcy5kYXRhLmV4cGVjdGluZ0ZpcnN0TGlzdEl0ZW1WYWx1ZSA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEB0eXBlIHtIYW5kbGV9XG4gICAqL1xuICBmdW5jdGlvbiBvbmV4aXRjb2RlZmVuY2VkZmVuY2VpbmZvKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlc3VtZSgpXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIGFzc2VydChub2RlLCAnZXhwZWN0ZWQgbm9kZSBvbiBzdGFjaycpXG4gICAgYXNzZXJ0KG5vZGUudHlwZSA9PT0gJ2NvZGUnLCAnZXhwZWN0ZWQgY29kZSBvbiBzdGFjaycpXG4gICAgbm9kZS5sYW5nID0gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogQHR5cGUge0hhbmRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWRmZW5jZW1ldGEoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG4gICAgYXNzZXJ0KG5vZGUsICdleHBlY3RlZCBub2RlIG9uIHN0YWNrJylcbiAgICBhc3NlcnQobm9kZS50eXBlID09PSAnY29kZScsICdleHBlY3RlZCBjb2RlIG9uIHN0YWNrJylcbiAgICBub2RlLm1ldGEgPSBkYXRhXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgKiBAdHlwZSB7SGFuZGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gb25leGl0Y29kZWZlbmNlZGZlbmNlKCkge1xuICAgIC8vIEV4aXQgaWYgdGhpcyBpcyB0aGUgY2xvc2luZyBmZW5jZS5cbiAgICBpZiAodGhpcy5kYXRhLmZsb3dDb2RlSW5zaWRlKSByZXR1cm5cbiAgICB0aGlzLmJ1ZmZlcigpXG4gICAgdGhpcy5kYXRhLmZsb3dDb2RlSW5zaWRlID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogQHR5cGUge0hhbmRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG9uZXhpdGNvZGVmZW5jZWQoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG4gICAgYXNzZXJ0KG5vZGUsICdleHBlY3RlZCBub2RlIG9uIHN0YWNrJylcbiAgICBhc3NlcnQobm9kZS50eXBlID09PSAnY29kZScsICdleHBlY3RlZCBjb2RlIG9uIHN0YWNrJylcblxuICAgIG5vZGUudmFsdWUgPSBkYXRhLnJlcGxhY2UoL14oXFxyP1xcbnxcXHIpfChcXHI/XFxufFxccikkL2csICcnKVxuICAgIHRoaXMuZGF0YS5mbG93Q29kZUluc2lkZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogQHR5cGUge0hhbmRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG9uZXhpdGNvZGVpbmRlbnRlZCgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5yZXN1bWUoKVxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV1cbiAgICBhc3NlcnQobm9kZSwgJ2V4cGVjdGVkIG5vZGUgb24gc3RhY2snKVxuICAgIGFzc2VydChub2RlLnR5cGUgPT09ICdjb2RlJywgJ2V4cGVjdGVkIGNvZGUgb24gc3RhY2snKVxuXG4gICAgbm9kZS52YWx1ZSA9IGRhdGEucmVwbGFjZSgvKFxccj9cXG58XFxyKSQvZywgJycpXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgKiBAdHlwZSB7SGFuZGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gb25leGl0ZGVmaW5pdGlvbmxhYmVsc3RyaW5nKHRva2VuKSB7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLnJlc3VtZSgpXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIGFzc2VydChub2RlLCAnZXhwZWN0ZWQgbm9kZSBvbiBzdGFjaycpXG4gICAgYXNzZXJ0KG5vZGUudHlwZSA9PT0gJ2RlZmluaXRpb24nLCAnZXhwZWN0ZWQgZGVmaW5pdGlvbiBvbiBzdGFjaycpXG5cbiAgICBub2RlLmxhYmVsID0gbGFiZWxcbiAgICBub2RlLmlkZW50aWZpZXIgPSBub3JtYWxpemVJZGVudGlmaWVyKFxuICAgICAgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbilcbiAgICApLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEB0eXBlIHtIYW5kbGV9XG4gICAqL1xuICBmdW5jdGlvbiBvbmV4aXRkZWZpbml0aW9udGl0bGVzdHJpbmcoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG4gICAgYXNzZXJ0KG5vZGUsICdleHBlY3RlZCBub2RlIG9uIHN0YWNrJylcbiAgICBhc3NlcnQobm9kZS50eXBlID09PSAnZGVmaW5pdGlvbicsICdleHBlY3RlZCBkZWZpbml0aW9uIG9uIHN0YWNrJylcblxuICAgIG5vZGUudGl0bGUgPSBkYXRhXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgKiBAdHlwZSB7SGFuZGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gb25leGl0ZGVmaW5pdGlvbmRlc3RpbmF0aW9uc3RyaW5nKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlc3VtZSgpXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIGFzc2VydChub2RlLCAnZXhwZWN0ZWQgbm9kZSBvbiBzdGFjaycpXG4gICAgYXNzZXJ0KG5vZGUudHlwZSA9PT0gJ2RlZmluaXRpb24nLCAnZXhwZWN0ZWQgZGVmaW5pdGlvbiBvbiBzdGFjaycpXG5cbiAgICBub2RlLnVybCA9IGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEB0eXBlIHtIYW5kbGV9XG4gICAqL1xuICBmdW5jdGlvbiBvbmV4aXRhdHhoZWFkaW5nc2VxdWVuY2UodG9rZW4pIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG4gICAgYXNzZXJ0KG5vZGUsICdleHBlY3RlZCBub2RlIG9uIHN0YWNrJylcbiAgICBhc3NlcnQobm9kZS50eXBlID09PSAnaGVhZGluZycsICdleHBlY3RlZCBoZWFkaW5nIG9uIHN0YWNrJylcblxuICAgIGlmICghbm9kZS5kZXB0aCkge1xuICAgICAgY29uc3QgZGVwdGggPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKS5sZW5ndGhcblxuICAgICAgYXNzZXJ0KFxuICAgICAgICBkZXB0aCA9PT0gMSB8fFxuICAgICAgICAgIGRlcHRoID09PSAyIHx8XG4gICAgICAgICAgZGVwdGggPT09IDMgfHxcbiAgICAgICAgICBkZXB0aCA9PT0gNCB8fFxuICAgICAgICAgIGRlcHRoID09PSA1IHx8XG4gICAgICAgICAgZGVwdGggPT09IDYsXG4gICAgICAgICdleHBlY3RlZCBgZGVwdGhgIGJldHdlZW4gYDFgIGFuZCBgNmAnXG4gICAgICApXG5cbiAgICAgIG5vZGUuZGVwdGggPSBkZXB0aFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEB0eXBlIHtIYW5kbGV9XG4gICAqL1xuICBmdW5jdGlvbiBvbmV4aXRzZXRleHRoZWFkaW5ndGV4dCgpIHtcbiAgICB0aGlzLmRhdGEuc2V0ZXh0SGVhZGluZ1NsdXJwTGluZUVuZGluZyA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEB0eXBlIHtIYW5kbGV9XG4gICAqL1xuICBmdW5jdGlvbiBvbmV4aXRzZXRleHRoZWFkaW5nbGluZXNlcXVlbmNlKHRva2VuKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIGFzc2VydChub2RlLCAnZXhwZWN0ZWQgbm9kZSBvbiBzdGFjaycpXG4gICAgYXNzZXJ0KG5vZGUudHlwZSA9PT0gJ2hlYWRpbmcnLCAnZXhwZWN0ZWQgaGVhZGluZyBvbiBzdGFjaycpXG5cbiAgICBub2RlLmRlcHRoID1cbiAgICAgIHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pLmNvZGVQb2ludEF0KDApID09PSBjb2Rlcy5lcXVhbHNUbyA/IDEgOiAyXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgKiBAdHlwZSB7SGFuZGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gb25leGl0c2V0ZXh0aGVhZGluZygpIHtcbiAgICB0aGlzLmRhdGEuc2V0ZXh0SGVhZGluZ1NsdXJwTGluZUVuZGluZyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogQHR5cGUge0hhbmRsZX1cbiAgICovXG5cbiAgZnVuY3Rpb24gb25lbnRlcmRhdGEodG9rZW4pIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG4gICAgYXNzZXJ0KG5vZGUsICdleHBlY3RlZCBub2RlIG9uIHN0YWNrJylcbiAgICBhc3NlcnQoJ2NoaWxkcmVuJyBpbiBub2RlLCAnZXhwZWN0ZWQgcGFyZW50IG9uIHN0YWNrJylcbiAgICAvKiogQHR5cGUge0FycmF5PE5vZGVzPn0gKi9cbiAgICBjb25zdCBzaWJsaW5ncyA9IG5vZGUuY2hpbGRyZW5cblxuICAgIGxldCB0YWlsID0gc2libGluZ3Nbc2libGluZ3MubGVuZ3RoIC0gMV1cblxuICAgIGlmICghdGFpbCB8fCB0YWlsLnR5cGUgIT09ICd0ZXh0Jykge1xuICAgICAgLy8gQWRkIGEgbmV3IHRleHQgbm9kZS5cbiAgICAgIHRhaWwgPSB0ZXh0KClcbiAgICAgIHRhaWwucG9zaXRpb24gPSB7XG4gICAgICAgIHN0YXJ0OiBwb2ludCh0b2tlbi5zdGFydCksXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IHdl4oCZbGwgYWRkIGBlbmRgIGxhdGVyLlxuICAgICAgICBlbmQ6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgc2libGluZ3MucHVzaCh0YWlsKVxuICAgIH1cblxuICAgIHRoaXMuc3RhY2sucHVzaCh0YWlsKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogQHR5cGUge0hhbmRsZX1cbiAgICovXG5cbiAgZnVuY3Rpb24gb25leGl0ZGF0YSh0b2tlbikge1xuICAgIGNvbnN0IHRhaWwgPSB0aGlzLnN0YWNrLnBvcCgpXG4gICAgYXNzZXJ0KHRhaWwsICdleHBlY3RlZCBhIGBub2RlYCB0byBiZSBvbiB0aGUgc3RhY2snKVxuICAgIGFzc2VydCgndmFsdWUnIGluIHRhaWwsICdleHBlY3RlZCBhIGBsaXRlcmFsYCB0byBiZSBvbiB0aGUgc3RhY2snKVxuICAgIGFzc2VydCh0YWlsLnBvc2l0aW9uLCAnZXhwZWN0ZWQgYG5vZGVgIHRvIGhhdmUgYW4gb3BlbiBwb3NpdGlvbicpXG4gICAgdGFpbC52YWx1ZSArPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKVxuICAgIHRhaWwucG9zaXRpb24uZW5kID0gcG9pbnQodG9rZW4uZW5kKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogQHR5cGUge0hhbmRsZX1cbiAgICovXG5cbiAgZnVuY3Rpb24gb25leGl0bGluZWVuZGluZyh0b2tlbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV1cbiAgICBhc3NlcnQoY29udGV4dCwgJ2V4cGVjdGVkIGBub2RlYCcpXG5cbiAgICAvLyBJZiB3ZeKAmXJlIGF0IGEgaGFyZCBicmVhaywgaW5jbHVkZSB0aGUgbGluZSBlbmRpbmcgaW4gdGhlcmUuXG4gICAgaWYgKHRoaXMuZGF0YS5hdEhhcmRCcmVhaykge1xuICAgICAgYXNzZXJ0KCdjaGlsZHJlbicgaW4gY29udGV4dCwgJ2V4cGVjdGVkIGBwYXJlbnRgJylcbiAgICAgIGNvbnN0IHRhaWwgPSBjb250ZXh0LmNoaWxkcmVuW2NvbnRleHQuY2hpbGRyZW4ubGVuZ3RoIC0gMV1cbiAgICAgIGFzc2VydCh0YWlsLnBvc2l0aW9uLCAnZXhwZWN0ZWQgdGFpbCB0byBoYXZlIGEgc3RhcnRpbmcgcG9zaXRpb24nKVxuICAgICAgdGFpbC5wb3NpdGlvbi5lbmQgPSBwb2ludCh0b2tlbi5lbmQpXG4gICAgICB0aGlzLmRhdGEuYXRIYXJkQnJlYWsgPSB1bmRlZmluZWRcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChcbiAgICAgICF0aGlzLmRhdGEuc2V0ZXh0SGVhZGluZ1NsdXJwTGluZUVuZGluZyAmJlxuICAgICAgY29uZmlnLmNhbkNvbnRhaW5Fb2xzLmluY2x1ZGVzKGNvbnRleHQudHlwZSlcbiAgICApIHtcbiAgICAgIG9uZW50ZXJkYXRhLmNhbGwodGhpcywgdG9rZW4pXG4gICAgICBvbmV4aXRkYXRhLmNhbGwodGhpcywgdG9rZW4pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogQHR5cGUge0hhbmRsZX1cbiAgICovXG5cbiAgZnVuY3Rpb24gb25leGl0aGFyZGJyZWFrKCkge1xuICAgIHRoaXMuZGF0YS5hdEhhcmRCcmVhayA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEB0eXBlIHtIYW5kbGV9XG4gICAqL1xuXG4gIGZ1bmN0aW9uIG9uZXhpdGh0bWxmbG93KCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlc3VtZSgpXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIGFzc2VydChub2RlLCAnZXhwZWN0ZWQgbm9kZSBvbiBzdGFjaycpXG4gICAgYXNzZXJ0KG5vZGUudHlwZSA9PT0gJ2h0bWwnLCAnZXhwZWN0ZWQgaHRtbCBvbiBzdGFjaycpXG5cbiAgICBub2RlLnZhbHVlID0gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogQHR5cGUge0hhbmRsZX1cbiAgICovXG5cbiAgZnVuY3Rpb24gb25leGl0aHRtbHRleHQoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG4gICAgYXNzZXJ0KG5vZGUsICdleHBlY3RlZCBub2RlIG9uIHN0YWNrJylcbiAgICBhc3NlcnQobm9kZS50eXBlID09PSAnaHRtbCcsICdleHBlY3RlZCBodG1sIG9uIHN0YWNrJylcblxuICAgIG5vZGUudmFsdWUgPSBkYXRhXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgKiBAdHlwZSB7SGFuZGxlfVxuICAgKi9cblxuICBmdW5jdGlvbiBvbmV4aXRjb2RldGV4dCgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5yZXN1bWUoKVxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV1cbiAgICBhc3NlcnQobm9kZSwgJ2V4cGVjdGVkIG5vZGUgb24gc3RhY2snKVxuICAgIGFzc2VydChub2RlLnR5cGUgPT09ICdpbmxpbmVDb2RlJywgJ2V4cGVjdGVkIGlubGluZSBjb2RlIG9uIHN0YWNrJylcblxuICAgIG5vZGUudmFsdWUgPSBkYXRhXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgKiBAdHlwZSB7SGFuZGxlfVxuICAgKi9cblxuICBmdW5jdGlvbiBvbmV4aXRsaW5rKCkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV1cbiAgICBhc3NlcnQobm9kZSwgJ2V4cGVjdGVkIG5vZGUgb24gc3RhY2snKVxuICAgIGFzc2VydChub2RlLnR5cGUgPT09ICdsaW5rJywgJ2V4cGVjdGVkIGxpbmsgb24gc3RhY2snKVxuXG4gICAgLy8gTm90ZTogdGhlcmUgYXJlIGFsc28gYGlkZW50aWZpZXJgIGFuZCBgbGFiZWxgIGZpZWxkcyBvbiB0aGlzIGxpbmsgbm9kZSFcbiAgICAvLyBUaGVzZSBhcmUgdXNlZCAvIGNsZWFuZWQgaGVyZS5cblxuICAgIC8vIFRvIGRvOiBjbGVhbi5cbiAgICBpZiAodGhpcy5kYXRhLmluUmVmZXJlbmNlKSB7XG4gICAgICAvKiogQHR5cGUge1JlZmVyZW5jZVR5cGV9ICovXG4gICAgICBjb25zdCByZWZlcmVuY2VUeXBlID0gdGhpcy5kYXRhLnJlZmVyZW5jZVR5cGUgfHwgJ3Nob3J0Y3V0J1xuXG4gICAgICBub2RlLnR5cGUgKz0gJ1JlZmVyZW5jZSdcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IG11dGF0ZS5cbiAgICAgIG5vZGUucmVmZXJlbmNlVHlwZSA9IHJlZmVyZW5jZVR5cGVcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IG11dGF0ZS5cbiAgICAgIGRlbGV0ZSBub2RlLnVybFxuICAgICAgZGVsZXRlIG5vZGUudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogbXV0YXRlLlxuICAgICAgZGVsZXRlIG5vZGUuaWRlbnRpZmllclxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogbXV0YXRlLlxuICAgICAgZGVsZXRlIG5vZGUubGFiZWxcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEucmVmZXJlbmNlVHlwZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogQHR5cGUge0hhbmRsZX1cbiAgICovXG5cbiAgZnVuY3Rpb24gb25leGl0aW1hZ2UoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIGFzc2VydChub2RlLCAnZXhwZWN0ZWQgbm9kZSBvbiBzdGFjaycpXG4gICAgYXNzZXJ0KG5vZGUudHlwZSA9PT0gJ2ltYWdlJywgJ2V4cGVjdGVkIGltYWdlIG9uIHN0YWNrJylcblxuICAgIC8vIE5vdGU6IHRoZXJlIGFyZSBhbHNvIGBpZGVudGlmaWVyYCBhbmQgYGxhYmVsYCBmaWVsZHMgb24gdGhpcyBsaW5rIG5vZGUhXG4gICAgLy8gVGhlc2UgYXJlIHVzZWQgLyBjbGVhbmVkIGhlcmUuXG5cbiAgICAvLyBUbyBkbzogY2xlYW4uXG4gICAgaWYgKHRoaXMuZGF0YS5pblJlZmVyZW5jZSkge1xuICAgICAgLyoqIEB0eXBlIHtSZWZlcmVuY2VUeXBlfSAqL1xuICAgICAgY29uc3QgcmVmZXJlbmNlVHlwZSA9IHRoaXMuZGF0YS5yZWZlcmVuY2VUeXBlIHx8ICdzaG9ydGN1dCdcblxuICAgICAgbm9kZS50eXBlICs9ICdSZWZlcmVuY2UnXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBtdXRhdGUuXG4gICAgICBub2RlLnJlZmVyZW5jZVR5cGUgPSByZWZlcmVuY2VUeXBlXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBtdXRhdGUuXG4gICAgICBkZWxldGUgbm9kZS51cmxcbiAgICAgIGRlbGV0ZSBub2RlLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IG11dGF0ZS5cbiAgICAgIGRlbGV0ZSBub2RlLmlkZW50aWZpZXJcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IG11dGF0ZS5cbiAgICAgIGRlbGV0ZSBub2RlLmxhYmVsXG4gICAgfVxuXG4gICAgdGhpcy5kYXRhLnJlZmVyZW5jZVR5cGUgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEB0eXBlIHtIYW5kbGV9XG4gICAqL1xuXG4gIGZ1bmN0aW9uIG9uZXhpdGxhYmVsdGV4dCh0b2tlbikge1xuICAgIGNvbnN0IHN0cmluZyA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pXG4gICAgY29uc3QgYW5jZXN0b3IgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMl1cbiAgICBhc3NlcnQoYW5jZXN0b3IsICdleHBlY3RlZCBhbmNlc3RvciBvbiBzdGFjaycpXG4gICAgYXNzZXJ0KFxuICAgICAgYW5jZXN0b3IudHlwZSA9PT0gJ2ltYWdlJyB8fCBhbmNlc3Rvci50eXBlID09PSAnbGluaycsXG4gICAgICAnZXhwZWN0ZWQgaW1hZ2Ugb3IgbGluayBvbiBzdGFjaydcbiAgICApXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBzdGFzaCB0aGlzIG9uIHRoZSBub2RlLCBhcyBpdCBtaWdodCBiZWNvbWUgYSByZWZlcmVuY2VcbiAgICAvLyBsYXRlci5cbiAgICBhbmNlc3Rvci5sYWJlbCA9IGRlY29kZVN0cmluZyhzdHJpbmcpXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogc2FtZSBhcyBhYm92ZS5cbiAgICBhbmNlc3Rvci5pZGVudGlmaWVyID0gbm9ybWFsaXplSWRlbnRpZmllcihzdHJpbmcpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEB0eXBlIHtIYW5kbGV9XG4gICAqL1xuXG4gIGZ1bmN0aW9uIG9uZXhpdGxhYmVsKCkge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG4gICAgYXNzZXJ0KGZyYWdtZW50LCAnZXhwZWN0ZWQgbm9kZSBvbiBzdGFjaycpXG4gICAgYXNzZXJ0KGZyYWdtZW50LnR5cGUgPT09ICdmcmFnbWVudCcsICdleHBlY3RlZCBmcmFnbWVudCBvbiBzdGFjaycpXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlc3VtZSgpXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIGFzc2VydChub2RlLCAnZXhwZWN0ZWQgbm9kZSBvbiBzdGFjaycpXG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZS50eXBlID09PSAnaW1hZ2UnIHx8IG5vZGUudHlwZSA9PT0gJ2xpbmsnLFxuICAgICAgJ2V4cGVjdGVkIGltYWdlIG9yIGxpbmsgb24gc3RhY2snXG4gICAgKVxuXG4gICAgLy8gQXNzdW1lIGEgcmVmZXJlbmNlLlxuICAgIHRoaXMuZGF0YS5pblJlZmVyZW5jZSA9IHRydWVcblxuICAgIGlmIChub2RlLnR5cGUgPT09ICdsaW5rJykge1xuICAgICAgLyoqIEB0eXBlIHtBcnJheTxQaHJhc2luZ0NvbnRlbnQ+fSAqL1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBmcmFnbWVudC5jaGlsZHJlblxuXG4gICAgICBub2RlLmNoaWxkcmVuID0gY2hpbGRyZW5cbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5hbHQgPSB2YWx1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEB0eXBlIHtIYW5kbGV9XG4gICAqL1xuXG4gIGZ1bmN0aW9uIG9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmcoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucmVzdW1lKClcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG4gICAgYXNzZXJ0KG5vZGUsICdleHBlY3RlZCBub2RlIG9uIHN0YWNrJylcbiAgICBhc3NlcnQoXG4gICAgICBub2RlLnR5cGUgPT09ICdpbWFnZScgfHwgbm9kZS50eXBlID09PSAnbGluaycsXG4gICAgICAnZXhwZWN0ZWQgaW1hZ2Ugb3IgbGluayBvbiBzdGFjaydcbiAgICApXG4gICAgbm9kZS51cmwgPSBkYXRhXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgKiBAdHlwZSB7SGFuZGxlfVxuICAgKi9cblxuICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlc3VtZSgpXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIGFzc2VydChub2RlLCAnZXhwZWN0ZWQgbm9kZSBvbiBzdGFjaycpXG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZS50eXBlID09PSAnaW1hZ2UnIHx8IG5vZGUudHlwZSA9PT0gJ2xpbmsnLFxuICAgICAgJ2V4cGVjdGVkIGltYWdlIG9yIGxpbmsgb24gc3RhY2snXG4gICAgKVxuICAgIG5vZGUudGl0bGUgPSBkYXRhXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgKiBAdHlwZSB7SGFuZGxlfVxuICAgKi9cblxuICBmdW5jdGlvbiBvbmV4aXRyZXNvdXJjZSgpIHtcbiAgICB0aGlzLmRhdGEuaW5SZWZlcmVuY2UgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEB0eXBlIHtIYW5kbGV9XG4gICAqL1xuXG4gIGZ1bmN0aW9uIG9uZW50ZXJyZWZlcmVuY2UoKSB7XG4gICAgdGhpcy5kYXRhLnJlZmVyZW5jZVR5cGUgPSAnY29sbGFwc2VkJ1xuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogQHR5cGUge0hhbmRsZX1cbiAgICovXG5cbiAgZnVuY3Rpb24gb25leGl0cmVmZXJlbmNlc3RyaW5nKHRva2VuKSB7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLnJlc3VtZSgpXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIGFzc2VydChub2RlLCAnZXhwZWN0ZWQgbm9kZSBvbiBzdGFjaycpXG4gICAgYXNzZXJ0KFxuICAgICAgbm9kZS50eXBlID09PSAnaW1hZ2UnIHx8IG5vZGUudHlwZSA9PT0gJ2xpbmsnLFxuICAgICAgJ2V4cGVjdGVkIGltYWdlIHJlZmVyZW5jZSBvciBsaW5rIHJlZmVyZW5jZSBvbiBzdGFjaydcbiAgICApXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBzdGFzaCB0aGlzIG9uIHRoZSBub2RlLCBhcyBpdCBtaWdodCBiZWNvbWUgYSByZWZlcmVuY2VcbiAgICAvLyBsYXRlci5cbiAgICBub2RlLmxhYmVsID0gbGFiZWxcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBzYW1lIGFzIGFib3ZlLlxuICAgIG5vZGUuaWRlbnRpZmllciA9IG5vcm1hbGl6ZUlkZW50aWZpZXIoXG4gICAgICB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKVxuICAgICkudG9Mb3dlckNhc2UoKVxuICAgIHRoaXMuZGF0YS5yZWZlcmVuY2VUeXBlID0gJ2Z1bGwnXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgKiBAdHlwZSB7SGFuZGxlfVxuICAgKi9cblxuICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2VtYXJrZXIodG9rZW4pIHtcbiAgICBhc3NlcnQoXG4gICAgICB0b2tlbi50eXBlID09PSAnY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpYycgfHxcbiAgICAgICAgdG9rZW4udHlwZSA9PT0gJ2NoYXJhY3RlclJlZmVyZW5jZU1hcmtlckhleGFkZWNpbWFsJ1xuICAgIClcbiAgICB0aGlzLmRhdGEuY2hhcmFjdGVyUmVmZXJlbmNlVHlwZSA9IHRva2VuLnR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGhpcyB7Q29tcGlsZUNvbnRleHR9XG4gICAqIEB0eXBlIHtIYW5kbGV9XG4gICAqL1xuICBmdW5jdGlvbiBvbmV4aXRjaGFyYWN0ZXJyZWZlcmVuY2V2YWx1ZSh0b2tlbikge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNsaWNlU2VyaWFsaXplKHRva2VuKVxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmRhdGEuY2hhcmFjdGVyUmVmZXJlbmNlVHlwZVxuICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgIGxldCB2YWx1ZVxuXG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIHZhbHVlID0gZGVjb2RlTnVtZXJpY0NoYXJhY3RlclJlZmVyZW5jZShcbiAgICAgICAgZGF0YSxcbiAgICAgICAgdHlwZSA9PT0gdHlwZXMuY2hhcmFjdGVyUmVmZXJlbmNlTWFya2VyTnVtZXJpY1xuICAgICAgICAgID8gY29uc3RhbnRzLm51bWVyaWNCYXNlRGVjaW1hbFxuICAgICAgICAgIDogY29uc3RhbnRzLm51bWVyaWNCYXNlSGV4YWRlY2ltYWxcbiAgICAgIClcbiAgICAgIHRoaXMuZGF0YS5jaGFyYWN0ZXJSZWZlcmVuY2VUeXBlID0gdW5kZWZpbmVkXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZU5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlKGRhdGEpXG4gICAgICBhc3NlcnQocmVzdWx0ICE9PSBmYWxzZSwgJ2V4cGVjdGVkIHJlZmVyZW5jZSB0byBkZWNvZGUnKVxuICAgICAgdmFsdWUgPSByZXN1bHRcbiAgICB9XG5cbiAgICBjb25zdCB0YWlsID0gdGhpcy5zdGFjay5wb3AoKVxuICAgIGFzc2VydCh0YWlsLCAnZXhwZWN0ZWQgYG5vZGVgJylcbiAgICBhc3NlcnQodGFpbC5wb3NpdGlvbiwgJ2V4cGVjdGVkIGBub2RlLnBvc2l0aW9uYCcpXG4gICAgYXNzZXJ0KCd2YWx1ZScgaW4gdGFpbCwgJ2V4cGVjdGVkIGBub2RlLnZhbHVlYCcpXG4gICAgdGFpbC52YWx1ZSArPSB2YWx1ZVxuICAgIHRhaWwucG9zaXRpb24uZW5kID0gcG9pbnQodG9rZW4uZW5kKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0aGlzIHtDb21waWxlQ29udGV4dH1cbiAgICogQHR5cGUge0hhbmRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG9uZXhpdGF1dG9saW5rcHJvdG9jb2wodG9rZW4pIHtcbiAgICBvbmV4aXRkYXRhLmNhbGwodGhpcywgdG9rZW4pXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXVxuICAgIGFzc2VydChub2RlLCAnZXhwZWN0ZWQgbm9kZSBvbiBzdGFjaycpXG4gICAgYXNzZXJ0KG5vZGUudHlwZSA9PT0gJ2xpbmsnLCAnZXhwZWN0ZWQgbGluayBvbiBzdGFjaycpXG5cbiAgICBub2RlLnVybCA9IHRoaXMuc2xpY2VTZXJpYWxpemUodG9rZW4pXG4gIH1cblxuICAvKipcbiAgICogQHRoaXMge0NvbXBpbGVDb250ZXh0fVxuICAgKiBAdHlwZSB7SGFuZGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gb25leGl0YXV0b2xpbmtlbWFpbCh0b2tlbikge1xuICAgIG9uZXhpdGRhdGEuY2FsbCh0aGlzLCB0b2tlbilcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdXG4gICAgYXNzZXJ0KG5vZGUsICdleHBlY3RlZCBub2RlIG9uIHN0YWNrJylcbiAgICBhc3NlcnQobm9kZS50eXBlID09PSAnbGluaycsICdleHBlY3RlZCBsaW5rIG9uIHN0YWNrJylcblxuICAgIG5vZGUudXJsID0gJ21haWx0bzonICsgdGhpcy5zbGljZVNlcmlhbGl6ZSh0b2tlbilcbiAgfVxuXG4gIC8vXG4gIC8vIENyZWF0ZXJzLlxuICAvL1xuXG4gIC8qKiBAcmV0dXJucyB7QmxvY2txdW90ZX0gKi9cbiAgZnVuY3Rpb24gYmxvY2tRdW90ZSgpIHtcbiAgICByZXR1cm4ge3R5cGU6ICdibG9ja3F1b3RlJywgY2hpbGRyZW46IFtdfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtDb2RlfSAqL1xuICBmdW5jdGlvbiBjb2RlRmxvdygpIHtcbiAgICByZXR1cm4ge3R5cGU6ICdjb2RlJywgbGFuZzogbnVsbCwgbWV0YTogbnVsbCwgdmFsdWU6ICcnfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtJbmxpbmVDb2RlfSAqL1xuICBmdW5jdGlvbiBjb2RlVGV4dCgpIHtcbiAgICByZXR1cm4ge3R5cGU6ICdpbmxpbmVDb2RlJywgdmFsdWU6ICcnfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtEZWZpbml0aW9ufSAqL1xuICBmdW5jdGlvbiBkZWZpbml0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZGVmaW5pdGlvbicsXG4gICAgICBpZGVudGlmaWVyOiAnJyxcbiAgICAgIGxhYmVsOiBudWxsLFxuICAgICAgdGl0bGU6IG51bGwsXG4gICAgICB1cmw6ICcnXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtFbXBoYXNpc30gKi9cbiAgZnVuY3Rpb24gZW1waGFzaXMoKSB7XG4gICAgcmV0dXJuIHt0eXBlOiAnZW1waGFzaXMnLCBjaGlsZHJlbjogW119XG4gIH1cblxuICAvKiogQHJldHVybnMge0hlYWRpbmd9ICovXG4gIGZ1bmN0aW9uIGhlYWRpbmcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdoZWFkaW5nJyxcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYGRlcHRoYCB3aWxsIGJlIHNldCBsYXRlci5cbiAgICAgIGRlcHRoOiAwLFxuICAgICAgY2hpbGRyZW46IFtdXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtCcmVha30gKi9cbiAgZnVuY3Rpb24gaGFyZEJyZWFrKCkge1xuICAgIHJldHVybiB7dHlwZTogJ2JyZWFrJ31cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7SHRtbH0gKi9cbiAgZnVuY3Rpb24gaHRtbCgpIHtcbiAgICByZXR1cm4ge3R5cGU6ICdodG1sJywgdmFsdWU6ICcnfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtJbWFnZX0gKi9cbiAgZnVuY3Rpb24gaW1hZ2UoKSB7XG4gICAgcmV0dXJuIHt0eXBlOiAnaW1hZ2UnLCB0aXRsZTogbnVsbCwgdXJsOiAnJywgYWx0OiBudWxsfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtMaW5rfSAqL1xuICBmdW5jdGlvbiBsaW5rKCkge1xuICAgIHJldHVybiB7dHlwZTogJ2xpbmsnLCB0aXRsZTogbnVsbCwgdXJsOiAnJywgY2hpbGRyZW46IFtdfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VG9rZW59IHRva2VuXG4gICAqIEByZXR1cm5zIHtMaXN0fVxuICAgKi9cbiAgZnVuY3Rpb24gbGlzdCh0b2tlbikge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICBvcmRlcmVkOiB0b2tlbi50eXBlID09PSAnbGlzdE9yZGVyZWQnLFxuICAgICAgc3RhcnQ6IG51bGwsXG4gICAgICBzcHJlYWQ6IHRva2VuLl9zcHJlYWQsXG4gICAgICBjaGlsZHJlbjogW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtUb2tlbn0gdG9rZW5cbiAgICogQHJldHVybnMge0xpc3RJdGVtfVxuICAgKi9cbiAgZnVuY3Rpb24gbGlzdEl0ZW0odG9rZW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2xpc3RJdGVtJyxcbiAgICAgIHNwcmVhZDogdG9rZW4uX3NwcmVhZCxcbiAgICAgIGNoZWNrZWQ6IG51bGwsXG4gICAgICBjaGlsZHJlbjogW11cbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1BhcmFncmFwaH0gKi9cbiAgZnVuY3Rpb24gcGFyYWdyYXBoKCkge1xuICAgIHJldHVybiB7dHlwZTogJ3BhcmFncmFwaCcsIGNoaWxkcmVuOiBbXX1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7U3Ryb25nfSAqL1xuICBmdW5jdGlvbiBzdHJvbmcoKSB7XG4gICAgcmV0dXJuIHt0eXBlOiAnc3Ryb25nJywgY2hpbGRyZW46IFtdfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtUZXh0fSAqL1xuICBmdW5jdGlvbiB0ZXh0KCkge1xuICAgIHJldHVybiB7dHlwZTogJ3RleHQnLCB2YWx1ZTogJyd9XG4gIH1cblxuICAvKiogQHJldHVybnMge1RoZW1hdGljQnJlYWt9ICovXG4gIGZ1bmN0aW9uIHRoZW1hdGljQnJlYWsoKSB7XG4gICAgcmV0dXJuIHt0eXBlOiAndGhlbWF0aWNCcmVhayd9XG4gIH1cbn1cblxuLyoqXG4gKiBDb3B5IGEgcG9pbnQtbGlrZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1BvaW50fSBkXG4gKiAgIFBvaW50LWxpa2UgdmFsdWUuXG4gKiBAcmV0dXJucyB7UG9pbnR9XG4gKiAgIHVuaXN0IHBvaW50LlxuICovXG5mdW5jdGlvbiBwb2ludChkKSB7XG4gIHJldHVybiB7bGluZTogZC5saW5lLCBjb2x1bW46IGQuY29sdW1uLCBvZmZzZXQ6IGQub2Zmc2V0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Q29uZmlnfSBjb21iaW5lZFxuICogQHBhcmFtIHtBcnJheTxBcnJheTxFeHRlbnNpb24+IHwgRXh0ZW5zaW9uPn0gZXh0ZW5zaW9uc1xuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gY29uZmlndXJlKGNvbWJpbmVkLCBleHRlbnNpb25zKSB7XG4gIGxldCBpbmRleCA9IC0xXG5cbiAgd2hpbGUgKCsraW5kZXggPCBleHRlbnNpb25zLmxlbmd0aCkge1xuICAgIGNvbnN0IHZhbHVlID0gZXh0ZW5zaW9uc1tpbmRleF1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uZmlndXJlKGNvbWJpbmVkLCB2YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXh0ZW5zaW9uKGNvbWJpbmVkLCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0NvbmZpZ30gY29tYmluZWRcbiAqIEBwYXJhbSB7RXh0ZW5zaW9ufSBleHRlbnNpb25cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGV4dGVuc2lvbihjb21iaW5lZCwgZXh0ZW5zaW9uKSB7XG4gIC8qKiBAdHlwZSB7a2V5b2YgRXh0ZW5zaW9ufSAqL1xuICBsZXQga2V5XG5cbiAgZm9yIChrZXkgaW4gZXh0ZW5zaW9uKSB7XG4gICAgaWYgKG93bi5jYWxsKGV4dGVuc2lvbiwga2V5KSkge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSAnY2FuQ29udGFpbkVvbHMnOiB7XG4gICAgICAgICAgY29uc3QgcmlnaHQgPSBleHRlbnNpb25ba2V5XVxuICAgICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgY29tYmluZWRba2V5XS5wdXNoKC4uLnJpZ2h0KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICd0cmFuc2Zvcm1zJzoge1xuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZXh0ZW5zaW9uW2tleV1cbiAgICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkW2tleV0ucHVzaCguLi5yaWdodClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnZW50ZXInOlxuICAgICAgICBjYXNlICdleGl0Jzoge1xuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZXh0ZW5zaW9uW2tleV1cbiAgICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29tYmluZWRba2V5XSwgcmlnaHQpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkZWZhdWx0XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKiBAdHlwZSB7T25FbnRlckVycm9yfSAqL1xuZnVuY3Rpb24gZGVmYXVsdE9uRXJyb3IobGVmdCwgcmlnaHQpIHtcbiAgaWYgKGxlZnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQ2Fubm90IGNsb3NlIGAnICtcbiAgICAgICAgbGVmdC50eXBlICtcbiAgICAgICAgJ2AgKCcgK1xuICAgICAgICBzdHJpbmdpZnlQb3NpdGlvbih7c3RhcnQ6IGxlZnQuc3RhcnQsIGVuZDogbGVmdC5lbmR9KSArXG4gICAgICAgICcpOiBhIGRpZmZlcmVudCB0b2tlbiAoYCcgK1xuICAgICAgICByaWdodC50eXBlICtcbiAgICAgICAgJ2AsICcgK1xuICAgICAgICBzdHJpbmdpZnlQb3NpdGlvbih7c3RhcnQ6IHJpZ2h0LnN0YXJ0LCBlbmQ6IHJpZ2h0LmVuZH0pICtcbiAgICAgICAgJykgaXMgb3BlbidcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0Nhbm5vdCBjbG9zZSBkb2N1bWVudCwgYSB0b2tlbiAoYCcgK1xuICAgICAgICByaWdodC50eXBlICtcbiAgICAgICAgJ2AsICcgK1xuICAgICAgICBzdHJpbmdpZnlQb3NpdGlvbih7c3RhcnQ6IHJpZ2h0LnN0YXJ0LCBlbmQ6IHJpZ2h0LmVuZH0pICtcbiAgICAgICAgJykgaXMgc3RpbGwgb3BlbidcbiAgICApXG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJvayIsImFzc2VydCIsInRvU3RyaW5nIiwicGFyc2UiLCJwb3N0cHJvY2VzcyIsInByZXByb2Nlc3MiLCJkZWNvZGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlIiwiZGVjb2RlU3RyaW5nIiwibm9ybWFsaXplSWRlbnRpZmllciIsImNvZGVzIiwiY29uc3RhbnRzIiwidHlwZXMiLCJkZWNvZGVOYW1lZENoYXJhY3RlclJlZmVyZW5jZSIsInN0cmluZ2lmeVBvc2l0aW9uIiwib3duIiwiaGFzT3duUHJvcGVydHkiLCJmcm9tTWFya2Rvd24iLCJ2YWx1ZSIsImVuY29kaW5nIiwib3B0aW9ucyIsInVuZGVmaW5lZCIsImNvbXBpbGVyIiwiZG9jdW1lbnQiLCJ3cml0ZSIsImNvbmZpZyIsInRyYW5zZm9ybXMiLCJjYW5Db250YWluRW9scyIsImVudGVyIiwiYXV0b2xpbmsiLCJvcGVuZXIiLCJsaW5rIiwiYXV0b2xpbmtQcm90b2NvbCIsIm9uZW50ZXJkYXRhIiwiYXV0b2xpbmtFbWFpbCIsImF0eEhlYWRpbmciLCJoZWFkaW5nIiwiYmxvY2tRdW90ZSIsImNoYXJhY3RlckVzY2FwZSIsImNoYXJhY3RlclJlZmVyZW5jZSIsImNvZGVGZW5jZWQiLCJjb2RlRmxvdyIsImNvZGVGZW5jZWRGZW5jZUluZm8iLCJidWZmZXIiLCJjb2RlRmVuY2VkRmVuY2VNZXRhIiwiY29kZUluZGVudGVkIiwiY29kZVRleHQiLCJjb2RlVGV4dERhdGEiLCJkYXRhIiwiY29kZUZsb3dWYWx1ZSIsImRlZmluaXRpb24iLCJkZWZpbml0aW9uRGVzdGluYXRpb25TdHJpbmciLCJkZWZpbml0aW9uTGFiZWxTdHJpbmciLCJkZWZpbml0aW9uVGl0bGVTdHJpbmciLCJlbXBoYXNpcyIsImhhcmRCcmVha0VzY2FwZSIsImhhcmRCcmVhayIsImhhcmRCcmVha1RyYWlsaW5nIiwiaHRtbEZsb3ciLCJodG1sIiwiaHRtbEZsb3dEYXRhIiwiaHRtbFRleHQiLCJodG1sVGV4dERhdGEiLCJpbWFnZSIsImxhYmVsIiwibGlzdEl0ZW0iLCJsaXN0SXRlbVZhbHVlIiwib25lbnRlcmxpc3RpdGVtdmFsdWUiLCJsaXN0T3JkZXJlZCIsImxpc3QiLCJvbmVudGVybGlzdG9yZGVyZWQiLCJsaXN0VW5vcmRlcmVkIiwicGFyYWdyYXBoIiwicmVmZXJlbmNlIiwib25lbnRlcnJlZmVyZW5jZSIsInJlZmVyZW5jZVN0cmluZyIsInJlc291cmNlRGVzdGluYXRpb25TdHJpbmciLCJyZXNvdXJjZVRpdGxlU3RyaW5nIiwic2V0ZXh0SGVhZGluZyIsInN0cm9uZyIsInRoZW1hdGljQnJlYWsiLCJleGl0IiwiY2xvc2VyIiwiYXR4SGVhZGluZ1NlcXVlbmNlIiwib25leGl0YXR4aGVhZGluZ3NlcXVlbmNlIiwib25leGl0YXV0b2xpbmtlbWFpbCIsIm9uZXhpdGF1dG9saW5rcHJvdG9jb2wiLCJjaGFyYWN0ZXJFc2NhcGVWYWx1ZSIsIm9uZXhpdGRhdGEiLCJjaGFyYWN0ZXJSZWZlcmVuY2VNYXJrZXJIZXhhZGVjaW1hbCIsIm9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZW1hcmtlciIsImNoYXJhY3RlclJlZmVyZW5jZU1hcmtlck51bWVyaWMiLCJjaGFyYWN0ZXJSZWZlcmVuY2VWYWx1ZSIsIm9uZXhpdGNoYXJhY3RlcnJlZmVyZW5jZXZhbHVlIiwib25leGl0Y29kZWZlbmNlZCIsImNvZGVGZW5jZWRGZW5jZSIsIm9uZXhpdGNvZGVmZW5jZWRmZW5jZSIsIm9uZXhpdGNvZGVmZW5jZWRmZW5jZWluZm8iLCJvbmV4aXRjb2RlZmVuY2VkZmVuY2VtZXRhIiwib25leGl0Y29kZWluZGVudGVkIiwib25leGl0Y29kZXRleHQiLCJvbmV4aXRkZWZpbml0aW9uZGVzdGluYXRpb25zdHJpbmciLCJvbmV4aXRkZWZpbml0aW9ubGFiZWxzdHJpbmciLCJvbmV4aXRkZWZpbml0aW9udGl0bGVzdHJpbmciLCJvbmV4aXRoYXJkYnJlYWsiLCJvbmV4aXRodG1sZmxvdyIsIm9uZXhpdGh0bWx0ZXh0Iiwib25leGl0aW1hZ2UiLCJvbmV4aXRsYWJlbCIsImxhYmVsVGV4dCIsIm9uZXhpdGxhYmVsdGV4dCIsImxpbmVFbmRpbmciLCJvbmV4aXRsaW5lZW5kaW5nIiwib25leGl0bGluayIsIm9uZXhpdHJlZmVyZW5jZXN0cmluZyIsIm9uZXhpdHJlc291cmNlZGVzdGluYXRpb25zdHJpbmciLCJvbmV4aXRyZXNvdXJjZXRpdGxlc3RyaW5nIiwicmVzb3VyY2UiLCJvbmV4aXRyZXNvdXJjZSIsIm9uZXhpdHNldGV4dGhlYWRpbmciLCJzZXRleHRIZWFkaW5nTGluZVNlcXVlbmNlIiwib25leGl0c2V0ZXh0aGVhZGluZ2xpbmVzZXF1ZW5jZSIsInNldGV4dEhlYWRpbmdUZXh0Iiwib25leGl0c2V0ZXh0aGVhZGluZ3RleHQiLCJjb25maWd1cmUiLCJtZGFzdEV4dGVuc2lvbnMiLCJjb21waWxlIiwiZXZlbnRzIiwidHJlZSIsInR5cGUiLCJjaGlsZHJlbiIsImNvbnRleHQiLCJzdGFjayIsInRva2VuU3RhY2siLCJyZXN1bWUiLCJsaXN0U3RhY2siLCJpbmRleCIsImxlbmd0aCIsInB1c2giLCJ0YWlsIiwicG9wIiwicHJlcGFyZUxpc3QiLCJoYW5kbGVyIiwiY2FsbCIsIk9iamVjdCIsImFzc2lnbiIsInNsaWNlU2VyaWFsaXplIiwiZGVmYXVsdE9uRXJyb3IiLCJwb3NpdGlvbiIsInN0YXJ0IiwicG9pbnQiLCJsaW5lIiwiY29sdW1uIiwib2Zmc2V0IiwiZW5kIiwiY29udGFpbmVyQmFsYW5jZSIsImxpc3RTcHJlYWQiLCJsaW5lSW5kZXgiLCJmaXJzdEJsYW5rTGluZUluZGV4IiwiYXRNYXJrZXIiLCJldmVudCIsImxpbmVFbmRpbmdCbGFuayIsImxpbmVQcmVmaXgiLCJsaXN0SXRlbU1hcmtlciIsImxpc3RJdGVtUHJlZml4IiwibGlzdEl0ZW1QcmVmaXhXaGl0ZXNwYWNlIiwidGFpbEluZGV4IiwidGFpbEV2ZW50IiwiYmxvY2tRdW90ZVByZWZpeCIsImJsb2NrUXVvdGVQcmVmaXhXaGl0ZXNwYWNlIiwiYmxvY2tRdW90ZU1hcmtlciIsImxpc3RJdGVtSW5kZW50IiwiX3NwcmVhZCIsInNwbGljZSIsIml0ZW0iLCJjcmVhdGUiLCJhbmQiLCJvcGVuIiwidG9rZW4iLCJub2RlIiwiZXJyb3JIYW5kbGVyIiwicGFyZW50Iiwic2libGluZ3MiLCJjbG9zZSIsIm9uRXhpdEVycm9yIiwiRXJyb3IiLCJleHBlY3RpbmdGaXJzdExpc3RJdGVtVmFsdWUiLCJhbmNlc3RvciIsIk51bWJlciIsInBhcnNlSW50IiwibnVtZXJpY0Jhc2VEZWNpbWFsIiwibGFuZyIsIm1ldGEiLCJmbG93Q29kZUluc2lkZSIsInJlcGxhY2UiLCJpZGVudGlmaWVyIiwidG9Mb3dlckNhc2UiLCJ0aXRsZSIsInVybCIsImRlcHRoIiwic2V0ZXh0SGVhZGluZ1NsdXJwTGluZUVuZGluZyIsImNvZGVQb2ludEF0IiwiZXF1YWxzVG8iLCJ0ZXh0IiwiYXRIYXJkQnJlYWsiLCJpbmNsdWRlcyIsImluUmVmZXJlbmNlIiwicmVmZXJlbmNlVHlwZSIsInN0cmluZyIsImZyYWdtZW50IiwiYWx0IiwiY2hhcmFjdGVyUmVmZXJlbmNlVHlwZSIsIm51bWVyaWNCYXNlSGV4YWRlY2ltYWwiLCJyZXN1bHQiLCJvcmRlcmVkIiwic3ByZWFkIiwiY2hlY2tlZCIsImQiLCJjb21iaW5lZCIsImV4dGVuc2lvbnMiLCJBcnJheSIsImlzQXJyYXkiLCJleHRlbnNpb24iLCJrZXkiLCJyaWdodCIsImxlZnQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/mdast-util-from-markdown/dev/lib/index.js\n");
/***/ })
};
;