diff options
-rw-r--r-- | README.md | 4 | ||||
-rw-r--r-- | dev/build-libs.js | 52 | ||||
-rw-r--r-- | ext/legal.html | 2 | ||||
-rw-r--r-- | ext/lib/parse5.js | 12657 | ||||
-rw-r--r-- | package-lock.json | 89 | ||||
-rw-r--r-- | package.json | 2 | ||||
-rw-r--r-- | test/test-build-libs.js | 41 |
7 files changed, 6716 insertions, 6131 deletions
@@ -62,7 +62,7 @@ submitting issues on GitHub, try the *testing* version; otherwise, the *stable* <sup>*</sup>Unlike Chrome, Firefox does not allow extensions meant for testing to be hosted in the marketplace. You will have to download a desired version and side-load it yourself. You only need to do this once and will get updates automatically. - + ## Dictionaries There are several free Japanese dictionaries available for Yomichan, with two of them having glossaries available in @@ -344,4 +344,4 @@ versions packaged. * Handlebars: [homepage](https://handlebarsjs.com/) - [snapshot](https://s3.amazonaws.com/builds.handlebarsjs.com/handlebars.min-v4.7.7.js) - [license](https://github.com/handlebars-lang/handlebars.js/blob/v4.7.7/LICENSE) * JSZip: [homepage](https://stuk.github.io/jszip/) - [snapshot](https://github.com/Stuk/jszip/blob/v3.7.1/dist/jszip.min.js) - [license](https://github.com/Stuk/jszip/blob/v3.7.1/LICENSE.markdown) * WanaKana: [homepage](https://wanakana.com/) - [snapshot](https://unpkg.com/wanakana@4.0.2/umd/wanakana.min.js) - [license](https://github.com/WaniKani/WanaKana/blob/4.0.2/LICENSE) -* parse5: [homepage](https://github.com/inikulin/parse5) - [snapshot](https://github.com/inikulin/parse5/tree/v6.0.1/packages/parse5) - [license](https://github.com/inikulin/parse5/blob/v6.0.1/LICENSE) _(Only used in MV3 build)_ +* parse5: [homepage](https://github.com/inikulin/parse5) - [snapshot](https://github.com/inikulin/parse5/tree/v7.0.0/packages/parse5) - [license](https://github.com/inikulin/parse5/blob/v7.0.0/LICENSE) _(Only used in MV3 build)_ diff --git a/dev/build-libs.js b/dev/build-libs.js index 37d74851..189a967d 100644 --- a/dev/build-libs.js +++ b/dev/build-libs.js @@ -19,21 +19,47 @@ const fs = require('fs'); const path = require('path'); const browserify = require('browserify'); -async function main() { - const extLibPath = path.join(__dirname, '..', 'ext', 'lib'); +async function buildParse5() { const parse5Path = require.resolve('parse5'); - - const content = await new Promise((resolve, reject) => { - browserify([parse5Path], {standalone: 'parse5', debug: true}).bundle((error, result) => { - if (error) { - reject(error); - } else { - resolve(result); - } + const cwd = process.cwd(); + try { + const baseDir = path.dirname(parse5Path); + process.chdir(baseDir); // This is necessary to ensure relative source map file names are consistent + return await new Promise((resolve, reject) => { + browserify({ + entries: [parse5Path], + standalone: 'parse5', + debug: true, + baseDir + }).bundle((error, result) => { + if (error) { + reject(error); + } else { + resolve(result); + } + }); }); - }); + } finally { + process.chdir(cwd); + } +} - fs.writeFileSync(path.join(extLibPath, 'parse5.js'), content); +function getBuildTargets() { + const extLibPath = path.join(__dirname, '..', 'ext', 'lib'); + return [ + {path: path.join(extLibPath, 'parse5.js'), build: buildParse5} + ]; } -main(); +async function main() { + for (const {path: path2, build} of getBuildTargets()) { + const content = await build(); + fs.writeFileSync(path2, content); + } +} + +if (require.main === module) { main(); } + +module.exports = { + getBuildTargets +}; diff --git a/ext/legal.html b/ext/legal.html index 09e1966b..b6b88ba5 100644 --- a/ext/legal.html +++ b/ext/legal.html @@ -119,7 +119,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. </div></div></div></div></div> <div data-show-for-manifest-version="3"> - <h2><a href="https://github.com/inikulin/parse5/blob/v6.0.1/LICENSE" target="_blank" rel="noopener noreferrer">parse5 v6.0.1</a></h2> + <h2><a href="https://github.com/inikulin/parse5/blob/v7.0.0/LICENSE" target="_blank" rel="noopener noreferrer">parse5 v7.0.0</a></h2> <div class="settings-group"><div class="settings-item"><div class="settings-item-inner"><div class="settings-item-left"><div class="settings-item-label"> <pre> Copyright (c) 2013-2019 Ivan Nikulin (ifaaan@gmail.com, https://github.com/inikulin) diff --git a/ext/lib/parse5.js b/ext/lib/parse5.js index 1519dedc..72e1bbf1 100644 --- a/ext/lib/parse5.js +++ b/ext/lib/parse5.js @@ -1,13 +1,12 @@ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.parse5 = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ -'use strict'; - -const { DOCUMENT_MODE } = require('./html'); - +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getDocumentMode = exports.isConforming = void 0; +const html_js_1 = require("./html.js"); //Const const VALID_DOCTYPE_NAME = 'html'; const VALID_SYSTEM_ID = 'about:legacy-compat'; const QUIRKS_MODE_SYSTEM_ID = 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd'; - const QUIRKS_MODE_PUBLIC_ID_PREFIXES = [ '+//silmaril//dtd html pro v0r11 19970101//', '-//as//dtd html 3.0 aswedit + extensions//', @@ -63,7923 +62,8371 @@ const QUIRKS_MODE_PUBLIC_ID_PREFIXES = [ '-//w3c//dtd w3 html//', '-//w3o//dtd w3 html 3.0//', '-//webtechs//dtd mozilla html 2.0//', - '-//webtechs//dtd mozilla html//' + '-//webtechs//dtd mozilla html//', ]; - -const QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = QUIRKS_MODE_PUBLIC_ID_PREFIXES.concat([ +const QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = [ + ...QUIRKS_MODE_PUBLIC_ID_PREFIXES, '-//w3c//dtd html 4.01 frameset//', - '-//w3c//dtd html 4.01 transitional//' + '-//w3c//dtd html 4.01 transitional//', +]; +const QUIRKS_MODE_PUBLIC_IDS = new Set([ + '-//w3o//dtd w3 html strict 3.0//en//', + '-/w3c/dtd html 4.0 transitional/en', + 'html', ]); - -const QUIRKS_MODE_PUBLIC_IDS = ['-//w3o//dtd w3 html strict 3.0//en//', '-/w3c/dtd html 4.0 transitional/en', 'html']; const LIMITED_QUIRKS_PUBLIC_ID_PREFIXES = ['-//w3c//dtd xhtml 1.0 frameset//', '-//w3c//dtd xhtml 1.0 transitional//']; - -const LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES = LIMITED_QUIRKS_PUBLIC_ID_PREFIXES.concat([ +const LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES = [ + ...LIMITED_QUIRKS_PUBLIC_ID_PREFIXES, '-//w3c//dtd html 4.01 frameset//', - '-//w3c//dtd html 4.01 transitional//' -]); - + '-//w3c//dtd html 4.01 transitional//', +]; //Utils -function enquoteDoctypeId(id) { - const quote = id.indexOf('"') !== -1 ? "'" : '"'; - - return quote + id + quote; -} - function hasPrefix(publicId, prefixes) { - for (let i = 0; i < prefixes.length; i++) { - if (publicId.indexOf(prefixes[i]) === 0) { - return true; - } - } - - return false; + return prefixes.some((prefix) => publicId.startsWith(prefix)); } - //API -exports.isConforming = function(token) { - return ( - token.name === VALID_DOCTYPE_NAME && +function isConforming(token) { + return (token.name === VALID_DOCTYPE_NAME && token.publicId === null && - (token.systemId === null || token.systemId === VALID_SYSTEM_ID) - ); -}; - -exports.getDocumentMode = function(token) { + (token.systemId === null || token.systemId === VALID_SYSTEM_ID)); +} +exports.isConforming = isConforming; +function getDocumentMode(token) { if (token.name !== VALID_DOCTYPE_NAME) { - return DOCUMENT_MODE.QUIRKS; + return html_js_1.DOCUMENT_MODE.QUIRKS; } - - const systemId = token.systemId; - + const { systemId } = token; if (systemId && systemId.toLowerCase() === QUIRKS_MODE_SYSTEM_ID) { - return DOCUMENT_MODE.QUIRKS; + return html_js_1.DOCUMENT_MODE.QUIRKS; } - - let publicId = token.publicId; - + let { publicId } = token; if (publicId !== null) { publicId = publicId.toLowerCase(); - - if (QUIRKS_MODE_PUBLIC_IDS.indexOf(publicId) > -1) { - return DOCUMENT_MODE.QUIRKS; + if (QUIRKS_MODE_PUBLIC_IDS.has(publicId)) { + return html_js_1.DOCUMENT_MODE.QUIRKS; } - let prefixes = systemId === null ? QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES : QUIRKS_MODE_PUBLIC_ID_PREFIXES; - if (hasPrefix(publicId, prefixes)) { - return DOCUMENT_MODE.QUIRKS; + return html_js_1.DOCUMENT_MODE.QUIRKS; } - prefixes = systemId === null ? LIMITED_QUIRKS_PUBLIC_ID_PREFIXES : LIMITED_QUIRKS_WITH_SYSTEM_ID_PUBLIC_ID_PREFIXES; - if (hasPrefix(publicId, prefixes)) { - return DOCUMENT_MODE.LIMITED_QUIRKS; - } - } - - return DOCUMENT_MODE.NO_QUIRKS; -}; - -exports.serializeContent = function(name, publicId, systemId) { - let str = '!DOCTYPE '; - - if (name) { - str += name; - } - - if (publicId) { - str += ' PUBLIC ' + enquoteDoctypeId(publicId); - } else if (systemId) { - str += ' SYSTEM'; - } - - if (systemId !== null) { - str += ' ' + enquoteDoctypeId(systemId); - } - - return str; -}; - -},{"./html":4}],2:[function(require,module,exports){ -'use strict'; - -module.exports = { - controlCharacterInInputStream: 'control-character-in-input-stream', - noncharacterInInputStream: 'noncharacter-in-input-stream', - surrogateInInputStream: 'surrogate-in-input-stream', - nonVoidHtmlElementStartTagWithTrailingSolidus: 'non-void-html-element-start-tag-with-trailing-solidus', - endTagWithAttributes: 'end-tag-with-attributes', - endTagWithTrailingSolidus: 'end-tag-with-trailing-solidus', - unexpectedSolidusInTag: 'unexpected-solidus-in-tag', - unexpectedNullCharacter: 'unexpected-null-character', - unexpectedQuestionMarkInsteadOfTagName: 'unexpected-question-mark-instead-of-tag-name', - invalidFirstCharacterOfTagName: 'invalid-first-character-of-tag-name', - unexpectedEqualsSignBeforeAttributeName: 'unexpected-equals-sign-before-attribute-name', - missingEndTagName: 'missing-end-tag-name', - unexpectedCharacterInAttributeName: 'unexpected-character-in-attribute-name', - unknownNamedCharacterReference: 'unknown-named-character-reference', - missingSemicolonAfterCharacterReference: 'missing-semicolon-after-character-reference', - unexpectedCharacterAfterDoctypeSystemIdentifier: 'unexpected-character-after-doctype-system-identifier', - unexpectedCharacterInUnquotedAttributeValue: 'unexpected-character-in-unquoted-attribute-value', - eofBeforeTagName: 'eof-before-tag-name', - eofInTag: 'eof-in-tag', - missingAttributeValue: 'missing-attribute-value', - missingWhitespaceBetweenAttributes: 'missing-whitespace-between-attributes', - missingWhitespaceAfterDoctypePublicKeyword: 'missing-whitespace-after-doctype-public-keyword', - missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers: - 'missing-whitespace-between-doctype-public-and-system-identifiers', - missingWhitespaceAfterDoctypeSystemKeyword: 'missing-whitespace-after-doctype-system-keyword', - missingQuoteBeforeDoctypePublicIdentifier: 'missing-quote-before-doctype-public-identifier', - missingQuoteBeforeDoctypeSystemIdentifier: 'missing-quote-before-doctype-system-identifier', - missingDoctypePublicIdentifier: 'missing-doctype-public-identifier', - missingDoctypeSystemIdentifier: 'missing-doctype-system-identifier', - abruptDoctypePublicIdentifier: 'abrupt-doctype-public-identifier', - abruptDoctypeSystemIdentifier: 'abrupt-doctype-system-identifier', - cdataInHtmlContent: 'cdata-in-html-content', - incorrectlyOpenedComment: 'incorrectly-opened-comment', - eofInScriptHtmlCommentLikeText: 'eof-in-script-html-comment-like-text', - eofInDoctype: 'eof-in-doctype', - nestedComment: 'nested-comment', - abruptClosingOfEmptyComment: 'abrupt-closing-of-empty-comment', - eofInComment: 'eof-in-comment', - incorrectlyClosedComment: 'incorrectly-closed-comment', - eofInCdata: 'eof-in-cdata', - absenceOfDigitsInNumericCharacterReference: 'absence-of-digits-in-numeric-character-reference', - nullCharacterReference: 'null-character-reference', - surrogateCharacterReference: 'surrogate-character-reference', - characterReferenceOutsideUnicodeRange: 'character-reference-outside-unicode-range', - controlCharacterReference: 'control-character-reference', - noncharacterCharacterReference: 'noncharacter-character-reference', - missingWhitespaceBeforeDoctypeName: 'missing-whitespace-before-doctype-name', - missingDoctypeName: 'missing-doctype-name', - invalidCharacterSequenceAfterDoctypeName: 'invalid-character-sequence-after-doctype-name', - duplicateAttribute: 'duplicate-attribute', - nonConformingDoctype: 'non-conforming-doctype', - missingDoctype: 'missing-doctype', - misplacedDoctype: 'misplaced-doctype', - endTagWithoutMatchingOpenElement: 'end-tag-without-matching-open-element', - closingOfElementWithOpenChildElements: 'closing-of-element-with-open-child-elements', - disallowedContentInNoscriptInHead: 'disallowed-content-in-noscript-in-head', - openElementsLeftAfterEof: 'open-elements-left-after-eof', - abandonedHeadElementChild: 'abandoned-head-element-child', - misplacedStartTagForHeadElement: 'misplaced-start-tag-for-head-element', - nestedNoscriptInHead: 'nested-noscript-in-head', - eofInElementThatCanContainOnlyText: 'eof-in-element-that-can-contain-only-text' -}; + return html_js_1.DOCUMENT_MODE.LIMITED_QUIRKS; + } + } + return html_js_1.DOCUMENT_MODE.NO_QUIRKS; +} +exports.getDocumentMode = getDocumentMode; + +},{"./html.js":4}],2:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ERR = void 0; +var ERR; +(function (ERR) { + ERR["controlCharacterInInputStream"] = "control-character-in-input-stream"; + ERR["noncharacterInInputStream"] = "noncharacter-in-input-stream"; + ERR["surrogateInInputStream"] = "surrogate-in-input-stream"; + ERR["nonVoidHtmlElementStartTagWithTrailingSolidus"] = "non-void-html-element-start-tag-with-trailing-solidus"; + ERR["endTagWithAttributes"] = "end-tag-with-attributes"; + ERR["endTagWithTrailingSolidus"] = "end-tag-with-trailing-solidus"; + ERR["unexpectedSolidusInTag"] = "unexpected-solidus-in-tag"; + ERR["unexpectedNullCharacter"] = "unexpected-null-character"; + ERR["unexpectedQuestionMarkInsteadOfTagName"] = "unexpected-question-mark-instead-of-tag-name"; + ERR["invalidFirstCharacterOfTagName"] = "invalid-first-character-of-tag-name"; + ERR["unexpectedEqualsSignBeforeAttributeName"] = "unexpected-equals-sign-before-attribute-name"; + ERR["missingEndTagName"] = "missing-end-tag-name"; + ERR["unexpectedCharacterInAttributeName"] = "unexpected-character-in-attribute-name"; + ERR["unknownNamedCharacterReference"] = "unknown-named-character-reference"; + ERR["missingSemicolonAfterCharacterReference"] = "missing-semicolon-after-character-reference"; + ERR["unexpectedCharacterAfterDoctypeSystemIdentifier"] = "unexpected-character-after-doctype-system-identifier"; + ERR["unexpectedCharacterInUnquotedAttributeValue"] = "unexpected-character-in-unquoted-attribute-value"; + ERR["eofBeforeTagName"] = "eof-before-tag-name"; + ERR["eofInTag"] = "eof-in-tag"; + ERR["missingAttributeValue"] = "missing-attribute-value"; + ERR["missingWhitespaceBetweenAttributes"] = "missing-whitespace-between-attributes"; + ERR["missingWhitespaceAfterDoctypePublicKeyword"] = "missing-whitespace-after-doctype-public-keyword"; + ERR["missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers"] = "missing-whitespace-between-doctype-public-and-system-identifiers"; + ERR["missingWhitespaceAfterDoctypeSystemKeyword"] = "missing-whitespace-after-doctype-system-keyword"; + ERR["missingQuoteBeforeDoctypePublicIdentifier"] = "missing-quote-before-doctype-public-identifier"; + ERR["missingQuoteBeforeDoctypeSystemIdentifier"] = "missing-quote-before-doctype-system-identifier"; + ERR["missingDoctypePublicIdentifier"] = "missing-doctype-public-identifier"; + ERR["missingDoctypeSystemIdentifier"] = "missing-doctype-system-identifier"; + ERR["abruptDoctypePublicIdentifier"] = "abrupt-doctype-public-identifier"; + ERR["abruptDoctypeSystemIdentifier"] = "abrupt-doctype-system-identifier"; + ERR["cdataInHtmlContent"] = "cdata-in-html-content"; + ERR["incorrectlyOpenedComment"] = "incorrectly-opened-comment"; + ERR["eofInScriptHtmlCommentLikeText"] = "eof-in-script-html-comment-like-text"; + ERR["eofInDoctype"] = "eof-in-doctype"; + ERR["nestedComment"] = "nested-comment"; + ERR["abruptClosingOfEmptyComment"] = "abrupt-closing-of-empty-comment"; + ERR["eofInComment"] = "eof-in-comment"; + ERR["incorrectlyClosedComment"] = "incorrectly-closed-comment"; + ERR["eofInCdata"] = "eof-in-cdata"; + ERR["absenceOfDigitsInNumericCharacterReference"] = "absence-of-digits-in-numeric-character-reference"; + ERR["nullCharacterReference"] = "null-character-reference"; + ERR["surrogateCharacterReference"] = "surrogate-character-reference"; + ERR["characterReferenceOutsideUnicodeRange"] = "character-reference-outside-unicode-range"; + ERR["controlCharacterReference"] = "control-character-reference"; + ERR["noncharacterCharacterReference"] = "noncharacter-character-reference"; + ERR["missingWhitespaceBeforeDoctypeName"] = "missing-whitespace-before-doctype-name"; + ERR["missingDoctypeName"] = "missing-doctype-name"; + ERR["invalidCharacterSequenceAfterDoctypeName"] = "invalid-character-sequence-after-doctype-name"; + ERR["duplicateAttribute"] = "duplicate-attribute"; + ERR["nonConformingDoctype"] = "non-conforming-doctype"; + ERR["missingDoctype"] = "missing-doctype"; + ERR["misplacedDoctype"] = "misplaced-doctype"; + ERR["endTagWithoutMatchingOpenElement"] = "end-tag-without-matching-open-element"; + ERR["closingOfElementWithOpenChildElements"] = "closing-of-element-with-open-child-elements"; + ERR["disallowedContentInNoscriptInHead"] = "disallowed-content-in-noscript-in-head"; + ERR["openElementsLeftAfterEof"] = "open-elements-left-after-eof"; + ERR["abandonedHeadElementChild"] = "abandoned-head-element-child"; + ERR["misplacedStartTagForHeadElement"] = "misplaced-start-tag-for-head-element"; + ERR["nestedNoscriptInHead"] = "nested-noscript-in-head"; + ERR["eofInElementThatCanContainOnlyText"] = "eof-in-element-that-can-contain-only-text"; +})(ERR = exports.ERR || (exports.ERR = {})); },{}],3:[function(require,module,exports){ -'use strict'; - -const Tokenizer = require('../tokenizer'); -const HTML = require('./html'); - -//Aliases -const $ = HTML.TAG_NAMES; -const NS = HTML.NAMESPACES; -const ATTRS = HTML.ATTRS; - +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isIntegrationPoint = exports.adjustTokenSVGTagName = exports.adjustTokenXMLAttrs = exports.adjustTokenSVGAttrs = exports.adjustTokenMathMLAttrs = exports.causesExit = exports.SVG_TAG_NAMES_ADJUSTMENT_MAP = void 0; +const html_js_1 = require("./html.js"); //MIME types const MIME_TYPES = { TEXT_HTML: 'text/html', - APPLICATION_XML: 'application/xhtml+xml' + APPLICATION_XML: 'application/xhtml+xml', }; - //Attributes const DEFINITION_URL_ATTR = 'definitionurl'; const ADJUSTED_DEFINITION_URL_ATTR = 'definitionURL'; -const SVG_ATTRS_ADJUSTMENT_MAP = { - attributename: 'attributeName', - attributetype: 'attributeType', - basefrequency: 'baseFrequency', - baseprofile: 'baseProfile', - calcmode: 'calcMode', - clippathunits: 'clipPathUnits', - diffuseconstant: 'diffuseConstant', - edgemode: 'edgeMode', - filterunits: 'filterUnits', - glyphref: 'glyphRef', - gradienttransform: 'gradientTransform', - gradientunits: 'gradientUnits', - kernelmatrix: 'kernelMatrix', - kernelunitlength: 'kernelUnitLength', - keypoints: 'keyPoints', - keysplines: 'keySplines', - keytimes: 'keyTimes', - lengthadjust: 'lengthAdjust', - limitingconeangle: 'limitingConeAngle', - markerheight: 'markerHeight', - markerunits: 'markerUnits', - markerwidth: 'markerWidth', - maskcontentunits: 'maskContentUnits', - maskunits: 'maskUnits', - numoctaves: 'numOctaves', - pathlength: 'pathLength', - patterncontentunits: 'patternContentUnits', - patterntransform: 'patternTransform', - patternunits: 'patternUnits', - pointsatx: 'pointsAtX', - pointsaty: 'pointsAtY', - pointsatz: 'pointsAtZ', - preservealpha: 'preserveAlpha', - preserveaspectratio: 'preserveAspectRatio', - primitiveunits: 'primitiveUnits', - refx: 'refX', - refy: 'refY', - repeatcount: 'repeatCount', - repeatdur: 'repeatDur', - requiredextensions: 'requiredExtensions', - requiredfeatures: 'requiredFeatures', - specularconstant: 'specularConstant', - specularexponent: 'specularExponent', - spreadmethod: 'spreadMethod', - startoffset: 'startOffset', - stddeviation: 'stdDeviation', - stitchtiles: 'stitchTiles', - surfacescale: 'surfaceScale', - systemlanguage: 'systemLanguage', - tablevalues: 'tableValues', - targetx: 'targetX', - targety: 'targetY', - textlength: 'textLength', - viewbox: 'viewBox', - viewtarget: 'viewTarget', - xchannelselector: 'xChannelSelector', - ychannelselector: 'yChannelSelector', - zoomandpan: 'zoomAndPan' -}; - -const XML_ATTRS_ADJUSTMENT_MAP = { - 'xlink:actuate': { prefix: 'xlink', name: 'actuate', namespace: NS.XLINK }, - 'xlink:arcrole': { prefix: 'xlink', name: 'arcrole', namespace: NS.XLINK }, - 'xlink:href': { prefix: 'xlink', name: 'href', namespace: NS.XLINK }, - 'xlink:role': { prefix: 'xlink', name: 'role', namespace: NS.XLINK }, - 'xlink:show': { prefix: 'xlink', name: 'show', namespace: NS.XLINK }, - 'xlink:title': { prefix: 'xlink', name: 'title', namespace: NS.XLINK }, - 'xlink:type': { prefix: 'xlink', name: 'type', namespace: NS.XLINK }, - 'xml:base': { prefix: 'xml', name: 'base', namespace: NS.XML }, - 'xml:lang': { prefix: 'xml', name: 'lang', namespace: NS.XML }, - 'xml:space': { prefix: 'xml', name: 'space', namespace: NS.XML }, - xmlns: { prefix: '', name: 'xmlns', namespace: NS.XMLNS }, - 'xmlns:xlink': { prefix: 'xmlns', name: 'xlink', namespace: NS.XMLNS } -}; - +const SVG_ATTRS_ADJUSTMENT_MAP = new Map([ + 'attributeName', + 'attributeType', + 'baseFrequency', + 'baseProfile', + 'calcMode', + 'clipPathUnits', + 'diffuseConstant', + 'edgeMode', + 'filterUnits', + 'glyphRef', + 'gradientTransform', + 'gradientUnits', + 'kernelMatrix', + 'kernelUnitLength', + 'keyPoints', + 'keySplines', + 'keyTimes', + 'lengthAdjust', + 'limitingConeAngle', + 'markerHeight', + 'markerUnits', + 'markerWidth', + 'maskContentUnits', + 'maskUnits', + 'numOctaves', + 'pathLength', + 'patternContentUnits', + 'patternTransform', + 'patternUnits', + 'pointsAtX', + 'pointsAtY', + 'pointsAtZ', + 'preserveAlpha', + 'preserveAspectRatio', + 'primitiveUnits', + 'refX', + 'refY', + 'repeatCount', + 'repeatDur', + 'requiredExtensions', + 'requiredFeatures', + 'specularConstant', + 'specularExponent', + 'spreadMethod', + 'startOffset', + 'stdDeviation', + 'stitchTiles', + 'surfaceScale', + 'systemLanguage', + 'tableValues', + 'targetX', + 'targetY', + 'textLength', + 'viewBox', + 'viewTarget', + 'xChannelSelector', + 'yChannelSelector', + 'zoomAndPan', +].map((attr) => [attr.toLowerCase(), attr])); +const XML_ATTRS_ADJUSTMENT_MAP = new Map([ + ['xlink:actuate', { prefix: 'xlink', name: 'actuate', namespace: html_js_1.NS.XLINK }], + ['xlink:arcrole', { prefix: 'xlink', name: 'arcrole', namespace: html_js_1.NS.XLINK }], + ['xlink:href', { prefix: 'xlink', name: 'href', namespace: html_js_1.NS.XLINK }], + ['xlink:role', { prefix: 'xlink', name: 'role', namespace: html_js_1.NS.XLINK }], + ['xlink:show', { prefix: 'xlink', name: 'show', namespace: html_js_1.NS.XLINK }], + ['xlink:title', { prefix: 'xlink', name: 'title', namespace: html_js_1.NS.XLINK }], + ['xlink:type', { prefix: 'xlink', name: 'type', namespace: html_js_1.NS.XLINK }], + ['xml:base', { prefix: 'xml', name: 'base', namespace: html_js_1.NS.XML }], + ['xml:lang', { prefix: 'xml', name: 'lang', namespace: html_js_1.NS.XML }], + ['xml:space', { prefix: 'xml', name: 'space', namespace: html_js_1.NS.XML }], + ['xmlns', { prefix: '', name: 'xmlns', namespace: html_js_1.NS.XMLNS }], + ['xmlns:xlink', { prefix: 'xmlns', name: 'xlink', namespace: html_js_1.NS.XMLNS }], +]); //SVG tag names adjustment map -const SVG_TAG_NAMES_ADJUSTMENT_MAP = (exports.SVG_TAG_NAMES_ADJUSTMENT_MAP = { - altglyph: 'altGlyph', - altglyphdef: 'altGlyphDef', - altglyphitem: 'altGlyphItem', - animatecolor: 'animateColor', - animatemotion: 'animateMotion', - animatetransform: 'animateTransform', - clippath: 'clipPath', - feblend: 'feBlend', - fecolormatrix: 'feColorMatrix', - fecomponenttransfer: 'feComponentTransfer', - fecomposite: 'feComposite', - feconvolvematrix: 'feConvolveMatrix', - fediffuselighting: 'feDiffuseLighting', - fedisplacementmap: 'feDisplacementMap', - fedistantlight: 'feDistantLight', - feflood: 'feFlood', - fefunca: 'feFuncA', - fefuncb: 'feFuncB', - fefuncg: 'feFuncG', - fefuncr: 'feFuncR', - fegaussianblur: 'feGaussianBlur', - feimage: 'feImage', - femerge: 'feMerge', - femergenode: 'feMergeNode', - femorphology: 'feMorphology', - feoffset: 'feOffset', - fepointlight: 'fePointLight', - fespecularlighting: 'feSpecularLighting', - fespotlight: 'feSpotLight', - fetile: 'feTile', - feturbulence: 'feTurbulence', - foreignobject: 'foreignObject', - glyphref: 'glyphRef', - lineargradient: 'linearGradient', - radialgradient: 'radialGradient', - textpath: 'textPath' -}); - +exports.SVG_TAG_NAMES_ADJUSTMENT_MAP = new Map([ + 'altGlyph', + 'altGlyphDef', + 'altGlyphItem', + 'animateColor', + 'animateMotion', + 'animateTransform', + 'clipPath', + 'feBlend', + 'feColorMatrix', + 'feComponentTransfer', + 'feComposite', + 'feConvolveMatrix', + 'feDiffuseLighting', + 'feDisplacementMap', + 'feDistantLight', + 'feFlood', + 'feFuncA', + 'feFuncB', + 'feFuncG', + 'feFuncR', + 'feGaussianBlur', + 'feImage', + 'feMerge', + 'feMergeNode', + 'feMorphology', + 'feOffset', + 'fePointLight', + 'feSpecularLighting', + 'feSpotLight', + 'feTile', + 'feTurbulence', + 'foreignObject', + 'glyphRef', + 'linearGradient', + 'radialGradient', + 'textPath', +].map((tn) => [tn.toLowerCase(), tn])); //Tags that causes exit from foreign content -const EXITS_FOREIGN_CONTENT = { - [$.B]: true, - [$.BIG]: true, - [$.BLOCKQUOTE]: true, - [$.BODY]: true, - [$.BR]: true, - [$.CENTER]: true, - [$.CODE]: true, - [$.DD]: true, - [$.DIV]: true, - [$.DL]: true, - [$.DT]: true, - [$.EM]: true, - [$.EMBED]: true, - [$.H1]: true, - [$.H2]: true, - [$.H3]: true, - [$.H4]: true, - [$.H5]: true, - [$.H6]: true, - [$.HEAD]: true, - [$.HR]: true, - [$.I]: true, - [$.IMG]: true, - [$.LI]: true, - [$.LISTING]: true, - [$.MENU]: true, - [$.META]: true, - [$.NOBR]: true, - [$.OL]: true, - [$.P]: true, - [$.PRE]: true, - [$.RUBY]: true, - [$.S]: true, - [$.SMALL]: true, - [$.SPAN]: true, - [$.STRONG]: true, - [$.STRIKE]: true, - [$.SUB]: true, - [$.SUP]: true, - [$.TABLE]: true, - [$.TT]: true, - [$.U]: true, - [$.UL]: true, - [$.VAR]: true -}; - +const EXITS_FOREIGN_CONTENT = new Set([ + html_js_1.TAG_ID.B, + html_js_1.TAG_ID.BIG, + html_js_1.TAG_ID.BLOCKQUOTE, + html_js_1.TAG_ID.BODY, + html_js_1.TAG_ID.BR, + html_js_1.TAG_ID.CENTER, + html_js_1.TAG_ID.CODE, + html_js_1.TAG_ID.DD, + html_js_1.TAG_ID.DIV, + html_js_1.TAG_ID.DL, + html_js_1.TAG_ID.DT, + html_js_1.TAG_ID.EM, + html_js_1.TAG_ID.EMBED, + html_js_1.TAG_ID.H1, + html_js_1.TAG_ID.H2, + html_js_1.TAG_ID.H3, + html_js_1.TAG_ID.H4, + html_js_1.TAG_ID.H5, + html_js_1.TAG_ID.H6, + html_js_1.TAG_ID.HEAD, + html_js_1.TAG_ID.HR, + html_js_1.TAG_ID.I, + html_js_1.TAG_ID.IMG, + html_js_1.TAG_ID.LI, + html_js_1.TAG_ID.LISTING, + html_js_1.TAG_ID.MENU, + html_js_1.TAG_ID.META, + html_js_1.TAG_ID.NOBR, + html_js_1.TAG_ID.OL, + html_js_1.TAG_ID.P, + html_js_1.TAG_ID.PRE, + html_js_1.TAG_ID.RUBY, + html_js_1.TAG_ID.S, + html_js_1.TAG_ID.SMALL, + html_js_1.TAG_ID.SPAN, + html_js_1.TAG_ID.STRONG, + html_js_1.TAG_ID.STRIKE, + html_js_1.TAG_ID.SUB, + html_js_1.TAG_ID.SUP, + html_js_1.TAG_ID.TABLE, + html_js_1.TAG_ID.TT, + html_js_1.TAG_ID.U, + html_js_1.TAG_ID.UL, + html_js_1.TAG_ID.VAR, +]); //Check exit from foreign content -exports.causesExit = function(startTagToken) { - const tn = startTagToken.tagName; - const isFontWithAttrs = - tn === $.FONT && - (Tokenizer.getTokenAttr(startTagToken, ATTRS.COLOR) !== null || - Tokenizer.getTokenAttr(startTagToken, ATTRS.SIZE) !== null || - Tokenizer.getTokenAttr(startTagToken, ATTRS.FACE) !== null); - - return isFontWithAttrs ? true : EXITS_FOREIGN_CONTENT[tn]; -}; - +function causesExit(startTagToken) { + const tn = startTagToken.tagID; + const isFontWithAttrs = tn === html_js_1.TAG_ID.FONT && + startTagToken.attrs.some(({ name }) => name === html_js_1.ATTRS.COLOR || name === html_js_1.ATTRS.SIZE || name === html_js_1.ATTRS.FACE); + return isFontWithAttrs || EXITS_FOREIGN_CONTENT.has(tn); +} +exports.causesExit = causesExit; //Token adjustments -exports.adjustTokenMathMLAttrs = function(token) { +function adjustTokenMathMLAttrs(token) { for (let i = 0; i < token.attrs.length; i++) { if (token.attrs[i].name === DEFINITION_URL_ATTR) { token.attrs[i].name = ADJUSTED_DEFINITION_URL_ATTR; break; } } -}; - -exports.adjustTokenSVGAttrs = function(token) { +} +exports.adjustTokenMathMLAttrs = adjustTokenMathMLAttrs; +function adjustTokenSVGAttrs(token) { for (let i = 0; i < token.attrs.length; i++) { - const adjustedAttrName = SVG_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name]; - - if (adjustedAttrName) { + const adjustedAttrName = SVG_ATTRS_ADJUSTMENT_MAP.get(token.attrs[i].name); + if (adjustedAttrName != null) { token.attrs[i].name = adjustedAttrName; } } -}; - -exports.adjustTokenXMLAttrs = function(token) { +} +exports.adjustTokenSVGAttrs = adjustTokenSVGAttrs; +function adjustTokenXMLAttrs(token) { for (let i = 0; i < token.attrs.length; i++) { - const adjustedAttrEntry = XML_ATTRS_ADJUSTMENT_MAP[token.attrs[i].name]; - + const adjustedAttrEntry = XML_ATTRS_ADJUSTMENT_MAP.get(token.attrs[i].name); if (adjustedAttrEntry) { token.attrs[i].prefix = adjustedAttrEntry.prefix; token.attrs[i].name = adjustedAttrEntry.name; token.attrs[i].namespace = adjustedAttrEntry.namespace; } } -}; - -exports.adjustTokenSVGTagName = function(token) { - const adjustedTagName = SVG_TAG_NAMES_ADJUSTMENT_MAP[token.tagName]; - - if (adjustedTagName) { +} +exports.adjustTokenXMLAttrs = adjustTokenXMLAttrs; +function adjustTokenSVGTagName(token) { + const adjustedTagName = exports.SVG_TAG_NAMES_ADJUSTMENT_MAP.get(token.tagName); + if (adjustedTagName != null) { token.tagName = adjustedTagName; + token.tagID = (0, html_js_1.getTagID)(token.tagName); } -}; - +} +exports.adjustTokenSVGTagName = adjustTokenSVGTagName; //Integration points function isMathMLTextIntegrationPoint(tn, ns) { - return ns === NS.MATHML && (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS || tn === $.MTEXT); + return ns === html_js_1.NS.MATHML && (tn === html_js_1.TAG_ID.MI || tn === html_js_1.TAG_ID.MO || tn === html_js_1.TAG_ID.MN || tn === html_js_1.TAG_ID.MS || tn === html_js_1.TAG_ID.MTEXT); } - function isHtmlIntegrationPoint(tn, ns, attrs) { - if (ns === NS.MATHML && tn === $.ANNOTATION_XML) { + if (ns === html_js_1.NS.MATHML && tn === html_js_1.TAG_ID.ANNOTATION_XML) { for (let i = 0; i < attrs.length; i++) { - if (attrs[i].name === ATTRS.ENCODING) { + if (attrs[i].name === html_js_1.ATTRS.ENCODING) { const value = attrs[i].value.toLowerCase(); - return value === MIME_TYPES.TEXT_HTML || value === MIME_TYPES.APPLICATION_XML; } } } - - return ns === NS.SVG && (tn === $.FOREIGN_OBJECT || tn === $.DESC || tn === $.TITLE); + return ns === html_js_1.NS.SVG && (tn === html_js_1.TAG_ID.FOREIGN_OBJECT || tn === html_js_1.TAG_ID.DESC || tn === html_js_1.TAG_ID.TITLE); +} +function isIntegrationPoint(tn, ns, attrs, foreignNS) { + return (((!foreignNS || foreignNS === html_js_1.NS.HTML) && isHtmlIntegrationPoint(tn, ns, attrs)) || + ((!foreignNS || foreignNS === html_js_1.NS.MATHML) && isMathMLTextIntegrationPoint(tn, ns))); +} +exports.isIntegrationPoint = isIntegrationPoint; + +},{"./html.js":4}],4:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.hasUnescapedText = exports.isNumberedHeader = exports.SPECIAL_ELEMENTS = exports.getTagID = exports.TAG_ID = exports.TAG_NAMES = exports.DOCUMENT_MODE = exports.ATTRS = exports.NS = void 0; +/** All valid namespaces in HTML. */ +var NS; +(function (NS) { + NS["HTML"] = "http://www.w3.org/1999/xhtml"; + NS["MATHML"] = "http://www.w3.org/1998/Math/MathML"; + NS["SVG"] = "http://www.w3.org/2000/svg"; + NS["XLINK"] = "http://www.w3.org/1999/xlink"; + NS["XML"] = "http://www.w3.org/XML/1998/namespace"; + NS["XMLNS"] = "http://www.w3.org/2000/xmlns/"; +})(NS = exports.NS || (exports.NS = {})); +var ATTRS; +(function (ATTRS) { + ATTRS["TYPE"] = "type"; + ATTRS["ACTION"] = "action"; + ATTRS["ENCODING"] = "encoding"; + ATTRS["PROMPT"] = "prompt"; + ATTRS["NAME"] = "name"; + ATTRS["COLOR"] = "color"; + ATTRS["FACE"] = "face"; + ATTRS["SIZE"] = "size"; +})(ATTRS = exports.ATTRS || (exports.ATTRS = {})); +/** + * The mode of the document. + * + * @see {@link https://dom.spec.whatwg.org/#concept-document-limited-quirks} + */ +var DOCUMENT_MODE; +(function (DOCUMENT_MODE) { + DOCUMENT_MODE["NO_QUIRKS"] = "no-quirks"; + DOCUMENT_MODE["QUIRKS"] = "quirks"; + DOCUMENT_MODE["LIMITED_QUIRKS"] = "limited-quirks"; +})(DOCUMENT_MODE = exports.DOCUMENT_MODE || (exports.DOCUMENT_MODE = {})); +var TAG_NAMES; +(function (TAG_NAMES) { + TAG_NAMES["A"] = "a"; + TAG_NAMES["ADDRESS"] = "address"; + TAG_NAMES["ANNOTATION_XML"] = "annotation-xml"; + TAG_NAMES["APPLET"] = "applet"; + TAG_NAMES["AREA"] = "area"; + TAG_NAMES["ARTICLE"] = "article"; + TAG_NAMES["ASIDE"] = "aside"; + TAG_NAMES["B"] = "b"; + TAG_NAMES["BASE"] = "base"; + TAG_NAMES["BASEFONT"] = "basefont"; + TAG_NAMES["BGSOUND"] = "bgsound"; + TAG_NAMES["BIG"] = "big"; + TAG_NAMES["BLOCKQUOTE"] = "blockquote"; + TAG_NAMES["BODY"] = "body"; + TAG_NAMES["BR"] = "br"; + TAG_NAMES["BUTTON"] = "button"; + TAG_NAMES["CAPTION"] = "caption"; + TAG_NAMES["CENTER"] = "center"; + TAG_NAMES["CODE"] = "code"; + TAG_NAMES["COL"] = "col"; + TAG_NAMES["COLGROUP"] = "colgroup"; + TAG_NAMES["DD"] = "dd"; + TAG_NAMES["DESC"] = "desc"; + TAG_NAMES["DETAILS"] = "details"; + TAG_NAMES["DIALOG"] = "dialog"; + TAG_NAMES["DIR"] = "dir"; + TAG_NAMES["DIV"] = "div"; + TAG_NAMES["DL"] = "dl"; + TAG_NAMES["DT"] = "dt"; + TAG_NAMES["EM"] = "em"; + TAG_NAMES["EMBED"] = "embed"; + TAG_NAMES["FIELDSET"] = "fieldset"; + TAG_NAMES["FIGCAPTION"] = "figcaption"; + TAG_NAMES["FIGURE"] = "figure"; + TAG_NAMES["FONT"] = "font"; + TAG_NAMES["FOOTER"] = "footer"; + TAG_NAMES["FOREIGN_OBJECT"] = "foreignObject"; + TAG_NAMES["FORM"] = "form"; + TAG_NAMES["FRAME"] = "frame"; + TAG_NAMES["FRAMESET"] = "frameset"; + TAG_NAMES["H1"] = "h1"; + TAG_NAMES["H2"] = "h2"; + TAG_NAMES["H3"] = "h3"; + TAG_NAMES["H4"] = "h4"; + TAG_NAMES["H5"] = "h5"; + TAG_NAMES["H6"] = "h6"; + TAG_NAMES["HEAD"] = "head"; + TAG_NAMES["HEADER"] = "header"; + TAG_NAMES["HGROUP"] = "hgroup"; + TAG_NAMES["HR"] = "hr"; + TAG_NAMES["HTML"] = "html"; + TAG_NAMES["I"] = "i"; + TAG_NAMES["IMG"] = "img"; + TAG_NAMES["IMAGE"] = "image"; + TAG_NAMES["INPUT"] = "input"; + TAG_NAMES["IFRAME"] = "iframe"; + TAG_NAMES["KEYGEN"] = "keygen"; + TAG_NAMES["LABEL"] = "label"; + TAG_NAMES["LI"] = "li"; + TAG_NAMES["LINK"] = "link"; + TAG_NAMES["LISTING"] = "listing"; + TAG_NAMES["MAIN"] = "main"; + TAG_NAMES["MALIGNMARK"] = "malignmark"; + TAG_NAMES["MARQUEE"] = "marquee"; + TAG_NAMES["MATH"] = "math"; + TAG_NAMES["MENU"] = "menu"; + TAG_NAMES["META"] = "meta"; + TAG_NAMES["MGLYPH"] = "mglyph"; + TAG_NAMES["MI"] = "mi"; + TAG_NAMES["MO"] = "mo"; + TAG_NAMES["MN"] = "mn"; + TAG_NAMES["MS"] = "ms"; + TAG_NAMES["MTEXT"] = "mtext"; + TAG_NAMES["NAV"] = "nav"; + TAG_NAMES["NOBR"] = "nobr"; + TAG_NAMES["NOFRAMES"] = "noframes"; + TAG_NAMES["NOEMBED"] = "noembed"; + TAG_NAMES["NOSCRIPT"] = "noscript"; + TAG_NAMES["OBJECT"] = "object"; + TAG_NAMES["OL"] = "ol"; + TAG_NAMES["OPTGROUP"] = "optgroup"; + TAG_NAMES["OPTION"] = "option"; + TAG_NAMES["P"] = "p"; + TAG_NAMES["PARAM"] = "param"; + TAG_NAMES["PLAINTEXT"] = "plaintext"; + TAG_NAMES["PRE"] = "pre"; + TAG_NAMES["RB"] = "rb"; + TAG_NAMES["RP"] = "rp"; + TAG_NAMES["RT"] = "rt"; + TAG_NAMES["RTC"] = "rtc"; + TAG_NAMES["RUBY"] = "ruby"; + TAG_NAMES["S"] = "s"; + TAG_NAMES["SCRIPT"] = "script"; + TAG_NAMES["SECTION"] = "section"; + TAG_NAMES["SELECT"] = "select"; + TAG_NAMES["SOURCE"] = "source"; + TAG_NAMES["SMALL"] = "small"; + TAG_NAMES["SPAN"] = "span"; + TAG_NAMES["STRIKE"] = "strike"; + TAG_NAMES["STRONG"] = "strong"; + TAG_NAMES["STYLE"] = "style"; + TAG_NAMES["SUB"] = "sub"; + TAG_NAMES["SUMMARY"] = "summary"; + TAG_NAMES["SUP"] = "sup"; + TAG_NAMES["TABLE"] = "table"; + TAG_NAMES["TBODY"] = "tbody"; + TAG_NAMES["TEMPLATE"] = "template"; + TAG_NAMES["TEXTAREA"] = "textarea"; + TAG_NAMES["TFOOT"] = "tfoot"; + TAG_NAMES["TD"] = "td"; + TAG_NAMES["TH"] = "th"; + TAG_NAMES["THEAD"] = "thead"; + TAG_NAMES["TITLE"] = "title"; + TAG_NAMES["TR"] = "tr"; + TAG_NAMES["TRACK"] = "track"; + TAG_NAMES["TT"] = "tt"; + TAG_NAMES["U"] = "u"; + TAG_NAMES["UL"] = "ul"; + TAG_NAMES["SVG"] = "svg"; + TAG_NAMES["VAR"] = "var"; + TAG_NAMES["WBR"] = "wbr"; + TAG_NAMES["XMP"] = "xmp"; +})(TAG_NAMES = exports.TAG_NAMES || (exports.TAG_NAMES = {})); +/** + * Tag IDs are numeric IDs for known tag names. + * + * We use tag IDs to improve the performance of tag name comparisons. + */ +var TAG_ID; +(function (TAG_ID) { + TAG_ID[TAG_ID["UNKNOWN"] = 0] = "UNKNOWN"; + TAG_ID[TAG_ID["A"] = 1] = "A"; + TAG_ID[TAG_ID["ADDRESS"] = 2] = "ADDRESS"; + TAG_ID[TAG_ID["ANNOTATION_XML"] = 3] = "ANNOTATION_XML"; + TAG_ID[TAG_ID["APPLET"] = 4] = "APPLET"; + TAG_ID[TAG_ID["AREA"] = 5] = "AREA"; + TAG_ID[TAG_ID["ARTICLE"] = 6] = "ARTICLE"; + TAG_ID[TAG_ID["ASIDE"] = 7] = "ASIDE"; + TAG_ID[TAG_ID["B"] = 8] = "B"; + TAG_ID[TAG_ID["BASE"] = 9] = "BASE"; + TAG_ID[TAG_ID["BASEFONT"] = 10] = "BASEFONT"; + TAG_ID[TAG_ID["BGSOUND"] = 11] = "BGSOUND"; + TAG_ID[TAG_ID["BIG"] = 12] = "BIG"; + TAG_ID[TAG_ID["BLOCKQUOTE"] = 13] = "BLOCKQUOTE"; + TAG_ID[TAG_ID["BODY"] = 14] = "BODY"; + TAG_ID[TAG_ID["BR"] = 15] = "BR"; + TAG_ID[TAG_ID["BUTTON"] = 16] = "BUTTON"; + TAG_ID[TAG_ID["CAPTION"] = 17] = "CAPTION"; + TAG_ID[TAG_ID["CENTER"] = 18] = "CENTER"; + TAG_ID[TAG_ID["CODE"] = 19] = "CODE"; + TAG_ID[TAG_ID["COL"] = 20] = "COL"; + TAG_ID[TAG_ID["COLGROUP"] = 21] = "COLGROUP"; + TAG_ID[TAG_ID["DD"] = 22] = "DD"; + TAG_ID[TAG_ID["DESC"] = 23] = "DESC"; + TAG_ID[TAG_ID["DETAILS"] = 24] = "DETAILS"; + TAG_ID[TAG_ID["DIALOG"] = 25] = "DIALOG"; + TAG_ID[TAG_ID["DIR"] = 26] = "DIR"; + TAG_ID[TAG_ID["DIV"] = 27] = "DIV"; + TAG_ID[TAG_ID["DL"] = 28] = "DL"; + TAG_ID[TAG_ID["DT"] = 29] = "DT"; + TAG_ID[TAG_ID["EM"] = 30] = "EM"; + TAG_ID[TAG_ID["EMBED"] = 31] = "EMBED"; + TAG_ID[TAG_ID["FIELDSET"] = 32] = "FIELDSET"; + TAG_ID[TAG_ID["FIGCAPTION"] = 33] = "FIGCAPTION"; + TAG_ID[TAG_ID["FIGURE"] = 34] = "FIGURE"; + TAG_ID[TAG_ID["FONT"] = 35] = "FONT"; + TAG_ID[TAG_ID["FOOTER"] = 36] = "FOOTER"; + TAG_ID[TAG_ID["FOREIGN_OBJECT"] = 37] = "FOREIGN_OBJECT"; + TAG_ID[TAG_ID["FORM"] = 38] = "FORM"; + TAG_ID[TAG_ID["FRAME"] = 39] = "FRAME"; + TAG_ID[TAG_ID["FRAMESET"] = 40] = "FRAMESET"; + TAG_ID[TAG_ID["H1"] = 41] = "H1"; + TAG_ID[TAG_ID["H2"] = 42] = "H2"; + TAG_ID[TAG_ID["H3"] = 43] = "H3"; + TAG_ID[TAG_ID["H4"] = 44] = "H4"; + TAG_ID[TAG_ID["H5"] = 45] = "H5"; + TAG_ID[TAG_ID["H6"] = 46] = "H6"; + TAG_ID[TAG_ID["HEAD"] = 47] = "HEAD"; + TAG_ID[TAG_ID["HEADER"] = 48] = "HEADER"; + TAG_ID[TAG_ID["HGROUP"] = 49] = "HGROUP"; + TAG_ID[TAG_ID["HR"] = 50] = "HR"; + TAG_ID[TAG_ID["HTML"] = 51] = "HTML"; + TAG_ID[TAG_ID["I"] = 52] = "I"; + TAG_ID[TAG_ID["IMG"] = 53] = "IMG"; + TAG_ID[TAG_ID["IMAGE"] = 54] = "IMAGE"; + TAG_ID[TAG_ID["INPUT"] = 55] = "INPUT"; + TAG_ID[TAG_ID["IFRAME"] = 56] = "IFRAME"; + TAG_ID[TAG_ID["KEYGEN"] = 57] = "KEYGEN"; + TAG_ID[TAG_ID["LABEL"] = 58] = "LABEL"; + TAG_ID[TAG_ID["LI"] = 59] = "LI"; + TAG_ID[TAG_ID["LINK"] = 60] = "LINK"; + TAG_ID[TAG_ID["LISTING"] = 61] = "LISTING"; + TAG_ID[TAG_ID["MAIN"] = 62] = "MAIN"; + TAG_ID[TAG_ID["MALIGNMARK"] = 63] = "MALIGNMARK"; + TAG_ID[TAG_ID["MARQUEE"] = 64] = "MARQUEE"; + TAG_ID[TAG_ID["MATH"] = 65] = "MATH"; + TAG_ID[TAG_ID["MENU"] = 66] = "MENU"; + TAG_ID[TAG_ID["META"] = 67] = "META"; + TAG_ID[TAG_ID["MGLYPH"] = 68] = "MGLYPH"; + TAG_ID[TAG_ID["MI"] = 69] = "MI"; + TAG_ID[TAG_ID["MO"] = 70] = "MO"; + TAG_ID[TAG_ID["MN"] = 71] = "MN"; + TAG_ID[TAG_ID["MS"] = 72] = "MS"; + TAG_ID[TAG_ID["MTEXT"] = 73] = "MTEXT"; + TAG_ID[TAG_ID["NAV"] = 74] = "NAV"; + TAG_ID[TAG_ID["NOBR"] = 75] = "NOBR"; + TAG_ID[TAG_ID["NOFRAMES"] = 76] = "NOFRAMES"; + TAG_ID[TAG_ID["NOEMBED"] = 77] = "NOEMBED"; + TAG_ID[TAG_ID["NOSCRIPT"] = 78] = "NOSCRIPT"; + TAG_ID[TAG_ID["OBJECT"] = 79] = "OBJECT"; + TAG_ID[TAG_ID["OL"] = 80] = "OL"; + TAG_ID[TAG_ID["OPTGROUP"] = 81] = "OPTGROUP"; + TAG_ID[TAG_ID["OPTION"] = 82] = "OPTION"; + TAG_ID[TAG_ID["P"] = 83] = "P"; + TAG_ID[TAG_ID["PARAM"] = 84] = "PARAM"; + TAG_ID[TAG_ID["PLAINTEXT"] = 85] = "PLAINTEXT"; + TAG_ID[TAG_ID["PRE"] = 86] = "PRE"; + TAG_ID[TAG_ID["RB"] = 87] = "RB"; + TAG_ID[TAG_ID["RP"] = 88] = "RP"; + TAG_ID[TAG_ID["RT"] = 89] = "RT"; + TAG_ID[TAG_ID["RTC"] = 90] = "RTC"; + TAG_ID[TAG_ID["RUBY"] = 91] = "RUBY"; + TAG_ID[TAG_ID["S"] = 92] = "S"; + TAG_ID[TAG_ID["SCRIPT"] = 93] = "SCRIPT"; + TAG_ID[TAG_ID["SECTION"] = 94] = "SECTION"; + TAG_ID[TAG_ID["SELECT"] = 95] = "SELECT"; + TAG_ID[TAG_ID["SOURCE"] = 96] = "SOURCE"; + TAG_ID[TAG_ID["SMALL"] = 97] = "SMALL"; + TAG_ID[TAG_ID["SPAN"] = 98] = "SPAN"; + TAG_ID[TAG_ID["STRIKE"] = 99] = "STRIKE"; + TAG_ID[TAG_ID["STRONG"] = 100] = "STRONG"; + TAG_ID[TAG_ID["STYLE"] = 101] = "STYLE"; + TAG_ID[TAG_ID["SUB"] = 102] = "SUB"; + TAG_ID[TAG_ID["SUMMARY"] = 103] = "SUMMARY"; + TAG_ID[TAG_ID["SUP"] = 104] = "SUP"; + TAG_ID[TAG_ID["TABLE"] = 105] = "TABLE"; + TAG_ID[TAG_ID["TBODY"] = 106] = "TBODY"; + TAG_ID[TAG_ID["TEMPLATE"] = 107] = "TEMPLATE"; + TAG_ID[TAG_ID["TEXTAREA"] = 108] = "TEXTAREA"; + TAG_ID[TAG_ID["TFOOT"] = 109] = "TFOOT"; + TAG_ID[TAG_ID["TD"] = 110] = "TD"; + TAG_ID[TAG_ID["TH"] = 111] = "TH"; + TAG_ID[TAG_ID["THEAD"] = 112] = "THEAD"; + TAG_ID[TAG_ID["TITLE"] = 113] = "TITLE"; + TAG_ID[TAG_ID["TR"] = 114] = "TR"; + TAG_ID[TAG_ID["TRACK"] = 115] = "TRACK"; + TAG_ID[TAG_ID["TT"] = 116] = "TT"; + TAG_ID[TAG_ID["U"] = 117] = "U"; + TAG_ID[TAG_ID["UL"] = 118] = "UL"; + TAG_ID[TAG_ID["SVG"] = 119] = "SVG"; + TAG_ID[TAG_ID["VAR"] = 120] = "VAR"; + TAG_ID[TAG_ID["WBR"] = 121] = "WBR"; + TAG_ID[TAG_ID["XMP"] = 122] = "XMP"; +})(TAG_ID = exports.TAG_ID || (exports.TAG_ID = {})); +const TAG_NAME_TO_ID = new Map([ + [TAG_NAMES.A, TAG_ID.A], + [TAG_NAMES.ADDRESS, TAG_ID.ADDRESS], + [TAG_NAMES.ANNOTATION_XML, TAG_ID.ANNOTATION_XML], + [TAG_NAMES.APPLET, TAG_ID.APPLET], + [TAG_NAMES.AREA, TAG_ID.AREA], + [TAG_NAMES.ARTICLE, TAG_ID.ARTICLE], + [TAG_NAMES.ASIDE, TAG_ID.ASIDE], + [TAG_NAMES.B, TAG_ID.B], + [TAG_NAMES.BASE, TAG_ID.BASE], + [TAG_NAMES.BASEFONT, TAG_ID.BASEFONT], + [TAG_NAMES.BGSOUND, TAG_ID.BGSOUND], + [TAG_NAMES.BIG, TAG_ID.BIG], + [TAG_NAMES.BLOCKQUOTE, TAG_ID.BLOCKQUOTE], + [TAG_NAMES.BODY, TAG_ID.BODY], + [TAG_NAMES.BR, TAG_ID.BR], + [TAG_NAMES.BUTTON, TAG_ID.BUTTON], + [TAG_NAMES.CAPTION, TAG_ID.CAPTION], + [TAG_NAMES.CENTER, TAG_ID.CENTER], + [TAG_NAMES.CODE, TAG_ID.CODE], + [TAG_NAMES.COL, TAG_ID.COL], + [TAG_NAMES.COLGROUP, TAG_ID.COLGROUP], + [TAG_NAMES.DD, TAG_ID.DD], + [TAG_NAMES.DESC, TAG_ID.DESC], + [TAG_NAMES.DETAILS, TAG_ID.DETAILS], + [TAG_NAMES.DIALOG, TAG_ID.DIALOG], + [TAG_NAMES.DIR, TAG_ID.DIR], + [TAG_NAMES.DIV, TAG_ID.DIV], + [TAG_NAMES.DL, TAG_ID.DL], + [TAG_NAMES.DT, TAG_ID.DT], + [TAG_NAMES.EM, TAG_ID.EM], + [TAG_NAMES.EMBED, TAG_ID.EMBED], + [TAG_NAMES.FIELDSET, TAG_ID.FIELDSET], + [TAG_NAMES.FIGCAPTION, TAG_ID.FIGCAPTION], + [TAG_NAMES.FIGURE, TAG_ID.FIGURE], + [TAG_NAMES.FONT, TAG_ID.FONT], + [TAG_NAMES.FOOTER, TAG_ID.FOOTER], + [TAG_NAMES.FOREIGN_OBJECT, TAG_ID.FOREIGN_OBJECT], + [TAG_NAMES.FORM, TAG_ID.FORM], + [TAG_NAMES.FRAME, TAG_ID.FRAME], + [TAG_NAMES.FRAMESET, TAG_ID.FRAMESET], + [TAG_NAMES.H1, TAG_ID.H1], + [TAG_NAMES.H2, TAG_ID.H2], + [TAG_NAMES.H3, TAG_ID.H3], + [TAG_NAMES.H4, TAG_ID.H4], + [TAG_NAMES.H5, TAG_ID.H5], + [TAG_NAMES.H6, TAG_ID.H6], + [TAG_NAMES.HEAD, TAG_ID.HEAD], + [TAG_NAMES.HEADER, TAG_ID.HEADER], + [TAG_NAMES.HGROUP, TAG_ID.HGROUP], + [TAG_NAMES.HR, TAG_ID.HR], + [TAG_NAMES.HTML, TAG_ID.HTML], + [TAG_NAMES.I, TAG_ID.I], + [TAG_NAMES.IMG, TAG_ID.IMG], + [TAG_NAMES.IMAGE, TAG_ID.IMAGE], + [TAG_NAMES.INPUT, TAG_ID.INPUT], + [TAG_NAMES.IFRAME, TAG_ID.IFRAME], + [TAG_NAMES.KEYGEN, TAG_ID.KEYGEN], + [TAG_NAMES.LABEL, TAG_ID.LABEL], + [TAG_NAMES.LI, TAG_ID.LI], + [TAG_NAMES.LINK, TAG_ID.LINK], + [TAG_NAMES.LISTING, TAG_ID.LISTING], + [TAG_NAMES.MAIN, TAG_ID.MAIN], + [TAG_NAMES.MALIGNMARK, TAG_ID.MALIGNMARK], + [TAG_NAMES.MARQUEE, TAG_ID.MARQUEE], + [TAG_NAMES.MATH, TAG_ID.MATH], + [TAG_NAMES.MENU, TAG_ID.MENU], + [TAG_NAMES.META, TAG_ID.META], + [TAG_NAMES.MGLYPH, TAG_ID.MGLYPH], + [TAG_NAMES.MI, TAG_ID.MI], + [TAG_NAMES.MO, TAG_ID.MO], + [TAG_NAMES.MN, TAG_ID.MN], + [TAG_NAMES.MS, TAG_ID.MS], + [TAG_NAMES.MTEXT, TAG_ID.MTEXT], + [TAG_NAMES.NAV, TAG_ID.NAV], + [TAG_NAMES.NOBR, TAG_ID.NOBR], + [TAG_NAMES.NOFRAMES, TAG_ID.NOFRAMES], + [TAG_NAMES.NOEMBED, TAG_ID.NOEMBED], + [TAG_NAMES.NOSCRIPT, TAG_ID.NOSCRIPT], + [TAG_NAMES.OBJECT, TAG_ID.OBJECT], + [TAG_NAMES.OL, TAG_ID.OL], + [TAG_NAMES.OPTGROUP, TAG_ID.OPTGROUP], + [TAG_NAMES.OPTION, TAG_ID.OPTION], + [TAG_NAMES.P, TAG_ID.P], + [TAG_NAMES.PARAM, TAG_ID.PARAM], + [TAG_NAMES.PLAINTEXT, TAG_ID.PLAINTEXT], + [TAG_NAMES.PRE, TAG_ID.PRE], + [TAG_NAMES.RB, TAG_ID.RB], + [TAG_NAMES.RP, TAG_ID.RP], + [TAG_NAMES.RT, TAG_ID.RT], + [TAG_NAMES.RTC, TAG_ID.RTC], + [TAG_NAMES.RUBY, TAG_ID.RUBY], + [TAG_NAMES.S, TAG_ID.S], + [TAG_NAMES.SCRIPT, TAG_ID.SCRIPT], + [TAG_NAMES.SECTION, TAG_ID.SECTION], + [TAG_NAMES.SELECT, TAG_ID.SELECT], + [TAG_NAMES.SOURCE, TAG_ID.SOURCE], + [TAG_NAMES.SMALL, TAG_ID.SMALL], + [TAG_NAMES.SPAN, TAG_ID.SPAN], + [TAG_NAMES.STRIKE, TAG_ID.STRIKE], + [TAG_NAMES.STRONG, TAG_ID.STRONG], + [TAG_NAMES.STYLE, TAG_ID.STYLE], + [TAG_NAMES.SUB, TAG_ID.SUB], + [TAG_NAMES.SUMMARY, TAG_ID.SUMMARY], + [TAG_NAMES.SUP, TAG_ID.SUP], + [TAG_NAMES.TABLE, TAG_ID.TABLE], + [TAG_NAMES.TBODY, TAG_ID.TBODY], + [TAG_NAMES.TEMPLATE, TAG_ID.TEMPLATE], + [TAG_NAMES.TEXTAREA, TAG_ID.TEXTAREA], + [TAG_NAMES.TFOOT, TAG_ID.TFOOT], + [TAG_NAMES.TD, TAG_ID.TD], + [TAG_NAMES.TH, TAG_ID.TH], + [TAG_NAMES.THEAD, TAG_ID.THEAD], + [TAG_NAMES.TITLE, TAG_ID.TITLE], + [TAG_NAMES.TR, TAG_ID.TR], + [TAG_NAMES.TRACK, TAG_ID.TRACK], + [TAG_NAMES.TT, TAG_ID.TT], + [TAG_NAMES.U, TAG_ID.U], + [TAG_NAMES.UL, TAG_ID.UL], + [TAG_NAMES.SVG, TAG_ID.SVG], + [TAG_NAMES.VAR, TAG_ID.VAR], + [TAG_NAMES.WBR, TAG_ID.WBR], + [TAG_NAMES.XMP, TAG_ID.XMP], +]); +function getTagID(tagName) { + var _a; + return (_a = TAG_NAME_TO_ID.get(tagName)) !== null && _a !== void 0 ? _a : TAG_ID.UNKNOWN; } - -exports.isIntegrationPoint = function(tn, ns, attrs, foreignNS) { - if ((!foreignNS || foreignNS === NS.HTML) && isHtmlIntegrationPoint(tn, ns, attrs)) { - return true; - } - - if ((!foreignNS || foreignNS === NS.MATHML) && isMathMLTextIntegrationPoint(tn, ns)) { - return true; - } - - return false; -}; - -},{"../tokenizer":19,"./html":4}],4:[function(require,module,exports){ -'use strict'; - -const NS = (exports.NAMESPACES = { - HTML: 'http://www.w3.org/1999/xhtml', - MATHML: 'http://www.w3.org/1998/Math/MathML', - SVG: 'http://www.w3.org/2000/svg', - XLINK: 'http://www.w3.org/1999/xlink', - XML: 'http://www.w3.org/XML/1998/namespace', - XMLNS: 'http://www.w3.org/2000/xmlns/' -}); - -exports.ATTRS = { - TYPE: 'type', - ACTION: 'action', - ENCODING: 'encoding', - PROMPT: 'prompt', - NAME: 'name', - COLOR: 'color', - FACE: 'face', - SIZE: 'size' -}; - -exports.DOCUMENT_MODE = { - NO_QUIRKS: 'no-quirks', - QUIRKS: 'quirks', - LIMITED_QUIRKS: 'limited-quirks' -}; - -const $ = (exports.TAG_NAMES = { - A: 'a', - ADDRESS: 'address', - ANNOTATION_XML: 'annotation-xml', - APPLET: 'applet', - AREA: 'area', - ARTICLE: 'article', - ASIDE: 'aside', - - B: 'b', - BASE: 'base', - BASEFONT: 'basefont', - BGSOUND: 'bgsound', - BIG: 'big', - BLOCKQUOTE: 'blockquote', - BODY: 'body', - BR: 'br', - BUTTON: 'button', - - CAPTION: 'caption', - CENTER: 'center', - CODE: 'code', - COL: 'col', - COLGROUP: 'colgroup', - - DD: 'dd', - DESC: 'desc', - DETAILS: 'details', - DIALOG: 'dialog', - DIR: 'dir', - DIV: 'div', - DL: 'dl', - DT: 'dt', - - EM: 'em', - EMBED: 'embed', - - FIELDSET: 'fieldset', - FIGCAPTION: 'figcaption', - FIGURE: 'figure', - FONT: 'font', - FOOTER: 'footer', - FOREIGN_OBJECT: 'foreignObject', - FORM: 'form', - FRAME: 'frame', - FRAMESET: 'frameset', - - H1: 'h1', - H2: 'h2', - H3: 'h3', - H4: 'h4', - H5: 'h5', - H6: 'h6', - HEAD: 'head', - HEADER: 'header', - HGROUP: 'hgroup', - HR: 'hr', - HTML: 'html', - - I: 'i', - IMG: 'img', - IMAGE: 'image', - INPUT: 'input', - IFRAME: 'iframe', - - KEYGEN: 'keygen', - - LABEL: 'label', - LI: 'li', - LINK: 'link', - LISTING: 'listing', - - MAIN: 'main', - MALIGNMARK: 'malignmark', - MARQUEE: 'marquee', - MATH: 'math', - MENU: 'menu', - META: 'meta', - MGLYPH: 'mglyph', - MI: 'mi', - MO: 'mo', - MN: 'mn', - MS: 'ms', - MTEXT: 'mtext', - - NAV: 'nav', - NOBR: 'nobr', - NOFRAMES: 'noframes', - NOEMBED: 'noembed', - NOSCRIPT: 'noscript', - - OBJECT: 'object', - OL: 'ol', - OPTGROUP: 'optgroup', - OPTION: 'option', - - P: 'p', - PARAM: 'param', - PLAINTEXT: 'plaintext', - PRE: 'pre', - - RB: 'rb', - RP: 'rp', - RT: 'rt', - RTC: 'rtc', - RUBY: 'ruby', - - S: 's', - SCRIPT: 'script', - SECTION: 'section', - SELECT: 'select', - SOURCE: 'source', - SMALL: 'small', - SPAN: 'span', - STRIKE: 'strike', - STRONG: 'strong', - STYLE: 'style', - SUB: 'sub', - SUMMARY: 'summary', - SUP: 'sup', - - TABLE: 'table', - TBODY: 'tbody', - TEMPLATE: 'template', - TEXTAREA: 'textarea', - TFOOT: 'tfoot', - TD: 'td', - TH: 'th', - THEAD: 'thead', - TITLE: 'title', - TR: 'tr', - TRACK: 'track', - TT: 'tt', - - U: 'u', - UL: 'ul', - - SVG: 'svg', - - VAR: 'var', - - WBR: 'wbr', - - XMP: 'xmp' -}); - +exports.getTagID = getTagID; +const $ = TAG_ID; exports.SPECIAL_ELEMENTS = { - [NS.HTML]: { - [$.ADDRESS]: true, - [$.APPLET]: true, - [$.AREA]: true, - [$.ARTICLE]: true, - [$.ASIDE]: true, - [$.BASE]: true, - [$.BASEFONT]: true, - [$.BGSOUND]: true, - [$.BLOCKQUOTE]: true, - [$.BODY]: true, - [$.BR]: true, - [$.BUTTON]: true, - [$.CAPTION]: true, - [$.CENTER]: true, - [$.COL]: true, - [$.COLGROUP]: true, - [$.DD]: true, - [$.DETAILS]: true, - [$.DIR]: true, - [$.DIV]: true, - [$.DL]: true, - [$.DT]: true, - [$.EMBED]: true, - [$.FIELDSET]: true, - [$.FIGCAPTION]: true, - [$.FIGURE]: true, - [$.FOOTER]: true, - [$.FORM]: true, - [$.FRAME]: true, - [$.FRAMESET]: true, - [$.H1]: true, - [$.H2]: true, - [$.H3]: true, - [$.H4]: true, - [$.H5]: true, - [$.H6]: true, - [$.HEAD]: true, - [$.HEADER]: true, - [$.HGROUP]: true, - [$.HR]: true, - [$.HTML]: true, - [$.IFRAME]: true, - [$.IMG]: true, - [$.INPUT]: true, - [$.LI]: true, - [$.LINK]: true, - [$.LISTING]: true, - [$.MAIN]: true, - [$.MARQUEE]: true, - [$.MENU]: true, - [$.META]: true, - [$.NAV]: true, - [$.NOEMBED]: true, - [$.NOFRAMES]: true, - [$.NOSCRIPT]: true, - [$.OBJECT]: true, - [$.OL]: true, - [$.P]: true, - [$.PARAM]: true, - [$.PLAINTEXT]: true, - [$.PRE]: true, - [$.SCRIPT]: true, - [$.SECTION]: true, - [$.SELECT]: true, - [$.SOURCE]: true, - [$.STYLE]: true, - [$.SUMMARY]: true, - [$.TABLE]: true, - [$.TBODY]: true, - [$.TD]: true, - [$.TEMPLATE]: true, - [$.TEXTAREA]: true, - [$.TFOOT]: true, - [$.TH]: true, - [$.THEAD]: true, - [$.TITLE]: true, - [$.TR]: true, - [$.TRACK]: true, - [$.UL]: true, - [$.WBR]: true, - [$.XMP]: true - }, - [NS.MATHML]: { - [$.MI]: true, - [$.MO]: true, - [$.MN]: true, - [$.MS]: true, - [$.MTEXT]: true, - [$.ANNOTATION_XML]: true - }, - [NS.SVG]: { - [$.TITLE]: true, - [$.FOREIGN_OBJECT]: true, - [$.DESC]: true - } + [NS.HTML]: new Set([ + $.ADDRESS, + $.APPLET, + $.AREA, + $.ARTICLE, + $.ASIDE, + $.BASE, + $.BASEFONT, + $.BGSOUND, + $.BLOCKQUOTE, + $.BODY, + $.BR, + $.BUTTON, + $.CAPTION, + $.CENTER, + $.COL, + $.COLGROUP, + $.DD, + $.DETAILS, + $.DIR, + $.DIV, + $.DL, + $.DT, + $.EMBED, + $.FIELDSET, + $.FIGCAPTION, + $.FIGURE, + $.FOOTER, + $.FORM, + $.FRAME, + $.FRAMESET, + $.H1, + $.H2, + $.H3, + $.H4, + $.H5, + $.H6, + $.HEAD, + $.HEADER, + $.HGROUP, + $.HR, + $.HTML, + $.IFRAME, + $.IMG, + $.INPUT, + $.LI, + $.LINK, + $.LISTING, + $.MAIN, + $.MARQUEE, + $.MENU, + $.META, + $.NAV, + $.NOEMBED, + $.NOFRAMES, + $.NOSCRIPT, + $.OBJECT, + $.OL, + $.P, + $.PARAM, + $.PLAINTEXT, + $.PRE, + $.SCRIPT, + $.SECTION, + $.SELECT, + $.SOURCE, + $.STYLE, + $.SUMMARY, + $.TABLE, + $.TBODY, + $.TD, + $.TEMPLATE, + $.TEXTAREA, + $.TFOOT, + $.TH, + $.THEAD, + $.TITLE, + $.TR, + $.TRACK, + $.UL, + $.WBR, + $.XMP, + ]), + [NS.MATHML]: new Set([$.MI, $.MO, $.MN, $.MS, $.MTEXT, $.ANNOTATION_XML]), + [NS.SVG]: new Set([$.TITLE, $.FOREIGN_OBJECT, $.DESC]), + [NS.XLINK]: new Set(), + [NS.XML]: new Set(), + [NS.XMLNS]: new Set(), }; - -},{}],5:[function(require,module,exports){ -'use strict'; - -const UNDEFINED_CODE_POINTS = [ - 0xfffe, - 0xffff, - 0x1fffe, - 0x1ffff, - 0x2fffe, - 0x2ffff, - 0x3fffe, - 0x3ffff, - 0x4fffe, - 0x4ffff, - 0x5fffe, - 0x5ffff, - 0x6fffe, - 0x6ffff, - 0x7fffe, - 0x7ffff, - 0x8fffe, - 0x8ffff, - 0x9fffe, - 0x9ffff, - 0xafffe, - 0xaffff, - 0xbfffe, - 0xbffff, - 0xcfffe, - 0xcffff, - 0xdfffe, - 0xdffff, - 0xefffe, - 0xeffff, - 0xffffe, - 0xfffff, - 0x10fffe, - 0x10ffff -]; - -exports.REPLACEMENT_CHARACTER = '\uFFFD'; - -exports.CODE_POINTS = { - EOF: -1, - NULL: 0x00, - TABULATION: 0x09, - CARRIAGE_RETURN: 0x0d, - LINE_FEED: 0x0a, - FORM_FEED: 0x0c, - SPACE: 0x20, - EXCLAMATION_MARK: 0x21, - QUOTATION_MARK: 0x22, - NUMBER_SIGN: 0x23, - AMPERSAND: 0x26, - APOSTROPHE: 0x27, - HYPHEN_MINUS: 0x2d, - SOLIDUS: 0x2f, - DIGIT_0: 0x30, - DIGIT_9: 0x39, - SEMICOLON: 0x3b, - LESS_THAN_SIGN: 0x3c, - EQUALS_SIGN: 0x3d, - GREATER_THAN_SIGN: 0x3e, - QUESTION_MARK: 0x3f, - LATIN_CAPITAL_A: 0x41, - LATIN_CAPITAL_F: 0x46, - LATIN_CAPITAL_X: 0x58, - LATIN_CAPITAL_Z: 0x5a, - RIGHT_SQUARE_BRACKET: 0x5d, - GRAVE_ACCENT: 0x60, - LATIN_SMALL_A: 0x61, - LATIN_SMALL_F: 0x66, - LATIN_SMALL_X: 0x78, - LATIN_SMALL_Z: 0x7a, - REPLACEMENT_CHARACTER: 0xfffd -}; - -exports.CODE_POINT_SEQUENCES = { - DASH_DASH_STRING: [0x2d, 0x2d], //-- - DOCTYPE_STRING: [0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45], //DOCTYPE - CDATA_START_STRING: [0x5b, 0x43, 0x44, 0x41, 0x54, 0x41, 0x5b], //[CDATA[ - SCRIPT_STRING: [0x73, 0x63, 0x72, 0x69, 0x70, 0x74], //script - PUBLIC_STRING: [0x50, 0x55, 0x42, 0x4c, 0x49, 0x43], //PUBLIC - SYSTEM_STRING: [0x53, 0x59, 0x53, 0x54, 0x45, 0x4d] //SYSTEM -}; - -//Surrogates -exports.isSurrogate = function(cp) { - return cp >= 0xd800 && cp <= 0xdfff; -}; - -exports.isSurrogatePair = function(cp) { - return cp >= 0xdc00 && cp <= 0xdfff; -}; - -exports.getSurrogatePairCodePoint = function(cp1, cp2) { - return (cp1 - 0xd800) * 0x400 + 0x2400 + cp2; -}; - -//NOTE: excluding NULL and ASCII whitespace -exports.isControlCodePoint = function(cp) { - return ( - (cp !== 0x20 && cp !== 0x0a && cp !== 0x0d && cp !== 0x09 && cp !== 0x0c && cp >= 0x01 && cp <= 0x1f) || - (cp >= 0x7f && cp <= 0x9f) - ); -}; - -exports.isUndefinedCodePoint = function(cp) { - return (cp >= 0xfdd0 && cp <= 0xfdef) || UNDEFINED_CODE_POINTS.indexOf(cp) > -1; -}; - -},{}],6:[function(require,module,exports){ -'use strict'; - -const Mixin = require('../../utils/mixin'); - -class ErrorReportingMixinBase extends Mixin { - constructor(host, opts) { - super(host); - - this.posTracker = null; - this.onParseError = opts.onParseError; - } - - _setErrorLocation(err) { - err.startLine = err.endLine = this.posTracker.line; - err.startCol = err.endCol = this.posTracker.col; - err.startOffset = err.endOffset = this.posTracker.offset; - } - - _reportError(code) { - const err = { - code: code, - startLine: -1, - startCol: -1, - startOffset: -1, - endLine: -1, - endCol: -1, - endOffset: -1 - }; - - this._setErrorLocation(err); - this.onParseError(err); - } - - _getOverriddenMethods(mxn) { - return { - _err(code) { - mxn._reportError(code); - } - }; - } -} - -module.exports = ErrorReportingMixinBase; - -},{"../../utils/mixin":24}],7:[function(require,module,exports){ -'use strict'; - -const ErrorReportingMixinBase = require('./mixin-base'); -const ErrorReportingTokenizerMixin = require('./tokenizer-mixin'); -const LocationInfoTokenizerMixin = require('../location-info/tokenizer-mixin'); -const Mixin = require('../../utils/mixin'); - -class ErrorReportingParserMixin extends ErrorReportingMixinBase { - constructor(parser, opts) { - super(parser, opts); - - this.opts = opts; - this.ctLoc = null; - this.locBeforeToken = false; - } - - _setErrorLocation(err) { - if (this.ctLoc) { - err.startLine = this.ctLoc.startLine; - err.startCol = this.ctLoc.startCol; - err.startOffset = this.ctLoc.startOffset; - - err.endLine = this.locBeforeToken ? this.ctLoc.startLine : this.ctLoc.endLine; - err.endCol = this.locBeforeToken ? this.ctLoc.startCol : this.ctLoc.endCol; - err.endOffset = this.locBeforeToken ? this.ctLoc.startOffset : this.ctLoc.endOffset; - } - } - - _getOverriddenMethods(mxn, orig) { - return { - _bootstrap(document, fragmentContext) { - orig._bootstrap.call(this, document, fragmentContext); - - Mixin.install(this.tokenizer, ErrorReportingTokenizerMixin, mxn.opts); - Mixin.install(this.tokenizer, LocationInfoTokenizerMixin); - }, - - _processInputToken(token) { - mxn.ctLoc = token.location; - - orig._processInputToken.call(this, token); - }, - - _err(code, options) { - mxn.locBeforeToken = options && options.beforeToken; - mxn._reportError(code); - } - }; - } +function isNumberedHeader(tn) { + return tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6; +} +exports.isNumberedHeader = isNumberedHeader; +const UNESCAPED_TEXT = new Set([ + TAG_NAMES.STYLE, + TAG_NAMES.SCRIPT, + TAG_NAMES.XMP, + TAG_NAMES.IFRAME, + TAG_NAMES.NOEMBED, + TAG_NAMES.NOFRAMES, + TAG_NAMES.PLAINTEXT, +]); +function hasUnescapedText(tn, scriptingEnabled) { + return UNESCAPED_TEXT.has(tn) || (scriptingEnabled && tn === TAG_NAMES.NOSCRIPT); } +exports.hasUnescapedText = hasUnescapedText; -module.exports = ErrorReportingParserMixin; - -},{"../../utils/mixin":24,"../location-info/tokenizer-mixin":12,"./mixin-base":6,"./tokenizer-mixin":9}],8:[function(require,module,exports){ -'use strict'; - -const ErrorReportingMixinBase = require('./mixin-base'); -const PositionTrackingPreprocessorMixin = require('../position-tracking/preprocessor-mixin'); -const Mixin = require('../../utils/mixin'); - -class ErrorReportingPreprocessorMixin extends ErrorReportingMixinBase { - constructor(preprocessor, opts) { - super(preprocessor, opts); - - this.posTracker = Mixin.install(preprocessor, PositionTrackingPreprocessorMixin); - this.lastErrOffset = -1; - } - - _reportError(code) { - //NOTE: avoid reporting error twice on advance/retreat - if (this.lastErrOffset !== this.posTracker.offset) { - this.lastErrOffset = this.posTracker.offset; - super._reportError(code); +},{}],5:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getTokenAttr = exports.TokenType = void 0; +var TokenType; +(function (TokenType) { + TokenType[TokenType["CHARACTER"] = 0] = "CHARACTER"; + TokenType[TokenType["NULL_CHARACTER"] = 1] = "NULL_CHARACTER"; + TokenType[TokenType["WHITESPACE_CHARACTER"] = 2] = "WHITESPACE_CHARACTER"; + TokenType[TokenType["START_TAG"] = 3] = "START_TAG"; + TokenType[TokenType["END_TAG"] = 4] = "END_TAG"; + TokenType[TokenType["COMMENT"] = 5] = "COMMENT"; + TokenType[TokenType["DOCTYPE"] = 6] = "DOCTYPE"; + TokenType[TokenType["EOF"] = 7] = "EOF"; + TokenType[TokenType["HIBERNATION"] = 8] = "HIBERNATION"; +})(TokenType = exports.TokenType || (exports.TokenType = {})); +function getTokenAttr(token, attrName) { + for (let i = token.attrs.length - 1; i >= 0; i--) { + if (token.attrs[i].name === attrName) { + return token.attrs[i].value; } } + return null; } +exports.getTokenAttr = getTokenAttr; -module.exports = ErrorReportingPreprocessorMixin; - -},{"../../utils/mixin":24,"../position-tracking/preprocessor-mixin":13,"./mixin-base":6}],9:[function(require,module,exports){ -'use strict'; - -const ErrorReportingMixinBase = require('./mixin-base'); -const ErrorReportingPreprocessorMixin = require('./preprocessor-mixin'); -const Mixin = require('../../utils/mixin'); - -class ErrorReportingTokenizerMixin extends ErrorReportingMixinBase { - constructor(tokenizer, opts) { - super(tokenizer, opts); - - const preprocessorMixin = Mixin.install(tokenizer.preprocessor, ErrorReportingPreprocessorMixin, opts); - - this.posTracker = preprocessorMixin.posTracker; - } -} - -module.exports = ErrorReportingTokenizerMixin; - -},{"../../utils/mixin":24,"./mixin-base":6,"./preprocessor-mixin":8}],10:[function(require,module,exports){ -'use strict'; - -const Mixin = require('../../utils/mixin'); - -class LocationInfoOpenElementStackMixin extends Mixin { - constructor(stack, opts) { - super(stack); - - this.onItemPop = opts.onItemPop; - } - - _getOverriddenMethods(mxn, orig) { - return { - pop() { - mxn.onItemPop(this.current); - orig.pop.call(this); - }, - - popAllUpToHtmlElement() { - for (let i = this.stackTop; i > 0; i--) { - mxn.onItemPop(this.items[i]); - } - - orig.popAllUpToHtmlElement.call(this); - }, - - remove(element) { - mxn.onItemPop(this.current); - orig.remove.call(this, element); - } - }; - } -} - -module.exports = LocationInfoOpenElementStackMixin; - -},{"../../utils/mixin":24}],11:[function(require,module,exports){ -'use strict'; - -const Mixin = require('../../utils/mixin'); -const Tokenizer = require('../../tokenizer'); -const LocationInfoTokenizerMixin = require('./tokenizer-mixin'); -const LocationInfoOpenElementStackMixin = require('./open-element-stack-mixin'); -const HTML = require('../../common/html'); - -//Aliases -const $ = HTML.TAG_NAMES; - -class LocationInfoParserMixin extends Mixin { - constructor(parser) { - super(parser); - - this.parser = parser; - this.treeAdapter = this.parser.treeAdapter; - this.posTracker = null; - this.lastStartTagToken = null; - this.lastFosterParentingLocation = null; - this.currentToken = null; - } - - _setStartLocation(element) { - let loc = null; - - if (this.lastStartTagToken) { - loc = Object.assign({}, this.lastStartTagToken.location); - loc.startTag = this.lastStartTagToken.location; - } - - this.treeAdapter.setNodeSourceCodeLocation(element, loc); - } - - _setEndLocation(element, closingToken) { - const loc = this.treeAdapter.getNodeSourceCodeLocation(element); - - if (loc) { - if (closingToken.location) { - const ctLoc = closingToken.location; - const tn = this.treeAdapter.getTagName(element); - - // NOTE: For cases like <p> <p> </p> - First 'p' closes without a closing - // tag and for cases like <td> <p> </td> - 'p' closes without a closing tag. - const isClosingEndTag = closingToken.type === Tokenizer.END_TAG_TOKEN && tn === closingToken.tagName; - const endLoc = {}; - if (isClosingEndTag) { - endLoc.endTag = Object.assign({}, ctLoc); - endLoc.endLine = ctLoc.endLine; - endLoc.endCol = ctLoc.endCol; - endLoc.endOffset = ctLoc.endOffset; - } else { - endLoc.endLine = ctLoc.startLine; - endLoc.endCol = ctLoc.startCol; - endLoc.endOffset = ctLoc.startOffset; - } - - this.treeAdapter.updateNodeSourceCodeLocation(element, endLoc); - } - } - } - - _getOverriddenMethods(mxn, orig) { - return { - _bootstrap(document, fragmentContext) { - orig._bootstrap.call(this, document, fragmentContext); - - mxn.lastStartTagToken = null; - mxn.lastFosterParentingLocation = null; - mxn.currentToken = null; - - const tokenizerMixin = Mixin.install(this.tokenizer, LocationInfoTokenizerMixin); - - mxn.posTracker = tokenizerMixin.posTracker; - - Mixin.install(this.openElements, LocationInfoOpenElementStackMixin, { - onItemPop: function(element) { - mxn._setEndLocation(element, mxn.currentToken); - } - }); - }, - - _runParsingLoop(scriptHandler) { - orig._runParsingLoop.call(this, scriptHandler); - - // NOTE: generate location info for elements - // that remains on open element stack - for (let i = this.openElements.stackTop; i >= 0; i--) { - mxn._setEndLocation(this.openElements.items[i], mxn.currentToken); - } - }, - - //Token processing - _processTokenInForeignContent(token) { - mxn.currentToken = token; - orig._processTokenInForeignContent.call(this, token); - }, - - _processToken(token) { - mxn.currentToken = token; - orig._processToken.call(this, token); - - //NOTE: <body> and <html> are never popped from the stack, so we need to updated - //their end location explicitly. - const requireExplicitUpdate = - token.type === Tokenizer.END_TAG_TOKEN && - (token.tagName === $.HTML || (token.tagName === $.BODY && this.openElements.hasInScope($.BODY))); - - if (requireExplicitUpdate) { - for (let i = this.openElements.stackTop; i >= 0; i--) { - const element = this.openElements.items[i]; - - if (this.treeAdapter.getTagName(element) === token.tagName) { - mxn._setEndLocation(element, token); - break; - } - } - } - }, - - //Doctype - _setDocumentType(token) { - orig._setDocumentType.call(this, token); - - const documentChildren = this.treeAdapter.getChildNodes(this.document); - const cnLength = documentChildren.length; - - for (let i = 0; i < cnLength; i++) { - const node = documentChildren[i]; - - if (this.treeAdapter.isDocumentTypeNode(node)) { - this.treeAdapter.setNodeSourceCodeLocation(node, token.location); - break; - } - } - }, - - //Elements - _attachElementToTree(element) { - //NOTE: _attachElementToTree is called from _appendElement, _insertElement and _insertTemplate methods. - //So we will use token location stored in this methods for the element. - mxn._setStartLocation(element); - mxn.lastStartTagToken = null; - orig._attachElementToTree.call(this, element); - }, - - _appendElement(token, namespaceURI) { - mxn.lastStartTagToken = token; - orig._appendElement.call(this, token, namespaceURI); - }, - - _insertElement(token, namespaceURI) { - mxn.lastStartTagToken = token; - orig._insertElement.call(this, token, namespaceURI); - }, - - _insertTemplate(token) { - mxn.lastStartTagToken = token; - orig._insertTemplate.call(this, token); - - const tmplContent = this.treeAdapter.getTemplateContent(this.openElements.current); - - this.treeAdapter.setNodeSourceCodeLocation(tmplContent, null); - }, - - _insertFakeRootElement() { - orig._insertFakeRootElement.call(this); - this.treeAdapter.setNodeSourceCodeLocation(this.openElements.current, null); - }, - - //Comments - _appendCommentNode(token, parent) { - orig._appendCommentNode.call(this, token, parent); - - const children = this.treeAdapter.getChildNodes(parent); - const commentNode = children[children.length - 1]; - - this.treeAdapter.setNodeSourceCodeLocation(commentNode, token.location); - }, - - //Text - _findFosterParentingLocation() { - //NOTE: store last foster parenting location, so we will be able to find inserted text - //in case of foster parenting - mxn.lastFosterParentingLocation = orig._findFosterParentingLocation.call(this); - - return mxn.lastFosterParentingLocation; - }, - - _insertCharacters(token) { - orig._insertCharacters.call(this, token); - - const hasFosterParent = this._shouldFosterParentOnInsertion(); - - const parent = - (hasFosterParent && mxn.lastFosterParentingLocation.parent) || - this.openElements.currentTmplContent || - this.openElements.current; - - const siblings = this.treeAdapter.getChildNodes(parent); - - const textNodeIdx = - hasFosterParent && mxn.lastFosterParentingLocation.beforeElement - ? siblings.indexOf(mxn.lastFosterParentingLocation.beforeElement) - 1 - : siblings.length - 1; - - const textNode = siblings[textNodeIdx]; - - //NOTE: if we have location assigned by another token, then just update end position - const tnLoc = this.treeAdapter.getNodeSourceCodeLocation(textNode); - - if (tnLoc) { - const { endLine, endCol, endOffset } = token.location; - this.treeAdapter.updateNodeSourceCodeLocation(textNode, { endLine, endCol, endOffset }); - } else { - this.treeAdapter.setNodeSourceCodeLocation(textNode, token.location); - } - } - }; - } +},{}],6:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isUndefinedCodePoint = exports.isControlCodePoint = exports.getSurrogatePairCodePoint = exports.isSurrogatePair = exports.isSurrogate = exports.SEQUENCES = exports.CODE_POINTS = exports.REPLACEMENT_CHARACTER = void 0; +const UNDEFINED_CODE_POINTS = new Set([ + 65534, 65535, 131070, 131071, 196606, 196607, 262142, 262143, 327678, 327679, 393214, + 393215, 458750, 458751, 524286, 524287, 589822, 589823, 655358, 655359, 720894, + 720895, 786430, 786431, 851966, 851967, 917502, 917503, 983038, 983039, 1048574, + 1048575, 1114110, 1114111, +]); +exports.REPLACEMENT_CHARACTER = '\uFFFD'; +var CODE_POINTS; +(function (CODE_POINTS) { + CODE_POINTS[CODE_POINTS["EOF"] = -1] = "EOF"; + CODE_POINTS[CODE_POINTS["NULL"] = 0] = "NULL"; + CODE_POINTS[CODE_POINTS["TABULATION"] = 9] = "TABULATION"; + CODE_POINTS[CODE_POINTS["CARRIAGE_RETURN"] = 13] = "CARRIAGE_RETURN"; + CODE_POINTS[CODE_POINTS["LINE_FEED"] = 10] = "LINE_FEED"; + CODE_POINTS[CODE_POINTS["FORM_FEED"] = 12] = "FORM_FEED"; + CODE_POINTS[CODE_POINTS["SPACE"] = 32] = "SPACE"; + CODE_POINTS[CODE_POINTS["EXCLAMATION_MARK"] = 33] = "EXCLAMATION_MARK"; + CODE_POINTS[CODE_POINTS["QUOTATION_MARK"] = 34] = "QUOTATION_MARK"; + CODE_POINTS[CODE_POINTS["NUMBER_SIGN"] = 35] = "NUMBER_SIGN"; + CODE_POINTS[CODE_POINTS["AMPERSAND"] = 38] = "AMPERSAND"; + CODE_POINTS[CODE_POINTS["APOSTROPHE"] = 39] = "APOSTROPHE"; + CODE_POINTS[CODE_POINTS["HYPHEN_MINUS"] = 45] = "HYPHEN_MINUS"; + CODE_POINTS[CODE_POINTS["SOLIDUS"] = 47] = "SOLIDUS"; + CODE_POINTS[CODE_POINTS["DIGIT_0"] = 48] = "DIGIT_0"; + CODE_POINTS[CODE_POINTS["DIGIT_9"] = 57] = "DIGIT_9"; + CODE_POINTS[CODE_POINTS["SEMICOLON"] = 59] = "SEMICOLON"; + CODE_POINTS[CODE_POINTS["LESS_THAN_SIGN"] = 60] = "LESS_THAN_SIGN"; + CODE_POINTS[CODE_POINTS["EQUALS_SIGN"] = 61] = "EQUALS_SIGN"; + CODE_POINTS[CODE_POINTS["GREATER_THAN_SIGN"] = 62] = "GREATER_THAN_SIGN"; + CODE_POINTS[CODE_POINTS["QUESTION_MARK"] = 63] = "QUESTION_MARK"; + CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_A"] = 65] = "LATIN_CAPITAL_A"; + CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_F"] = 70] = "LATIN_CAPITAL_F"; + CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_X"] = 88] = "LATIN_CAPITAL_X"; + CODE_POINTS[CODE_POINTS["LATIN_CAPITAL_Z"] = 90] = "LATIN_CAPITAL_Z"; + CODE_POINTS[CODE_POINTS["RIGHT_SQUARE_BRACKET"] = 93] = "RIGHT_SQUARE_BRACKET"; + CODE_POINTS[CODE_POINTS["GRAVE_ACCENT"] = 96] = "GRAVE_ACCENT"; + CODE_POINTS[CODE_POINTS["LATIN_SMALL_A"] = 97] = "LATIN_SMALL_A"; + CODE_POINTS[CODE_POINTS["LATIN_SMALL_F"] = 102] = "LATIN_SMALL_F"; + CODE_POINTS[CODE_POINTS["LATIN_SMALL_X"] = 120] = "LATIN_SMALL_X"; + CODE_POINTS[CODE_POINTS["LATIN_SMALL_Z"] = 122] = "LATIN_SMALL_Z"; + CODE_POINTS[CODE_POINTS["REPLACEMENT_CHARACTER"] = 65533] = "REPLACEMENT_CHARACTER"; +})(CODE_POINTS = exports.CODE_POINTS || (exports.CODE_POINTS = {})); +exports.SEQUENCES = { + DASH_DASH: '--', + CDATA_START: '[CDATA[', + DOCTYPE: 'doctype', + SCRIPT: 'script', + PUBLIC: 'public', + SYSTEM: 'system', +}; +//Surrogates +function isSurrogate(cp) { + return cp >= 55296 && cp <= 57343; } - -module.exports = LocationInfoParserMixin; - -},{"../../common/html":4,"../../tokenizer":19,"../../utils/mixin":24,"./open-element-stack-mixin":10,"./tokenizer-mixin":12}],12:[function(require,module,exports){ -'use strict'; - -const Mixin = require('../../utils/mixin'); -const Tokenizer = require('../../tokenizer'); -const PositionTrackingPreprocessorMixin = require('../position-tracking/preprocessor-mixin'); - -class LocationInfoTokenizerMixin extends Mixin { - constructor(tokenizer) { - super(tokenizer); - - this.tokenizer = tokenizer; - this.posTracker = Mixin.install(tokenizer.preprocessor, PositionTrackingPreprocessorMixin); - this.currentAttrLocation = null; - this.ctLoc = null; - } - - _getCurrentLocation() { - return { - startLine: this.posTracker.line, - startCol: this.posTracker.col, - startOffset: this.posTracker.offset, - endLine: -1, - endCol: -1, - endOffset: -1 - }; - } - - _attachCurrentAttrLocationInfo() { - this.currentAttrLocation.endLine = this.posTracker.line; - this.currentAttrLocation.endCol = this.posTracker.col; - this.currentAttrLocation.endOffset = this.posTracker.offset; - - const currentToken = this.tokenizer.currentToken; - const currentAttr = this.tokenizer.currentAttr; - - if (!currentToken.location.attrs) { - currentToken.location.attrs = Object.create(null); - } - - currentToken.location.attrs[currentAttr.name] = this.currentAttrLocation; - } - - _getOverriddenMethods(mxn, orig) { - const methods = { - _createStartTagToken() { - orig._createStartTagToken.call(this); - this.currentToken.location = mxn.ctLoc; - }, - - _createEndTagToken() { - orig._createEndTagToken.call(this); - this.currentToken.location = mxn.ctLoc; - }, - - _createCommentToken() { - orig._createCommentToken.call(this); - this.currentToken.location = mxn.ctLoc; - }, - - _createDoctypeToken(initialName) { - orig._createDoctypeToken.call(this, initialName); - this.currentToken.location = mxn.ctLoc; - }, - - _createCharacterToken(type, ch) { - orig._createCharacterToken.call(this, type, ch); - this.currentCharacterToken.location = mxn.ctLoc; - }, - - _createEOFToken() { - orig._createEOFToken.call(this); - this.currentToken.location = mxn._getCurrentLocation(); - }, - - _createAttr(attrNameFirstCh) { - orig._createAttr.call(this, attrNameFirstCh); - mxn.currentAttrLocation = mxn._getCurrentLocation(); - }, - - _leaveAttrName(toState) { - orig._leaveAttrName.call(this, toState); - mxn._attachCurrentAttrLocationInfo(); - }, - - _leaveAttrValue(toState) { - orig._leaveAttrValue.call(this, toState); - mxn._attachCurrentAttrLocationInfo(); - }, - - _emitCurrentToken() { - const ctLoc = this.currentToken.location; - - //NOTE: if we have pending character token make it's end location equal to the - //current token's start location. - if (this.currentCharacterToken) { - this.currentCharacterToken.location.endLine = ctLoc.startLine; - this.currentCharacterToken.location.endCol = ctLoc.startCol; - this.currentCharacterToken.location.endOffset = ctLoc.startOffset; - } - - if (this.currentToken.type === Tokenizer.EOF_TOKEN) { - ctLoc.endLine = ctLoc.startLine; - ctLoc.endCol = ctLoc.startCol; - ctLoc.endOffset = ctLoc.startOffset; - } else { - ctLoc.endLine = mxn.posTracker.line; - ctLoc.endCol = mxn.posTracker.col + 1; - ctLoc.endOffset = mxn.posTracker.offset + 1; - } - - orig._emitCurrentToken.call(this); - }, - - _emitCurrentCharacterToken() { - const ctLoc = this.currentCharacterToken && this.currentCharacterToken.location; - - //NOTE: if we have character token and it's location wasn't set in the _emitCurrentToken(), - //then set it's location at the current preprocessor position. - //We don't need to increment preprocessor position, since character token - //emission is always forced by the start of the next character token here. - //So, we already have advanced position. - if (ctLoc && ctLoc.endOffset === -1) { - ctLoc.endLine = mxn.posTracker.line; - ctLoc.endCol = mxn.posTracker.col; - ctLoc.endOffset = mxn.posTracker.offset; - } - - orig._emitCurrentCharacterToken.call(this); - } - }; - - //NOTE: patch initial states for each mode to obtain token start position - Object.keys(Tokenizer.MODE).forEach(modeName => { - const state = Tokenizer.MODE[modeName]; - - methods[state] = function(cp) { - mxn.ctLoc = mxn._getCurrentLocation(); - orig[state].call(this, cp); - }; - }); - - return methods; - } +exports.isSurrogate = isSurrogate; +function isSurrogatePair(cp) { + return cp >= 56320 && cp <= 57343; } - -module.exports = LocationInfoTokenizerMixin; - -},{"../../tokenizer":19,"../../utils/mixin":24,"../position-tracking/preprocessor-mixin":13}],13:[function(require,module,exports){ -'use strict'; - -const Mixin = require('../../utils/mixin'); - -class PositionTrackingPreprocessorMixin extends Mixin { - constructor(preprocessor) { - super(preprocessor); - - this.preprocessor = preprocessor; - this.isEol = false; - this.lineStartPos = 0; - this.droppedBufferSize = 0; - - this.offset = 0; - this.col = 0; - this.line = 1; - } - - _getOverriddenMethods(mxn, orig) { - return { - advance() { - const pos = this.pos + 1; - const ch = this.html[pos]; - - //NOTE: LF should be in the last column of the line - if (mxn.isEol) { - mxn.isEol = false; - mxn.line++; - mxn.lineStartPos = pos; - } - - if (ch === '\n' || (ch === '\r' && this.html[pos + 1] !== '\n')) { - mxn.isEol = true; - } - - mxn.col = pos - mxn.lineStartPos + 1; - mxn.offset = mxn.droppedBufferSize + pos; - - return orig.advance.call(this); - }, - - retreat() { - orig.retreat.call(this); - - mxn.isEol = false; - mxn.col = this.pos - mxn.lineStartPos + 1; - }, - - dropParsedChunk() { - const prevPos = this.pos; - - orig.dropParsedChunk.call(this); - - const reduction = prevPos - this.pos; - - mxn.lineStartPos -= reduction; - mxn.droppedBufferSize += reduction; - mxn.offset = mxn.droppedBufferSize + this.pos; - } - }; - } +exports.isSurrogatePair = isSurrogatePair; +function getSurrogatePairCodePoint(cp1, cp2) { + return (cp1 - 55296) * 1024 + 9216 + cp2; } - -module.exports = PositionTrackingPreprocessorMixin; - -},{"../../utils/mixin":24}],14:[function(require,module,exports){ -'use strict'; - -const Parser = require('./parser'); -const Serializer = require('./serializer'); - +exports.getSurrogatePairCodePoint = getSurrogatePairCodePoint; +//NOTE: excluding NULL and ASCII whitespace +function isControlCodePoint(cp) { + return ((cp !== 0x20 && cp !== 0x0a && cp !== 0x0d && cp !== 0x09 && cp !== 0x0c && cp >= 0x01 && cp <= 0x1f) || + (cp >= 0x7f && cp <= 0x9f)); +} +exports.isControlCodePoint = isControlCodePoint; +function isUndefinedCodePoint(cp) { + return (cp >= 64976 && cp <= 65007) || UNDEFINED_CODE_POINTS.has(cp); +} +exports.isUndefinedCodePoint = isUndefinedCodePoint; + +},{}],7:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseFragment = exports.parse = exports.TokenizerMode = exports.Tokenizer = exports.Token = exports.html = exports.foreignContent = exports.serializeOuter = exports.serialize = exports.Parser = exports.defaultTreeAdapter = void 0; +const index_js_1 = require("./parser/index.js"); +var default_js_1 = require("./tree-adapters/default.js"); +Object.defineProperty(exports, "defaultTreeAdapter", { enumerable: true, get: function () { return default_js_1.defaultTreeAdapter; } }); +var index_js_2 = require("./parser/index.js"); +Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return index_js_2.Parser; } }); +var index_js_3 = require("./serializer/index.js"); +Object.defineProperty(exports, "serialize", { enumerable: true, get: function () { return index_js_3.serialize; } }); +Object.defineProperty(exports, "serializeOuter", { enumerable: true, get: function () { return index_js_3.serializeOuter; } }); +/** @internal */ +exports.foreignContent = require("./common/foreign-content.js"); +/** @internal */ +exports.html = require("./common/html.js"); +/** @internal */ +exports.Token = require("./common/token.js"); +/** @internal */ +var index_js_4 = require("./tokenizer/index.js"); +Object.defineProperty(exports, "Tokenizer", { enumerable: true, get: function () { return index_js_4.Tokenizer; } }); +Object.defineProperty(exports, "TokenizerMode", { enumerable: true, get: function () { return index_js_4.TokenizerMode; } }); // Shorthands -exports.parse = function parse(html, options) { - const parser = new Parser(options); - - return parser.parse(html); -}; - -exports.parseFragment = function parseFragment(fragmentContext, html, options) { +/** + * Parses an HTML string. + * + * @param html Input HTML string. + * @param options Parsing options. + * @returns Document + * + * @example + * + * ```js + * const parse5 = require('parse5'); + * + * const document = parse5.parse('<!DOCTYPE html><html><head></head><body>Hi there!</body></html>'); + * + * console.log(document.childNodes[1].tagName); //> 'html' + *``` + */ +function parse(html, options) { + return index_js_1.Parser.parse(html, options); +} +exports.parse = parse; +function parseFragment(fragmentContext, html, options) { if (typeof fragmentContext === 'string') { options = html; html = fragmentContext; fragmentContext = null; } + const parser = index_js_1.Parser.getFragmentParser(fragmentContext, options); + parser.tokenizer.write(html, true); + return parser.getFragment(); +} +exports.parseFragment = parseFragment; - const parser = new Parser(options); - - return parser.parseFragment(html, fragmentContext); -}; - -exports.serialize = function(node, options) { - const serializer = new Serializer(node, options); - - return serializer.serialize(); -}; - -},{"./parser":16,"./serializer":18}],15:[function(require,module,exports){ -'use strict'; - +},{"./common/foreign-content.js":3,"./common/html.js":4,"./common/token.js":5,"./parser/index.js":9,"./serializer/index.js":11,"./tokenizer/index.js":12,"./tree-adapters/default.js":14}],8:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FormattingElementList = exports.EntryType = void 0; //Const const NOAH_ARK_CAPACITY = 3; - +var EntryType; +(function (EntryType) { + EntryType[EntryType["Marker"] = 0] = "Marker"; + EntryType[EntryType["Element"] = 1] = "Element"; +})(EntryType = exports.EntryType || (exports.EntryType = {})); +const MARKER = { type: EntryType.Marker }; //List of formatting elements class FormattingElementList { constructor(treeAdapter) { - this.length = 0; - this.entries = []; this.treeAdapter = treeAdapter; + this.entries = []; this.bookmark = null; } - //Noah Ark's condition //OPTIMIZATION: at first we try to find possible candidates for exclusion using //lightweight heuristics without thorough attributes check. - _getNoahArkConditionCandidates(newElement) { + _getNoahArkConditionCandidates(newElement, neAttrs) { const candidates = []; - - if (this.length >= NOAH_ARK_CAPACITY) { - const neAttrsLength = this.treeAdapter.getAttrList(newElement).length; - const neTagName = this.treeAdapter.getTagName(newElement); - const neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement); - - for (let i = this.length - 1; i >= 0; i--) { - const entry = this.entries[i]; - - if (entry.type === FormattingElementList.MARKER_ENTRY) { - break; - } - - const element = entry.element; + const neAttrsLength = neAttrs.length; + const neTagName = this.treeAdapter.getTagName(newElement); + const neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement); + for (let i = 0; i < this.entries.length; i++) { + const entry = this.entries[i]; + if (entry.type === EntryType.Marker) { + break; + } + const { element } = entry; + if (this.treeAdapter.getTagName(element) === neTagName && + this.treeAdapter.getNamespaceURI(element) === neNamespaceURI) { const elementAttrs = this.treeAdapter.getAttrList(element); - - const isCandidate = - this.treeAdapter.getTagName(element) === neTagName && - this.treeAdapter.getNamespaceURI(element) === neNamespaceURI && - elementAttrs.length === neAttrsLength; - - if (isCandidate) { + if (elementAttrs.length === neAttrsLength) { candidates.push({ idx: i, attrs: elementAttrs }); } } } - - return candidates.length < NOAH_ARK_CAPACITY ? [] : candidates; + return candidates; } - _ensureNoahArkCondition(newElement) { - const candidates = this._getNoahArkConditionCandidates(newElement); - let cLength = candidates.length; - - if (cLength) { - const neAttrs = this.treeAdapter.getAttrList(newElement); - const neAttrsLength = neAttrs.length; - const neAttrsMap = Object.create(null); - - //NOTE: build attrs map for the new element so we can perform fast lookups - for (let i = 0; i < neAttrsLength; i++) { - const neAttr = neAttrs[i]; - - neAttrsMap[neAttr.name] = neAttr.value; - } - - for (let i = 0; i < neAttrsLength; i++) { - for (let j = 0; j < cLength; j++) { - const cAttr = candidates[j].attrs[i]; - - if (neAttrsMap[cAttr.name] !== cAttr.value) { - candidates.splice(j, 1); - cLength--; - } - - if (candidates.length < NOAH_ARK_CAPACITY) { - return; - } + if (this.entries.length < NOAH_ARK_CAPACITY) + return; + const neAttrs = this.treeAdapter.getAttrList(newElement); + const candidates = this._getNoahArkConditionCandidates(newElement, neAttrs); + if (candidates.length < NOAH_ARK_CAPACITY) + return; + //NOTE: build attrs map for the new element, so we can perform fast lookups + const neAttrsMap = new Map(neAttrs.map((neAttr) => [neAttr.name, neAttr.value])); + let validCandidates = 0; + //NOTE: remove bottommost candidates, until Noah's Ark condition will not be met + for (let i = 0; i < candidates.length; i++) { + const candidate = candidates[i]; + // We know that `candidate.attrs.length === neAttrs.length` + if (candidate.attrs.every((cAttr) => neAttrsMap.get(cAttr.name) === cAttr.value)) { + validCandidates += 1; + if (validCandidates >= NOAH_ARK_CAPACITY) { + this.entries.splice(candidate.idx, 1); } } - - //NOTE: remove bottommost candidates until Noah's Ark condition will not be met - for (let i = cLength - 1; i >= NOAH_ARK_CAPACITY - 1; i--) { - this.entries.splice(candidates[i].idx, 1); - this.length--; - } } } - //Mutations insertMarker() { - this.entries.push({ type: FormattingElementList.MARKER_ENTRY }); - this.length++; + this.entries.unshift(MARKER); } - pushElement(element, token) { this._ensureNoahArkCondition(element); - - this.entries.push({ - type: FormattingElementList.ELEMENT_ENTRY, - element: element, - token: token + this.entries.unshift({ + type: EntryType.Element, + element, + token, }); - - this.length++; } - insertElementAfterBookmark(element, token) { - let bookmarkIdx = this.length - 1; - - for (; bookmarkIdx >= 0; bookmarkIdx--) { - if (this.entries[bookmarkIdx] === this.bookmark) { - break; - } - } - - this.entries.splice(bookmarkIdx + 1, 0, { - type: FormattingElementList.ELEMENT_ENTRY, - element: element, - token: token + const bookmarkIdx = this.entries.indexOf(this.bookmark); + this.entries.splice(bookmarkIdx, 0, { + type: EntryType.Element, + element, + token, }); - - this.length++; } - removeEntry(entry) { - for (let i = this.length - 1; i >= 0; i--) { - if (this.entries[i] === entry) { - this.entries.splice(i, 1); - this.length--; - break; - } + const entryIndex = this.entries.indexOf(entry); + if (entryIndex >= 0) { + this.entries.splice(entryIndex, 1); } } - clearToLastMarker() { - while (this.length) { - const entry = this.entries.pop(); - - this.length--; - - if (entry.type === FormattingElementList.MARKER_ENTRY) { - break; - } + const markerIdx = this.entries.indexOf(MARKER); + if (markerIdx >= 0) { + this.entries.splice(0, markerIdx + 1); + } + else { + this.entries.length = 0; } } - //Search getElementEntryInScopeWithTagName(tagName) { - for (let i = this.length - 1; i >= 0; i--) { - const entry = this.entries[i]; - - if (entry.type === FormattingElementList.MARKER_ENTRY) { - return null; - } - - if (this.treeAdapter.getTagName(entry.element) === tagName) { - return entry; - } - } - - return null; + const entry = this.entries.find((entry) => entry.type === EntryType.Marker || this.treeAdapter.getTagName(entry.element) === tagName); + return entry && entry.type === EntryType.Element ? entry : null; } - getElementEntry(element) { - for (let i = this.length - 1; i >= 0; i--) { - const entry = this.entries[i]; - - if (entry.type === FormattingElementList.ELEMENT_ENTRY && entry.element === element) { - return entry; - } - } - - return null; - } -} - -//Entry types -FormattingElementList.MARKER_ENTRY = 'MARKER_ENTRY'; -FormattingElementList.ELEMENT_ENTRY = 'ELEMENT_ENTRY'; - -module.exports = FormattingElementList; - -},{}],16:[function(require,module,exports){ -'use strict'; - -const Tokenizer = require('../tokenizer'); -const OpenElementStack = require('./open-element-stack'); -const FormattingElementList = require('./formatting-element-list'); -const LocationInfoParserMixin = require('../extensions/location-info/parser-mixin'); -const ErrorReportingParserMixin = require('../extensions/error-reporting/parser-mixin'); -const Mixin = require('../utils/mixin'); -const defaultTreeAdapter = require('../tree-adapters/default'); -const mergeOptions = require('../utils/merge-options'); -const doctype = require('../common/doctype'); -const foreignContent = require('../common/foreign-content'); -const ERR = require('../common/error-codes'); -const unicode = require('../common/unicode'); -const HTML = require('../common/html'); - -//Aliases -const $ = HTML.TAG_NAMES; -const NS = HTML.NAMESPACES; -const ATTRS = HTML.ATTRS; - -const DEFAULT_OPTIONS = { - scriptingEnabled: true, - sourceCodeLocationInfo: false, - onParseError: null, - treeAdapter: defaultTreeAdapter -}; - + return this.entries.find((entry) => entry.type === EntryType.Element && entry.element === element); + } +} +exports.FormattingElementList = FormattingElementList; + +},{}],9:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Parser = void 0; +const index_js_1 = require("../tokenizer/index.js"); +const open_element_stack_js_1 = require("./open-element-stack.js"); +const formatting_element_list_js_1 = require("./formatting-element-list.js"); +const default_js_1 = require("../tree-adapters/default.js"); +const doctype = require("../common/doctype.js"); +const foreignContent = require("../common/foreign-content.js"); +const error_codes_js_1 = require("../common/error-codes.js"); +const unicode = require("../common/unicode.js"); +const html_js_1 = require("../common/html.js"); +const token_js_1 = require("../common/token.js"); //Misc constants const HIDDEN_INPUT_TYPE = 'hidden'; - //Adoption agency loops iteration count const AA_OUTER_LOOP_ITER = 8; const AA_INNER_LOOP_ITER = 3; - //Insertion modes -const INITIAL_MODE = 'INITIAL_MODE'; -const BEFORE_HTML_MODE = 'BEFORE_HTML_MODE'; -const BEFORE_HEAD_MODE = 'BEFORE_HEAD_MODE'; -const IN_HEAD_MODE = 'IN_HEAD_MODE'; -const IN_HEAD_NO_SCRIPT_MODE = 'IN_HEAD_NO_SCRIPT_MODE'; -const AFTER_HEAD_MODE = 'AFTER_HEAD_MODE'; -const IN_BODY_MODE = 'IN_BODY_MODE'; -const TEXT_MODE = 'TEXT_MODE'; -const IN_TABLE_MODE = 'IN_TABLE_MODE'; -const IN_TABLE_TEXT_MODE = 'IN_TABLE_TEXT_MODE'; -const IN_CAPTION_MODE = 'IN_CAPTION_MODE'; -const IN_COLUMN_GROUP_MODE = 'IN_COLUMN_GROUP_MODE'; -const IN_TABLE_BODY_MODE = 'IN_TABLE_BODY_MODE'; -const IN_ROW_MODE = 'IN_ROW_MODE'; -const IN_CELL_MODE = 'IN_CELL_MODE'; -const IN_SELECT_MODE = 'IN_SELECT_MODE'; -const IN_SELECT_IN_TABLE_MODE = 'IN_SELECT_IN_TABLE_MODE'; -const IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE'; -const AFTER_BODY_MODE = 'AFTER_BODY_MODE'; -const IN_FRAMESET_MODE = 'IN_FRAMESET_MODE'; -const AFTER_FRAMESET_MODE = 'AFTER_FRAMESET_MODE'; -const AFTER_AFTER_BODY_MODE = 'AFTER_AFTER_BODY_MODE'; -const AFTER_AFTER_FRAMESET_MODE = 'AFTER_AFTER_FRAMESET_MODE'; - -//Insertion mode reset map -const INSERTION_MODE_RESET_MAP = { - [$.TR]: IN_ROW_MODE, - [$.TBODY]: IN_TABLE_BODY_MODE, - [$.THEAD]: IN_TABLE_BODY_MODE, - [$.TFOOT]: IN_TABLE_BODY_MODE, - [$.CAPTION]: IN_CAPTION_MODE, - [$.COLGROUP]: IN_COLUMN_GROUP_MODE, - [$.TABLE]: IN_TABLE_MODE, - [$.BODY]: IN_BODY_MODE, - [$.FRAMESET]: IN_FRAMESET_MODE -}; - -//Template insertion mode switch map -const TEMPLATE_INSERTION_MODE_SWITCH_MAP = { - [$.CAPTION]: IN_TABLE_MODE, - [$.COLGROUP]: IN_TABLE_MODE, - [$.TBODY]: IN_TABLE_MODE, - [$.TFOOT]: IN_TABLE_MODE, - [$.THEAD]: IN_TABLE_MODE, - [$.COL]: IN_COLUMN_GROUP_MODE, - [$.TR]: IN_TABLE_BODY_MODE, - [$.TD]: IN_ROW_MODE, - [$.TH]: IN_ROW_MODE +var InsertionMode; +(function (InsertionMode) { + InsertionMode[InsertionMode["INITIAL"] = 0] = "INITIAL"; + InsertionMode[InsertionMode["BEFORE_HTML"] = 1] = "BEFORE_HTML"; + InsertionMode[InsertionMode["BEFORE_HEAD"] = 2] = "BEFORE_HEAD"; + InsertionMode[InsertionMode["IN_HEAD"] = 3] = "IN_HEAD"; + InsertionMode[InsertionMode["IN_HEAD_NO_SCRIPT"] = 4] = "IN_HEAD_NO_SCRIPT"; + InsertionMode[InsertionMode["AFTER_HEAD"] = 5] = "AFTER_HEAD"; + InsertionMode[InsertionMode["IN_BODY"] = 6] = "IN_BODY"; + InsertionMode[InsertionMode["TEXT"] = 7] = "TEXT"; + InsertionMode[InsertionMode["IN_TABLE"] = 8] = "IN_TABLE"; + InsertionMode[InsertionMode["IN_TABLE_TEXT"] = 9] = "IN_TABLE_TEXT"; + InsertionMode[InsertionMode["IN_CAPTION"] = 10] = "IN_CAPTION"; + InsertionMode[InsertionMode["IN_COLUMN_GROUP"] = 11] = "IN_COLUMN_GROUP"; + InsertionMode[InsertionMode["IN_TABLE_BODY"] = 12] = "IN_TABLE_BODY"; + InsertionMode[InsertionMode["IN_ROW"] = 13] = "IN_ROW"; + InsertionMode[InsertionMode["IN_CELL"] = 14] = "IN_CELL"; + InsertionMode[InsertionMode["IN_SELECT"] = 15] = "IN_SELECT"; + InsertionMode[InsertionMode["IN_SELECT_IN_TABLE"] = 16] = "IN_SELECT_IN_TABLE"; + InsertionMode[InsertionMode["IN_TEMPLATE"] = 17] = "IN_TEMPLATE"; + InsertionMode[InsertionMode["AFTER_BODY"] = 18] = "AFTER_BODY"; + InsertionMode[InsertionMode["IN_FRAMESET"] = 19] = "IN_FRAMESET"; + InsertionMode[InsertionMode["AFTER_FRAMESET"] = 20] = "AFTER_FRAMESET"; + InsertionMode[InsertionMode["AFTER_AFTER_BODY"] = 21] = "AFTER_AFTER_BODY"; + InsertionMode[InsertionMode["AFTER_AFTER_FRAMESET"] = 22] = "AFTER_AFTER_FRAMESET"; +})(InsertionMode || (InsertionMode = {})); +const BASE_LOC = { + startLine: -1, + startCol: -1, + startOffset: -1, + endLine: -1, + endCol: -1, + endOffset: -1, }; - -//Token handlers map for insertion modes -const TOKEN_HANDLERS = { - [INITIAL_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: tokenInInitialMode, - [Tokenizer.NULL_CHARACTER_TOKEN]: tokenInInitialMode, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: doctypeInInitialMode, - [Tokenizer.START_TAG_TOKEN]: tokenInInitialMode, - [Tokenizer.END_TAG_TOKEN]: tokenInInitialMode, - [Tokenizer.EOF_TOKEN]: tokenInInitialMode - }, - [BEFORE_HTML_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: tokenBeforeHtml, - [Tokenizer.NULL_CHARACTER_TOKEN]: tokenBeforeHtml, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagBeforeHtml, - [Tokenizer.END_TAG_TOKEN]: endTagBeforeHtml, - [Tokenizer.EOF_TOKEN]: tokenBeforeHtml - }, - [BEFORE_HEAD_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: tokenBeforeHead, - [Tokenizer.NULL_CHARACTER_TOKEN]: tokenBeforeHead, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: misplacedDoctype, - [Tokenizer.START_TAG_TOKEN]: startTagBeforeHead, - [Tokenizer.END_TAG_TOKEN]: endTagBeforeHead, - [Tokenizer.EOF_TOKEN]: tokenBeforeHead - }, - [IN_HEAD_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: tokenInHead, - [Tokenizer.NULL_CHARACTER_TOKEN]: tokenInHead, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: misplacedDoctype, - [Tokenizer.START_TAG_TOKEN]: startTagInHead, - [Tokenizer.END_TAG_TOKEN]: endTagInHead, - [Tokenizer.EOF_TOKEN]: tokenInHead - }, - [IN_HEAD_NO_SCRIPT_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: tokenInHeadNoScript, - [Tokenizer.NULL_CHARACTER_TOKEN]: tokenInHeadNoScript, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: misplacedDoctype, - [Tokenizer.START_TAG_TOKEN]: startTagInHeadNoScript, - [Tokenizer.END_TAG_TOKEN]: endTagInHeadNoScript, - [Tokenizer.EOF_TOKEN]: tokenInHeadNoScript - }, - [AFTER_HEAD_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: tokenAfterHead, - [Tokenizer.NULL_CHARACTER_TOKEN]: tokenAfterHead, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: misplacedDoctype, - [Tokenizer.START_TAG_TOKEN]: startTagAfterHead, - [Tokenizer.END_TAG_TOKEN]: endTagAfterHead, - [Tokenizer.EOF_TOKEN]: tokenAfterHead - }, - [IN_BODY_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: characterInBody, - [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagInBody, - [Tokenizer.END_TAG_TOKEN]: endTagInBody, - [Tokenizer.EOF_TOKEN]: eofInBody - }, - [TEXT_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.NULL_CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.COMMENT_TOKEN]: ignoreToken, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: ignoreToken, - [Tokenizer.END_TAG_TOKEN]: endTagInText, - [Tokenizer.EOF_TOKEN]: eofInText - }, - [IN_TABLE_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: characterInTable, - [Tokenizer.NULL_CHARACTER_TOKEN]: characterInTable, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: characterInTable, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagInTable, - [Tokenizer.END_TAG_TOKEN]: endTagInTable, - [Tokenizer.EOF_TOKEN]: eofInBody - }, - [IN_TABLE_TEXT_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: characterInTableText, - [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInTableText, - [Tokenizer.COMMENT_TOKEN]: tokenInTableText, - [Tokenizer.DOCTYPE_TOKEN]: tokenInTableText, - [Tokenizer.START_TAG_TOKEN]: tokenInTableText, - [Tokenizer.END_TAG_TOKEN]: tokenInTableText, - [Tokenizer.EOF_TOKEN]: tokenInTableText - }, - [IN_CAPTION_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: characterInBody, - [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagInCaption, - [Tokenizer.END_TAG_TOKEN]: endTagInCaption, - [Tokenizer.EOF_TOKEN]: eofInBody - }, - [IN_COLUMN_GROUP_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: tokenInColumnGroup, - [Tokenizer.NULL_CHARACTER_TOKEN]: tokenInColumnGroup, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagInColumnGroup, - [Tokenizer.END_TAG_TOKEN]: endTagInColumnGroup, - [Tokenizer.EOF_TOKEN]: eofInBody - }, - [IN_TABLE_BODY_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: characterInTable, - [Tokenizer.NULL_CHARACTER_TOKEN]: characterInTable, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: characterInTable, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagInTableBody, - [Tokenizer.END_TAG_TOKEN]: endTagInTableBody, - [Tokenizer.EOF_TOKEN]: eofInBody - }, - [IN_ROW_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: characterInTable, - [Tokenizer.NULL_CHARACTER_TOKEN]: characterInTable, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: characterInTable, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagInRow, - [Tokenizer.END_TAG_TOKEN]: endTagInRow, - [Tokenizer.EOF_TOKEN]: eofInBody - }, - [IN_CELL_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: characterInBody, - [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagInCell, - [Tokenizer.END_TAG_TOKEN]: endTagInCell, - [Tokenizer.EOF_TOKEN]: eofInBody - }, - [IN_SELECT_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagInSelect, - [Tokenizer.END_TAG_TOKEN]: endTagInSelect, - [Tokenizer.EOF_TOKEN]: eofInBody - }, - [IN_SELECT_IN_TABLE_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagInSelectInTable, - [Tokenizer.END_TAG_TOKEN]: endTagInSelectInTable, - [Tokenizer.EOF_TOKEN]: eofInBody - }, - [IN_TEMPLATE_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: characterInBody, - [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagInTemplate, - [Tokenizer.END_TAG_TOKEN]: endTagInTemplate, - [Tokenizer.EOF_TOKEN]: eofInTemplate - }, - [AFTER_BODY_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: tokenAfterBody, - [Tokenizer.NULL_CHARACTER_TOKEN]: tokenAfterBody, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, - [Tokenizer.COMMENT_TOKEN]: appendCommentToRootHtmlElement, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagAfterBody, - [Tokenizer.END_TAG_TOKEN]: endTagAfterBody, - [Tokenizer.EOF_TOKEN]: stopParsing - }, - [IN_FRAMESET_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagInFrameset, - [Tokenizer.END_TAG_TOKEN]: endTagInFrameset, - [Tokenizer.EOF_TOKEN]: stopParsing - }, - [AFTER_FRAMESET_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: insertCharacters, - [Tokenizer.COMMENT_TOKEN]: appendComment, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagAfterFrameset, - [Tokenizer.END_TAG_TOKEN]: endTagAfterFrameset, - [Tokenizer.EOF_TOKEN]: stopParsing - }, - [AFTER_AFTER_BODY_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: tokenAfterAfterBody, - [Tokenizer.NULL_CHARACTER_TOKEN]: tokenAfterAfterBody, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, - [Tokenizer.COMMENT_TOKEN]: appendCommentToDocument, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagAfterAfterBody, - [Tokenizer.END_TAG_TOKEN]: tokenAfterAfterBody, - [Tokenizer.EOF_TOKEN]: stopParsing - }, - [AFTER_AFTER_FRAMESET_MODE]: { - [Tokenizer.CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.NULL_CHARACTER_TOKEN]: ignoreToken, - [Tokenizer.WHITESPACE_CHARACTER_TOKEN]: whitespaceCharacterInBody, - [Tokenizer.COMMENT_TOKEN]: appendCommentToDocument, - [Tokenizer.DOCTYPE_TOKEN]: ignoreToken, - [Tokenizer.START_TAG_TOKEN]: startTagAfterAfterFrameset, - [Tokenizer.END_TAG_TOKEN]: ignoreToken, - [Tokenizer.EOF_TOKEN]: stopParsing - } +const TABLE_STRUCTURE_TAGS = new Set([html_js_1.TAG_ID.TABLE, html_js_1.TAG_ID.TBODY, html_js_1.TAG_ID.TFOOT, html_js_1.TAG_ID.THEAD, html_js_1.TAG_ID.TR]); +const defaultParserOptions = { + scriptingEnabled: true, + sourceCodeLocationInfo: false, + treeAdapter: default_js_1.defaultTreeAdapter, + onParseError: null, }; - //Parser class Parser { - constructor(options) { - this.options = mergeOptions(DEFAULT_OPTIONS, options); - - this.treeAdapter = this.options.treeAdapter; - this.pendingScript = null; - - if (this.options.sourceCodeLocationInfo) { - Mixin.install(this, LocationInfoParserMixin); - } - - if (this.options.onParseError) { - Mixin.install(this, ErrorReportingParserMixin, { onParseError: this.options.onParseError }); - } - } - - // API - parse(html) { - const document = this.treeAdapter.createDocument(); - - this._bootstrap(document, null); - this.tokenizer.write(html, true); - this._runParsingLoop(null); - - return document; - } - - parseFragment(html, fragmentContext) { - //NOTE: use <template> element as a fragment context if context element was not provided, - //so we will parse in "forgiving" manner - if (!fragmentContext) { - fragmentContext = this.treeAdapter.createElement($.TEMPLATE, NS.HTML, []); - } - - //NOTE: create fake element which will be used as 'document' for fragment parsing. - //This is important for jsdom there 'document' can't be recreated, therefore - //fragment parsing causes messing of the main `document`. - const documentMock = this.treeAdapter.createElement('documentmock', NS.HTML, []); - - this._bootstrap(documentMock, fragmentContext); - - if (this.treeAdapter.getTagName(fragmentContext) === $.TEMPLATE) { - this._pushTmplInsertionMode(IN_TEMPLATE_MODE); - } - - this._initTokenizerForFragmentParsing(); - this._insertFakeRootElement(); - this._resetInsertionMode(); - this._findFormInFragmentContext(); - this.tokenizer.write(html, true); - this._runParsingLoop(null); - - const rootElement = this.treeAdapter.getFirstChild(documentMock); - const fragment = this.treeAdapter.createDocumentFragment(); - - this._adoptNodes(rootElement, fragment); - - return fragment; - } - - //Bootstrap parser - _bootstrap(document, fragmentContext) { - this.tokenizer = new Tokenizer(this.options); - - this.stopped = false; - - this.insertionMode = INITIAL_MODE; - this.originalInsertionMode = ''; - - this.document = document; + constructor(options, document, fragmentContext = null, scriptHandler = null) { this.fragmentContext = fragmentContext; - + this.scriptHandler = scriptHandler; + this.currentToken = null; + this.stopped = false; + this.insertionMode = InsertionMode.INITIAL; + this.originalInsertionMode = InsertionMode.INITIAL; this.headElement = null; this.formElement = null; - - this.openElements = new OpenElementStack(this.document, this.treeAdapter); - this.activeFormattingElements = new FormattingElementList(this.treeAdapter); - + /** Indicates that the current node is not an element in the HTML namespace */ + this.currentNotInHTML = false; + /** + * The template insertion mode stack is maintained from the left. + * Ie. the topmost element will always have index 0. + */ this.tmplInsertionModeStack = []; - this.tmplInsertionModeStackTop = -1; - this.currentTmplInsertionMode = null; - this.pendingCharacterTokens = []; this.hasNonWhitespacePendingCharacterToken = false; - this.framesetOk = true; this.skipNextNewLine = false; this.fosterParentingEnabled = false; + this.options = Object.assign(Object.assign({}, defaultParserOptions), options); + this.treeAdapter = this.options.treeAdapter; + this.onParseError = this.options.onParseError; + // Always enable location info if we report parse errors. + if (this.onParseError) { + this.options.sourceCodeLocationInfo = true; + } + this.document = document !== null && document !== void 0 ? document : this.treeAdapter.createDocument(); + this.tokenizer = new index_js_1.Tokenizer(this.options, this); + this.activeFormattingElements = new formatting_element_list_js_1.FormattingElementList(this.treeAdapter); + this.fragmentContextID = fragmentContext ? (0, html_js_1.getTagID)(this.treeAdapter.getTagName(fragmentContext)) : html_js_1.TAG_ID.UNKNOWN; + this._setContextModes(fragmentContext !== null && fragmentContext !== void 0 ? fragmentContext : this.document, this.fragmentContextID); + this.openElements = new open_element_stack_js_1.OpenElementStack(this.document, this.treeAdapter, this); + } + // API + static parse(html, options) { + const parser = new this(options); + parser.tokenizer.write(html, true); + return parser.document; + } + static getFragmentParser(fragmentContext, options) { + const opts = Object.assign(Object.assign({}, defaultParserOptions), options); + //NOTE: use a <template> element as the fragment context if no context element was provided, + //so we will parse in a "forgiving" manner + fragmentContext !== null && fragmentContext !== void 0 ? fragmentContext : (fragmentContext = opts.treeAdapter.createElement(html_js_1.TAG_NAMES.TEMPLATE, html_js_1.NS.HTML, [])); + //NOTE: create a fake element which will be used as the `document` for fragment parsing. + //This is important for jsdom, where a new `document` cannot be created. This led to + //fragment parsing messing with the main `document`. + const documentMock = opts.treeAdapter.createElement('documentmock', html_js_1.NS.HTML, []); + const parser = new this(opts, documentMock, fragmentContext); + if (parser.fragmentContextID === html_js_1.TAG_ID.TEMPLATE) { + parser.tmplInsertionModeStack.unshift(InsertionMode.IN_TEMPLATE); + } + parser._initTokenizerForFragmentParsing(); + parser._insertFakeRootElement(); + parser._resetInsertionMode(); + parser._findFormInFragmentContext(); + return parser; + } + getFragment() { + const rootElement = this.treeAdapter.getFirstChild(this.document); + const fragment = this.treeAdapter.createDocumentFragment(); + this._adoptNodes(rootElement, fragment); + return fragment; } - //Errors - _err() { - // NOTE: err reporting is noop by default. Enabled by mixin. + _err(token, code, beforeToken) { + var _a; + if (!this.onParseError) + return; + const loc = (_a = token.location) !== null && _a !== void 0 ? _a : BASE_LOC; + const err = { + code, + startLine: loc.startLine, + startCol: loc.startCol, + startOffset: loc.startOffset, + endLine: beforeToken ? loc.startLine : loc.endLine, + endCol: beforeToken ? loc.startCol : loc.endCol, + endOffset: beforeToken ? loc.startOffset : loc.endOffset, + }; + this.onParseError(err); } - - //Parsing loop - _runParsingLoop(scriptHandler) { - while (!this.stopped) { - this._setupTokenizerCDATAMode(); - - const token = this.tokenizer.getNextToken(); - - if (token.type === Tokenizer.HIBERNATION_TOKEN) { - break; - } - - if (this.skipNextNewLine) { - this.skipNextNewLine = false; - - if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\n') { - if (token.chars.length === 1) { - continue; - } - - token.chars = token.chars.substr(1); - } + //Stack events + onItemPush(node, tid, isTop) { + var _a, _b; + (_b = (_a = this.treeAdapter).onItemPush) === null || _b === void 0 ? void 0 : _b.call(_a, node); + if (isTop && this.openElements.stackTop > 0) + this._setContextModes(node, tid); + } + onItemPop(node, isTop) { + var _a, _b; + if (this.options.sourceCodeLocationInfo) { + this._setEndLocation(node, this.currentToken); + } + (_b = (_a = this.treeAdapter).onItemPop) === null || _b === void 0 ? void 0 : _b.call(_a, node, this.openElements.current); + if (isTop) { + let current; + let currentTagId; + if (this.openElements.stackTop === 0 && this.fragmentContext) { + current = this.fragmentContext; + currentTagId = this.fragmentContextID; } - - this._processInputToken(token); - - if (scriptHandler && this.pendingScript) { - break; + else { + ({ current, currentTagId } = this.openElements); } + this._setContextModes(current, currentTagId); } } - - runParsingLoopForCurrentChunk(writeCallback, scriptHandler) { - this._runParsingLoop(scriptHandler); - - if (scriptHandler && this.pendingScript) { - const script = this.pendingScript; - - this.pendingScript = null; - - scriptHandler(script); - - return; - } - - if (writeCallback) { - writeCallback(); - } - } - - //Text parsing - _setupTokenizerCDATAMode() { - const current = this._getAdjustedCurrentElement(); - - this.tokenizer.allowCDATA = - current && - current !== this.document && - this.treeAdapter.getNamespaceURI(current) !== NS.HTML && - !this._isIntegrationPoint(current); + _setContextModes(current, tid) { + const isHTML = current === this.document || this.treeAdapter.getNamespaceURI(current) === html_js_1.NS.HTML; + this.currentNotInHTML = !isHTML; + this.tokenizer.inForeignNode = !isHTML && !this._isIntegrationPoint(tid, current); } - _switchToTextParsing(currentToken, nextTokenizerState) { - this._insertElement(currentToken, NS.HTML); + this._insertElement(currentToken, html_js_1.NS.HTML); this.tokenizer.state = nextTokenizerState; this.originalInsertionMode = this.insertionMode; - this.insertionMode = TEXT_MODE; + this.insertionMode = InsertionMode.TEXT; } - switchToPlaintextParsing() { - this.insertionMode = TEXT_MODE; - this.originalInsertionMode = IN_BODY_MODE; - this.tokenizer.state = Tokenizer.MODE.PLAINTEXT; + this.insertionMode = InsertionMode.TEXT; + this.originalInsertionMode = InsertionMode.IN_BODY; + this.tokenizer.state = index_js_1.TokenizerMode.PLAINTEXT; } - //Fragment parsing _getAdjustedCurrentElement() { return this.openElements.stackTop === 0 && this.fragmentContext ? this.fragmentContext : this.openElements.current; } - _findFormInFragmentContext() { let node = this.fragmentContext; - - do { - if (this.treeAdapter.getTagName(node) === $.FORM) { + while (node) { + if (this.treeAdapter.getTagName(node) === html_js_1.TAG_NAMES.FORM) { this.formElement = node; break; } - node = this.treeAdapter.getParentNode(node); - } while (node); + } } - _initTokenizerForFragmentParsing() { - if (this.treeAdapter.getNamespaceURI(this.fragmentContext) === NS.HTML) { - const tn = this.treeAdapter.getTagName(this.fragmentContext); - - if (tn === $.TITLE || tn === $.TEXTAREA) { - this.tokenizer.state = Tokenizer.MODE.RCDATA; - } else if ( - tn === $.STYLE || - tn === $.XMP || - tn === $.IFRAME || - tn === $.NOEMBED || - tn === $.NOFRAMES || - tn === $.NOSCRIPT - ) { - this.tokenizer.state = Tokenizer.MODE.RAWTEXT; - } else if (tn === $.SCRIPT) { - this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA; - } else if (tn === $.PLAINTEXT) { - this.tokenizer.state = Tokenizer.MODE.PLAINTEXT; + if (!this.fragmentContext || this.treeAdapter.getNamespaceURI(this.fragmentContext) !== html_js_1.NS.HTML) { + return; + } + switch (this.fragmentContextID) { + case html_js_1.TAG_ID.TITLE: + case html_js_1.TAG_ID.TEXTAREA: { + this.tokenizer.state = index_js_1.TokenizerMode.RCDATA; + break; + } + case html_js_1.TAG_ID.STYLE: + case html_js_1.TAG_ID.XMP: + case html_js_1.TAG_ID.IFRAME: + case html_js_1.TAG_ID.NOEMBED: + case html_js_1.TAG_ID.NOFRAMES: + case html_js_1.TAG_ID.NOSCRIPT: { + this.tokenizer.state = index_js_1.TokenizerMode.RAWTEXT; + break; + } + case html_js_1.TAG_ID.SCRIPT: { + this.tokenizer.state = index_js_1.TokenizerMode.SCRIPT_DATA; + break; + } + case html_js_1.TAG_ID.PLAINTEXT: { + this.tokenizer.state = index_js_1.TokenizerMode.PLAINTEXT; + break; } + default: + // Do nothing } } - //Tree mutation _setDocumentType(token) { const name = token.name || ''; const publicId = token.publicId || ''; const systemId = token.systemId || ''; - this.treeAdapter.setDocumentType(this.document, name, publicId, systemId); + if (token.location) { + const documentChildren = this.treeAdapter.getChildNodes(this.document); + const docTypeNode = documentChildren.find((node) => this.treeAdapter.isDocumentTypeNode(node)); + if (docTypeNode) { + this.treeAdapter.setNodeSourceCodeLocation(docTypeNode, token.location); + } + } } - - _attachElementToTree(element) { + _attachElementToTree(element, location) { + if (this.options.sourceCodeLocationInfo) { + const loc = location && Object.assign(Object.assign({}, location), { startTag: location }); + this.treeAdapter.setNodeSourceCodeLocation(element, loc); + } if (this._shouldFosterParentOnInsertion()) { this._fosterParentElement(element); - } else { - const parent = this.openElements.currentTmplContent || this.openElements.current; - + } + else { + const parent = this.openElements.currentTmplContentOrNode; this.treeAdapter.appendChild(parent, element); } } - _appendElement(token, namespaceURI) { const element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs); - - this._attachElementToTree(element); + this._attachElementToTree(element, token.location); } - _insertElement(token, namespaceURI) { const element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs); - - this._attachElementToTree(element); - this.openElements.push(element); + this._attachElementToTree(element, token.location); + this.openElements.push(element, token.tagID); } - - _insertFakeElement(tagName) { - const element = this.treeAdapter.createElement(tagName, NS.HTML, []); - - this._attachElementToTree(element); - this.openElements.push(element); + _insertFakeElement(tagName, tagID) { + const element = this.treeAdapter.createElement(tagName, html_js_1.NS.HTML, []); + this._attachElementToTree(element, null); + this.openElements.push(element, tagID); } - _insertTemplate(token) { - const tmpl = this.treeAdapter.createElement(token.tagName, NS.HTML, token.attrs); + const tmpl = this.treeAdapter.createElement(token.tagName, html_js_1.NS.HTML, token.attrs); const content = this.treeAdapter.createDocumentFragment(); - this.treeAdapter.setTemplateContent(tmpl, content); - this._attachElementToTree(tmpl); - this.openElements.push(tmpl); + this._attachElementToTree(tmpl, token.location); + this.openElements.push(tmpl, token.tagID); + if (this.options.sourceCodeLocationInfo) + this.treeAdapter.setNodeSourceCodeLocation(content, null); } - _insertFakeRootElement() { - const element = this.treeAdapter.createElement($.HTML, NS.HTML, []); - + const element = this.treeAdapter.createElement(html_js_1.TAG_NAMES.HTML, html_js_1.NS.HTML, []); + if (this.options.sourceCodeLocationInfo) + this.treeAdapter.setNodeSourceCodeLocation(element, null); this.treeAdapter.appendChild(this.openElements.current, element); - this.openElements.push(element); + this.openElements.push(element, html_js_1.TAG_ID.HTML); } - _appendCommentNode(token, parent) { const commentNode = this.treeAdapter.createCommentNode(token.data); - this.treeAdapter.appendChild(parent, commentNode); + if (this.options.sourceCodeLocationInfo) { + this.treeAdapter.setNodeSourceCodeLocation(commentNode, token.location); + } } - _insertCharacters(token) { + let parent; + let beforeElement; if (this._shouldFosterParentOnInsertion()) { - this._fosterParentText(token.chars); - } else { - const parent = this.openElements.currentTmplContent || this.openElements.current; - + ({ parent, beforeElement } = this._findFosterParentingLocation()); + if (beforeElement) { + this.treeAdapter.insertTextBefore(parent, token.chars, beforeElement); + } + else { + this.treeAdapter.insertText(parent, token.chars); + } + } + else { + parent = this.openElements.currentTmplContentOrNode; this.treeAdapter.insertText(parent, token.chars); } + if (!token.location) + return; + const siblings = this.treeAdapter.getChildNodes(parent); + const textNodeIdx = beforeElement ? siblings.lastIndexOf(beforeElement) : siblings.length; + const textNode = siblings[textNodeIdx - 1]; + //NOTE: if we have a location assigned by another token, then just update the end position + const tnLoc = this.treeAdapter.getNodeSourceCodeLocation(textNode); + if (tnLoc) { + const { endLine, endCol, endOffset } = token.location; + this.treeAdapter.updateNodeSourceCodeLocation(textNode, { endLine, endCol, endOffset }); + } + else if (this.options.sourceCodeLocationInfo) { + this.treeAdapter.setNodeSourceCodeLocation(textNode, token.location); + } } - _adoptNodes(donor, recipient) { for (let child = this.treeAdapter.getFirstChild(donor); child; child = this.treeAdapter.getFirstChild(donor)) { this.treeAdapter.detachNode(child); this.treeAdapter.appendChild(recipient, child); } } - - //Token processing - _shouldProcessTokenInForeignContent(token) { - const current = this._getAdjustedCurrentElement(); - - if (!current || current === this.document) { - return false; - } - - const ns = this.treeAdapter.getNamespaceURI(current); - - if (ns === NS.HTML) { - return false; + _setEndLocation(element, closingToken) { + if (this.treeAdapter.getNodeSourceCodeLocation(element) && closingToken.location) { + const ctLoc = closingToken.location; + const tn = this.treeAdapter.getTagName(element); + const endLoc = + // NOTE: For cases like <p> <p> </p> - First 'p' closes without a closing + // tag and for cases like <td> <p> </td> - 'p' closes without a closing tag. + closingToken.type === token_js_1.TokenType.END_TAG && tn === closingToken.tagName + ? { + endTag: Object.assign({}, ctLoc), + endLine: ctLoc.endLine, + endCol: ctLoc.endCol, + endOffset: ctLoc.endOffset, + } + : { + endLine: ctLoc.startLine, + endCol: ctLoc.startCol, + endOffset: ctLoc.startOffset, + }; + this.treeAdapter.updateNodeSourceCodeLocation(element, endLoc); } - - if ( - this.treeAdapter.getTagName(current) === $.ANNOTATION_XML && - ns === NS.MATHML && - token.type === Tokenizer.START_TAG_TOKEN && - token.tagName === $.SVG - ) { + } + //Token processing + shouldProcessStartTagTokenInForeignContent(token) { + // Check that neither current === document, or ns === NS.HTML + if (!this.currentNotInHTML) return false; - } - - const isCharacterToken = - token.type === Tokenizer.CHARACTER_TOKEN || - token.type === Tokenizer.NULL_CHARACTER_TOKEN || - token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN; - - const isMathMLTextStartTag = - token.type === Tokenizer.START_TAG_TOKEN && token.tagName !== $.MGLYPH && token.tagName !== $.MALIGNMARK; - - if ((isMathMLTextStartTag || isCharacterToken) && this._isIntegrationPoint(current, NS.MATHML)) { + let current; + let currentTagId; + if (this.openElements.stackTop === 0 && this.fragmentContext) { + current = this.fragmentContext; + currentTagId = this.fragmentContextID; + } + else { + ({ current, currentTagId } = this.openElements); + } + if (token.tagID === html_js_1.TAG_ID.SVG && + this.treeAdapter.getTagName(current) === html_js_1.TAG_NAMES.ANNOTATION_XML && + this.treeAdapter.getNamespaceURI(current) === html_js_1.NS.MATHML) { return false; } - - if ( - (token.type === Tokenizer.START_TAG_TOKEN || isCharacterToken) && - this._isIntegrationPoint(current, NS.HTML) - ) { - return false; - } - - return token.type !== Tokenizer.EOF_TOKEN; + return ( + // Check that `current` is not an integration point for HTML or MathML elements. + this.tokenizer.inForeignNode || + // If it _is_ an integration point, then we might have to check that it is not an HTML + // integration point. + ((token.tagID === html_js_1.TAG_ID.MGLYPH || token.tagID === html_js_1.TAG_ID.MALIGNMARK) && + !this._isIntegrationPoint(currentTagId, current, html_js_1.NS.HTML))); } - _processToken(token) { - TOKEN_HANDLERS[this.insertionMode][token.type](this, token); - } - - _processTokenInBodyMode(token) { - TOKEN_HANDLERS[IN_BODY_MODE][token.type](this, token); - } - - _processTokenInForeignContent(token) { - if (token.type === Tokenizer.CHARACTER_TOKEN) { - characterInForeignContent(this, token); - } else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN) { - nullCharacterInForeignContent(this, token); - } else if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN) { - insertCharacters(this, token); - } else if (token.type === Tokenizer.COMMENT_TOKEN) { - appendComment(this, token); - } else if (token.type === Tokenizer.START_TAG_TOKEN) { - startTagInForeignContent(this, token); - } else if (token.type === Tokenizer.END_TAG_TOKEN) { - endTagInForeignContent(this, token); - } - } - - _processInputToken(token) { - if (this._shouldProcessTokenInForeignContent(token)) { - this._processTokenInForeignContent(token); - } else { - this._processToken(token); - } - - if (token.type === Tokenizer.START_TAG_TOKEN && token.selfClosing && !token.ackSelfClosing) { - this._err(ERR.nonVoidHtmlElementStartTagWithTrailingSolidus); + switch (token.type) { + case token_js_1.TokenType.CHARACTER: { + this.onCharacter(token); + break; + } + case token_js_1.TokenType.NULL_CHARACTER: { + this.onNullCharacter(token); + break; + } + case token_js_1.TokenType.COMMENT: { + this.onComment(token); + break; + } + case token_js_1.TokenType.DOCTYPE: { + this.onDoctype(token); + break; + } + case token_js_1.TokenType.START_TAG: { + this._processStartTag(token); + break; + } + case token_js_1.TokenType.END_TAG: { + this.onEndTag(token); + break; + } + case token_js_1.TokenType.EOF: { + this.onEof(token); + break; + } + case token_js_1.TokenType.WHITESPACE_CHARACTER: { + this.onWhitespaceCharacter(token); + break; + } } } - //Integration points - _isIntegrationPoint(element, foreignNS) { - const tn = this.treeAdapter.getTagName(element); + _isIntegrationPoint(tid, element, foreignNS) { const ns = this.treeAdapter.getNamespaceURI(element); const attrs = this.treeAdapter.getAttrList(element); - - return foreignContent.isIntegrationPoint(tn, ns, attrs, foreignNS); + return foreignContent.isIntegrationPoint(tid, ns, attrs, foreignNS); } - //Active formatting elements reconstruction _reconstructActiveFormattingElements() { - const listLength = this.activeFormattingElements.length; - + const listLength = this.activeFormattingElements.entries.length; if (listLength) { - let unopenIdx = listLength; - let entry = null; - - do { - unopenIdx--; - entry = this.activeFormattingElements.entries[unopenIdx]; - - if (entry.type === FormattingElementList.MARKER_ENTRY || this.openElements.contains(entry.element)) { - unopenIdx++; - break; - } - } while (unopenIdx > 0); - - for (let i = unopenIdx; i < listLength; i++) { - entry = this.activeFormattingElements.entries[i]; + const endIndex = this.activeFormattingElements.entries.findIndex((entry) => entry.type === formatting_element_list_js_1.EntryType.Marker || this.openElements.contains(entry.element)); + const unopenIdx = endIndex < 0 ? listLength - 1 : endIndex - 1; + for (let i = unopenIdx; i >= 0; i--) { + const entry = this.activeFormattingElements.entries[i]; this._insertElement(entry.token, this.treeAdapter.getNamespaceURI(entry.element)); entry.element = this.openElements.current; } } } - //Close elements _closeTableCell() { this.openElements.generateImpliedEndTags(); this.openElements.popUntilTableCellPopped(); this.activeFormattingElements.clearToLastMarker(); - this.insertionMode = IN_ROW_MODE; + this.insertionMode = InsertionMode.IN_ROW; } - _closePElement() { - this.openElements.generateImpliedEndTagsWithExclusion($.P); - this.openElements.popUntilTagNamePopped($.P); + this.openElements.generateImpliedEndTagsWithExclusion(html_js_1.TAG_ID.P); + this.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.P); } - //Insertion modes _resetInsertionMode() { - for (let i = this.openElements.stackTop, last = false; i >= 0; i--) { - let element = this.openElements.items[i]; - - if (i === 0) { - last = true; - - if (this.fragmentContext) { - element = this.fragmentContext; - } - } - - const tn = this.treeAdapter.getTagName(element); - const newInsertionMode = INSERTION_MODE_RESET_MAP[tn]; - - if (newInsertionMode) { - this.insertionMode = newInsertionMode; - break; - } else if (!last && (tn === $.TD || tn === $.TH)) { - this.insertionMode = IN_CELL_MODE; - break; - } else if (!last && tn === $.HEAD) { - this.insertionMode = IN_HEAD_MODE; - break; - } else if (tn === $.SELECT) { - this._resetInsertionModeForSelect(i); - break; - } else if (tn === $.TEMPLATE) { - this.insertionMode = this.currentTmplInsertionMode; - break; - } else if (tn === $.HTML) { - this.insertionMode = this.headElement ? AFTER_HEAD_MODE : BEFORE_HEAD_MODE; - break; - } else if (last) { - this.insertionMode = IN_BODY_MODE; - break; + for (let i = this.openElements.stackTop; i >= 0; i--) { + //Insertion mode reset map + switch (i === 0 && this.fragmentContext ? this.fragmentContextID : this.openElements.tagIDs[i]) { + case html_js_1.TAG_ID.TR: + this.insertionMode = InsertionMode.IN_ROW; + return; + case html_js_1.TAG_ID.TBODY: + case html_js_1.TAG_ID.THEAD: + case html_js_1.TAG_ID.TFOOT: + this.insertionMode = InsertionMode.IN_TABLE_BODY; + return; + case html_js_1.TAG_ID.CAPTION: + this.insertionMode = InsertionMode.IN_CAPTION; + return; + case html_js_1.TAG_ID.COLGROUP: + this.insertionMode = InsertionMode.IN_COLUMN_GROUP; + return; + case html_js_1.TAG_ID.TABLE: + this.insertionMode = InsertionMode.IN_TABLE; + return; + case html_js_1.TAG_ID.BODY: + this.insertionMode = InsertionMode.IN_BODY; + return; + case html_js_1.TAG_ID.FRAMESET: + this.insertionMode = InsertionMode.IN_FRAMESET; + return; + case html_js_1.TAG_ID.SELECT: + this._resetInsertionModeForSelect(i); + return; + case html_js_1.TAG_ID.TEMPLATE: + this.insertionMode = this.tmplInsertionModeStack[0]; + return; + case html_js_1.TAG_ID.HTML: + this.insertionMode = this.headElement ? InsertionMode.AFTER_HEAD : InsertionMode.BEFORE_HEAD; + return; + case html_js_1.TAG_ID.TD: + case html_js_1.TAG_ID.TH: + if (i > 0) { + this.insertionMode = InsertionMode.IN_CELL; + return; + } + break; + case html_js_1.TAG_ID.HEAD: + if (i > 0) { + this.insertionMode = InsertionMode.IN_HEAD; + return; + } + break; } } + this.insertionMode = InsertionMode.IN_BODY; } - _resetInsertionModeForSelect(selectIdx) { if (selectIdx > 0) { for (let i = selectIdx - 1; i > 0; i--) { - const ancestor = this.openElements.items[i]; - const tn = this.treeAdapter.getTagName(ancestor); - - if (tn === $.TEMPLATE) { + const tn = this.openElements.tagIDs[i]; + if (tn === html_js_1.TAG_ID.TEMPLATE) { break; - } else if (tn === $.TABLE) { - this.insertionMode = IN_SELECT_IN_TABLE_MODE; + } + else if (tn === html_js_1.TAG_ID.TABLE) { + this.insertionMode = InsertionMode.IN_SELECT_IN_TABLE; return; } } } - - this.insertionMode = IN_SELECT_MODE; + this.insertionMode = InsertionMode.IN_SELECT; } - - _pushTmplInsertionMode(mode) { - this.tmplInsertionModeStack.push(mode); - this.tmplInsertionModeStackTop++; - this.currentTmplInsertionMode = mode; - } - - _popTmplInsertionMode() { - this.tmplInsertionModeStack.pop(); - this.tmplInsertionModeStackTop--; - this.currentTmplInsertionMode = this.tmplInsertionModeStack[this.tmplInsertionModeStackTop]; - } - //Foster parenting - _isElementCausesFosterParenting(element) { - const tn = this.treeAdapter.getTagName(element); - - return tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR; + _isElementCausesFosterParenting(tn) { + return TABLE_STRUCTURE_TAGS.has(tn); } - _shouldFosterParentOnInsertion() { - return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.current); + return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.currentTagId); } - _findFosterParentingLocation() { - const location = { - parent: null, - beforeElement: null - }; - for (let i = this.openElements.stackTop; i >= 0; i--) { const openElement = this.openElements.items[i]; - const tn = this.treeAdapter.getTagName(openElement); - const ns = this.treeAdapter.getNamespaceURI(openElement); - - if (tn === $.TEMPLATE && ns === NS.HTML) { - location.parent = this.treeAdapter.getTemplateContent(openElement); - break; - } else if (tn === $.TABLE) { - location.parent = this.treeAdapter.getParentNode(openElement); - - if (location.parent) { - location.beforeElement = openElement; - } else { - location.parent = this.openElements.items[i - 1]; + switch (this.openElements.tagIDs[i]) { + case html_js_1.TAG_ID.TEMPLATE: + if (this.treeAdapter.getNamespaceURI(openElement) === html_js_1.NS.HTML) { + return { parent: this.treeAdapter.getTemplateContent(openElement), beforeElement: null }; + } + break; + case html_js_1.TAG_ID.TABLE: { + const parent = this.treeAdapter.getParentNode(openElement); + if (parent) { + return { parent, beforeElement: openElement }; + } + return { parent: this.openElements.items[i - 1], beforeElement: null }; } - - break; + default: + // Do nothing } } - - if (!location.parent) { - location.parent = this.openElements.items[0]; - } - - return location; + return { parent: this.openElements.items[0], beforeElement: null }; } - _fosterParentElement(element) { const location = this._findFosterParentingLocation(); - if (location.beforeElement) { this.treeAdapter.insertBefore(location.parent, element, location.beforeElement); - } else { - this.treeAdapter.appendChild(location.parent, element); } - } - - _fosterParentText(chars) { - const location = this._findFosterParentingLocation(); - - if (location.beforeElement) { - this.treeAdapter.insertTextBefore(location.parent, chars, location.beforeElement); - } else { - this.treeAdapter.insertText(location.parent, chars); + else { + this.treeAdapter.appendChild(location.parent, element); } } - //Special elements - _isSpecialElement(element) { - const tn = this.treeAdapter.getTagName(element); + _isSpecialElement(element, id) { const ns = this.treeAdapter.getNamespaceURI(element); - - return HTML.SPECIAL_ELEMENTS[ns][tn]; + return html_js_1.SPECIAL_ELEMENTS[ns].has(id); + } + onCharacter(token) { + this.skipNextNewLine = false; + if (this.tokenizer.inForeignNode) { + characterInForeignContent(this, token); + return; + } + switch (this.insertionMode) { + case InsertionMode.INITIAL: + tokenInInitialMode(this, token); + break; + case InsertionMode.BEFORE_HTML: + tokenBeforeHtml(this, token); + break; + case InsertionMode.BEFORE_HEAD: + tokenBeforeHead(this, token); + break; + case InsertionMode.IN_HEAD: + tokenInHead(this, token); + break; + case InsertionMode.IN_HEAD_NO_SCRIPT: + tokenInHeadNoScript(this, token); + break; + case InsertionMode.AFTER_HEAD: + tokenAfterHead(this, token); + break; + case InsertionMode.IN_BODY: + case InsertionMode.IN_CAPTION: + case InsertionMode.IN_CELL: + case InsertionMode.IN_TEMPLATE: + characterInBody(this, token); + break; + case InsertionMode.TEXT: + case InsertionMode.IN_SELECT: + case InsertionMode.IN_SELECT_IN_TABLE: + this._insertCharacters(token); + break; + case InsertionMode.IN_TABLE: + case InsertionMode.IN_TABLE_BODY: + case InsertionMode.IN_ROW: + characterInTable(this, token); + break; + case InsertionMode.IN_TABLE_TEXT: + characterInTableText(this, token); + break; + case InsertionMode.IN_COLUMN_GROUP: + tokenInColumnGroup(this, token); + break; + case InsertionMode.AFTER_BODY: + tokenAfterBody(this, token); + break; + case InsertionMode.AFTER_AFTER_BODY: + tokenAfterAfterBody(this, token); + break; + default: + // Do nothing + } + } + onNullCharacter(token) { + this.skipNextNewLine = false; + if (this.tokenizer.inForeignNode) { + nullCharacterInForeignContent(this, token); + return; + } + switch (this.insertionMode) { + case InsertionMode.INITIAL: + tokenInInitialMode(this, token); + break; + case InsertionMode.BEFORE_HTML: + tokenBeforeHtml(this, token); + break; + case InsertionMode.BEFORE_HEAD: + tokenBeforeHead(this, token); + break; + case InsertionMode.IN_HEAD: + tokenInHead(this, token); + break; + case InsertionMode.IN_HEAD_NO_SCRIPT: + tokenInHeadNoScript(this, token); + break; + case InsertionMode.AFTER_HEAD: + tokenAfterHead(this, token); + break; + case InsertionMode.TEXT: + this._insertCharacters(token); + break; + case InsertionMode.IN_TABLE: + case InsertionMode.IN_TABLE_BODY: + case InsertionMode.IN_ROW: + characterInTable(this, token); + break; + case InsertionMode.IN_COLUMN_GROUP: + tokenInColumnGroup(this, token); + break; + case InsertionMode.AFTER_BODY: + tokenAfterBody(this, token); + break; + case InsertionMode.AFTER_AFTER_BODY: + tokenAfterAfterBody(this, token); + break; + default: + // Do nothing + } + } + onComment(token) { + this.skipNextNewLine = false; + if (this.currentNotInHTML) { + appendComment(this, token); + return; + } + switch (this.insertionMode) { + case InsertionMode.INITIAL: + case InsertionMode.BEFORE_HTML: + case InsertionMode.BEFORE_HEAD: + case InsertionMode.IN_HEAD: + case InsertionMode.IN_HEAD_NO_SCRIPT: + case InsertionMode.AFTER_HEAD: + case InsertionMode.IN_BODY: + case InsertionMode.IN_TABLE: + case InsertionMode.IN_CAPTION: + case InsertionMode.IN_COLUMN_GROUP: + case InsertionMode.IN_TABLE_BODY: + case InsertionMode.IN_ROW: + case InsertionMode.IN_CELL: + case InsertionMode.IN_SELECT: + case InsertionMode.IN_SELECT_IN_TABLE: + case InsertionMode.IN_TEMPLATE: + case InsertionMode.IN_FRAMESET: + case InsertionMode.AFTER_FRAMESET: + appendComment(this, token); + break; + case InsertionMode.IN_TABLE_TEXT: + tokenInTableText(this, token); + break; + case InsertionMode.AFTER_BODY: + appendCommentToRootHtmlElement(this, token); + break; + case InsertionMode.AFTER_AFTER_BODY: + case InsertionMode.AFTER_AFTER_FRAMESET: + appendCommentToDocument(this, token); + break; + default: + // Do nothing + } + } + onDoctype(token) { + this.skipNextNewLine = false; + switch (this.insertionMode) { + case InsertionMode.INITIAL: + doctypeInInitialMode(this, token); + break; + case InsertionMode.BEFORE_HEAD: + case InsertionMode.IN_HEAD: + case InsertionMode.IN_HEAD_NO_SCRIPT: + case InsertionMode.AFTER_HEAD: + this._err(token, error_codes_js_1.ERR.misplacedDoctype); + break; + case InsertionMode.IN_TABLE_TEXT: + tokenInTableText(this, token); + break; + default: + // Do nothing + } + } + onStartTag(token) { + this.skipNextNewLine = false; + this.currentToken = token; + this._processStartTag(token); + if (token.selfClosing && !token.ackSelfClosing) { + this._err(token, error_codes_js_1.ERR.nonVoidHtmlElementStartTagWithTrailingSolidus); + } + } + /** + * Processes a given start tag. + * + * `onStartTag` checks if a self-closing tag was recognized. When a token + * is moved inbetween multiple insertion modes, this check for self-closing + * could lead to false positives. To avoid this, `_processStartTag` is used + * for nested calls. + * + * @param token The token to process. + */ + _processStartTag(token) { + if (this.shouldProcessStartTagTokenInForeignContent(token)) { + startTagInForeignContent(this, token); + } + else { + this._startTagOutsideForeignContent(token); + } + } + _startTagOutsideForeignContent(token) { + switch (this.insertionMode) { + case InsertionMode.INITIAL: + tokenInInitialMode(this, token); + break; + case InsertionMode.BEFORE_HTML: + startTagBeforeHtml(this, token); + break; + case InsertionMode.BEFORE_HEAD: + startTagBeforeHead(this, token); + break; + case InsertionMode.IN_HEAD: + startTagInHead(this, token); + break; + case InsertionMode.IN_HEAD_NO_SCRIPT: + startTagInHeadNoScript(this, token); + break; + case InsertionMode.AFTER_HEAD: + startTagAfterHead(this, token); + break; + case InsertionMode.IN_BODY: + startTagInBody(this, token); + break; + case InsertionMode.IN_TABLE: + startTagInTable(this, token); + break; + case InsertionMode.IN_TABLE_TEXT: + tokenInTableText(this, token); + break; + case InsertionMode.IN_CAPTION: + startTagInCaption(this, token); + break; + case InsertionMode.IN_COLUMN_GROUP: + startTagInColumnGroup(this, token); + break; + case InsertionMode.IN_TABLE_BODY: + startTagInTableBody(this, token); + break; + case InsertionMode.IN_ROW: + startTagInRow(this, token); + break; + case InsertionMode.IN_CELL: + startTagInCell(this, token); + break; + case InsertionMode.IN_SELECT: + startTagInSelect(this, token); + break; + case InsertionMode.IN_SELECT_IN_TABLE: + startTagInSelectInTable(this, token); + break; + case InsertionMode.IN_TEMPLATE: + startTagInTemplate(this, token); + break; + case InsertionMode.AFTER_BODY: + startTagAfterBody(this, token); + break; + case InsertionMode.IN_FRAMESET: + startTagInFrameset(this, token); + break; + case InsertionMode.AFTER_FRAMESET: + startTagAfterFrameset(this, token); + break; + case InsertionMode.AFTER_AFTER_BODY: + startTagAfterAfterBody(this, token); + break; + case InsertionMode.AFTER_AFTER_FRAMESET: + startTagAfterAfterFrameset(this, token); + break; + default: + // Do nothing + } + } + onEndTag(token) { + this.skipNextNewLine = false; + this.currentToken = token; + if (this.currentNotInHTML) { + endTagInForeignContent(this, token); + } + else { + this._endTagOutsideForeignContent(token); + } + } + _endTagOutsideForeignContent(token) { + switch (this.insertionMode) { + case InsertionMode.INITIAL: + tokenInInitialMode(this, token); + break; + case InsertionMode.BEFORE_HTML: + endTagBeforeHtml(this, token); + break; + case InsertionMode.BEFORE_HEAD: + endTagBeforeHead(this, token); + break; + case InsertionMode.IN_HEAD: + endTagInHead(this, token); + break; + case InsertionMode.IN_HEAD_NO_SCRIPT: + endTagInHeadNoScript(this, token); + break; + case InsertionMode.AFTER_HEAD: + endTagAfterHead(this, token); + break; + case InsertionMode.IN_BODY: + endTagInBody(this, token); + break; + case InsertionMode.TEXT: + endTagInText(this, token); + break; + case InsertionMode.IN_TABLE: + endTagInTable(this, token); + break; + case InsertionMode.IN_TABLE_TEXT: + tokenInTableText(this, token); + break; + case InsertionMode.IN_CAPTION: + endTagInCaption(this, token); + break; + case InsertionMode.IN_COLUMN_GROUP: + endTagInColumnGroup(this, token); + break; + case InsertionMode.IN_TABLE_BODY: + endTagInTableBody(this, token); + break; + case InsertionMode.IN_ROW: + endTagInRow(this, token); + break; + case InsertionMode.IN_CELL: + endTagInCell(this, token); + break; + case InsertionMode.IN_SELECT: + endTagInSelect(this, token); + break; + case InsertionMode.IN_SELECT_IN_TABLE: + endTagInSelectInTable(this, token); + break; + case InsertionMode.IN_TEMPLATE: + endTagInTemplate(this, token); + break; + case InsertionMode.AFTER_BODY: + endTagAfterBody(this, token); + break; + case InsertionMode.IN_FRAMESET: + endTagInFrameset(this, token); + break; + case InsertionMode.AFTER_FRAMESET: + endTagAfterFrameset(this, token); + break; + case InsertionMode.AFTER_AFTER_BODY: + tokenAfterAfterBody(this, token); + break; + default: + // Do nothing + } + } + onEof(token) { + switch (this.insertionMode) { + case InsertionMode.INITIAL: + tokenInInitialMode(this, token); + break; + case InsertionMode.BEFORE_HTML: + tokenBeforeHtml(this, token); + break; + case InsertionMode.BEFORE_HEAD: + tokenBeforeHead(this, token); + break; + case InsertionMode.IN_HEAD: + tokenInHead(this, token); + break; + case InsertionMode.IN_HEAD_NO_SCRIPT: + tokenInHeadNoScript(this, token); + break; + case InsertionMode.AFTER_HEAD: + tokenAfterHead(this, token); + break; + case InsertionMode.IN_BODY: + case InsertionMode.IN_TABLE: + case InsertionMode.IN_CAPTION: + case InsertionMode.IN_COLUMN_GROUP: + case InsertionMode.IN_TABLE_BODY: + case InsertionMode.IN_ROW: + case InsertionMode.IN_CELL: + case InsertionMode.IN_SELECT: + case InsertionMode.IN_SELECT_IN_TABLE: + eofInBody(this, token); + break; + case InsertionMode.TEXT: + eofInText(this, token); + break; + case InsertionMode.IN_TABLE_TEXT: + tokenInTableText(this, token); + break; + case InsertionMode.IN_TEMPLATE: + eofInTemplate(this, token); + break; + case InsertionMode.AFTER_BODY: + case InsertionMode.IN_FRAMESET: + case InsertionMode.AFTER_FRAMESET: + case InsertionMode.AFTER_AFTER_BODY: + case InsertionMode.AFTER_AFTER_FRAMESET: + stopParsing(this, token); + break; + default: + // Do nothing + } + } + onWhitespaceCharacter(token) { + if (this.skipNextNewLine) { + this.skipNextNewLine = false; + if (token.chars.charCodeAt(0) === unicode.CODE_POINTS.LINE_FEED) { + if (token.chars.length === 1) { + return; + } + token.chars = token.chars.substr(1); + } + } + if (this.tokenizer.inForeignNode) { + this._insertCharacters(token); + return; + } + switch (this.insertionMode) { + case InsertionMode.IN_HEAD: + case InsertionMode.IN_HEAD_NO_SCRIPT: + case InsertionMode.AFTER_HEAD: + case InsertionMode.TEXT: + case InsertionMode.IN_COLUMN_GROUP: + case InsertionMode.IN_SELECT: + case InsertionMode.IN_SELECT_IN_TABLE: + case InsertionMode.IN_FRAMESET: + case InsertionMode.AFTER_FRAMESET: + this._insertCharacters(token); + break; + case InsertionMode.IN_BODY: + case InsertionMode.IN_CAPTION: + case InsertionMode.IN_CELL: + case InsertionMode.IN_TEMPLATE: + case InsertionMode.AFTER_BODY: + case InsertionMode.AFTER_AFTER_BODY: + case InsertionMode.AFTER_AFTER_FRAMESET: + whitespaceCharacterInBody(this, token); + break; + case InsertionMode.IN_TABLE: + case InsertionMode.IN_TABLE_BODY: + case InsertionMode.IN_ROW: + characterInTable(this, token); + break; + case InsertionMode.IN_TABLE_TEXT: + whitespaceCharacterInTableText(this, token); + break; + default: + // Do nothing + } } } - -module.exports = Parser; - +exports.Parser = Parser; //Adoption agency algorithm //(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#adoptionAgency) //------------------------------------------------------------------ - //Steps 5-8 of the algorithm function aaObtainFormattingElementEntry(p, token) { let formattingElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName(token.tagName); - if (formattingElementEntry) { if (!p.openElements.contains(formattingElementEntry.element)) { p.activeFormattingElements.removeEntry(formattingElementEntry); formattingElementEntry = null; - } else if (!p.openElements.hasInScope(token.tagName)) { + } + else if (!p.openElements.hasInScope(token.tagID)) { formattingElementEntry = null; } - } else { + } + else { genericEndTagInBody(p, token); } - return formattingElementEntry; } - //Steps 9 and 10 of the algorithm function aaObtainFurthestBlock(p, formattingElementEntry) { let furthestBlock = null; - - for (let i = p.openElements.stackTop; i >= 0; i--) { - const element = p.openElements.items[i]; - + let idx = p.openElements.stackTop; + for (; idx >= 0; idx--) { + const element = p.openElements.items[idx]; if (element === formattingElementEntry.element) { break; } - - if (p._isSpecialElement(element)) { + if (p._isSpecialElement(element, p.openElements.tagIDs[idx])) { furthestBlock = element; } } - if (!furthestBlock) { - p.openElements.popUntilElementPopped(formattingElementEntry.element); + p.openElements.shortenToLength(idx < 0 ? 0 : idx); p.activeFormattingElements.removeEntry(formattingElementEntry); } - return furthestBlock; } - //Step 13 of the algorithm function aaInnerLoop(p, furthestBlock, formattingElement) { let lastElement = furthestBlock; let nextElement = p.openElements.getCommonAncestor(furthestBlock); - for (let i = 0, element = nextElement; element !== formattingElement; i++, element = nextElement) { - //NOTE: store next element for the next loop iteration (it may be deleted from the stack by step 9.5) + //NOTE: store the next element for the next loop iteration (it may be deleted from the stack by step 9.5) nextElement = p.openElements.getCommonAncestor(element); - const elementEntry = p.activeFormattingElements.getElementEntry(element); const counterOverflow = elementEntry && i >= AA_INNER_LOOP_ITER; const shouldRemoveFromOpenElements = !elementEntry || counterOverflow; - if (shouldRemoveFromOpenElements) { if (counterOverflow) { p.activeFormattingElements.removeEntry(elementEntry); } - p.openElements.remove(element); - } else { + } + else { element = aaRecreateElementFromEntry(p, elementEntry); - if (lastElement === furthestBlock) { p.activeFormattingElements.bookmark = elementEntry; } - p.treeAdapter.detachNode(lastElement); p.treeAdapter.appendChild(element, lastElement); lastElement = element; } } - return lastElement; } - //Step 13.7 of the algorithm function aaRecreateElementFromEntry(p, elementEntry) { const ns = p.treeAdapter.getNamespaceURI(elementEntry.element); const newElement = p.treeAdapter.createElement(elementEntry.token.tagName, ns, elementEntry.token.attrs); - p.openElements.replace(elementEntry.element, newElement); elementEntry.element = newElement; - return newElement; } - //Step 14 of the algorithm function aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement) { - if (p._isElementCausesFosterParenting(commonAncestor)) { + const tn = p.treeAdapter.getTagName(commonAncestor); + const tid = (0, html_js_1.getTagID)(tn); + if (p._isElementCausesFosterParenting(tid)) { p._fosterParentElement(lastElement); - } else { - const tn = p.treeAdapter.getTagName(commonAncestor); + } + else { const ns = p.treeAdapter.getNamespaceURI(commonAncestor); - - if (tn === $.TEMPLATE && ns === NS.HTML) { + if (tid === html_js_1.TAG_ID.TEMPLATE && ns === html_js_1.NS.HTML) { commonAncestor = p.treeAdapter.getTemplateContent(commonAncestor); } - p.treeAdapter.appendChild(commonAncestor, lastElement); } } - //Steps 15-19 of the algorithm function aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry) { const ns = p.treeAdapter.getNamespaceURI(formattingElementEntry.element); - const token = formattingElementEntry.token; + const { token } = formattingElementEntry; const newElement = p.treeAdapter.createElement(token.tagName, ns, token.attrs); - p._adoptNodes(furthestBlock, newElement); p.treeAdapter.appendChild(furthestBlock, newElement); - - p.activeFormattingElements.insertElementAfterBookmark(newElement, formattingElementEntry.token); + p.activeFormattingElements.insertElementAfterBookmark(newElement, token); p.activeFormattingElements.removeEntry(formattingElementEntry); - p.openElements.remove(formattingElementEntry.element); - p.openElements.insertAfter(furthestBlock, newElement); + p.openElements.insertAfter(furthestBlock, newElement, token.tagID); } - //Algorithm entry point function callAdoptionAgency(p, token) { - let formattingElementEntry; - for (let i = 0; i < AA_OUTER_LOOP_ITER; i++) { - formattingElementEntry = aaObtainFormattingElementEntry(p, token, formattingElementEntry); - + const formattingElementEntry = aaObtainFormattingElementEntry(p, token); if (!formattingElementEntry) { break; } - const furthestBlock = aaObtainFurthestBlock(p, formattingElementEntry); - if (!furthestBlock) { break; } - p.activeFormattingElements.bookmark = formattingElementEntry; - const lastElement = aaInnerLoop(p, furthestBlock, formattingElementEntry.element); const commonAncestor = p.openElements.getCommonAncestor(formattingElementEntry.element); - p.treeAdapter.detachNode(lastElement); - aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement); + if (commonAncestor) + aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement); aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry); } } - //Generic token handlers //------------------------------------------------------------------ -function ignoreToken() { - //NOTE: do nothing =) -} - -function misplacedDoctype(p) { - p._err(ERR.misplacedDoctype); -} - function appendComment(p, token) { - p._appendCommentNode(token, p.openElements.currentTmplContent || p.openElements.current); + p._appendCommentNode(token, p.openElements.currentTmplContentOrNode); } - function appendCommentToRootHtmlElement(p, token) { p._appendCommentNode(token, p.openElements.items[0]); } - function appendCommentToDocument(p, token) { p._appendCommentNode(token, p.document); } - -function insertCharacters(p, token) { - p._insertCharacters(token); -} - -function stopParsing(p) { +function stopParsing(p, token) { p.stopped = true; + // NOTE: Set end locations for elements that remain on the open element stack. + if (token.location) { + // NOTE: If we are not in a fragment, `html` and `body` will stay on the stack. + // This is a problem, as we might overwrite their end position here. + const target = p.fragmentContext ? 0 : 2; + for (let i = p.openElements.stackTop; i >= target; i--) { + p._setEndLocation(p.openElements.items[i], token); + } + // Handle `html` and `body` + if (!p.fragmentContext && p.openElements.stackTop >= 0) { + const htmlElement = p.openElements.items[0]; + const htmlLocation = p.treeAdapter.getNodeSourceCodeLocation(htmlElement); + if (htmlLocation && !htmlLocation.endTag) { + p._setEndLocation(htmlElement, token); + if (p.openElements.stackTop >= 1) { + const bodyElement = p.openElements.items[1]; + const bodyLocation = p.treeAdapter.getNodeSourceCodeLocation(bodyElement); + if (bodyLocation && !bodyLocation.endTag) { + p._setEndLocation(bodyElement, token); + } + } + } + } + } } - // The "initial" insertion mode //------------------------------------------------------------------ function doctypeInInitialMode(p, token) { p._setDocumentType(token); - - const mode = token.forceQuirks ? HTML.DOCUMENT_MODE.QUIRKS : doctype.getDocumentMode(token); - + const mode = token.forceQuirks ? html_js_1.DOCUMENT_MODE.QUIRKS : doctype.getDocumentMode(token); if (!doctype.isConforming(token)) { - p._err(ERR.nonConformingDoctype); + p._err(token, error_codes_js_1.ERR.nonConformingDoctype); } - p.treeAdapter.setDocumentMode(p.document, mode); - - p.insertionMode = BEFORE_HTML_MODE; + p.insertionMode = InsertionMode.BEFORE_HTML; } - function tokenInInitialMode(p, token) { - p._err(ERR.missingDoctype, { beforeToken: true }); - p.treeAdapter.setDocumentMode(p.document, HTML.DOCUMENT_MODE.QUIRKS); - p.insertionMode = BEFORE_HTML_MODE; + p._err(token, error_codes_js_1.ERR.missingDoctype, true); + p.treeAdapter.setDocumentMode(p.document, html_js_1.DOCUMENT_MODE.QUIRKS); + p.insertionMode = InsertionMode.BEFORE_HTML; p._processToken(token); } - // The "before html" insertion mode //------------------------------------------------------------------ function startTagBeforeHtml(p, token) { - if (token.tagName === $.HTML) { - p._insertElement(token, NS.HTML); - p.insertionMode = BEFORE_HEAD_MODE; - } else { + if (token.tagID === html_js_1.TAG_ID.HTML) { + p._insertElement(token, html_js_1.NS.HTML); + p.insertionMode = InsertionMode.BEFORE_HEAD; + } + else { tokenBeforeHtml(p, token); } } - function endTagBeforeHtml(p, token) { - const tn = token.tagName; - - if (tn === $.HTML || tn === $.HEAD || tn === $.BODY || tn === $.BR) { + const tn = token.tagID; + if (tn === html_js_1.TAG_ID.HTML || tn === html_js_1.TAG_ID.HEAD || tn === html_js_1.TAG_ID.BODY || tn === html_js_1.TAG_ID.BR) { tokenBeforeHtml(p, token); } } - function tokenBeforeHtml(p, token) { p._insertFakeRootElement(); - p.insertionMode = BEFORE_HEAD_MODE; + p.insertionMode = InsertionMode.BEFORE_HEAD; p._processToken(token); } - // The "before head" insertion mode //------------------------------------------------------------------ function startTagBeforeHead(p, token) { - const tn = token.tagName; - - if (tn === $.HTML) { - startTagInBody(p, token); - } else if (tn === $.HEAD) { - p._insertElement(token, NS.HTML); - p.headElement = p.openElements.current; - p.insertionMode = IN_HEAD_MODE; - } else { - tokenBeforeHead(p, token); + switch (token.tagID) { + case html_js_1.TAG_ID.HTML: { + startTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.HEAD: { + p._insertElement(token, html_js_1.NS.HTML); + p.headElement = p.openElements.current; + p.insertionMode = InsertionMode.IN_HEAD; + break; + } + default: { + tokenBeforeHead(p, token); + } } } - function endTagBeforeHead(p, token) { - const tn = token.tagName; - - if (tn === $.HEAD || tn === $.BODY || tn === $.HTML || tn === $.BR) { + const tn = token.tagID; + if (tn === html_js_1.TAG_ID.HEAD || tn === html_js_1.TAG_ID.BODY || tn === html_js_1.TAG_ID.HTML || tn === html_js_1.TAG_ID.BR) { tokenBeforeHead(p, token); - } else { - p._err(ERR.endTagWithoutMatchingOpenElement); + } + else { + p._err(token, error_codes_js_1.ERR.endTagWithoutMatchingOpenElement); } } - function tokenBeforeHead(p, token) { - p._insertFakeElement($.HEAD); + p._insertFakeElement(html_js_1.TAG_NAMES.HEAD, html_js_1.TAG_ID.HEAD); p.headElement = p.openElements.current; - p.insertionMode = IN_HEAD_MODE; + p.insertionMode = InsertionMode.IN_HEAD; p._processToken(token); } - // The "in head" insertion mode //------------------------------------------------------------------ function startTagInHead(p, token) { - const tn = token.tagName; - - if (tn === $.HTML) { - startTagInBody(p, token); - } else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META) { - p._appendElement(token, NS.HTML); - token.ackSelfClosing = true; - } else if (tn === $.TITLE) { - p._switchToTextParsing(token, Tokenizer.MODE.RCDATA); - } else if (tn === $.NOSCRIPT) { - if (p.options.scriptingEnabled) { - p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); - } else { - p._insertElement(token, NS.HTML); - p.insertionMode = IN_HEAD_NO_SCRIPT_MODE; - } - } else if (tn === $.NOFRAMES || tn === $.STYLE) { - p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); - } else if (tn === $.SCRIPT) { - p._switchToTextParsing(token, Tokenizer.MODE.SCRIPT_DATA); - } else if (tn === $.TEMPLATE) { - p._insertTemplate(token, NS.HTML); - p.activeFormattingElements.insertMarker(); - p.framesetOk = false; - p.insertionMode = IN_TEMPLATE_MODE; - p._pushTmplInsertionMode(IN_TEMPLATE_MODE); - } else if (tn === $.HEAD) { - p._err(ERR.misplacedStartTagForHeadElement); - } else { - tokenInHead(p, token); + switch (token.tagID) { + case html_js_1.TAG_ID.HTML: { + startTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.BASE: + case html_js_1.TAG_ID.BASEFONT: + case html_js_1.TAG_ID.BGSOUND: + case html_js_1.TAG_ID.LINK: + case html_js_1.TAG_ID.META: { + p._appendElement(token, html_js_1.NS.HTML); + token.ackSelfClosing = true; + break; + } + case html_js_1.TAG_ID.TITLE: { + p._switchToTextParsing(token, index_js_1.TokenizerMode.RCDATA); + break; + } + case html_js_1.TAG_ID.NOSCRIPT: { + if (p.options.scriptingEnabled) { + p._switchToTextParsing(token, index_js_1.TokenizerMode.RAWTEXT); + } + else { + p._insertElement(token, html_js_1.NS.HTML); + p.insertionMode = InsertionMode.IN_HEAD_NO_SCRIPT; + } + break; + } + case html_js_1.TAG_ID.NOFRAMES: + case html_js_1.TAG_ID.STYLE: { + p._switchToTextParsing(token, index_js_1.TokenizerMode.RAWTEXT); + break; + } + case html_js_1.TAG_ID.SCRIPT: { + p._switchToTextParsing(token, index_js_1.TokenizerMode.SCRIPT_DATA); + break; + } + case html_js_1.TAG_ID.TEMPLATE: { + p._insertTemplate(token); + p.activeFormattingElements.insertMarker(); + p.framesetOk = false; + p.insertionMode = InsertionMode.IN_TEMPLATE; + p.tmplInsertionModeStack.unshift(InsertionMode.IN_TEMPLATE); + break; + } + case html_js_1.TAG_ID.HEAD: { + p._err(token, error_codes_js_1.ERR.misplacedStartTagForHeadElement); + break; + } + default: { + tokenInHead(p, token); + } } } - function endTagInHead(p, token) { - const tn = token.tagName; - - if (tn === $.HEAD) { - p.openElements.pop(); - p.insertionMode = AFTER_HEAD_MODE; - } else if (tn === $.BODY || tn === $.BR || tn === $.HTML) { - tokenInHead(p, token); - } else if (tn === $.TEMPLATE) { - if (p.openElements.tmplCount > 0) { - p.openElements.generateImpliedEndTagsThoroughly(); - - if (p.openElements.currentTagName !== $.TEMPLATE) { - p._err(ERR.closingOfElementWithOpenChildElements); + switch (token.tagID) { + case html_js_1.TAG_ID.HEAD: { + p.openElements.pop(); + p.insertionMode = InsertionMode.AFTER_HEAD; + break; + } + case html_js_1.TAG_ID.BODY: + case html_js_1.TAG_ID.BR: + case html_js_1.TAG_ID.HTML: { + tokenInHead(p, token); + break; + } + case html_js_1.TAG_ID.TEMPLATE: { + if (p.openElements.tmplCount > 0) { + p.openElements.generateImpliedEndTagsThoroughly(); + if (p.openElements.currentTagId !== html_js_1.TAG_ID.TEMPLATE) { + p._err(token, error_codes_js_1.ERR.closingOfElementWithOpenChildElements); + } + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.TEMPLATE); + p.activeFormattingElements.clearToLastMarker(); + p.tmplInsertionModeStack.shift(); + p._resetInsertionMode(); } - - p.openElements.popUntilTagNamePopped($.TEMPLATE); - p.activeFormattingElements.clearToLastMarker(); - p._popTmplInsertionMode(); - p._resetInsertionMode(); - } else { - p._err(ERR.endTagWithoutMatchingOpenElement); + else { + p._err(token, error_codes_js_1.ERR.endTagWithoutMatchingOpenElement); + } + break; + } + default: { + p._err(token, error_codes_js_1.ERR.endTagWithoutMatchingOpenElement); } - } else { - p._err(ERR.endTagWithoutMatchingOpenElement); } } - function tokenInHead(p, token) { p.openElements.pop(); - p.insertionMode = AFTER_HEAD_MODE; + p.insertionMode = InsertionMode.AFTER_HEAD; p._processToken(token); } - // The "in head no script" insertion mode //------------------------------------------------------------------ function startTagInHeadNoScript(p, token) { - const tn = token.tagName; - - if (tn === $.HTML) { - startTagInBody(p, token); - } else if ( - tn === $.BASEFONT || - tn === $.BGSOUND || - tn === $.HEAD || - tn === $.LINK || - tn === $.META || - tn === $.NOFRAMES || - tn === $.STYLE - ) { - startTagInHead(p, token); - } else if (tn === $.NOSCRIPT) { - p._err(ERR.nestedNoscriptInHead); - } else { - tokenInHeadNoScript(p, token); + switch (token.tagID) { + case html_js_1.TAG_ID.HTML: { + startTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.BASEFONT: + case html_js_1.TAG_ID.BGSOUND: + case html_js_1.TAG_ID.HEAD: + case html_js_1.TAG_ID.LINK: + case html_js_1.TAG_ID.META: + case html_js_1.TAG_ID.NOFRAMES: + case html_js_1.TAG_ID.STYLE: { + startTagInHead(p, token); + break; + } + case html_js_1.TAG_ID.NOSCRIPT: { + p._err(token, error_codes_js_1.ERR.nestedNoscriptInHead); + break; + } + default: { + tokenInHeadNoScript(p, token); + } } } - function endTagInHeadNoScript(p, token) { - const tn = token.tagName; - - if (tn === $.NOSCRIPT) { - p.openElements.pop(); - p.insertionMode = IN_HEAD_MODE; - } else if (tn === $.BR) { - tokenInHeadNoScript(p, token); - } else { - p._err(ERR.endTagWithoutMatchingOpenElement); + switch (token.tagID) { + case html_js_1.TAG_ID.NOSCRIPT: { + p.openElements.pop(); + p.insertionMode = InsertionMode.IN_HEAD; + break; + } + case html_js_1.TAG_ID.BR: { + tokenInHeadNoScript(p, token); + break; + } + default: { + p._err(token, error_codes_js_1.ERR.endTagWithoutMatchingOpenElement); + } } } - function tokenInHeadNoScript(p, token) { - const errCode = - token.type === Tokenizer.EOF_TOKEN ? ERR.openElementsLeftAfterEof : ERR.disallowedContentInNoscriptInHead; - - p._err(errCode); + const errCode = token.type === token_js_1.TokenType.EOF ? error_codes_js_1.ERR.openElementsLeftAfterEof : error_codes_js_1.ERR.disallowedContentInNoscriptInHead; + p._err(token, errCode); p.openElements.pop(); - p.insertionMode = IN_HEAD_MODE; + p.insertionMode = InsertionMode.IN_HEAD; p._processToken(token); } - // The "after head" insertion mode //------------------------------------------------------------------ function startTagAfterHead(p, token) { - const tn = token.tagName; - - if (tn === $.HTML) { - startTagInBody(p, token); - } else if (tn === $.BODY) { - p._insertElement(token, NS.HTML); - p.framesetOk = false; - p.insertionMode = IN_BODY_MODE; - } else if (tn === $.FRAMESET) { - p._insertElement(token, NS.HTML); - p.insertionMode = IN_FRAMESET_MODE; - } else if ( - tn === $.BASE || - tn === $.BASEFONT || - tn === $.BGSOUND || - tn === $.LINK || - tn === $.META || - tn === $.NOFRAMES || - tn === $.SCRIPT || - tn === $.STYLE || - tn === $.TEMPLATE || - tn === $.TITLE - ) { - p._err(ERR.abandonedHeadElementChild); - p.openElements.push(p.headElement); - startTagInHead(p, token); - p.openElements.remove(p.headElement); - } else if (tn === $.HEAD) { - p._err(ERR.misplacedStartTagForHeadElement); - } else { - tokenAfterHead(p, token); + switch (token.tagID) { + case html_js_1.TAG_ID.HTML: { + startTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.BODY: { + p._insertElement(token, html_js_1.NS.HTML); + p.framesetOk = false; + p.insertionMode = InsertionMode.IN_BODY; + break; + } + case html_js_1.TAG_ID.FRAMESET: { + p._insertElement(token, html_js_1.NS.HTML); + p.insertionMode = InsertionMode.IN_FRAMESET; + break; + } + case html_js_1.TAG_ID.BASE: + case html_js_1.TAG_ID.BASEFONT: + case html_js_1.TAG_ID.BGSOUND: + case html_js_1.TAG_ID.LINK: + case html_js_1.TAG_ID.META: + case html_js_1.TAG_ID.NOFRAMES: + case html_js_1.TAG_ID.SCRIPT: + case html_js_1.TAG_ID.STYLE: + case html_js_1.TAG_ID.TEMPLATE: + case html_js_1.TAG_ID.TITLE: { + p._err(token, error_codes_js_1.ERR.abandonedHeadElementChild); + p.openElements.push(p.headElement, html_js_1.TAG_ID.HEAD); + startTagInHead(p, token); + p.openElements.remove(p.headElement); + break; + } + case html_js_1.TAG_ID.HEAD: { + p._err(token, error_codes_js_1.ERR.misplacedStartTagForHeadElement); + break; + } + default: { + tokenAfterHead(p, token); + } } } - function endTagAfterHead(p, token) { - const tn = token.tagName; - - if (tn === $.BODY || tn === $.HTML || tn === $.BR) { - tokenAfterHead(p, token); - } else if (tn === $.TEMPLATE) { - endTagInHead(p, token); - } else { - p._err(ERR.endTagWithoutMatchingOpenElement); + switch (token.tagID) { + case html_js_1.TAG_ID.BODY: + case html_js_1.TAG_ID.HTML: + case html_js_1.TAG_ID.BR: { + tokenAfterHead(p, token); + break; + } + case html_js_1.TAG_ID.TEMPLATE: { + endTagInHead(p, token); + break; + } + default: { + p._err(token, error_codes_js_1.ERR.endTagWithoutMatchingOpenElement); + } } } - function tokenAfterHead(p, token) { - p._insertFakeElement($.BODY); - p.insertionMode = IN_BODY_MODE; - p._processToken(token); + p._insertFakeElement(html_js_1.TAG_NAMES.BODY, html_js_1.TAG_ID.BODY); + p.insertionMode = InsertionMode.IN_BODY; + modeInBody(p, token); } - // The "in body" insertion mode //------------------------------------------------------------------ +function modeInBody(p, token) { + switch (token.type) { + case token_js_1.TokenType.CHARACTER: { + characterInBody(p, token); + break; + } + case token_js_1.TokenType.WHITESPACE_CHARACTER: { + whitespaceCharacterInBody(p, token); + break; + } + case token_js_1.TokenType.COMMENT: { + appendComment(p, token); + break; + } + case token_js_1.TokenType.START_TAG: { + startTagInBody(p, token); + break; + } + case token_js_1.TokenType.END_TAG: { + endTagInBody(p, token); + break; + } + case token_js_1.TokenType.EOF: { + eofInBody(p, token); + break; + } + default: + // Do nothing + } +} function whitespaceCharacterInBody(p, token) { p._reconstructActiveFormattingElements(); p._insertCharacters(token); } - function characterInBody(p, token) { p._reconstructActiveFormattingElements(); p._insertCharacters(token); p.framesetOk = false; } - function htmlStartTagInBody(p, token) { if (p.openElements.tmplCount === 0) { p.treeAdapter.adoptAttributes(p.openElements.items[0], token.attrs); } } - function bodyStartTagInBody(p, token) { const bodyElement = p.openElements.tryPeekProperlyNestedBodyElement(); - if (bodyElement && p.openElements.tmplCount === 0) { p.framesetOk = false; p.treeAdapter.adoptAttributes(bodyElement, token.attrs); } } - function framesetStartTagInBody(p, token) { const bodyElement = p.openElements.tryPeekProperlyNestedBodyElement(); - if (p.framesetOk && bodyElement) { p.treeAdapter.detachNode(bodyElement); p.openElements.popAllUpToHtmlElement(); - p._insertElement(token, NS.HTML); - p.insertionMode = IN_FRAMESET_MODE; + p._insertElement(token, html_js_1.NS.HTML); + p.insertionMode = InsertionMode.IN_FRAMESET; } } - function addressStartTagInBody(p, token) { - if (p.openElements.hasInButtonScope($.P)) { + if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) { p._closePElement(); } - - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); } - function numberedHeaderStartTagInBody(p, token) { - if (p.openElements.hasInButtonScope($.P)) { + if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) { p._closePElement(); } - - const tn = p.openElements.currentTagName; - - if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) { + if ((0, html_js_1.isNumberedHeader)(p.openElements.currentTagId)) { p.openElements.pop(); } - - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); } - function preStartTagInBody(p, token) { - if (p.openElements.hasInButtonScope($.P)) { + if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) { p._closePElement(); } - - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); //NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move //on to the next one. (Newlines at the start of pre blocks are ignored as an authoring convenience.) p.skipNextNewLine = true; p.framesetOk = false; } - function formStartTagInBody(p, token) { const inTemplate = p.openElements.tmplCount > 0; - if (!p.formElement || inTemplate) { - if (p.openElements.hasInButtonScope($.P)) { + if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) { p._closePElement(); } - - p._insertElement(token, NS.HTML); - + p._insertElement(token, html_js_1.NS.HTML); if (!inTemplate) { p.formElement = p.openElements.current; } } } - function listItemStartTagInBody(p, token) { p.framesetOk = false; - - const tn = token.tagName; - + const tn = token.tagID; for (let i = p.openElements.stackTop; i >= 0; i--) { - const element = p.openElements.items[i]; - const elementTn = p.treeAdapter.getTagName(element); - let closeTn = null; - - if (tn === $.LI && elementTn === $.LI) { - closeTn = $.LI; - } else if ((tn === $.DD || tn === $.DT) && (elementTn === $.DD || elementTn === $.DT)) { - closeTn = elementTn; - } - - if (closeTn) { - p.openElements.generateImpliedEndTagsWithExclusion(closeTn); - p.openElements.popUntilTagNamePopped(closeTn); + const elementId = p.openElements.tagIDs[i]; + if ((tn === html_js_1.TAG_ID.LI && elementId === html_js_1.TAG_ID.LI) || + ((tn === html_js_1.TAG_ID.DD || tn === html_js_1.TAG_ID.DT) && (elementId === html_js_1.TAG_ID.DD || elementId === html_js_1.TAG_ID.DT))) { + p.openElements.generateImpliedEndTagsWithExclusion(elementId); + p.openElements.popUntilTagNamePopped(elementId); break; } - - if (elementTn !== $.ADDRESS && elementTn !== $.DIV && elementTn !== $.P && p._isSpecialElement(element)) { + if (elementId !== html_js_1.TAG_ID.ADDRESS && + elementId !== html_js_1.TAG_ID.DIV && + elementId !== html_js_1.TAG_ID.P && + p._isSpecialElement(p.openElements.items[i], elementId)) { break; } } - - if (p.openElements.hasInButtonScope($.P)) { + if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) { p._closePElement(); } - - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); } - function plaintextStartTagInBody(p, token) { - if (p.openElements.hasInButtonScope($.P)) { + if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) { p._closePElement(); } - - p._insertElement(token, NS.HTML); - p.tokenizer.state = Tokenizer.MODE.PLAINTEXT; + p._insertElement(token, html_js_1.NS.HTML); + p.tokenizer.state = index_js_1.TokenizerMode.PLAINTEXT; } - function buttonStartTagInBody(p, token) { - if (p.openElements.hasInScope($.BUTTON)) { + if (p.openElements.hasInScope(html_js_1.TAG_ID.BUTTON)) { p.openElements.generateImpliedEndTags(); - p.openElements.popUntilTagNamePopped($.BUTTON); + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.BUTTON); } - p._reconstructActiveFormattingElements(); - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); p.framesetOk = false; } - function aStartTagInBody(p, token) { - const activeElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName($.A); - + const activeElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName(html_js_1.TAG_NAMES.A); if (activeElementEntry) { callAdoptionAgency(p, token); p.openElements.remove(activeElementEntry.element); p.activeFormattingElements.removeEntry(activeElementEntry); } - p._reconstructActiveFormattingElements(); - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); p.activeFormattingElements.pushElement(p.openElements.current, token); } - function bStartTagInBody(p, token) { p._reconstructActiveFormattingElements(); - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); p.activeFormattingElements.pushElement(p.openElements.current, token); } - function nobrStartTagInBody(p, token) { p._reconstructActiveFormattingElements(); - - if (p.openElements.hasInScope($.NOBR)) { + if (p.openElements.hasInScope(html_js_1.TAG_ID.NOBR)) { callAdoptionAgency(p, token); p._reconstructActiveFormattingElements(); } - - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); p.activeFormattingElements.pushElement(p.openElements.current, token); } - function appletStartTagInBody(p, token) { p._reconstructActiveFormattingElements(); - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); p.activeFormattingElements.insertMarker(); p.framesetOk = false; } - function tableStartTagInBody(p, token) { - if ( - p.treeAdapter.getDocumentMode(p.document) !== HTML.DOCUMENT_MODE.QUIRKS && - p.openElements.hasInButtonScope($.P) - ) { + if (p.treeAdapter.getDocumentMode(p.document) !== html_js_1.DOCUMENT_MODE.QUIRKS && p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) { p._closePElement(); } - - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); p.framesetOk = false; - p.insertionMode = IN_TABLE_MODE; + p.insertionMode = InsertionMode.IN_TABLE; } - function areaStartTagInBody(p, token) { p._reconstructActiveFormattingElements(); - p._appendElement(token, NS.HTML); + p._appendElement(token, html_js_1.NS.HTML); p.framesetOk = false; token.ackSelfClosing = true; } - +function isHiddenInput(token) { + const inputType = (0, token_js_1.getTokenAttr)(token, html_js_1.ATTRS.TYPE); + return inputType != null && inputType.toLowerCase() === HIDDEN_INPUT_TYPE; +} function inputStartTagInBody(p, token) { p._reconstructActiveFormattingElements(); - p._appendElement(token, NS.HTML); - - const inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE); - - if (!inputType || inputType.toLowerCase() !== HIDDEN_INPUT_TYPE) { + p._appendElement(token, html_js_1.NS.HTML); + if (!isHiddenInput(token)) { p.framesetOk = false; } - token.ackSelfClosing = true; } - function paramStartTagInBody(p, token) { - p._appendElement(token, NS.HTML); + p._appendElement(token, html_js_1.NS.HTML); token.ackSelfClosing = true; } - function hrStartTagInBody(p, token) { - if (p.openElements.hasInButtonScope($.P)) { + if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) { p._closePElement(); } - - p._appendElement(token, NS.HTML); + p._appendElement(token, html_js_1.NS.HTML); p.framesetOk = false; token.ackSelfClosing = true; } - function imageStartTagInBody(p, token) { - token.tagName = $.IMG; + token.tagName = html_js_1.TAG_NAMES.IMG; + token.tagID = html_js_1.TAG_ID.IMG; areaStartTagInBody(p, token); } - function textareaStartTagInBody(p, token) { - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); //NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move //on to the next one. (Newlines at the start of textarea elements are ignored as an authoring convenience.) p.skipNextNewLine = true; - p.tokenizer.state = Tokenizer.MODE.RCDATA; + p.tokenizer.state = index_js_1.TokenizerMode.RCDATA; p.originalInsertionMode = p.insertionMode; p.framesetOk = false; - p.insertionMode = TEXT_MODE; + p.insertionMode = InsertionMode.TEXT; } - function xmpStartTagInBody(p, token) { - if (p.openElements.hasInButtonScope($.P)) { + if (p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) { p._closePElement(); } - p._reconstructActiveFormattingElements(); p.framesetOk = false; - p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); + p._switchToTextParsing(token, index_js_1.TokenizerMode.RAWTEXT); } - function iframeStartTagInBody(p, token) { p.framesetOk = false; - p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); + p._switchToTextParsing(token, index_js_1.TokenizerMode.RAWTEXT); } - //NOTE: here we assume that we always act as an user agent with enabled plugins, so we parse -//<noembed> as a rawtext. +//<noembed> as rawtext. function noembedStartTagInBody(p, token) { - p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT); + p._switchToTextParsing(token, index_js_1.TokenizerMode.RAWTEXT); } - function selectStartTagInBody(p, token) { p._reconstructActiveFormattingElements(); - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); p.framesetOk = false; - - if ( - p.insertionMode === IN_TABLE_MODE || - p.insertionMode === IN_CAPTION_MODE || - p.insertionMode === IN_TABLE_BODY_MODE || - p.insertionMode === IN_ROW_MODE || - p.insertionMode === IN_CELL_MODE - ) { - p.insertionMode = IN_SELECT_IN_TABLE_MODE; - } else { - p.insertionMode = IN_SELECT_MODE; - } + p.insertionMode = + p.insertionMode === InsertionMode.IN_TABLE || + p.insertionMode === InsertionMode.IN_CAPTION || + p.insertionMode === InsertionMode.IN_TABLE_BODY || + p.insertionMode === InsertionMode.IN_ROW || + p.insertionMode === InsertionMode.IN_CELL + ? InsertionMode.IN_SELECT_IN_TABLE + : InsertionMode.IN_SELECT; } - function optgroupStartTagInBody(p, token) { - if (p.openElements.currentTagName === $.OPTION) { + if (p.openElements.currentTagId === html_js_1.TAG_ID.OPTION) { p.openElements.pop(); } - p._reconstructActiveFormattingElements(); - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); } - function rbStartTagInBody(p, token) { - if (p.openElements.hasInScope($.RUBY)) { + if (p.openElements.hasInScope(html_js_1.TAG_ID.RUBY)) { p.openElements.generateImpliedEndTags(); } - - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); } - function rtStartTagInBody(p, token) { - if (p.openElements.hasInScope($.RUBY)) { - p.openElements.generateImpliedEndTagsWithExclusion($.RTC); - } - - p._insertElement(token, NS.HTML); -} - -function menuStartTagInBody(p, token) { - if (p.openElements.hasInButtonScope($.P)) { - p._closePElement(); + if (p.openElements.hasInScope(html_js_1.TAG_ID.RUBY)) { + p.openElements.generateImpliedEndTagsWithExclusion(html_js_1.TAG_ID.RTC); } - - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); } - function mathStartTagInBody(p, token) { p._reconstructActiveFormattingElements(); - foreignContent.adjustTokenMathMLAttrs(token); foreignContent.adjustTokenXMLAttrs(token); - if (token.selfClosing) { - p._appendElement(token, NS.MATHML); - } else { - p._insertElement(token, NS.MATHML); + p._appendElement(token, html_js_1.NS.MATHML); + } + else { + p._insertElement(token, html_js_1.NS.MATHML); } - token.ackSelfClosing = true; } - function svgStartTagInBody(p, token) { p._reconstructActiveFormattingElements(); - foreignContent.adjustTokenSVGAttrs(token); foreignContent.adjustTokenXMLAttrs(token); - if (token.selfClosing) { - p._appendElement(token, NS.SVG); - } else { - p._insertElement(token, NS.SVG); + p._appendElement(token, html_js_1.NS.SVG); + } + else { + p._insertElement(token, html_js_1.NS.SVG); } - token.ackSelfClosing = true; } - function genericStartTagInBody(p, token) { p._reconstructActiveFormattingElements(); - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); } - -//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here. -//It's faster than using dictionary. function startTagInBody(p, token) { - const tn = token.tagName; - - switch (tn.length) { - case 1: - if (tn === $.I || tn === $.S || tn === $.B || tn === $.U) { - bStartTagInBody(p, token); - } else if (tn === $.P) { - addressStartTagInBody(p, token); - } else if (tn === $.A) { - aStartTagInBody(p, token); - } else { - genericStartTagInBody(p, token); - } - + switch (token.tagID) { + case html_js_1.TAG_ID.I: + case html_js_1.TAG_ID.S: + case html_js_1.TAG_ID.B: + case html_js_1.TAG_ID.U: + case html_js_1.TAG_ID.EM: + case html_js_1.TAG_ID.TT: + case html_js_1.TAG_ID.BIG: + case html_js_1.TAG_ID.CODE: + case html_js_1.TAG_ID.FONT: + case html_js_1.TAG_ID.SMALL: + case html_js_1.TAG_ID.STRIKE: + case html_js_1.TAG_ID.STRONG: { + bStartTagInBody(p, token); break; - - case 2: - if (tn === $.DL || tn === $.OL || tn === $.UL) { - addressStartTagInBody(p, token); - } else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) { - numberedHeaderStartTagInBody(p, token); - } else if (tn === $.LI || tn === $.DD || tn === $.DT) { - listItemStartTagInBody(p, token); - } else if (tn === $.EM || tn === $.TT) { - bStartTagInBody(p, token); - } else if (tn === $.BR) { - areaStartTagInBody(p, token); - } else if (tn === $.HR) { - hrStartTagInBody(p, token); - } else if (tn === $.RB) { - rbStartTagInBody(p, token); - } else if (tn === $.RT || tn === $.RP) { - rtStartTagInBody(p, token); - } else if (tn !== $.TH && tn !== $.TD && tn !== $.TR) { - genericStartTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.A: { + aStartTagInBody(p, token); break; - - case 3: - if (tn === $.DIV || tn === $.DIR || tn === $.NAV) { - addressStartTagInBody(p, token); - } else if (tn === $.PRE) { - preStartTagInBody(p, token); - } else if (tn === $.BIG) { - bStartTagInBody(p, token); - } else if (tn === $.IMG || tn === $.WBR) { - areaStartTagInBody(p, token); - } else if (tn === $.XMP) { - xmpStartTagInBody(p, token); - } else if (tn === $.SVG) { - svgStartTagInBody(p, token); - } else if (tn === $.RTC) { - rbStartTagInBody(p, token); - } else if (tn !== $.COL) { - genericStartTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.H1: + case html_js_1.TAG_ID.H2: + case html_js_1.TAG_ID.H3: + case html_js_1.TAG_ID.H4: + case html_js_1.TAG_ID.H5: + case html_js_1.TAG_ID.H6: { + numberedHeaderStartTagInBody(p, token); break; - - case 4: - if (tn === $.HTML) { - htmlStartTagInBody(p, token); - } else if (tn === $.BASE || tn === $.LINK || tn === $.META) { - startTagInHead(p, token); - } else if (tn === $.BODY) { - bodyStartTagInBody(p, token); - } else if (tn === $.MAIN || tn === $.MENU) { - addressStartTagInBody(p, token); - } else if (tn === $.FORM) { - formStartTagInBody(p, token); - } else if (tn === $.CODE || tn === $.FONT) { - bStartTagInBody(p, token); - } else if (tn === $.NOBR) { - nobrStartTagInBody(p, token); - } else if (tn === $.AREA) { - areaStartTagInBody(p, token); - } else if (tn === $.MATH) { - mathStartTagInBody(p, token); - } else if (tn === $.MENU) { - menuStartTagInBody(p, token); - } else if (tn !== $.HEAD) { - genericStartTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.P: + case html_js_1.TAG_ID.DL: + case html_js_1.TAG_ID.OL: + case html_js_1.TAG_ID.UL: + case html_js_1.TAG_ID.DIV: + case html_js_1.TAG_ID.DIR: + case html_js_1.TAG_ID.NAV: + case html_js_1.TAG_ID.MAIN: + case html_js_1.TAG_ID.MENU: + case html_js_1.TAG_ID.ASIDE: + case html_js_1.TAG_ID.CENTER: + case html_js_1.TAG_ID.FIGURE: + case html_js_1.TAG_ID.FOOTER: + case html_js_1.TAG_ID.HEADER: + case html_js_1.TAG_ID.HGROUP: + case html_js_1.TAG_ID.DIALOG: + case html_js_1.TAG_ID.DETAILS: + case html_js_1.TAG_ID.ADDRESS: + case html_js_1.TAG_ID.ARTICLE: + case html_js_1.TAG_ID.SECTION: + case html_js_1.TAG_ID.SUMMARY: + case html_js_1.TAG_ID.FIELDSET: + case html_js_1.TAG_ID.BLOCKQUOTE: + case html_js_1.TAG_ID.FIGCAPTION: { + addressStartTagInBody(p, token); break; - - case 5: - if (tn === $.STYLE || tn === $.TITLE) { - startTagInHead(p, token); - } else if (tn === $.ASIDE) { - addressStartTagInBody(p, token); - } else if (tn === $.SMALL) { - bStartTagInBody(p, token); - } else if (tn === $.TABLE) { - tableStartTagInBody(p, token); - } else if (tn === $.EMBED) { - areaStartTagInBody(p, token); - } else if (tn === $.INPUT) { - inputStartTagInBody(p, token); - } else if (tn === $.PARAM || tn === $.TRACK) { - paramStartTagInBody(p, token); - } else if (tn === $.IMAGE) { - imageStartTagInBody(p, token); - } else if (tn !== $.FRAME && tn !== $.TBODY && tn !== $.TFOOT && tn !== $.THEAD) { - genericStartTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.LI: + case html_js_1.TAG_ID.DD: + case html_js_1.TAG_ID.DT: { + listItemStartTagInBody(p, token); break; - - case 6: - if (tn === $.SCRIPT) { - startTagInHead(p, token); - } else if ( - tn === $.CENTER || - tn === $.FIGURE || - tn === $.FOOTER || - tn === $.HEADER || - tn === $.HGROUP || - tn === $.DIALOG - ) { - addressStartTagInBody(p, token); - } else if (tn === $.BUTTON) { - buttonStartTagInBody(p, token); - } else if (tn === $.STRIKE || tn === $.STRONG) { - bStartTagInBody(p, token); - } else if (tn === $.APPLET || tn === $.OBJECT) { - appletStartTagInBody(p, token); - } else if (tn === $.KEYGEN) { - areaStartTagInBody(p, token); - } else if (tn === $.SOURCE) { - paramStartTagInBody(p, token); - } else if (tn === $.IFRAME) { - iframeStartTagInBody(p, token); - } else if (tn === $.SELECT) { - selectStartTagInBody(p, token); - } else if (tn === $.OPTION) { - optgroupStartTagInBody(p, token); - } else { - genericStartTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.BR: + case html_js_1.TAG_ID.IMG: + case html_js_1.TAG_ID.WBR: + case html_js_1.TAG_ID.AREA: + case html_js_1.TAG_ID.EMBED: + case html_js_1.TAG_ID.KEYGEN: { + areaStartTagInBody(p, token); break; - - case 7: - if (tn === $.BGSOUND) { - startTagInHead(p, token); - } else if ( - tn === $.DETAILS || - tn === $.ADDRESS || - tn === $.ARTICLE || - tn === $.SECTION || - tn === $.SUMMARY - ) { - addressStartTagInBody(p, token); - } else if (tn === $.LISTING) { - preStartTagInBody(p, token); - } else if (tn === $.MARQUEE) { - appletStartTagInBody(p, token); - } else if (tn === $.NOEMBED) { + } + case html_js_1.TAG_ID.HR: { + hrStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.RB: + case html_js_1.TAG_ID.RTC: { + rbStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.RT: + case html_js_1.TAG_ID.RP: { + rtStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.PRE: + case html_js_1.TAG_ID.LISTING: { + preStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.XMP: { + xmpStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.SVG: { + svgStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.HTML: { + htmlStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.BASE: + case html_js_1.TAG_ID.LINK: + case html_js_1.TAG_ID.META: + case html_js_1.TAG_ID.STYLE: + case html_js_1.TAG_ID.TITLE: + case html_js_1.TAG_ID.SCRIPT: + case html_js_1.TAG_ID.BGSOUND: + case html_js_1.TAG_ID.BASEFONT: + case html_js_1.TAG_ID.TEMPLATE: { + startTagInHead(p, token); + break; + } + case html_js_1.TAG_ID.BODY: { + bodyStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.FORM: { + formStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.NOBR: { + nobrStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.MATH: { + mathStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.TABLE: { + tableStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.INPUT: { + inputStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.PARAM: + case html_js_1.TAG_ID.TRACK: + case html_js_1.TAG_ID.SOURCE: { + paramStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.IMAGE: { + imageStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.BUTTON: { + buttonStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.APPLET: + case html_js_1.TAG_ID.OBJECT: + case html_js_1.TAG_ID.MARQUEE: { + appletStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.IFRAME: { + iframeStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.SELECT: { + selectStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.OPTION: + case html_js_1.TAG_ID.OPTGROUP: { + optgroupStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.NOEMBED: { + noembedStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.FRAMESET: { + framesetStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.TEXTAREA: { + textareaStartTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.NOSCRIPT: { + if (p.options.scriptingEnabled) { noembedStartTagInBody(p, token); - } else if (tn !== $.CAPTION) { - genericStartTagInBody(p, token); } - - break; - - case 8: - if (tn === $.BASEFONT) { - startTagInHead(p, token); - } else if (tn === $.FRAMESET) { - framesetStartTagInBody(p, token); - } else if (tn === $.FIELDSET) { - addressStartTagInBody(p, token); - } else if (tn === $.TEXTAREA) { - textareaStartTagInBody(p, token); - } else if (tn === $.TEMPLATE) { - startTagInHead(p, token); - } else if (tn === $.NOSCRIPT) { - if (p.options.scriptingEnabled) { - noembedStartTagInBody(p, token); - } else { - genericStartTagInBody(p, token); - } - } else if (tn === $.OPTGROUP) { - optgroupStartTagInBody(p, token); - } else if (tn !== $.COLGROUP) { + else { genericStartTagInBody(p, token); } - break; - - case 9: - if (tn === $.PLAINTEXT) { - plaintextStartTagInBody(p, token); - } else { - genericStartTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.PLAINTEXT: { + plaintextStartTagInBody(p, token); break; - - case 10: - if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION) { - addressStartTagInBody(p, token); - } else { - genericStartTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.COL: + case html_js_1.TAG_ID.TH: + case html_js_1.TAG_ID.TD: + case html_js_1.TAG_ID.TR: + case html_js_1.TAG_ID.HEAD: + case html_js_1.TAG_ID.FRAME: + case html_js_1.TAG_ID.TBODY: + case html_js_1.TAG_ID.TFOOT: + case html_js_1.TAG_ID.THEAD: + case html_js_1.TAG_ID.CAPTION: + case html_js_1.TAG_ID.COLGROUP: { + // Ignore token break; - - default: + } + default: { genericStartTagInBody(p, token); + } } } - -function bodyEndTagInBody(p) { - if (p.openElements.hasInScope($.BODY)) { - p.insertionMode = AFTER_BODY_MODE; +function bodyEndTagInBody(p, token) { + if (p.openElements.hasInScope(html_js_1.TAG_ID.BODY)) { + p.insertionMode = InsertionMode.AFTER_BODY; + //NOTE: <body> is never popped from the stack, so we need to updated + //the end location explicitly. + if (p.options.sourceCodeLocationInfo) { + const bodyElement = p.openElements.tryPeekProperlyNestedBodyElement(); + if (bodyElement) { + p._setEndLocation(bodyElement, token); + } + } } } - function htmlEndTagInBody(p, token) { - if (p.openElements.hasInScope($.BODY)) { - p.insertionMode = AFTER_BODY_MODE; - p._processToken(token); + if (p.openElements.hasInScope(html_js_1.TAG_ID.BODY)) { + p.insertionMode = InsertionMode.AFTER_BODY; + endTagAfterBody(p, token); } } - function addressEndTagInBody(p, token) { - const tn = token.tagName; - + const tn = token.tagID; if (p.openElements.hasInScope(tn)) { p.openElements.generateImpliedEndTags(); p.openElements.popUntilTagNamePopped(tn); } } - function formEndTagInBody(p) { const inTemplate = p.openElements.tmplCount > 0; - const formElement = p.formElement; - + const { formElement } = p; if (!inTemplate) { p.formElement = null; } - - if ((formElement || inTemplate) && p.openElements.hasInScope($.FORM)) { + if ((formElement || inTemplate) && p.openElements.hasInScope(html_js_1.TAG_ID.FORM)) { p.openElements.generateImpliedEndTags(); - if (inTemplate) { - p.openElements.popUntilTagNamePopped($.FORM); - } else { + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.FORM); + } + else if (formElement) { p.openElements.remove(formElement); } } } - function pEndTagInBody(p) { - if (!p.openElements.hasInButtonScope($.P)) { - p._insertFakeElement($.P); + if (!p.openElements.hasInButtonScope(html_js_1.TAG_ID.P)) { + p._insertFakeElement(html_js_1.TAG_NAMES.P, html_js_1.TAG_ID.P); } - p._closePElement(); } - function liEndTagInBody(p) { - if (p.openElements.hasInListItemScope($.LI)) { - p.openElements.generateImpliedEndTagsWithExclusion($.LI); - p.openElements.popUntilTagNamePopped($.LI); + if (p.openElements.hasInListItemScope(html_js_1.TAG_ID.LI)) { + p.openElements.generateImpliedEndTagsWithExclusion(html_js_1.TAG_ID.LI); + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.LI); } } - function ddEndTagInBody(p, token) { - const tn = token.tagName; - + const tn = token.tagID; if (p.openElements.hasInScope(tn)) { p.openElements.generateImpliedEndTagsWithExclusion(tn); p.openElements.popUntilTagNamePopped(tn); } } - function numberedHeaderEndTagInBody(p) { if (p.openElements.hasNumberedHeaderInScope()) { p.openElements.generateImpliedEndTags(); p.openElements.popUntilNumberedHeaderPopped(); } } - function appletEndTagInBody(p, token) { - const tn = token.tagName; - + const tn = token.tagID; if (p.openElements.hasInScope(tn)) { p.openElements.generateImpliedEndTags(); p.openElements.popUntilTagNamePopped(tn); p.activeFormattingElements.clearToLastMarker(); } } - function brEndTagInBody(p) { p._reconstructActiveFormattingElements(); - p._insertFakeElement($.BR); + p._insertFakeElement(html_js_1.TAG_NAMES.BR, html_js_1.TAG_ID.BR); p.openElements.pop(); p.framesetOk = false; } - function genericEndTagInBody(p, token) { const tn = token.tagName; - + const tid = token.tagID; for (let i = p.openElements.stackTop; i > 0; i--) { const element = p.openElements.items[i]; - - if (p.treeAdapter.getTagName(element) === tn) { - p.openElements.generateImpliedEndTagsWithExclusion(tn); - p.openElements.popUntilElementPopped(element); + const elementId = p.openElements.tagIDs[i]; + // Compare the tag name here, as the tag might not be a known tag with an ID. + if (tid === elementId && (tid !== html_js_1.TAG_ID.UNKNOWN || p.treeAdapter.getTagName(element) === tn)) { + p.openElements.generateImpliedEndTagsWithExclusion(tid); + if (p.openElements.stackTop >= i) + p.openElements.shortenToLength(i); break; } - - if (p._isSpecialElement(element)) { + if (p._isSpecialElement(element, elementId)) { break; } } } - -//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here. -//It's faster than using dictionary. function endTagInBody(p, token) { - const tn = token.tagName; - - switch (tn.length) { - case 1: - if (tn === $.A || tn === $.B || tn === $.I || tn === $.S || tn === $.U) { - callAdoptionAgency(p, token); - } else if (tn === $.P) { - pEndTagInBody(p, token); - } else { - genericEndTagInBody(p, token); - } - + switch (token.tagID) { + case html_js_1.TAG_ID.A: + case html_js_1.TAG_ID.B: + case html_js_1.TAG_ID.I: + case html_js_1.TAG_ID.S: + case html_js_1.TAG_ID.U: + case html_js_1.TAG_ID.EM: + case html_js_1.TAG_ID.TT: + case html_js_1.TAG_ID.BIG: + case html_js_1.TAG_ID.CODE: + case html_js_1.TAG_ID.FONT: + case html_js_1.TAG_ID.NOBR: + case html_js_1.TAG_ID.SMALL: + case html_js_1.TAG_ID.STRIKE: + case html_js_1.TAG_ID.STRONG: { + callAdoptionAgency(p, token); break; - - case 2: - if (tn === $.DL || tn === $.UL || tn === $.OL) { - addressEndTagInBody(p, token); - } else if (tn === $.LI) { - liEndTagInBody(p, token); - } else if (tn === $.DD || tn === $.DT) { - ddEndTagInBody(p, token); - } else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) { - numberedHeaderEndTagInBody(p, token); - } else if (tn === $.BR) { - brEndTagInBody(p, token); - } else if (tn === $.EM || tn === $.TT) { - callAdoptionAgency(p, token); - } else { - genericEndTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.P: { + pEndTagInBody(p); break; - - case 3: - if (tn === $.BIG) { - callAdoptionAgency(p, token); - } else if (tn === $.DIR || tn === $.DIV || tn === $.NAV || tn === $.PRE) { - addressEndTagInBody(p, token); - } else { - genericEndTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.DL: + case html_js_1.TAG_ID.UL: + case html_js_1.TAG_ID.OL: + case html_js_1.TAG_ID.DIR: + case html_js_1.TAG_ID.DIV: + case html_js_1.TAG_ID.NAV: + case html_js_1.TAG_ID.PRE: + case html_js_1.TAG_ID.MAIN: + case html_js_1.TAG_ID.MENU: + case html_js_1.TAG_ID.ASIDE: + case html_js_1.TAG_ID.CENTER: + case html_js_1.TAG_ID.FIGURE: + case html_js_1.TAG_ID.FOOTER: + case html_js_1.TAG_ID.HEADER: + case html_js_1.TAG_ID.HGROUP: + case html_js_1.TAG_ID.DIALOG: + case html_js_1.TAG_ID.ADDRESS: + case html_js_1.TAG_ID.ARTICLE: + case html_js_1.TAG_ID.DETAILS: + case html_js_1.TAG_ID.SECTION: + case html_js_1.TAG_ID.SUMMARY: + case html_js_1.TAG_ID.LISTING: + case html_js_1.TAG_ID.FIELDSET: + case html_js_1.TAG_ID.BLOCKQUOTE: + case html_js_1.TAG_ID.FIGCAPTION: { + addressEndTagInBody(p, token); break; - - case 4: - if (tn === $.BODY) { - bodyEndTagInBody(p, token); - } else if (tn === $.HTML) { - htmlEndTagInBody(p, token); - } else if (tn === $.FORM) { - formEndTagInBody(p, token); - } else if (tn === $.CODE || tn === $.FONT || tn === $.NOBR) { - callAdoptionAgency(p, token); - } else if (tn === $.MAIN || tn === $.MENU) { - addressEndTagInBody(p, token); - } else { - genericEndTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.LI: { + liEndTagInBody(p); break; - - case 5: - if (tn === $.ASIDE) { - addressEndTagInBody(p, token); - } else if (tn === $.SMALL) { - callAdoptionAgency(p, token); - } else { - genericEndTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.DD: + case html_js_1.TAG_ID.DT: { + ddEndTagInBody(p, token); break; - - case 6: - if ( - tn === $.CENTER || - tn === $.FIGURE || - tn === $.FOOTER || - tn === $.HEADER || - tn === $.HGROUP || - tn === $.DIALOG - ) { - addressEndTagInBody(p, token); - } else if (tn === $.APPLET || tn === $.OBJECT) { - appletEndTagInBody(p, token); - } else if (tn === $.STRIKE || tn === $.STRONG) { - callAdoptionAgency(p, token); - } else { - genericEndTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.H1: + case html_js_1.TAG_ID.H2: + case html_js_1.TAG_ID.H3: + case html_js_1.TAG_ID.H4: + case html_js_1.TAG_ID.H5: + case html_js_1.TAG_ID.H6: { + numberedHeaderEndTagInBody(p); break; - - case 7: - if ( - tn === $.ADDRESS || - tn === $.ARTICLE || - tn === $.DETAILS || - tn === $.SECTION || - tn === $.SUMMARY || - tn === $.LISTING - ) { - addressEndTagInBody(p, token); - } else if (tn === $.MARQUEE) { - appletEndTagInBody(p, token); - } else { - genericEndTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.BR: { + brEndTagInBody(p); break; - - case 8: - if (tn === $.FIELDSET) { - addressEndTagInBody(p, token); - } else if (tn === $.TEMPLATE) { - endTagInHead(p, token); - } else { - genericEndTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.BODY: { + bodyEndTagInBody(p, token); break; - - case 10: - if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION) { - addressEndTagInBody(p, token); - } else { - genericEndTagInBody(p, token); - } - + } + case html_js_1.TAG_ID.HTML: { + htmlEndTagInBody(p, token); break; - - default: + } + case html_js_1.TAG_ID.FORM: { + formEndTagInBody(p); + break; + } + case html_js_1.TAG_ID.APPLET: + case html_js_1.TAG_ID.OBJECT: + case html_js_1.TAG_ID.MARQUEE: { + appletEndTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.TEMPLATE: { + endTagInHead(p, token); + break; + } + default: { genericEndTagInBody(p, token); + } } } - function eofInBody(p, token) { - if (p.tmplInsertionModeStackTop > -1) { + if (p.tmplInsertionModeStack.length > 0) { eofInTemplate(p, token); - } else { - p.stopped = true; + } + else { + stopParsing(p, token); } } - // The "text" insertion mode //------------------------------------------------------------------ function endTagInText(p, token) { - if (token.tagName === $.SCRIPT) { - p.pendingScript = p.openElements.current; + var _a; + if (token.tagID === html_js_1.TAG_ID.SCRIPT) { + (_a = p.scriptHandler) === null || _a === void 0 ? void 0 : _a.call(p, p.openElements.current); } - p.openElements.pop(); p.insertionMode = p.originalInsertionMode; } - function eofInText(p, token) { - p._err(ERR.eofInElementThatCanContainOnlyText); + p._err(token, error_codes_js_1.ERR.eofInElementThatCanContainOnlyText); p.openElements.pop(); p.insertionMode = p.originalInsertionMode; - p._processToken(token); + p.onEof(token); } - // The "in table" insertion mode //------------------------------------------------------------------ function characterInTable(p, token) { - const curTn = p.openElements.currentTagName; - - if (curTn === $.TABLE || curTn === $.TBODY || curTn === $.TFOOT || curTn === $.THEAD || curTn === $.TR) { - p.pendingCharacterTokens = []; + if (TABLE_STRUCTURE_TAGS.has(p.openElements.currentTagId)) { + p.pendingCharacterTokens.length = 0; p.hasNonWhitespacePendingCharacterToken = false; p.originalInsertionMode = p.insertionMode; - p.insertionMode = IN_TABLE_TEXT_MODE; - p._processToken(token); - } else { + p.insertionMode = InsertionMode.IN_TABLE_TEXT; + switch (token.type) { + case token_js_1.TokenType.CHARACTER: { + characterInTableText(p, token); + break; + } + case token_js_1.TokenType.WHITESPACE_CHARACTER: { + whitespaceCharacterInTableText(p, token); + break; + } + // Ignore null + } + } + else { tokenInTable(p, token); } } - function captionStartTagInTable(p, token) { p.openElements.clearBackToTableContext(); p.activeFormattingElements.insertMarker(); - p._insertElement(token, NS.HTML); - p.insertionMode = IN_CAPTION_MODE; + p._insertElement(token, html_js_1.NS.HTML); + p.insertionMode = InsertionMode.IN_CAPTION; } - function colgroupStartTagInTable(p, token) { p.openElements.clearBackToTableContext(); - p._insertElement(token, NS.HTML); - p.insertionMode = IN_COLUMN_GROUP_MODE; + p._insertElement(token, html_js_1.NS.HTML); + p.insertionMode = InsertionMode.IN_COLUMN_GROUP; } - function colStartTagInTable(p, token) { p.openElements.clearBackToTableContext(); - p._insertFakeElement($.COLGROUP); - p.insertionMode = IN_COLUMN_GROUP_MODE; - p._processToken(token); + p._insertFakeElement(html_js_1.TAG_NAMES.COLGROUP, html_js_1.TAG_ID.COLGROUP); + p.insertionMode = InsertionMode.IN_COLUMN_GROUP; + startTagInColumnGroup(p, token); } - function tbodyStartTagInTable(p, token) { p.openElements.clearBackToTableContext(); - p._insertElement(token, NS.HTML); - p.insertionMode = IN_TABLE_BODY_MODE; + p._insertElement(token, html_js_1.NS.HTML); + p.insertionMode = InsertionMode.IN_TABLE_BODY; } - function tdStartTagInTable(p, token) { p.openElements.clearBackToTableContext(); - p._insertFakeElement($.TBODY); - p.insertionMode = IN_TABLE_BODY_MODE; - p._processToken(token); + p._insertFakeElement(html_js_1.TAG_NAMES.TBODY, html_js_1.TAG_ID.TBODY); + p.insertionMode = InsertionMode.IN_TABLE_BODY; + startTagInTableBody(p, token); } - function tableStartTagInTable(p, token) { - if (p.openElements.hasInTableScope($.TABLE)) { - p.openElements.popUntilTagNamePopped($.TABLE); + if (p.openElements.hasInTableScope(html_js_1.TAG_ID.TABLE)) { + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.TABLE); p._resetInsertionMode(); - p._processToken(token); + p._processStartTag(token); } } - function inputStartTagInTable(p, token) { - const inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE); - - if (inputType && inputType.toLowerCase() === HIDDEN_INPUT_TYPE) { - p._appendElement(token, NS.HTML); - } else { + if (isHiddenInput(token)) { + p._appendElement(token, html_js_1.NS.HTML); + } + else { tokenInTable(p, token); } - token.ackSelfClosing = true; } - function formStartTagInTable(p, token) { if (!p.formElement && p.openElements.tmplCount === 0) { - p._insertElement(token, NS.HTML); + p._insertElement(token, html_js_1.NS.HTML); p.formElement = p.openElements.current; p.openElements.pop(); } } - function startTagInTable(p, token) { - const tn = token.tagName; - - switch (tn.length) { - case 2: - if (tn === $.TD || tn === $.TH || tn === $.TR) { - tdStartTagInTable(p, token); - } else { - tokenInTable(p, token); - } - + switch (token.tagID) { + case html_js_1.TAG_ID.TD: + case html_js_1.TAG_ID.TH: + case html_js_1.TAG_ID.TR: { + tdStartTagInTable(p, token); break; - - case 3: - if (tn === $.COL) { - colStartTagInTable(p, token); - } else { - tokenInTable(p, token); - } - + } + case html_js_1.TAG_ID.STYLE: + case html_js_1.TAG_ID.SCRIPT: + case html_js_1.TAG_ID.TEMPLATE: { + startTagInHead(p, token); break; - - case 4: - if (tn === $.FORM) { - formStartTagInTable(p, token); - } else { - tokenInTable(p, token); - } - + } + case html_js_1.TAG_ID.COL: { + colStartTagInTable(p, token); break; - - case 5: - if (tn === $.TABLE) { - tableStartTagInTable(p, token); - } else if (tn === $.STYLE) { - startTagInHead(p, token); - } else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) { - tbodyStartTagInTable(p, token); - } else if (tn === $.INPUT) { - inputStartTagInTable(p, token); - } else { - tokenInTable(p, token); - } - + } + case html_js_1.TAG_ID.FORM: { + formStartTagInTable(p, token); break; - - case 6: - if (tn === $.SCRIPT) { - startTagInHead(p, token); - } else { - tokenInTable(p, token); - } - + } + case html_js_1.TAG_ID.TABLE: { + tableStartTagInTable(p, token); break; - - case 7: - if (tn === $.CAPTION) { - captionStartTagInTable(p, token); - } else { - tokenInTable(p, token); - } - + } + case html_js_1.TAG_ID.TBODY: + case html_js_1.TAG_ID.TFOOT: + case html_js_1.TAG_ID.THEAD: { + tbodyStartTagInTable(p, token); break; - - case 8: - if (tn === $.COLGROUP) { - colgroupStartTagInTable(p, token); - } else if (tn === $.TEMPLATE) { - startTagInHead(p, token); - } else { - tokenInTable(p, token); - } - + } + case html_js_1.TAG_ID.INPUT: { + inputStartTagInTable(p, token); break; - - default: + } + case html_js_1.TAG_ID.CAPTION: { + captionStartTagInTable(p, token); + break; + } + case html_js_1.TAG_ID.COLGROUP: { + colgroupStartTagInTable(p, token); + break; + } + default: { tokenInTable(p, token); + } } } - function endTagInTable(p, token) { - const tn = token.tagName; - - if (tn === $.TABLE) { - if (p.openElements.hasInTableScope($.TABLE)) { - p.openElements.popUntilTagNamePopped($.TABLE); - p._resetInsertionMode(); + switch (token.tagID) { + case html_js_1.TAG_ID.TABLE: { + if (p.openElements.hasInTableScope(html_js_1.TAG_ID.TABLE)) { + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.TABLE); + p._resetInsertionMode(); + } + break; + } + case html_js_1.TAG_ID.TEMPLATE: { + endTagInHead(p, token); + break; + } + case html_js_1.TAG_ID.BODY: + case html_js_1.TAG_ID.CAPTION: + case html_js_1.TAG_ID.COL: + case html_js_1.TAG_ID.COLGROUP: + case html_js_1.TAG_ID.HTML: + case html_js_1.TAG_ID.TBODY: + case html_js_1.TAG_ID.TD: + case html_js_1.TAG_ID.TFOOT: + case html_js_1.TAG_ID.TH: + case html_js_1.TAG_ID.THEAD: + case html_js_1.TAG_ID.TR: { + // Ignore token + break; + } + default: { + tokenInTable(p, token); } - } else if (tn === $.TEMPLATE) { - endTagInHead(p, token); - } else if ( - tn !== $.BODY && - tn !== $.CAPTION && - tn !== $.COL && - tn !== $.COLGROUP && - tn !== $.HTML && - tn !== $.TBODY && - tn !== $.TD && - tn !== $.TFOOT && - tn !== $.TH && - tn !== $.THEAD && - tn !== $.TR - ) { - tokenInTable(p, token); } } - function tokenInTable(p, token) { const savedFosterParentingState = p.fosterParentingEnabled; - p.fosterParentingEnabled = true; - p._processTokenInBodyMode(token); + // Process token in `In Body` mode + modeInBody(p, token); p.fosterParentingEnabled = savedFosterParentingState; } - // The "in table text" insertion mode //------------------------------------------------------------------ function whitespaceCharacterInTableText(p, token) { p.pendingCharacterTokens.push(token); } - function characterInTableText(p, token) { p.pendingCharacterTokens.push(token); p.hasNonWhitespacePendingCharacterToken = true; } - function tokenInTableText(p, token) { let i = 0; - if (p.hasNonWhitespacePendingCharacterToken) { for (; i < p.pendingCharacterTokens.length; i++) { tokenInTable(p, p.pendingCharacterTokens[i]); } - } else { + } + else { for (; i < p.pendingCharacterTokens.length; i++) { p._insertCharacters(p.pendingCharacterTokens[i]); } } - p.insertionMode = p.originalInsertionMode; p._processToken(token); } - // The "in caption" insertion mode //------------------------------------------------------------------ +const TABLE_VOID_ELEMENTS = new Set([html_js_1.TAG_ID.CAPTION, html_js_1.TAG_ID.COL, html_js_1.TAG_ID.COLGROUP, html_js_1.TAG_ID.TBODY, html_js_1.TAG_ID.TD, html_js_1.TAG_ID.TFOOT, html_js_1.TAG_ID.TH, html_js_1.TAG_ID.THEAD, html_js_1.TAG_ID.TR]); function startTagInCaption(p, token) { - const tn = token.tagName; - - if ( - tn === $.CAPTION || - tn === $.COL || - tn === $.COLGROUP || - tn === $.TBODY || - tn === $.TD || - tn === $.TFOOT || - tn === $.TH || - tn === $.THEAD || - tn === $.TR - ) { - if (p.openElements.hasInTableScope($.CAPTION)) { + const tn = token.tagID; + if (TABLE_VOID_ELEMENTS.has(tn)) { + if (p.openElements.hasInTableScope(html_js_1.TAG_ID.CAPTION)) { p.openElements.generateImpliedEndTags(); - p.openElements.popUntilTagNamePopped($.CAPTION); + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.CAPTION); p.activeFormattingElements.clearToLastMarker(); - p.insertionMode = IN_TABLE_MODE; - p._processToken(token); + p.insertionMode = InsertionMode.IN_TABLE; + startTagInTable(p, token); } - } else { + } + else { startTagInBody(p, token); } } - function endTagInCaption(p, token) { - const tn = token.tagName; - - if (tn === $.CAPTION || tn === $.TABLE) { - if (p.openElements.hasInTableScope($.CAPTION)) { - p.openElements.generateImpliedEndTags(); - p.openElements.popUntilTagNamePopped($.CAPTION); - p.activeFormattingElements.clearToLastMarker(); - p.insertionMode = IN_TABLE_MODE; - - if (tn === $.TABLE) { - p._processToken(token); + const tn = token.tagID; + switch (tn) { + case html_js_1.TAG_ID.CAPTION: + case html_js_1.TAG_ID.TABLE: { + if (p.openElements.hasInTableScope(html_js_1.TAG_ID.CAPTION)) { + p.openElements.generateImpliedEndTags(); + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.CAPTION); + p.activeFormattingElements.clearToLastMarker(); + p.insertionMode = InsertionMode.IN_TABLE; + if (tn === html_js_1.TAG_ID.TABLE) { + endTagInTable(p, token); + } } + break; + } + case html_js_1.TAG_ID.BODY: + case html_js_1.TAG_ID.COL: + case html_js_1.TAG_ID.COLGROUP: + case html_js_1.TAG_ID.HTML: + case html_js_1.TAG_ID.TBODY: + case html_js_1.TAG_ID.TD: + case html_js_1.TAG_ID.TFOOT: + case html_js_1.TAG_ID.TH: + case html_js_1.TAG_ID.THEAD: + case html_js_1.TAG_ID.TR: { + // Ignore token + break; + } + default: { + endTagInBody(p, token); } - } else if ( - tn !== $.BODY && - tn !== $.COL && - tn !== $.COLGROUP && - tn !== $.HTML && - tn !== $.TBODY && - tn !== $.TD && - tn !== $.TFOOT && - tn !== $.TH && - tn !== $.THEAD && - tn !== $.TR - ) { - endTagInBody(p, token); } } - // The "in column group" insertion mode //------------------------------------------------------------------ function startTagInColumnGroup(p, token) { - const tn = token.tagName; - - if (tn === $.HTML) { - startTagInBody(p, token); - } else if (tn === $.COL) { - p._appendElement(token, NS.HTML); - token.ackSelfClosing = true; - } else if (tn === $.TEMPLATE) { - startTagInHead(p, token); - } else { - tokenInColumnGroup(p, token); + switch (token.tagID) { + case html_js_1.TAG_ID.HTML: { + startTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.COL: { + p._appendElement(token, html_js_1.NS.HTML); + token.ackSelfClosing = true; + break; + } + case html_js_1.TAG_ID.TEMPLATE: { + startTagInHead(p, token); + break; + } + default: { + tokenInColumnGroup(p, token); + } } } - function endTagInColumnGroup(p, token) { - const tn = token.tagName; - - if (tn === $.COLGROUP) { - if (p.openElements.currentTagName === $.COLGROUP) { - p.openElements.pop(); - p.insertionMode = IN_TABLE_MODE; + switch (token.tagID) { + case html_js_1.TAG_ID.COLGROUP: { + if (p.openElements.currentTagId === html_js_1.TAG_ID.COLGROUP) { + p.openElements.pop(); + p.insertionMode = InsertionMode.IN_TABLE; + } + break; + } + case html_js_1.TAG_ID.TEMPLATE: { + endTagInHead(p, token); + break; + } + case html_js_1.TAG_ID.COL: { + // Ignore token + break; + } + default: { + tokenInColumnGroup(p, token); } - } else if (tn === $.TEMPLATE) { - endTagInHead(p, token); - } else if (tn !== $.COL) { - tokenInColumnGroup(p, token); } } - function tokenInColumnGroup(p, token) { - if (p.openElements.currentTagName === $.COLGROUP) { + if (p.openElements.currentTagId === html_js_1.TAG_ID.COLGROUP) { p.openElements.pop(); - p.insertionMode = IN_TABLE_MODE; + p.insertionMode = InsertionMode.IN_TABLE; p._processToken(token); } } - // The "in table body" insertion mode //------------------------------------------------------------------ function startTagInTableBody(p, token) { - const tn = token.tagName; - - if (tn === $.TR) { - p.openElements.clearBackToTableBodyContext(); - p._insertElement(token, NS.HTML); - p.insertionMode = IN_ROW_MODE; - } else if (tn === $.TH || tn === $.TD) { - p.openElements.clearBackToTableBodyContext(); - p._insertFakeElement($.TR); - p.insertionMode = IN_ROW_MODE; - p._processToken(token); - } else if ( - tn === $.CAPTION || - tn === $.COL || - tn === $.COLGROUP || - tn === $.TBODY || - tn === $.TFOOT || - tn === $.THEAD - ) { - if (p.openElements.hasTableBodyContextInTableScope()) { + switch (token.tagID) { + case html_js_1.TAG_ID.TR: { p.openElements.clearBackToTableBodyContext(); - p.openElements.pop(); - p.insertionMode = IN_TABLE_MODE; - p._processToken(token); + p._insertElement(token, html_js_1.NS.HTML); + p.insertionMode = InsertionMode.IN_ROW; + break; + } + case html_js_1.TAG_ID.TH: + case html_js_1.TAG_ID.TD: { + p.openElements.clearBackToTableBodyContext(); + p._insertFakeElement(html_js_1.TAG_NAMES.TR, html_js_1.TAG_ID.TR); + p.insertionMode = InsertionMode.IN_ROW; + startTagInRow(p, token); + break; + } + case html_js_1.TAG_ID.CAPTION: + case html_js_1.TAG_ID.COL: + case html_js_1.TAG_ID.COLGROUP: + case html_js_1.TAG_ID.TBODY: + case html_js_1.TAG_ID.TFOOT: + case html_js_1.TAG_ID.THEAD: { + if (p.openElements.hasTableBodyContextInTableScope()) { + p.openElements.clearBackToTableBodyContext(); + p.openElements.pop(); + p.insertionMode = InsertionMode.IN_TABLE; + startTagInTable(p, token); + } + break; + } + default: { + startTagInTable(p, token); } - } else { - startTagInTable(p, token); } } - function endTagInTableBody(p, token) { - const tn = token.tagName; - - if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) { - if (p.openElements.hasInTableScope(tn)) { - p.openElements.clearBackToTableBodyContext(); - p.openElements.pop(); - p.insertionMode = IN_TABLE_MODE; + const tn = token.tagID; + switch (token.tagID) { + case html_js_1.TAG_ID.TBODY: + case html_js_1.TAG_ID.TFOOT: + case html_js_1.TAG_ID.THEAD: { + if (p.openElements.hasInTableScope(tn)) { + p.openElements.clearBackToTableBodyContext(); + p.openElements.pop(); + p.insertionMode = InsertionMode.IN_TABLE; + } + break; } - } else if (tn === $.TABLE) { - if (p.openElements.hasTableBodyContextInTableScope()) { - p.openElements.clearBackToTableBodyContext(); - p.openElements.pop(); - p.insertionMode = IN_TABLE_MODE; - p._processToken(token); + case html_js_1.TAG_ID.TABLE: { + if (p.openElements.hasTableBodyContextInTableScope()) { + p.openElements.clearBackToTableBodyContext(); + p.openElements.pop(); + p.insertionMode = InsertionMode.IN_TABLE; + endTagInTable(p, token); + } + break; + } + case html_js_1.TAG_ID.BODY: + case html_js_1.TAG_ID.CAPTION: + case html_js_1.TAG_ID.COL: + case html_js_1.TAG_ID.COLGROUP: + case html_js_1.TAG_ID.HTML: + case html_js_1.TAG_ID.TD: + case html_js_1.TAG_ID.TH: + case html_js_1.TAG_ID.TR: { + // Ignore token + break; + } + default: { + endTagInTable(p, token); } - } else if ( - (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP) || - (tn !== $.HTML && tn !== $.TD && tn !== $.TH && tn !== $.TR) - ) { - endTagInTable(p, token); } } - // The "in row" insertion mode //------------------------------------------------------------------ function startTagInRow(p, token) { - const tn = token.tagName; - - if (tn === $.TH || tn === $.TD) { - p.openElements.clearBackToTableRowContext(); - p._insertElement(token, NS.HTML); - p.insertionMode = IN_CELL_MODE; - p.activeFormattingElements.insertMarker(); - } else if ( - tn === $.CAPTION || - tn === $.COL || - tn === $.COLGROUP || - tn === $.TBODY || - tn === $.TFOOT || - tn === $.THEAD || - tn === $.TR - ) { - if (p.openElements.hasInTableScope($.TR)) { + switch (token.tagID) { + case html_js_1.TAG_ID.TH: + case html_js_1.TAG_ID.TD: { p.openElements.clearBackToTableRowContext(); - p.openElements.pop(); - p.insertionMode = IN_TABLE_BODY_MODE; - p._processToken(token); + p._insertElement(token, html_js_1.NS.HTML); + p.insertionMode = InsertionMode.IN_CELL; + p.activeFormattingElements.insertMarker(); + break; + } + case html_js_1.TAG_ID.CAPTION: + case html_js_1.TAG_ID.COL: + case html_js_1.TAG_ID.COLGROUP: + case html_js_1.TAG_ID.TBODY: + case html_js_1.TAG_ID.TFOOT: + case html_js_1.TAG_ID.THEAD: + case html_js_1.TAG_ID.TR: { + if (p.openElements.hasInTableScope(html_js_1.TAG_ID.TR)) { + p.openElements.clearBackToTableRowContext(); + p.openElements.pop(); + p.insertionMode = InsertionMode.IN_TABLE_BODY; + startTagInTableBody(p, token); + } + break; + } + default: { + startTagInTable(p, token); } - } else { - startTagInTable(p, token); } } - function endTagInRow(p, token) { - const tn = token.tagName; - - if (tn === $.TR) { - if (p.openElements.hasInTableScope($.TR)) { - p.openElements.clearBackToTableRowContext(); - p.openElements.pop(); - p.insertionMode = IN_TABLE_BODY_MODE; + switch (token.tagID) { + case html_js_1.TAG_ID.TR: { + if (p.openElements.hasInTableScope(html_js_1.TAG_ID.TR)) { + p.openElements.clearBackToTableRowContext(); + p.openElements.pop(); + p.insertionMode = InsertionMode.IN_TABLE_BODY; + } + break; } - } else if (tn === $.TABLE) { - if (p.openElements.hasInTableScope($.TR)) { - p.openElements.clearBackToTableRowContext(); - p.openElements.pop(); - p.insertionMode = IN_TABLE_BODY_MODE; - p._processToken(token); + case html_js_1.TAG_ID.TABLE: { + if (p.openElements.hasInTableScope(html_js_1.TAG_ID.TR)) { + p.openElements.clearBackToTableRowContext(); + p.openElements.pop(); + p.insertionMode = InsertionMode.IN_TABLE_BODY; + endTagInTableBody(p, token); + } + break; } - } else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) { - if (p.openElements.hasInTableScope(tn) || p.openElements.hasInTableScope($.TR)) { - p.openElements.clearBackToTableRowContext(); - p.openElements.pop(); - p.insertionMode = IN_TABLE_BODY_MODE; - p._processToken(token); + case html_js_1.TAG_ID.TBODY: + case html_js_1.TAG_ID.TFOOT: + case html_js_1.TAG_ID.THEAD: { + if (p.openElements.hasInTableScope(token.tagID) || p.openElements.hasInTableScope(html_js_1.TAG_ID.TR)) { + p.openElements.clearBackToTableRowContext(); + p.openElements.pop(); + p.insertionMode = InsertionMode.IN_TABLE_BODY; + endTagInTableBody(p, token); + } + break; } - } else if ( - (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP) || - (tn !== $.HTML && tn !== $.TD && tn !== $.TH) - ) { - endTagInTable(p, token); + case html_js_1.TAG_ID.BODY: + case html_js_1.TAG_ID.CAPTION: + case html_js_1.TAG_ID.COL: + case html_js_1.TAG_ID.COLGROUP: + case html_js_1.TAG_ID.HTML: + case html_js_1.TAG_ID.TD: + case html_js_1.TAG_ID.TH: { + // Ignore end tag + break; + } + default: + endTagInTable(p, token); } } - // The "in cell" insertion mode //------------------------------------------------------------------ function startTagInCell(p, token) { - const tn = token.tagName; - - if ( - tn === $.CAPTION || - tn === $.COL || - tn === $.COLGROUP || - tn === $.TBODY || - tn === $.TD || - tn === $.TFOOT || - tn === $.TH || - tn === $.THEAD || - tn === $.TR - ) { - if (p.openElements.hasInTableScope($.TD) || p.openElements.hasInTableScope($.TH)) { + const tn = token.tagID; + if (TABLE_VOID_ELEMENTS.has(tn)) { + if (p.openElements.hasInTableScope(html_js_1.TAG_ID.TD) || p.openElements.hasInTableScope(html_js_1.TAG_ID.TH)) { p._closeTableCell(); - p._processToken(token); + startTagInRow(p, token); } - } else { + } + else { startTagInBody(p, token); } } - function endTagInCell(p, token) { - const tn = token.tagName; - - if (tn === $.TD || tn === $.TH) { - if (p.openElements.hasInTableScope(tn)) { - p.openElements.generateImpliedEndTags(); - p.openElements.popUntilTagNamePopped(tn); - p.activeFormattingElements.clearToLastMarker(); - p.insertionMode = IN_ROW_MODE; + const tn = token.tagID; + switch (tn) { + case html_js_1.TAG_ID.TD: + case html_js_1.TAG_ID.TH: { + if (p.openElements.hasInTableScope(tn)) { + p.openElements.generateImpliedEndTags(); + p.openElements.popUntilTagNamePopped(tn); + p.activeFormattingElements.clearToLastMarker(); + p.insertionMode = InsertionMode.IN_ROW; + } + break; } - } else if (tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR) { - if (p.openElements.hasInTableScope(tn)) { - p._closeTableCell(); - p._processToken(token); + case html_js_1.TAG_ID.TABLE: + case html_js_1.TAG_ID.TBODY: + case html_js_1.TAG_ID.TFOOT: + case html_js_1.TAG_ID.THEAD: + case html_js_1.TAG_ID.TR: { + if (p.openElements.hasInTableScope(tn)) { + p._closeTableCell(); + endTagInRow(p, token); + } + break; + } + case html_js_1.TAG_ID.BODY: + case html_js_1.TAG_ID.CAPTION: + case html_js_1.TAG_ID.COL: + case html_js_1.TAG_ID.COLGROUP: + case html_js_1.TAG_ID.HTML: { + // Ignore token + break; + } + default: { + endTagInBody(p, token); } - } else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML) { - endTagInBody(p, token); } } - // The "in select" insertion mode //------------------------------------------------------------------ function startTagInSelect(p, token) { - const tn = token.tagName; - - if (tn === $.HTML) { - startTagInBody(p, token); - } else if (tn === $.OPTION) { - if (p.openElements.currentTagName === $.OPTION) { - p.openElements.pop(); + switch (token.tagID) { + case html_js_1.TAG_ID.HTML: { + startTagInBody(p, token); + break; } - - p._insertElement(token, NS.HTML); - } else if (tn === $.OPTGROUP) { - if (p.openElements.currentTagName === $.OPTION) { - p.openElements.pop(); + case html_js_1.TAG_ID.OPTION: { + if (p.openElements.currentTagId === html_js_1.TAG_ID.OPTION) { + p.openElements.pop(); + } + p._insertElement(token, html_js_1.NS.HTML); + break; } - - if (p.openElements.currentTagName === $.OPTGROUP) { - p.openElements.pop(); + case html_js_1.TAG_ID.OPTGROUP: { + if (p.openElements.currentTagId === html_js_1.TAG_ID.OPTION) { + p.openElements.pop(); + } + if (p.openElements.currentTagId === html_js_1.TAG_ID.OPTGROUP) { + p.openElements.pop(); + } + p._insertElement(token, html_js_1.NS.HTML); + break; } - - p._insertElement(token, NS.HTML); - } else if (tn === $.INPUT || tn === $.KEYGEN || tn === $.TEXTAREA || tn === $.SELECT) { - if (p.openElements.hasInSelectScope($.SELECT)) { - p.openElements.popUntilTagNamePopped($.SELECT); - p._resetInsertionMode(); - - if (tn !== $.SELECT) { - p._processToken(token); + case html_js_1.TAG_ID.INPUT: + case html_js_1.TAG_ID.KEYGEN: + case html_js_1.TAG_ID.TEXTAREA: + case html_js_1.TAG_ID.SELECT: { + if (p.openElements.hasInSelectScope(html_js_1.TAG_ID.SELECT)) { + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.SELECT); + p._resetInsertionMode(); + if (token.tagID !== html_js_1.TAG_ID.SELECT) { + p._processStartTag(token); + } } + break; + } + case html_js_1.TAG_ID.SCRIPT: + case html_js_1.TAG_ID.TEMPLATE: { + startTagInHead(p, token); + break; } - } else if (tn === $.SCRIPT || tn === $.TEMPLATE) { - startTagInHead(p, token); + default: + // Do nothing } } - function endTagInSelect(p, token) { - const tn = token.tagName; - - if (tn === $.OPTGROUP) { - const prevOpenElement = p.openElements.items[p.openElements.stackTop - 1]; - const prevOpenElementTn = prevOpenElement && p.treeAdapter.getTagName(prevOpenElement); - - if (p.openElements.currentTagName === $.OPTION && prevOpenElementTn === $.OPTGROUP) { - p.openElements.pop(); + switch (token.tagID) { + case html_js_1.TAG_ID.OPTGROUP: { + if (p.openElements.stackTop > 0 && + p.openElements.currentTagId === html_js_1.TAG_ID.OPTION && + p.openElements.tagIDs[p.openElements.stackTop - 1] === html_js_1.TAG_ID.OPTGROUP) { + p.openElements.pop(); + } + if (p.openElements.currentTagId === html_js_1.TAG_ID.OPTGROUP) { + p.openElements.pop(); + } + break; } - - if (p.openElements.currentTagName === $.OPTGROUP) { - p.openElements.pop(); + case html_js_1.TAG_ID.OPTION: { + if (p.openElements.currentTagId === html_js_1.TAG_ID.OPTION) { + p.openElements.pop(); + } + break; } - } else if (tn === $.OPTION) { - if (p.openElements.currentTagName === $.OPTION) { - p.openElements.pop(); + case html_js_1.TAG_ID.SELECT: { + if (p.openElements.hasInSelectScope(html_js_1.TAG_ID.SELECT)) { + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.SELECT); + p._resetInsertionMode(); + } + break; } - } else if (tn === $.SELECT && p.openElements.hasInSelectScope($.SELECT)) { - p.openElements.popUntilTagNamePopped($.SELECT); - p._resetInsertionMode(); - } else if (tn === $.TEMPLATE) { - endTagInHead(p, token); + case html_js_1.TAG_ID.TEMPLATE: { + endTagInHead(p, token); + break; + } + default: + // Do nothing } } - -//12.2.5.4.17 The "in select in table" insertion mode +// The "in select in table" insertion mode //------------------------------------------------------------------ function startTagInSelectInTable(p, token) { - const tn = token.tagName; - - if ( - tn === $.CAPTION || - tn === $.TABLE || - tn === $.TBODY || - tn === $.TFOOT || - tn === $.THEAD || - tn === $.TR || - tn === $.TD || - tn === $.TH - ) { - p.openElements.popUntilTagNamePopped($.SELECT); + const tn = token.tagID; + if (tn === html_js_1.TAG_ID.CAPTION || + tn === html_js_1.TAG_ID.TABLE || + tn === html_js_1.TAG_ID.TBODY || + tn === html_js_1.TAG_ID.TFOOT || + tn === html_js_1.TAG_ID.THEAD || + tn === html_js_1.TAG_ID.TR || + tn === html_js_1.TAG_ID.TD || + tn === html_js_1.TAG_ID.TH) { + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.SELECT); p._resetInsertionMode(); - p._processToken(token); - } else { + p._processStartTag(token); + } + else { startTagInSelect(p, token); } } - function endTagInSelectInTable(p, token) { - const tn = token.tagName; - - if ( - tn === $.CAPTION || - tn === $.TABLE || - tn === $.TBODY || - tn === $.TFOOT || - tn === $.THEAD || - tn === $.TR || - tn === $.TD || - tn === $.TH - ) { + const tn = token.tagID; + if (tn === html_js_1.TAG_ID.CAPTION || + tn === html_js_1.TAG_ID.TABLE || + tn === html_js_1.TAG_ID.TBODY || + tn === html_js_1.TAG_ID.TFOOT || + tn === html_js_1.TAG_ID.THEAD || + tn === html_js_1.TAG_ID.TR || + tn === html_js_1.TAG_ID.TD || + tn === html_js_1.TAG_ID.TH) { if (p.openElements.hasInTableScope(tn)) { - p.openElements.popUntilTagNamePopped($.SELECT); + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.SELECT); p._resetInsertionMode(); - p._processToken(token); + p.onEndTag(token); } - } else { + } + else { endTagInSelect(p, token); } } - // The "in template" insertion mode //------------------------------------------------------------------ function startTagInTemplate(p, token) { - const tn = token.tagName; - - if ( - tn === $.BASE || - tn === $.BASEFONT || - tn === $.BGSOUND || - tn === $.LINK || - tn === $.META || - tn === $.NOFRAMES || - tn === $.SCRIPT || - tn === $.STYLE || - tn === $.TEMPLATE || - tn === $.TITLE - ) { - startTagInHead(p, token); - } else { - const newInsertionMode = TEMPLATE_INSERTION_MODE_SWITCH_MAP[tn] || IN_BODY_MODE; - - p._popTmplInsertionMode(); - p._pushTmplInsertionMode(newInsertionMode); - p.insertionMode = newInsertionMode; - p._processToken(token); + switch (token.tagID) { + // First, handle tags that can start without a mode change + case html_js_1.TAG_ID.BASE: + case html_js_1.TAG_ID.BASEFONT: + case html_js_1.TAG_ID.BGSOUND: + case html_js_1.TAG_ID.LINK: + case html_js_1.TAG_ID.META: + case html_js_1.TAG_ID.NOFRAMES: + case html_js_1.TAG_ID.SCRIPT: + case html_js_1.TAG_ID.STYLE: + case html_js_1.TAG_ID.TEMPLATE: + case html_js_1.TAG_ID.TITLE: + startTagInHead(p, token); + break; + // Re-process the token in the appropriate mode + case html_js_1.TAG_ID.CAPTION: + case html_js_1.TAG_ID.COLGROUP: + case html_js_1.TAG_ID.TBODY: + case html_js_1.TAG_ID.TFOOT: + case html_js_1.TAG_ID.THEAD: + p.tmplInsertionModeStack[0] = InsertionMode.IN_TABLE; + p.insertionMode = InsertionMode.IN_TABLE; + startTagInTable(p, token); + break; + case html_js_1.TAG_ID.COL: + p.tmplInsertionModeStack[0] = InsertionMode.IN_COLUMN_GROUP; + p.insertionMode = InsertionMode.IN_COLUMN_GROUP; + startTagInColumnGroup(p, token); + break; + case html_js_1.TAG_ID.TR: + p.tmplInsertionModeStack[0] = InsertionMode.IN_TABLE_BODY; + p.insertionMode = InsertionMode.IN_TABLE_BODY; + startTagInTableBody(p, token); + break; + case html_js_1.TAG_ID.TD: + case html_js_1.TAG_ID.TH: + p.tmplInsertionModeStack[0] = InsertionMode.IN_ROW; + p.insertionMode = InsertionMode.IN_ROW; + startTagInRow(p, token); + break; + default: + p.tmplInsertionModeStack[0] = InsertionMode.IN_BODY; + p.insertionMode = InsertionMode.IN_BODY; + startTagInBody(p, token); } } - function endTagInTemplate(p, token) { - if (token.tagName === $.TEMPLATE) { + if (token.tagID === html_js_1.TAG_ID.TEMPLATE) { endTagInHead(p, token); } } - function eofInTemplate(p, token) { if (p.openElements.tmplCount > 0) { - p.openElements.popUntilTagNamePopped($.TEMPLATE); + p.openElements.popUntilTagNamePopped(html_js_1.TAG_ID.TEMPLATE); p.activeFormattingElements.clearToLastMarker(); - p._popTmplInsertionMode(); + p.tmplInsertionModeStack.shift(); p._resetInsertionMode(); - p._processToken(token); - } else { - p.stopped = true; + p.onEof(token); + } + else { + stopParsing(p, token); } } - // The "after body" insertion mode //------------------------------------------------------------------ function startTagAfterBody(p, token) { - if (token.tagName === $.HTML) { + if (token.tagID === html_js_1.TAG_ID.HTML) { startTagInBody(p, token); - } else { + } + else { tokenAfterBody(p, token); } } - function endTagAfterBody(p, token) { - if (token.tagName === $.HTML) { + var _a; + if (token.tagID === html_js_1.TAG_ID.HTML) { if (!p.fragmentContext) { - p.insertionMode = AFTER_AFTER_BODY_MODE; + p.insertionMode = InsertionMode.AFTER_AFTER_BODY; + } + //NOTE: <html> is never popped from the stack, so we need to updated + //the end location explicitly. + if (p.options.sourceCodeLocationInfo && p.openElements.tagIDs[0] === html_js_1.TAG_ID.HTML) { + p._setEndLocation(p.openElements.items[0], token); + // Update the body element, if it doesn't have an end tag + const bodyElement = p.openElements.items[1]; + if (bodyElement && !((_a = p.treeAdapter.getNodeSourceCodeLocation(bodyElement)) === null || _a === void 0 ? void 0 : _a.endTag)) { + p._setEndLocation(bodyElement, token); + } } - } else { + } + else { tokenAfterBody(p, token); } } - function tokenAfterBody(p, token) { - p.insertionMode = IN_BODY_MODE; - p._processToken(token); + p.insertionMode = InsertionMode.IN_BODY; + modeInBody(p, token); } - // The "in frameset" insertion mode //------------------------------------------------------------------ function startTagInFrameset(p, token) { - const tn = token.tagName; - - if (tn === $.HTML) { - startTagInBody(p, token); - } else if (tn === $.FRAMESET) { - p._insertElement(token, NS.HTML); - } else if (tn === $.FRAME) { - p._appendElement(token, NS.HTML); - token.ackSelfClosing = true; - } else if (tn === $.NOFRAMES) { - startTagInHead(p, token); + switch (token.tagID) { + case html_js_1.TAG_ID.HTML: { + startTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.FRAMESET: { + p._insertElement(token, html_js_1.NS.HTML); + break; + } + case html_js_1.TAG_ID.FRAME: { + p._appendElement(token, html_js_1.NS.HTML); + token.ackSelfClosing = true; + break; + } + case html_js_1.TAG_ID.NOFRAMES: { + startTagInHead(p, token); + break; + } + default: + // Do nothing } } - function endTagInFrameset(p, token) { - if (token.tagName === $.FRAMESET && !p.openElements.isRootHtmlElementCurrent()) { + if (token.tagID === html_js_1.TAG_ID.FRAMESET && !p.openElements.isRootHtmlElementCurrent()) { p.openElements.pop(); - - if (!p.fragmentContext && p.openElements.currentTagName !== $.FRAMESET) { - p.insertionMode = AFTER_FRAMESET_MODE; + if (!p.fragmentContext && p.openElements.currentTagId !== html_js_1.TAG_ID.FRAMESET) { + p.insertionMode = InsertionMode.AFTER_FRAMESET; } } } - // The "after frameset" insertion mode //------------------------------------------------------------------ function startTagAfterFrameset(p, token) { - const tn = token.tagName; - - if (tn === $.HTML) { - startTagInBody(p, token); - } else if (tn === $.NOFRAMES) { - startTagInHead(p, token); + switch (token.tagID) { + case html_js_1.TAG_ID.HTML: { + startTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.NOFRAMES: { + startTagInHead(p, token); + break; + } + default: + // Do nothing } } - function endTagAfterFrameset(p, token) { - if (token.tagName === $.HTML) { - p.insertionMode = AFTER_AFTER_FRAMESET_MODE; + if (token.tagID === html_js_1.TAG_ID.HTML) { + p.insertionMode = InsertionMode.AFTER_AFTER_FRAMESET; } } - // The "after after body" insertion mode //------------------------------------------------------------------ function startTagAfterAfterBody(p, token) { - if (token.tagName === $.HTML) { + if (token.tagID === html_js_1.TAG_ID.HTML) { startTagInBody(p, token); - } else { + } + else { tokenAfterAfterBody(p, token); } } - function tokenAfterAfterBody(p, token) { - p.insertionMode = IN_BODY_MODE; - p._processToken(token); + p.insertionMode = InsertionMode.IN_BODY; + modeInBody(p, token); } - // The "after after frameset" insertion mode //------------------------------------------------------------------ function startTagAfterAfterFrameset(p, token) { - const tn = token.tagName; - - if (tn === $.HTML) { - startTagInBody(p, token); - } else if (tn === $.NOFRAMES) { - startTagInHead(p, token); + switch (token.tagID) { + case html_js_1.TAG_ID.HTML: { + startTagInBody(p, token); + break; + } + case html_js_1.TAG_ID.NOFRAMES: { + startTagInHead(p, token); + break; + } + default: + // Do nothing } } - // The rules for parsing tokens in foreign content //------------------------------------------------------------------ function nullCharacterInForeignContent(p, token) { token.chars = unicode.REPLACEMENT_CHARACTER; p._insertCharacters(token); } - function characterInForeignContent(p, token) { p._insertCharacters(token); p.framesetOk = false; } - +function popUntilHtmlOrIntegrationPoint(p) { + while (p.treeAdapter.getNamespaceURI(p.openElements.current) !== html_js_1.NS.HTML && + !p._isIntegrationPoint(p.openElements.currentTagId, p.openElements.current)) { + p.openElements.pop(); + } +} function startTagInForeignContent(p, token) { - if (foreignContent.causesExit(token) && !p.fragmentContext) { - while ( - p.treeAdapter.getNamespaceURI(p.openElements.current) !== NS.HTML && - !p._isIntegrationPoint(p.openElements.current) - ) { - p.openElements.pop(); - } - - p._processToken(token); - } else { + if (foreignContent.causesExit(token)) { + popUntilHtmlOrIntegrationPoint(p); + p._startTagOutsideForeignContent(token); + } + else { const current = p._getAdjustedCurrentElement(); const currentNs = p.treeAdapter.getNamespaceURI(current); - - if (currentNs === NS.MATHML) { + if (currentNs === html_js_1.NS.MATHML) { foreignContent.adjustTokenMathMLAttrs(token); - } else if (currentNs === NS.SVG) { + } + else if (currentNs === html_js_1.NS.SVG) { foreignContent.adjustTokenSVGTagName(token); foreignContent.adjustTokenSVGAttrs(token); } - foreignContent.adjustTokenXMLAttrs(token); - if (token.selfClosing) { p._appendElement(token, currentNs); - } else { + } + else { p._insertElement(token, currentNs); } - token.ackSelfClosing = true; } } - function endTagInForeignContent(p, token) { + if (token.tagID === html_js_1.TAG_ID.P || token.tagID === html_js_1.TAG_ID.BR) { + popUntilHtmlOrIntegrationPoint(p); + p._endTagOutsideForeignContent(token); + return; + } for (let i = p.openElements.stackTop; i > 0; i--) { const element = p.openElements.items[i]; - - if (p.treeAdapter.getNamespaceURI(element) === NS.HTML) { - p._processToken(token); + if (p.treeAdapter.getNamespaceURI(element) === html_js_1.NS.HTML) { + p._endTagOutsideForeignContent(token); break; } - - if (p.treeAdapter.getTagName(element).toLowerCase() === token.tagName) { - p.openElements.popUntilElementPopped(element); + const tagName = p.treeAdapter.getTagName(element); + if (tagName.toLowerCase() === token.tagName) { + //NOTE: update the token tag name for `_setEndLocation`. + token.tagName = tagName; + p.openElements.shortenToLength(i); break; } } } -},{"../common/doctype":1,"../common/error-codes":2,"../common/foreign-content":3,"../common/html":4,"../common/unicode":5,"../extensions/error-reporting/parser-mixin":7,"../extensions/location-info/parser-mixin":11,"../tokenizer":19,"../tree-adapters/default":22,"../utils/merge-options":23,"../utils/mixin":24,"./formatting-element-list":15,"./open-element-stack":17}],17:[function(require,module,exports){ -'use strict'; - -const HTML = require('../common/html'); - -//Aliases -const $ = HTML.TAG_NAMES; -const NS = HTML.NAMESPACES; - +},{"../common/doctype.js":1,"../common/error-codes.js":2,"../common/foreign-content.js":3,"../common/html.js":4,"../common/token.js":5,"../common/unicode.js":6,"../tokenizer/index.js":12,"../tree-adapters/default.js":14,"./formatting-element-list.js":8,"./open-element-stack.js":10}],10:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.OpenElementStack = void 0; +const html_js_1 = require("../common/html.js"); //Element utils - -//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here. -//It's faster than using dictionary. -function isImpliedEndTagRequired(tn) { - switch (tn.length) { - case 1: - return tn === $.P; - - case 2: - return tn === $.RB || tn === $.RP || tn === $.RT || tn === $.DD || tn === $.DT || tn === $.LI; - - case 3: - return tn === $.RTC; - - case 6: - return tn === $.OPTION; - - case 8: - return tn === $.OPTGROUP; - } - - return false; -} - -function isImpliedEndTagRequiredThoroughly(tn) { - switch (tn.length) { - case 1: - return tn === $.P; - - case 2: - return ( - tn === $.RB || - tn === $.RP || - tn === $.RT || - tn === $.DD || - tn === $.DT || - tn === $.LI || - tn === $.TD || - tn === $.TH || - tn === $.TR - ); - - case 3: - return tn === $.RTC; - - case 5: - return tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD; - - case 6: - return tn === $.OPTION; - - case 7: - return tn === $.CAPTION; - - case 8: - return tn === $.OPTGROUP || tn === $.COLGROUP; - } - - return false; -} - -function isScopingElement(tn, ns) { - switch (tn.length) { - case 2: - if (tn === $.TD || tn === $.TH) { - return ns === NS.HTML; - } else if (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS) { - return ns === NS.MATHML; - } - - break; - - case 4: - if (tn === $.HTML) { - return ns === NS.HTML; - } else if (tn === $.DESC) { - return ns === NS.SVG; - } - - break; - - case 5: - if (tn === $.TABLE) { - return ns === NS.HTML; - } else if (tn === $.MTEXT) { - return ns === NS.MATHML; - } else if (tn === $.TITLE) { - return ns === NS.SVG; - } - - break; - - case 6: - return (tn === $.APPLET || tn === $.OBJECT) && ns === NS.HTML; - - case 7: - return (tn === $.CAPTION || tn === $.MARQUEE) && ns === NS.HTML; - - case 8: - return tn === $.TEMPLATE && ns === NS.HTML; - - case 13: - return tn === $.FOREIGN_OBJECT && ns === NS.SVG; - - case 14: - return tn === $.ANNOTATION_XML && ns === NS.MATHML; - } - - return false; -} - +const IMPLICIT_END_TAG_REQUIRED = new Set([html_js_1.TAG_ID.DD, html_js_1.TAG_ID.DT, html_js_1.TAG_ID.LI, html_js_1.TAG_ID.OPTGROUP, html_js_1.TAG_ID.OPTION, html_js_1.TAG_ID.P, html_js_1.TAG_ID.RB, html_js_1.TAG_ID.RP, html_js_1.TAG_ID.RT, html_js_1.TAG_ID.RTC]); +const IMPLICIT_END_TAG_REQUIRED_THOROUGHLY = new Set([ + ...IMPLICIT_END_TAG_REQUIRED, + html_js_1.TAG_ID.CAPTION, + html_js_1.TAG_ID.COLGROUP, + html_js_1.TAG_ID.TBODY, + html_js_1.TAG_ID.TD, + html_js_1.TAG_ID.TFOOT, + html_js_1.TAG_ID.TH, + html_js_1.TAG_ID.THEAD, + html_js_1.TAG_ID.TR, +]); +const SCOPING_ELEMENT_NS = new Map([ + [html_js_1.TAG_ID.APPLET, html_js_1.NS.HTML], + [html_js_1.TAG_ID.CAPTION, html_js_1.NS.HTML], + [html_js_1.TAG_ID.HTML, html_js_1.NS.HTML], + [html_js_1.TAG_ID.MARQUEE, html_js_1.NS.HTML], + [html_js_1.TAG_ID.OBJECT, html_js_1.NS.HTML], + [html_js_1.TAG_ID.TABLE, html_js_1.NS.HTML], + [html_js_1.TAG_ID.TD, html_js_1.NS.HTML], + [html_js_1.TAG_ID.TEMPLATE, html_js_1.NS.HTML], + [html_js_1.TAG_ID.TH, html_js_1.NS.HTML], + [html_js_1.TAG_ID.ANNOTATION_XML, html_js_1.NS.MATHML], + [html_js_1.TAG_ID.MI, html_js_1.NS.MATHML], + [html_js_1.TAG_ID.MN, html_js_1.NS.MATHML], + [html_js_1.TAG_ID.MO, html_js_1.NS.MATHML], + [html_js_1.TAG_ID.MS, html_js_1.NS.MATHML], + [html_js_1.TAG_ID.MTEXT, html_js_1.NS.MATHML], + [html_js_1.TAG_ID.DESC, html_js_1.NS.SVG], + [html_js_1.TAG_ID.FOREIGN_OBJECT, html_js_1.NS.SVG], + [html_js_1.TAG_ID.TITLE, html_js_1.NS.SVG], +]); +const NAMED_HEADERS = [html_js_1.TAG_ID.H1, html_js_1.TAG_ID.H2, html_js_1.TAG_ID.H3, html_js_1.TAG_ID.H4, html_js_1.TAG_ID.H5, html_js_1.TAG_ID.H6]; +const TABLE_ROW_CONTEXT = [html_js_1.TAG_ID.TR, html_js_1.TAG_ID.TEMPLATE, html_js_1.TAG_ID.HTML]; +const TABLE_BODY_CONTEXT = [html_js_1.TAG_ID.TBODY, html_js_1.TAG_ID.TFOOT, html_js_1.TAG_ID.THEAD, html_js_1.TAG_ID.TEMPLATE, html_js_1.TAG_ID.HTML]; +const TABLE_CONTEXT = [html_js_1.TAG_ID.TABLE, html_js_1.TAG_ID.TEMPLATE, html_js_1.TAG_ID.HTML]; +const TABLE_CELLS = [html_js_1.TAG_ID.TD, html_js_1.TAG_ID.TH]; //Stack of open elements class OpenElementStack { - constructor(document, treeAdapter) { - this.stackTop = -1; + constructor(document, treeAdapter, handler) { + this.treeAdapter = treeAdapter; + this.handler = handler; this.items = []; - this.current = document; - this.currentTagName = null; - this.currentTmplContent = null; + this.tagIDs = []; + this.stackTop = -1; this.tmplCount = 0; - this.treeAdapter = treeAdapter; + this.currentTagId = html_js_1.TAG_ID.UNKNOWN; + this.current = document; + } + get currentTmplContentOrNode() { + return this._isInTemplate() ? this.treeAdapter.getTemplateContent(this.current) : this.current; } - //Index of element _indexOf(element) { - let idx = -1; - - for (let i = this.stackTop; i >= 0; i--) { - if (this.items[i] === element) { - idx = i; - break; - } - } - return idx; + return this.items.lastIndexOf(element, this.stackTop); } - //Update current element _isInTemplate() { - return this.currentTagName === $.TEMPLATE && this.treeAdapter.getNamespaceURI(this.current) === NS.HTML; + return this.currentTagId === html_js_1.TAG_ID.TEMPLATE && this.treeAdapter.getNamespaceURI(this.current) === html_js_1.NS.HTML; } - _updateCurrentElement() { this.current = this.items[this.stackTop]; - this.currentTagName = this.current && this.treeAdapter.getTagName(this.current); - - this.currentTmplContent = this._isInTemplate() ? this.treeAdapter.getTemplateContent(this.current) : null; + this.currentTagId = this.tagIDs[this.stackTop]; } - //Mutations - push(element) { - this.items[++this.stackTop] = element; - this._updateCurrentElement(); - + push(element, tagID) { + this.stackTop++; + this.items[this.stackTop] = element; + this.current = element; + this.tagIDs[this.stackTop] = tagID; + this.currentTagId = tagID; if (this._isInTemplate()) { this.tmplCount++; } + this.handler.onItemPush(element, tagID, true); } - pop() { - this.stackTop--; - + const popped = this.current; if (this.tmplCount > 0 && this._isInTemplate()) { this.tmplCount--; } - + this.stackTop--; this._updateCurrentElement(); + this.handler.onItemPop(popped, true); } - replace(oldElement, newElement) { const idx = this._indexOf(oldElement); - this.items[idx] = newElement; - if (idx === this.stackTop) { - this._updateCurrentElement(); + this.current = newElement; } } - - insertAfter(referenceElement, newElement) { + insertAfter(referenceElement, newElement, newElementID) { const insertionIdx = this._indexOf(referenceElement) + 1; - this.items.splice(insertionIdx, 0, newElement); - - if (insertionIdx === ++this.stackTop) { + this.tagIDs.splice(insertionIdx, 0, newElementID); + this.stackTop++; + if (insertionIdx === this.stackTop) { this._updateCurrentElement(); } + this.handler.onItemPush(this.current, this.currentTagId, insertionIdx === this.stackTop); } - popUntilTagNamePopped(tagName) { - while (this.stackTop > -1) { - const tn = this.currentTagName; - const ns = this.treeAdapter.getNamespaceURI(this.current); - - this.pop(); - - if (tn === tagName && ns === NS.HTML) { - break; + let targetIdx = this.stackTop + 1; + do { + targetIdx = this.tagIDs.lastIndexOf(tagName, targetIdx - 1); + } while (targetIdx > 0 && this.treeAdapter.getNamespaceURI(this.items[targetIdx]) !== html_js_1.NS.HTML); + this.shortenToLength(targetIdx < 0 ? 0 : targetIdx); + } + shortenToLength(idx) { + while (this.stackTop >= idx) { + const popped = this.current; + if (this.tmplCount > 0 && this._isInTemplate()) { + this.tmplCount -= 1; } + this.stackTop--; + this._updateCurrentElement(); + this.handler.onItemPop(popped, this.stackTop < idx); } } - popUntilElementPopped(element) { - while (this.stackTop > -1) { - const poppedElement = this.current; - - this.pop(); - - if (poppedElement === element) { - break; - } - } + const idx = this._indexOf(element); + this.shortenToLength(idx < 0 ? 0 : idx); + } + popUntilPopped(tagNames, targetNS) { + const idx = this._indexOfTagNames(tagNames, targetNS); + this.shortenToLength(idx < 0 ? 0 : idx); } - popUntilNumberedHeaderPopped() { - while (this.stackTop > -1) { - const tn = this.currentTagName; - const ns = this.treeAdapter.getNamespaceURI(this.current); - - this.pop(); - - if ( - tn === $.H1 || - tn === $.H2 || - tn === $.H3 || - tn === $.H4 || - tn === $.H5 || - (tn === $.H6 && ns === NS.HTML) - ) { - break; - } - } + this.popUntilPopped(NAMED_HEADERS, html_js_1.NS.HTML); } - popUntilTableCellPopped() { - while (this.stackTop > -1) { - const tn = this.currentTagName; - const ns = this.treeAdapter.getNamespaceURI(this.current); - - this.pop(); - - if (tn === $.TD || (tn === $.TH && ns === NS.HTML)) { - break; - } - } + this.popUntilPopped(TABLE_CELLS, html_js_1.NS.HTML); } - popAllUpToHtmlElement() { - //NOTE: here we assume that root <html> element is always first in the open element stack, so + //NOTE: here we assume that the root <html> element is always first in the open element stack, so //we perform this fast stack clean up. - this.stackTop = 0; - this._updateCurrentElement(); + this.tmplCount = 0; + this.shortenToLength(1); } - - clearBackToTableContext() { - while ( - (this.currentTagName !== $.TABLE && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML) || - this.treeAdapter.getNamespaceURI(this.current) !== NS.HTML - ) { - this.pop(); + _indexOfTagNames(tagNames, namespace) { + for (let i = this.stackTop; i >= 0; i--) { + if (tagNames.includes(this.tagIDs[i]) && this.treeAdapter.getNamespaceURI(this.items[i]) === namespace) { + return i; + } } + return -1; + } + clearBackTo(tagNames, targetNS) { + const idx = this._indexOfTagNames(tagNames, targetNS); + this.shortenToLength(idx + 1); + } + clearBackToTableContext() { + this.clearBackTo(TABLE_CONTEXT, html_js_1.NS.HTML); } - clearBackToTableBodyContext() { - while ( - (this.currentTagName !== $.TBODY && - this.currentTagName !== $.TFOOT && - this.currentTagName !== $.THEAD && - this.currentTagName !== $.TEMPLATE && - this.currentTagName !== $.HTML) || - this.treeAdapter.getNamespaceURI(this.current) !== NS.HTML - ) { - this.pop(); - } + this.clearBackTo(TABLE_BODY_CONTEXT, html_js_1.NS.HTML); } - clearBackToTableRowContext() { - while ( - (this.currentTagName !== $.TR && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML) || - this.treeAdapter.getNamespaceURI(this.current) !== NS.HTML - ) { - this.pop(); - } + this.clearBackTo(TABLE_ROW_CONTEXT, html_js_1.NS.HTML); } - remove(element) { - for (let i = this.stackTop; i >= 0; i--) { - if (this.items[i] === element) { - this.items.splice(i, 1); + const idx = this._indexOf(element); + if (idx >= 0) { + if (idx === this.stackTop) { + this.pop(); + } + else { + this.items.splice(idx, 1); + this.tagIDs.splice(idx, 1); this.stackTop--; this._updateCurrentElement(); - break; + this.handler.onItemPop(element, false); } } } - //Search tryPeekProperlyNestedBodyElement() { //Properly nested <body> element (should be second element in stack). - const element = this.items[1]; - - return element && this.treeAdapter.getTagName(element) === $.BODY ? element : null; + return this.stackTop >= 1 && this.tagIDs[1] === html_js_1.TAG_ID.BODY ? this.items[1] : null; } - contains(element) { return this._indexOf(element) > -1; } - getCommonAncestor(element) { - let elementIdx = this._indexOf(element); - - return --elementIdx >= 0 ? this.items[elementIdx] : null; + const elementIdx = this._indexOf(element) - 1; + return elementIdx >= 0 ? this.items[elementIdx] : null; } - isRootHtmlElementCurrent() { - return this.stackTop === 0 && this.currentTagName === $.HTML; + return this.stackTop === 0 && this.tagIDs[0] === html_js_1.TAG_ID.HTML; } - //Element in scope hasInScope(tagName) { for (let i = this.stackTop; i >= 0; i--) { - const tn = this.treeAdapter.getTagName(this.items[i]); + const tn = this.tagIDs[i]; const ns = this.treeAdapter.getNamespaceURI(this.items[i]); - - if (tn === tagName && ns === NS.HTML) { + if (tn === tagName && ns === html_js_1.NS.HTML) { return true; } - - if (isScopingElement(tn, ns)) { + if (SCOPING_ELEMENT_NS.get(tn) === ns) { return false; } } - return true; } - hasNumberedHeaderInScope() { for (let i = this.stackTop; i >= 0; i--) { - const tn = this.treeAdapter.getTagName(this.items[i]); + const tn = this.tagIDs[i]; const ns = this.treeAdapter.getNamespaceURI(this.items[i]); - - if ( - (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) && - ns === NS.HTML - ) { + if ((0, html_js_1.isNumberedHeader)(tn) && ns === html_js_1.NS.HTML) { return true; } - - if (isScopingElement(tn, ns)) { + if (SCOPING_ELEMENT_NS.get(tn) === ns) { return false; } } - return true; } - hasInListItemScope(tagName) { for (let i = this.stackTop; i >= 0; i--) { - const tn = this.treeAdapter.getTagName(this.items[i]); + const tn = this.tagIDs[i]; const ns = this.treeAdapter.getNamespaceURI(this.items[i]); - - if (tn === tagName && ns === NS.HTML) { + if (tn === tagName && ns === html_js_1.NS.HTML) { return true; } - - if (((tn === $.UL || tn === $.OL) && ns === NS.HTML) || isScopingElement(tn, ns)) { + if (((tn === html_js_1.TAG_ID.UL || tn === html_js_1.TAG_ID.OL) && ns === html_js_1.NS.HTML) || SCOPING_ELEMENT_NS.get(tn) === ns) { return false; } } - return true; } - hasInButtonScope(tagName) { for (let i = this.stackTop; i >= 0; i--) { - const tn = this.treeAdapter.getTagName(this.items[i]); + const tn = this.tagIDs[i]; const ns = this.treeAdapter.getNamespaceURI(this.items[i]); - - if (tn === tagName && ns === NS.HTML) { + if (tn === tagName && ns === html_js_1.NS.HTML) { return true; } - - if ((tn === $.BUTTON && ns === NS.HTML) || isScopingElement(tn, ns)) { + if ((tn === html_js_1.TAG_ID.BUTTON && ns === html_js_1.NS.HTML) || SCOPING_ELEMENT_NS.get(tn) === ns) { return false; } } - return true; } - hasInTableScope(tagName) { for (let i = this.stackTop; i >= 0; i--) { - const tn = this.treeAdapter.getTagName(this.items[i]); + const tn = this.tagIDs[i]; const ns = this.treeAdapter.getNamespaceURI(this.items[i]); - - if (ns !== NS.HTML) { + if (ns !== html_js_1.NS.HTML) { continue; } - if (tn === tagName) { return true; } - - if (tn === $.TABLE || tn === $.TEMPLATE || tn === $.HTML) { + if (tn === html_js_1.TAG_ID.TABLE || tn === html_js_1.TAG_ID.TEMPLATE || tn === html_js_1.TAG_ID.HTML) { return false; } } - return true; } - hasTableBodyContextInTableScope() { for (let i = this.stackTop; i >= 0; i--) { - const tn = this.treeAdapter.getTagName(this.items[i]); + const tn = this.tagIDs[i]; const ns = this.treeAdapter.getNamespaceURI(this.items[i]); - - if (ns !== NS.HTML) { + if (ns !== html_js_1.NS.HTML) { continue; } - - if (tn === $.TBODY || tn === $.THEAD || tn === $.TFOOT) { + if (tn === html_js_1.TAG_ID.TBODY || tn === html_js_1.TAG_ID.THEAD || tn === html_js_1.TAG_ID.TFOOT) { return true; } - - if (tn === $.TABLE || tn === $.HTML) { + if (tn === html_js_1.TAG_ID.TABLE || tn === html_js_1.TAG_ID.HTML) { return false; } } - return true; } - hasInSelectScope(tagName) { for (let i = this.stackTop; i >= 0; i--) { - const tn = this.treeAdapter.getTagName(this.items[i]); + const tn = this.tagIDs[i]; const ns = this.treeAdapter.getNamespaceURI(this.items[i]); - - if (ns !== NS.HTML) { + if (ns !== html_js_1.NS.HTML) { continue; } - if (tn === tagName) { return true; } - - if (tn !== $.OPTION && tn !== $.OPTGROUP) { + if (tn !== html_js_1.TAG_ID.OPTION && tn !== html_js_1.TAG_ID.OPTGROUP) { return false; } } - return true; } - //Implied end tags generateImpliedEndTags() { - while (isImpliedEndTagRequired(this.currentTagName)) { + while (IMPLICIT_END_TAG_REQUIRED.has(this.currentTagId)) { this.pop(); } } - generateImpliedEndTagsThoroughly() { - while (isImpliedEndTagRequiredThoroughly(this.currentTagName)) { + while (IMPLICIT_END_TAG_REQUIRED_THOROUGHLY.has(this.currentTagId)) { this.pop(); } } - - generateImpliedEndTagsWithExclusion(exclusionTagName) { - while (isImpliedEndTagRequired(this.currentTagName) && this.currentTagName !== exclusionTagName) { + generateImpliedEndTagsWithExclusion(exclusionId) { + while (this.currentTagId !== exclusionId && IMPLICIT_END_TAG_REQUIRED_THOROUGHLY.has(this.currentTagId)) { this.pop(); } } } - -module.exports = OpenElementStack; - -},{"../common/html":4}],18:[function(require,module,exports){ -'use strict'; - -const defaultTreeAdapter = require('../tree-adapters/default'); -const mergeOptions = require('../utils/merge-options'); -const doctype = require('../common/doctype'); -const HTML = require('../common/html'); - -//Aliases -const $ = HTML.TAG_NAMES; -const NS = HTML.NAMESPACES; - -//Default serializer options -const DEFAULT_OPTIONS = { - treeAdapter: defaultTreeAdapter -}; - -//Escaping regexes -const AMP_REGEX = /&/g; -const NBSP_REGEX = /\u00a0/g; -const DOUBLE_QUOTE_REGEX = /"/g; -const LT_REGEX = /</g; -const GT_REGEX = />/g; - -//Serializer -class Serializer { - constructor(node, options) { - this.options = mergeOptions(DEFAULT_OPTIONS, options); - this.treeAdapter = this.options.treeAdapter; - - this.html = ''; - this.startNode = node; - } - - //API - serialize() { - this._serializeChildNodes(this.startNode); - - return this.html; - } - - //Internals - _serializeChildNodes(parentNode) { - const childNodes = this.treeAdapter.getChildNodes(parentNode); - - if (childNodes) { - for (let i = 0, cnLength = childNodes.length; i < cnLength; i++) { - const currentNode = childNodes[i]; - - if (this.treeAdapter.isElementNode(currentNode)) { - this._serializeElement(currentNode); - } else if (this.treeAdapter.isTextNode(currentNode)) { - this._serializeTextNode(currentNode); - } else if (this.treeAdapter.isCommentNode(currentNode)) { - this._serializeCommentNode(currentNode); - } else if (this.treeAdapter.isDocumentTypeNode(currentNode)) { - this._serializeDocumentTypeNode(currentNode); +exports.OpenElementStack = OpenElementStack; + +},{"../common/html.js":4}],11:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.serializeOuter = exports.serialize = void 0; +const html_js_1 = require("../common/html.js"); +const escape_js_1 = require("entities/lib/escape.js"); +const default_js_1 = require("../tree-adapters/default.js"); +// Sets +const VOID_ELEMENTS = new Set([ + html_js_1.TAG_NAMES.AREA, + html_js_1.TAG_NAMES.BASE, + html_js_1.TAG_NAMES.BASEFONT, + html_js_1.TAG_NAMES.BGSOUND, + html_js_1.TAG_NAMES.BR, + html_js_1.TAG_NAMES.COL, + html_js_1.TAG_NAMES.EMBED, + html_js_1.TAG_NAMES.FRAME, + html_js_1.TAG_NAMES.HR, + html_js_1.TAG_NAMES.IMG, + html_js_1.TAG_NAMES.INPUT, + html_js_1.TAG_NAMES.KEYGEN, + html_js_1.TAG_NAMES.LINK, + html_js_1.TAG_NAMES.META, + html_js_1.TAG_NAMES.PARAM, + html_js_1.TAG_NAMES.SOURCE, + html_js_1.TAG_NAMES.TRACK, + html_js_1.TAG_NAMES.WBR, +]); +function isVoidElement(node, options) { + return (options.treeAdapter.isElementNode(node) && + options.treeAdapter.getNamespaceURI(node) === html_js_1.NS.HTML && + VOID_ELEMENTS.has(options.treeAdapter.getTagName(node))); +} +const defaultOpts = { treeAdapter: default_js_1.defaultTreeAdapter, scriptingEnabled: true }; +/** + * Serializes an AST node to an HTML string. + * + * @example + * + * ```js + * const parse5 = require('parse5'); + * + * const document = parse5.parse('<!DOCTYPE html><html><head></head><body>Hi there!</body></html>'); + * + * // Serializes a document. + * const html = parse5.serialize(document); + * + * // Serializes the <html> element content. + * const str = parse5.serialize(document.childNodes[1]); + * + * console.log(str); //> '<head></head><body>Hi there!</body>' + * ``` + * + * @param node Node to serialize. + * @param options Serialization options. + */ +function serialize(node, options) { + const opts = Object.assign(Object.assign({}, defaultOpts), options); + if (isVoidElement(node, opts)) { + return ''; + } + return serializeChildNodes(node, opts); +} +exports.serialize = serialize; +/** + * Serializes an AST element node to an HTML string, including the element node. + * + * @example + * + * ```js + * const parse5 = require('parse5'); + * + * const document = parse5.parseFragment('<div>Hello, <b>world</b>!</div>'); + * + * // Serializes the <div> element. + * const html = parse5.serializeOuter(document.childNodes[0]); + * + * console.log(str); //> '<div>Hello, <b>world</b>!</div>' + * ``` + * + * @param node Node to serialize. + * @param options Serialization options. + */ +function serializeOuter(node, options) { + const opts = Object.assign(Object.assign({}, defaultOpts), options); + return serializeNode(node, opts); +} +exports.serializeOuter = serializeOuter; +function serializeChildNodes(parentNode, options) { + let html = ''; + // Get container of the child nodes + const container = options.treeAdapter.isElementNode(parentNode) && + options.treeAdapter.getTagName(parentNode) === html_js_1.TAG_NAMES.TEMPLATE && + options.treeAdapter.getNamespaceURI(parentNode) === html_js_1.NS.HTML + ? options.treeAdapter.getTemplateContent(parentNode) + : parentNode; + const childNodes = options.treeAdapter.getChildNodes(container); + if (childNodes) { + for (const currentNode of childNodes) { + html += serializeNode(currentNode, options); + } + } + return html; +} +function serializeNode(node, options) { + if (options.treeAdapter.isElementNode(node)) { + return serializeElement(node, options); + } + if (options.treeAdapter.isTextNode(node)) { + return serializeTextNode(node, options); + } + if (options.treeAdapter.isCommentNode(node)) { + return serializeCommentNode(node, options); + } + if (options.treeAdapter.isDocumentTypeNode(node)) { + return serializeDocumentTypeNode(node, options); + } + // Return an empty string for unknown nodes + return ''; +} +function serializeElement(node, options) { + const tn = options.treeAdapter.getTagName(node); + return `<${tn}${serializeAttributes(node, options)}>${isVoidElement(node, options) ? '' : `${serializeChildNodes(node, options)}</${tn}>`}`; +} +function serializeAttributes(node, { treeAdapter }) { + let html = ''; + for (const attr of treeAdapter.getAttrList(node)) { + html += ' '; + if (!attr.namespace) { + html += attr.name; + } + else + switch (attr.namespace) { + case html_js_1.NS.XML: { + html += `xml:${attr.name}`; + break; } - } - } - } - - _serializeElement(node) { - const tn = this.treeAdapter.getTagName(node); - const ns = this.treeAdapter.getNamespaceURI(node); - - this.html += '<' + tn; - this._serializeAttributes(node); - this.html += '>'; - - if ( - tn !== $.AREA && - tn !== $.BASE && - tn !== $.BASEFONT && - tn !== $.BGSOUND && - tn !== $.BR && - tn !== $.COL && - tn !== $.EMBED && - tn !== $.FRAME && - tn !== $.HR && - tn !== $.IMG && - tn !== $.INPUT && - tn !== $.KEYGEN && - tn !== $.LINK && - tn !== $.META && - tn !== $.PARAM && - tn !== $.SOURCE && - tn !== $.TRACK && - tn !== $.WBR - ) { - const childNodesHolder = - tn === $.TEMPLATE && ns === NS.HTML ? this.treeAdapter.getTemplateContent(node) : node; - - this._serializeChildNodes(childNodesHolder); - this.html += '</' + tn + '>'; - } - } - - _serializeAttributes(node) { - const attrs = this.treeAdapter.getAttrList(node); - - for (let i = 0, attrsLength = attrs.length; i < attrsLength; i++) { - const attr = attrs[i]; - const value = Serializer.escapeString(attr.value, true); - - this.html += ' '; - - if (!attr.namespace) { - this.html += attr.name; - } else if (attr.namespace === NS.XML) { - this.html += 'xml:' + attr.name; - } else if (attr.namespace === NS.XMLNS) { - if (attr.name !== 'xmlns') { - this.html += 'xmlns:'; + case html_js_1.NS.XMLNS: { + if (attr.name !== 'xmlns') { + html += 'xmlns:'; + } + html += attr.name; + break; + } + case html_js_1.NS.XLINK: { + html += `xlink:${attr.name}`; + break; + } + default: { + html += `${attr.prefix}:${attr.name}`; } - - this.html += attr.name; - } else if (attr.namespace === NS.XLINK) { - this.html += 'xlink:' + attr.name; - } else { - this.html += attr.prefix + ':' + attr.name; } - - this.html += '="' + value + '"'; - } - } - - _serializeTextNode(node) { - const content = this.treeAdapter.getTextNodeContent(node); - const parent = this.treeAdapter.getParentNode(node); - let parentTn = void 0; - - if (parent && this.treeAdapter.isElementNode(parent)) { - parentTn = this.treeAdapter.getTagName(parent); - } - - if ( - parentTn === $.STYLE || - parentTn === $.SCRIPT || - parentTn === $.XMP || - parentTn === $.IFRAME || - parentTn === $.NOEMBED || - parentTn === $.NOFRAMES || - parentTn === $.PLAINTEXT || - parentTn === $.NOSCRIPT - ) { - this.html += content; - } else { - this.html += Serializer.escapeString(content, false); - } - } - - _serializeCommentNode(node) { - this.html += '<!--' + this.treeAdapter.getCommentNodeContent(node) + '-->'; - } - - _serializeDocumentTypeNode(node) { - const name = this.treeAdapter.getDocumentTypeNodeName(node); - - this.html += '<' + doctype.serializeContent(name, null, null) + '>'; - } -} - -// NOTE: used in tests and by rewriting stream -Serializer.escapeString = function(str, attrMode) { - str = str.replace(AMP_REGEX, '&').replace(NBSP_REGEX, ' '); - - if (attrMode) { - str = str.replace(DOUBLE_QUOTE_REGEX, '"'); - } else { - str = str.replace(LT_REGEX, '<').replace(GT_REGEX, '>'); - } - - return str; -}; - -module.exports = Serializer; - -},{"../common/doctype":1,"../common/html":4,"../tree-adapters/default":22,"../utils/merge-options":23}],19:[function(require,module,exports){ -'use strict'; - -const Preprocessor = require('./preprocessor'); -const unicode = require('../common/unicode'); -const neTree = require('./named-entity-data'); -const ERR = require('../common/error-codes'); - -//Aliases -const $ = unicode.CODE_POINTS; -const $$ = unicode.CODE_POINT_SEQUENCES; - + html += `="${(0, escape_js_1.escapeAttribute)(attr.value)}"`; + } + return html; +} +function serializeTextNode(node, options) { + const { treeAdapter } = options; + const content = treeAdapter.getTextNodeContent(node); + const parent = treeAdapter.getParentNode(node); + const parentTn = parent && treeAdapter.isElementNode(parent) && treeAdapter.getTagName(parent); + return parentTn && + treeAdapter.getNamespaceURI(parent) === html_js_1.NS.HTML && + (0, html_js_1.hasUnescapedText)(parentTn, options.scriptingEnabled) + ? content + : (0, escape_js_1.escapeText)(content); +} +function serializeCommentNode(node, { treeAdapter }) { + return `<!--${treeAdapter.getCommentNodeContent(node)}-->`; +} +function serializeDocumentTypeNode(node, { treeAdapter }) { + return `<!DOCTYPE ${treeAdapter.getDocumentTypeNodeName(node)}>`; +} + +},{"../common/html.js":4,"../tree-adapters/default.js":14,"entities/lib/escape.js":17}],12:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Tokenizer = exports.TokenizerMode = void 0; +const preprocessor_js_1 = require("./preprocessor.js"); +const unicode_js_1 = require("../common/unicode.js"); +const token_js_1 = require("../common/token.js"); +const decode_js_1 = require("entities/lib/decode.js"); +const error_codes_js_1 = require("../common/error-codes.js"); +const html_js_1 = require("../common/html.js"); //C1 Unicode control character reference replacements -const C1_CONTROLS_REFERENCE_REPLACEMENTS = { - 0x80: 0x20ac, - 0x82: 0x201a, - 0x83: 0x0192, - 0x84: 0x201e, - 0x85: 0x2026, - 0x86: 0x2020, - 0x87: 0x2021, - 0x88: 0x02c6, - 0x89: 0x2030, - 0x8a: 0x0160, - 0x8b: 0x2039, - 0x8c: 0x0152, - 0x8e: 0x017d, - 0x91: 0x2018, - 0x92: 0x2019, - 0x93: 0x201c, - 0x94: 0x201d, - 0x95: 0x2022, - 0x96: 0x2013, - 0x97: 0x2014, - 0x98: 0x02dc, - 0x99: 0x2122, - 0x9a: 0x0161, - 0x9b: 0x203a, - 0x9c: 0x0153, - 0x9e: 0x017e, - 0x9f: 0x0178 -}; - -// Named entity tree flags -const HAS_DATA_FLAG = 1 << 0; -const DATA_DUPLET_FLAG = 1 << 1; -const HAS_BRANCHES_FLAG = 1 << 2; -const MAX_BRANCH_MARKER_VALUE = HAS_DATA_FLAG | DATA_DUPLET_FLAG | HAS_BRANCHES_FLAG; - +const C1_CONTROLS_REFERENCE_REPLACEMENTS = new Map([ + [0x80, 8364], + [0x82, 8218], + [0x83, 402], + [0x84, 8222], + [0x85, 8230], + [0x86, 8224], + [0x87, 8225], + [0x88, 710], + [0x89, 8240], + [0x8a, 352], + [0x8b, 8249], + [0x8c, 338], + [0x8e, 381], + [0x91, 8216], + [0x92, 8217], + [0x93, 8220], + [0x94, 8221], + [0x95, 8226], + [0x96, 8211], + [0x97, 8212], + [0x98, 732], + [0x99, 8482], + [0x9a, 353], + [0x9b, 8250], + [0x9c, 339], + [0x9e, 382], + [0x9f, 376], +]); //States -const DATA_STATE = 'DATA_STATE'; -const RCDATA_STATE = 'RCDATA_STATE'; -const RAWTEXT_STATE = 'RAWTEXT_STATE'; -const SCRIPT_DATA_STATE = 'SCRIPT_DATA_STATE'; -const PLAINTEXT_STATE = 'PLAINTEXT_STATE'; -const TAG_OPEN_STATE = 'TAG_OPEN_STATE'; -const END_TAG_OPEN_STATE = 'END_TAG_OPEN_STATE'; -const TAG_NAME_STATE = 'TAG_NAME_STATE'; -const RCDATA_LESS_THAN_SIGN_STATE = 'RCDATA_LESS_THAN_SIGN_STATE'; -const RCDATA_END_TAG_OPEN_STATE = 'RCDATA_END_TAG_OPEN_STATE'; -const RCDATA_END_TAG_NAME_STATE = 'RCDATA_END_TAG_NAME_STATE'; -const RAWTEXT_LESS_THAN_SIGN_STATE = 'RAWTEXT_LESS_THAN_SIGN_STATE'; -const RAWTEXT_END_TAG_OPEN_STATE = 'RAWTEXT_END_TAG_OPEN_STATE'; -const RAWTEXT_END_TAG_NAME_STATE = 'RAWTEXT_END_TAG_NAME_STATE'; -const SCRIPT_DATA_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_LESS_THAN_SIGN_STATE'; -const SCRIPT_DATA_END_TAG_OPEN_STATE = 'SCRIPT_DATA_END_TAG_OPEN_STATE'; -const SCRIPT_DATA_END_TAG_NAME_STATE = 'SCRIPT_DATA_END_TAG_NAME_STATE'; -const SCRIPT_DATA_ESCAPE_START_STATE = 'SCRIPT_DATA_ESCAPE_START_STATE'; -const SCRIPT_DATA_ESCAPE_START_DASH_STATE = 'SCRIPT_DATA_ESCAPE_START_DASH_STATE'; -const SCRIPT_DATA_ESCAPED_STATE = 'SCRIPT_DATA_ESCAPED_STATE'; -const SCRIPT_DATA_ESCAPED_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_STATE'; -const SCRIPT_DATA_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_DASH_STATE'; -const SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE'; -const SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE'; -const SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE'; -const SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE'; -const SCRIPT_DATA_DOUBLE_ESCAPED_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_STATE'; -const SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE'; -const SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE'; -const SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE'; -const SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE'; -const BEFORE_ATTRIBUTE_NAME_STATE = 'BEFORE_ATTRIBUTE_NAME_STATE'; -const ATTRIBUTE_NAME_STATE = 'ATTRIBUTE_NAME_STATE'; -const AFTER_ATTRIBUTE_NAME_STATE = 'AFTER_ATTRIBUTE_NAME_STATE'; -const BEFORE_ATTRIBUTE_VALUE_STATE = 'BEFORE_ATTRIBUTE_VALUE_STATE'; -const ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE'; -const ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE'; -const ATTRIBUTE_VALUE_UNQUOTED_STATE = 'ATTRIBUTE_VALUE_UNQUOTED_STATE'; -const AFTER_ATTRIBUTE_VALUE_QUOTED_STATE = 'AFTER_ATTRIBUTE_VALUE_QUOTED_STATE'; -const SELF_CLOSING_START_TAG_STATE = 'SELF_CLOSING_START_TAG_STATE'; -const BOGUS_COMMENT_STATE = 'BOGUS_COMMENT_STATE'; -const MARKUP_DECLARATION_OPEN_STATE = 'MARKUP_DECLARATION_OPEN_STATE'; -const COMMENT_START_STATE = 'COMMENT_START_STATE'; -const COMMENT_START_DASH_STATE = 'COMMENT_START_DASH_STATE'; -const COMMENT_STATE = 'COMMENT_STATE'; -const COMMENT_LESS_THAN_SIGN_STATE = 'COMMENT_LESS_THAN_SIGN_STATE'; -const COMMENT_LESS_THAN_SIGN_BANG_STATE = 'COMMENT_LESS_THAN_SIGN_BANG_STATE'; -const COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE = 'COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE'; -const COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE = 'COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE'; -const COMMENT_END_DASH_STATE = 'COMMENT_END_DASH_STATE'; -const COMMENT_END_STATE = 'COMMENT_END_STATE'; -const COMMENT_END_BANG_STATE = 'COMMENT_END_BANG_STATE'; -const DOCTYPE_STATE = 'DOCTYPE_STATE'; -const BEFORE_DOCTYPE_NAME_STATE = 'BEFORE_DOCTYPE_NAME_STATE'; -const DOCTYPE_NAME_STATE = 'DOCTYPE_NAME_STATE'; -const AFTER_DOCTYPE_NAME_STATE = 'AFTER_DOCTYPE_NAME_STATE'; -const AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE = 'AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE'; -const BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE'; -const DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE'; -const DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE'; -const AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE'; -const BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE = 'BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE'; -const AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE = 'AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE'; -const BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE'; -const DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE'; -const DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE'; -const AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE'; -const BOGUS_DOCTYPE_STATE = 'BOGUS_DOCTYPE_STATE'; -const CDATA_SECTION_STATE = 'CDATA_SECTION_STATE'; -const CDATA_SECTION_BRACKET_STATE = 'CDATA_SECTION_BRACKET_STATE'; -const CDATA_SECTION_END_STATE = 'CDATA_SECTION_END_STATE'; -const CHARACTER_REFERENCE_STATE = 'CHARACTER_REFERENCE_STATE'; -const NAMED_CHARACTER_REFERENCE_STATE = 'NAMED_CHARACTER_REFERENCE_STATE'; -const AMBIGUOUS_AMPERSAND_STATE = 'AMBIGUOS_AMPERSAND_STATE'; -const NUMERIC_CHARACTER_REFERENCE_STATE = 'NUMERIC_CHARACTER_REFERENCE_STATE'; -const HEXADEMICAL_CHARACTER_REFERENCE_START_STATE = 'HEXADEMICAL_CHARACTER_REFERENCE_START_STATE'; -const DECIMAL_CHARACTER_REFERENCE_START_STATE = 'DECIMAL_CHARACTER_REFERENCE_START_STATE'; -const HEXADEMICAL_CHARACTER_REFERENCE_STATE = 'HEXADEMICAL_CHARACTER_REFERENCE_STATE'; -const DECIMAL_CHARACTER_REFERENCE_STATE = 'DECIMAL_CHARACTER_REFERENCE_STATE'; -const NUMERIC_CHARACTER_REFERENCE_END_STATE = 'NUMERIC_CHARACTER_REFERENCE_END_STATE'; - +var State; +(function (State) { + State[State["DATA"] = 0] = "DATA"; + State[State["RCDATA"] = 1] = "RCDATA"; + State[State["RAWTEXT"] = 2] = "RAWTEXT"; + State[State["SCRIPT_DATA"] = 3] = "SCRIPT_DATA"; + State[State["PLAINTEXT"] = 4] = "PLAINTEXT"; + State[State["TAG_OPEN"] = 5] = "TAG_OPEN"; + State[State["END_TAG_OPEN"] = 6] = "END_TAG_OPEN"; + State[State["TAG_NAME"] = 7] = "TAG_NAME"; + State[State["RCDATA_LESS_THAN_SIGN"] = 8] = "RCDATA_LESS_THAN_SIGN"; + State[State["RCDATA_END_TAG_OPEN"] = 9] = "RCDATA_END_TAG_OPEN"; + State[State["RCDATA_END_TAG_NAME"] = 10] = "RCDATA_END_TAG_NAME"; + State[State["RAWTEXT_LESS_THAN_SIGN"] = 11] = "RAWTEXT_LESS_THAN_SIGN"; + State[State["RAWTEXT_END_TAG_OPEN"] = 12] = "RAWTEXT_END_TAG_OPEN"; + State[State["RAWTEXT_END_TAG_NAME"] = 13] = "RAWTEXT_END_TAG_NAME"; + State[State["SCRIPT_DATA_LESS_THAN_SIGN"] = 14] = "SCRIPT_DATA_LESS_THAN_SIGN"; + State[State["SCRIPT_DATA_END_TAG_OPEN"] = 15] = "SCRIPT_DATA_END_TAG_OPEN"; + State[State["SCRIPT_DATA_END_TAG_NAME"] = 16] = "SCRIPT_DATA_END_TAG_NAME"; + State[State["SCRIPT_DATA_ESCAPE_START"] = 17] = "SCRIPT_DATA_ESCAPE_START"; + State[State["SCRIPT_DATA_ESCAPE_START_DASH"] = 18] = "SCRIPT_DATA_ESCAPE_START_DASH"; + State[State["SCRIPT_DATA_ESCAPED"] = 19] = "SCRIPT_DATA_ESCAPED"; + State[State["SCRIPT_DATA_ESCAPED_DASH"] = 20] = "SCRIPT_DATA_ESCAPED_DASH"; + State[State["SCRIPT_DATA_ESCAPED_DASH_DASH"] = 21] = "SCRIPT_DATA_ESCAPED_DASH_DASH"; + State[State["SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN"] = 22] = "SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN"; + State[State["SCRIPT_DATA_ESCAPED_END_TAG_OPEN"] = 23] = "SCRIPT_DATA_ESCAPED_END_TAG_OPEN"; + State[State["SCRIPT_DATA_ESCAPED_END_TAG_NAME"] = 24] = "SCRIPT_DATA_ESCAPED_END_TAG_NAME"; + State[State["SCRIPT_DATA_DOUBLE_ESCAPE_START"] = 25] = "SCRIPT_DATA_DOUBLE_ESCAPE_START"; + State[State["SCRIPT_DATA_DOUBLE_ESCAPED"] = 26] = "SCRIPT_DATA_DOUBLE_ESCAPED"; + State[State["SCRIPT_DATA_DOUBLE_ESCAPED_DASH"] = 27] = "SCRIPT_DATA_DOUBLE_ESCAPED_DASH"; + State[State["SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH"] = 28] = "SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH"; + State[State["SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN"] = 29] = "SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN"; + State[State["SCRIPT_DATA_DOUBLE_ESCAPE_END"] = 30] = "SCRIPT_DATA_DOUBLE_ESCAPE_END"; + State[State["BEFORE_ATTRIBUTE_NAME"] = 31] = "BEFORE_ATTRIBUTE_NAME"; + State[State["ATTRIBUTE_NAME"] = 32] = "ATTRIBUTE_NAME"; + State[State["AFTER_ATTRIBUTE_NAME"] = 33] = "AFTER_ATTRIBUTE_NAME"; + State[State["BEFORE_ATTRIBUTE_VALUE"] = 34] = "BEFORE_ATTRIBUTE_VALUE"; + State[State["ATTRIBUTE_VALUE_DOUBLE_QUOTED"] = 35] = "ATTRIBUTE_VALUE_DOUBLE_QUOTED"; + State[State["ATTRIBUTE_VALUE_SINGLE_QUOTED"] = 36] = "ATTRIBUTE_VALUE_SINGLE_QUOTED"; + State[State["ATTRIBUTE_VALUE_UNQUOTED"] = 37] = "ATTRIBUTE_VALUE_UNQUOTED"; + State[State["AFTER_ATTRIBUTE_VALUE_QUOTED"] = 38] = "AFTER_ATTRIBUTE_VALUE_QUOTED"; + State[State["SELF_CLOSING_START_TAG"] = 39] = "SELF_CLOSING_START_TAG"; + State[State["BOGUS_COMMENT"] = 40] = "BOGUS_COMMENT"; + State[State["MARKUP_DECLARATION_OPEN"] = 41] = "MARKUP_DECLARATION_OPEN"; + State[State["COMMENT_START"] = 42] = "COMMENT_START"; + State[State["COMMENT_START_DASH"] = 43] = "COMMENT_START_DASH"; + State[State["COMMENT"] = 44] = "COMMENT"; + State[State["COMMENT_LESS_THAN_SIGN"] = 45] = "COMMENT_LESS_THAN_SIGN"; + State[State["COMMENT_LESS_THAN_SIGN_BANG"] = 46] = "COMMENT_LESS_THAN_SIGN_BANG"; + State[State["COMMENT_LESS_THAN_SIGN_BANG_DASH"] = 47] = "COMMENT_LESS_THAN_SIGN_BANG_DASH"; + State[State["COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH"] = 48] = "COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH"; + State[State["COMMENT_END_DASH"] = 49] = "COMMENT_END_DASH"; + State[State["COMMENT_END"] = 50] = "COMMENT_END"; + State[State["COMMENT_END_BANG"] = 51] = "COMMENT_END_BANG"; + State[State["DOCTYPE"] = 52] = "DOCTYPE"; + State[State["BEFORE_DOCTYPE_NAME"] = 53] = "BEFORE_DOCTYPE_NAME"; + State[State["DOCTYPE_NAME"] = 54] = "DOCTYPE_NAME"; + State[State["AFTER_DOCTYPE_NAME"] = 55] = "AFTER_DOCTYPE_NAME"; + State[State["AFTER_DOCTYPE_PUBLIC_KEYWORD"] = 56] = "AFTER_DOCTYPE_PUBLIC_KEYWORD"; + State[State["BEFORE_DOCTYPE_PUBLIC_IDENTIFIER"] = 57] = "BEFORE_DOCTYPE_PUBLIC_IDENTIFIER"; + State[State["DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED"] = 58] = "DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED"; + State[State["DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED"] = 59] = "DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED"; + State[State["AFTER_DOCTYPE_PUBLIC_IDENTIFIER"] = 60] = "AFTER_DOCTYPE_PUBLIC_IDENTIFIER"; + State[State["BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS"] = 61] = "BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS"; + State[State["AFTER_DOCTYPE_SYSTEM_KEYWORD"] = 62] = "AFTER_DOCTYPE_SYSTEM_KEYWORD"; + State[State["BEFORE_DOCTYPE_SYSTEM_IDENTIFIER"] = 63] = "BEFORE_DOCTYPE_SYSTEM_IDENTIFIER"; + State[State["DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED"] = 64] = "DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED"; + State[State["DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED"] = 65] = "DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED"; + State[State["AFTER_DOCTYPE_SYSTEM_IDENTIFIER"] = 66] = "AFTER_DOCTYPE_SYSTEM_IDENTIFIER"; + State[State["BOGUS_DOCTYPE"] = 67] = "BOGUS_DOCTYPE"; + State[State["CDATA_SECTION"] = 68] = "CDATA_SECTION"; + State[State["CDATA_SECTION_BRACKET"] = 69] = "CDATA_SECTION_BRACKET"; + State[State["CDATA_SECTION_END"] = 70] = "CDATA_SECTION_END"; + State[State["CHARACTER_REFERENCE"] = 71] = "CHARACTER_REFERENCE"; + State[State["NAMED_CHARACTER_REFERENCE"] = 72] = "NAMED_CHARACTER_REFERENCE"; + State[State["AMBIGUOUS_AMPERSAND"] = 73] = "AMBIGUOUS_AMPERSAND"; + State[State["NUMERIC_CHARACTER_REFERENCE"] = 74] = "NUMERIC_CHARACTER_REFERENCE"; + State[State["HEXADEMICAL_CHARACTER_REFERENCE_START"] = 75] = "HEXADEMICAL_CHARACTER_REFERENCE_START"; + State[State["DECIMAL_CHARACTER_REFERENCE_START"] = 76] = "DECIMAL_CHARACTER_REFERENCE_START"; + State[State["HEXADEMICAL_CHARACTER_REFERENCE"] = 77] = "HEXADEMICAL_CHARACTER_REFERENCE"; + State[State["DECIMAL_CHARACTER_REFERENCE"] = 78] = "DECIMAL_CHARACTER_REFERENCE"; + State[State["NUMERIC_CHARACTER_REFERENCE_END"] = 79] = "NUMERIC_CHARACTER_REFERENCE_END"; +})(State || (State = {})); +//Tokenizer initial states for different modes +exports.TokenizerMode = { + DATA: State.DATA, + RCDATA: State.RCDATA, + RAWTEXT: State.RAWTEXT, + SCRIPT_DATA: State.SCRIPT_DATA, + PLAINTEXT: State.PLAINTEXT, + CDATA_SECTION: State.CDATA_SECTION, +}; //Utils - //OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline //this functions if they will be situated in another module due to context switch. //Always perform inlining check before modifying this functions ('node --trace-inlining'). -function isWhitespace(cp) { - return cp === $.SPACE || cp === $.LINE_FEED || cp === $.TABULATION || cp === $.FORM_FEED; -} - function isAsciiDigit(cp) { - return cp >= $.DIGIT_0 && cp <= $.DIGIT_9; + return cp >= unicode_js_1.CODE_POINTS.DIGIT_0 && cp <= unicode_js_1.CODE_POINTS.DIGIT_9; } - function isAsciiUpper(cp) { - return cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_Z; + return cp >= unicode_js_1.CODE_POINTS.LATIN_CAPITAL_A && cp <= unicode_js_1.CODE_POINTS.LATIN_CAPITAL_Z; } - function isAsciiLower(cp) { - return cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_Z; + return cp >= unicode_js_1.CODE_POINTS.LATIN_SMALL_A && cp <= unicode_js_1.CODE_POINTS.LATIN_SMALL_Z; } - function isAsciiLetter(cp) { return isAsciiLower(cp) || isAsciiUpper(cp); } - function isAsciiAlphaNumeric(cp) { return isAsciiLetter(cp) || isAsciiDigit(cp); } - function isAsciiUpperHexDigit(cp) { - return cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_F; + return cp >= unicode_js_1.CODE_POINTS.LATIN_CAPITAL_A && cp <= unicode_js_1.CODE_POINTS.LATIN_CAPITAL_F; } - function isAsciiLowerHexDigit(cp) { - return cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_F; + return cp >= unicode_js_1.CODE_POINTS.LATIN_SMALL_A && cp <= unicode_js_1.CODE_POINTS.LATIN_SMALL_F; } - function isAsciiHexDigit(cp) { return isAsciiDigit(cp) || isAsciiUpperHexDigit(cp) || isAsciiLowerHexDigit(cp); } - -function toAsciiLowerCodePoint(cp) { - return cp + 0x0020; +function toAsciiLower(cp) { + return cp + 32; } - -//NOTE: String.fromCharCode() function can handle only characters from BMP subset. -//So, we need to workaround this manually. -//(see: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/fromCharCode#Getting_it_to_work_with_higher_values) -function toChar(cp) { - if (cp <= 0xffff) { - return String.fromCharCode(cp); - } - - cp -= 0x10000; - return String.fromCharCode(((cp >>> 10) & 0x3ff) | 0xd800) + String.fromCharCode(0xdc00 | (cp & 0x3ff)); +function isWhitespace(cp) { + return cp === unicode_js_1.CODE_POINTS.SPACE || cp === unicode_js_1.CODE_POINTS.LINE_FEED || cp === unicode_js_1.CODE_POINTS.TABULATION || cp === unicode_js_1.CODE_POINTS.FORM_FEED; } - -function toAsciiLowerChar(cp) { - return String.fromCharCode(toAsciiLowerCodePoint(cp)); +function isEntityInAttributeInvalidEnd(nextCp) { + return nextCp === unicode_js_1.CODE_POINTS.EQUALS_SIGN || isAsciiAlphaNumeric(nextCp); } - -function findNamedEntityTreeBranch(nodeIx, cp) { - const branchCount = neTree[++nodeIx]; - let lo = ++nodeIx; - let hi = lo + branchCount - 1; - - while (lo <= hi) { - const mid = (lo + hi) >>> 1; - const midCp = neTree[mid]; - - if (midCp < cp) { - lo = mid + 1; - } else if (midCp > cp) { - hi = mid - 1; - } else { - return neTree[mid + branchCount]; - } - } - - return -1; +function isScriptDataDoubleEscapeSequenceEnd(cp) { + return isWhitespace(cp) || cp === unicode_js_1.CODE_POINTS.SOLIDUS || cp === unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN; } - //Tokenizer class Tokenizer { - constructor() { - this.preprocessor = new Preprocessor(); - - this.tokenQueue = []; - - this.allowCDATA = false; - - this.state = DATA_STATE; - this.returnState = ''; - - this.charRefCode = -1; - this.tempBuff = []; + constructor(options, handler) { + this.options = options; + this.handler = handler; + this.paused = false; + /** Ensures that the parsing loop isn't run multiple times at once. */ + this.inLoop = false; + /** + * Indicates that the current adjusted node exists, is not an element in the HTML namespace, + * and that it is not an integration point for either MathML or HTML. + * + * @see {@link https://html.spec.whatwg.org/multipage/parsing.html#tree-construction} + */ + this.inForeignNode = false; this.lastStartTagName = ''; - - this.consumedAfterSnapshot = -1; this.active = false; - + this.state = State.DATA; + this.returnState = State.DATA; + this.charRefCode = -1; + this.consumedAfterSnapshot = -1; this.currentCharacterToken = null; this.currentToken = null; - this.currentAttr = null; + this.currentAttr = { name: '', value: '' }; + this.preprocessor = new preprocessor_js_1.Preprocessor(handler); + this.currentLocation = this.getCurrentLocation(-1); } - //Errors - _err() { - // NOTE: err reporting is noop by default. Enabled by mixin. + _err(code) { + var _a, _b; + (_b = (_a = this.handler).onParseError) === null || _b === void 0 ? void 0 : _b.call(_a, this.preprocessor.getError(code)); } - - _errOnNextCodePoint(err) { - this._consume(); - this._err(err); - this._unconsume(); + // NOTE: `offset` may never run across line boundaries. + getCurrentLocation(offset) { + if (!this.options.sourceCodeLocationInfo) { + return null; + } + return { + startLine: this.preprocessor.line, + startCol: this.preprocessor.col - offset, + startOffset: this.preprocessor.offset - offset, + endLine: -1, + endCol: -1, + endOffset: -1, + }; } - - //API - getNextToken() { - while (!this.tokenQueue.length && this.active) { + _runParsingLoop() { + if (this.inLoop) + return; + this.inLoop = true; + while (this.active && !this.paused) { this.consumedAfterSnapshot = 0; - const cp = this._consume(); - if (!this._ensureHibernation()) { - this[this.state](cp); + this._callState(cp); } } - - return this.tokenQueue.shift(); + this.inLoop = false; } - - write(chunk, isLastChunk) { + //API + pause() { + this.paused = true; + } + resume(writeCallback) { + if (!this.paused) { + throw new Error('Parser was already resumed'); + } + this.paused = false; + // Necessary for synchronous resume. + if (this.inLoop) + return; + this._runParsingLoop(); + if (!this.paused) { + writeCallback === null || writeCallback === void 0 ? void 0 : writeCallback(); + } + } + write(chunk, isLastChunk, writeCallback) { this.active = true; this.preprocessor.write(chunk, isLastChunk); + this._runParsingLoop(); + if (!this.paused) { + writeCallback === null || writeCallback === void 0 ? void 0 : writeCallback(); + } } - insertHtmlAtCurrentPos(chunk) { this.active = true; this.preprocessor.insertHtmlAtCurrentPos(chunk); + this._runParsingLoop(); } - //Hibernation _ensureHibernation() { if (this.preprocessor.endOfChunkHit) { - for (; this.consumedAfterSnapshot > 0; this.consumedAfterSnapshot--) { - this.preprocessor.retreat(); - } - + this._unconsume(this.consumedAfterSnapshot); this.active = false; - this.tokenQueue.push({ type: Tokenizer.HIBERNATION_TOKEN }); - return true; } - return false; } - //Consumption _consume() { this.consumedAfterSnapshot++; return this.preprocessor.advance(); } - - _unconsume() { - this.consumedAfterSnapshot--; - this.preprocessor.retreat(); + _unconsume(count) { + this.consumedAfterSnapshot -= count; + this.preprocessor.retreat(count); } - _reconsumeInState(state) { this.state = state; - this._unconsume(); + this._unconsume(1); } - - _consumeSequenceIfMatch(pattern, startCp, caseSensitive) { - let consumedCount = 0; - let isMatch = true; - const patternLength = pattern.length; - let patternPos = 0; - let cp = startCp; - let patternCp = void 0; - - for (; patternPos < patternLength; patternPos++) { - if (patternPos > 0) { - cp = this._consume(); - consumedCount++; - } - - if (cp === $.EOF) { - isMatch = false; - break; - } - - patternCp = pattern[patternPos]; - - if (cp !== patternCp && (caseSensitive || cp !== toAsciiLowerCodePoint(patternCp))) { - isMatch = false; - break; - } - } - - if (!isMatch) { - while (consumedCount--) { - this._unconsume(); - } + _advanceBy(count) { + this.consumedAfterSnapshot += count; + for (let i = 0; i < count; i++) { + this.preprocessor.advance(); } - - return isMatch; } - - //Temp buffer - _isTempBufferEqualToScriptString() { - if (this.tempBuff.length !== $$.SCRIPT_STRING.length) { - return false; - } - - for (let i = 0; i < this.tempBuff.length; i++) { - if (this.tempBuff[i] !== $$.SCRIPT_STRING[i]) { - return false; - } + _consumeSequenceIfMatch(pattern, caseSensitive) { + if (this.preprocessor.startsWith(pattern, caseSensitive)) { + // We will already have consumed one character before calling this method. + this._advanceBy(pattern.length - 1); + return true; } - - return true; + return false; } - //Token creation _createStartTagToken() { this.currentToken = { - type: Tokenizer.START_TAG_TOKEN, + type: token_js_1.TokenType.START_TAG, tagName: '', + tagID: html_js_1.TAG_ID.UNKNOWN, selfClosing: false, ackSelfClosing: false, - attrs: [] + attrs: [], + location: this.getCurrentLocation(1), }; } - _createEndTagToken() { this.currentToken = { - type: Tokenizer.END_TAG_TOKEN, + type: token_js_1.TokenType.END_TAG, tagName: '', + tagID: html_js_1.TAG_ID.UNKNOWN, selfClosing: false, - attrs: [] + ackSelfClosing: false, + attrs: [], + location: this.getCurrentLocation(2), }; } - - _createCommentToken() { + _createCommentToken(offset) { this.currentToken = { - type: Tokenizer.COMMENT_TOKEN, - data: '' + type: token_js_1.TokenType.COMMENT, + data: '', + location: this.getCurrentLocation(offset), }; } - _createDoctypeToken(initialName) { this.currentToken = { - type: Tokenizer.DOCTYPE_TOKEN, + type: token_js_1.TokenType.DOCTYPE, name: initialName, forceQuirks: false, publicId: null, - systemId: null + systemId: null, + location: this.currentLocation, }; } - - _createCharacterToken(type, ch) { + _createCharacterToken(type, chars) { this.currentCharacterToken = { - type: type, - chars: ch + type, + chars, + location: this.currentLocation, }; } - - _createEOFToken() { - this.currentToken = { type: Tokenizer.EOF_TOKEN }; - } - //Tag attributes _createAttr(attrNameFirstCh) { this.currentAttr = { name: attrNameFirstCh, - value: '' + value: '', }; - } - - _leaveAttrName(toState) { - if (Tokenizer.getTokenAttr(this.currentToken, this.currentAttr.name) === null) { - this.currentToken.attrs.push(this.currentAttr); - } else { - this._err(ERR.duplicateAttribute); + this.currentLocation = this.getCurrentLocation(0); + } + _leaveAttrName() { + var _a; + var _b; + const token = this.currentToken; + if ((0, token_js_1.getTokenAttr)(token, this.currentAttr.name) === null) { + token.attrs.push(this.currentAttr); + if (token.location && this.currentLocation) { + const attrLocations = ((_a = (_b = token.location).attrs) !== null && _a !== void 0 ? _a : (_b.attrs = Object.create(null))); + attrLocations[this.currentAttr.name] = this.currentLocation; + // Set end location + this._leaveAttrValue(); + } + } + else { + this._err(error_codes_js_1.ERR.duplicateAttribute); } - - this.state = toState; } - - _leaveAttrValue(toState) { - this.state = toState; + _leaveAttrValue() { + if (this.currentLocation) { + this.currentLocation.endLine = this.preprocessor.line; + this.currentLocation.endCol = this.preprocessor.col; + this.currentLocation.endOffset = this.preprocessor.offset; + } } - //Token emission - _emitCurrentToken() { - this._emitCurrentCharacterToken(); - - const ct = this.currentToken; - + prepareToken(ct) { + this._emitCurrentCharacterToken(ct.location); this.currentToken = null; - - //NOTE: store emited start tag's tagName to determine is the following end tag token is appropriate. - if (ct.type === Tokenizer.START_TAG_TOKEN) { + if (ct.location) { + ct.location.endLine = this.preprocessor.line; + ct.location.endCol = this.preprocessor.col + 1; + ct.location.endOffset = this.preprocessor.offset + 1; + } + this.currentLocation = this.getCurrentLocation(-1); + } + emitCurrentTagToken() { + const ct = this.currentToken; + this.prepareToken(ct); + ct.tagID = (0, html_js_1.getTagID)(ct.tagName); + if (ct.type === token_js_1.TokenType.START_TAG) { this.lastStartTagName = ct.tagName; - } else if (ct.type === Tokenizer.END_TAG_TOKEN) { + this.handler.onStartTag(ct); + } + else { if (ct.attrs.length > 0) { - this._err(ERR.endTagWithAttributes); + this._err(error_codes_js_1.ERR.endTagWithAttributes); } - if (ct.selfClosing) { - this._err(ERR.endTagWithTrailingSolidus); + this._err(error_codes_js_1.ERR.endTagWithTrailingSolidus); } + this.handler.onEndTag(ct); } - - this.tokenQueue.push(ct); + this.preprocessor.dropParsedChunk(); } - - _emitCurrentCharacterToken() { + emitCurrentComment(ct) { + this.prepareToken(ct); + this.handler.onComment(ct); + this.preprocessor.dropParsedChunk(); + } + emitCurrentDoctype(ct) { + this.prepareToken(ct); + this.handler.onDoctype(ct); + this.preprocessor.dropParsedChunk(); + } + _emitCurrentCharacterToken(nextLocation) { if (this.currentCharacterToken) { - this.tokenQueue.push(this.currentCharacterToken); + //NOTE: if we have a pending character token, make it's end location equal to the + //current token's start location. + if (nextLocation && this.currentCharacterToken.location) { + this.currentCharacterToken.location.endLine = nextLocation.startLine; + this.currentCharacterToken.location.endCol = nextLocation.startCol; + this.currentCharacterToken.location.endOffset = nextLocation.startOffset; + } + switch (this.currentCharacterToken.type) { + case token_js_1.TokenType.CHARACTER: { + this.handler.onCharacter(this.currentCharacterToken); + break; + } + case token_js_1.TokenType.NULL_CHARACTER: { + this.handler.onNullCharacter(this.currentCharacterToken); + break; + } + case token_js_1.TokenType.WHITESPACE_CHARACTER: { + this.handler.onWhitespaceCharacter(this.currentCharacterToken); + break; + } + } this.currentCharacterToken = null; } } - _emitEOFToken() { - this._createEOFToken(); - this._emitCurrentToken(); + const location = this.getCurrentLocation(0); + if (location) { + location.endLine = location.startLine; + location.endCol = location.startCol; + location.endOffset = location.startOffset; + } + this._emitCurrentCharacterToken(location); + this.handler.onEof({ type: token_js_1.TokenType.EOF, location }); + this.active = false; } - //Characters emission - //OPTIMIZATION: specification uses only one type of character tokens (one token per character). //This causes a huge memory overhead and a lot of unnecessary parser loops. parse5 uses 3 groups of characters. - //If we have a sequence of characters that belong to the same group, parser can process it + //If we have a sequence of characters that belong to the same group, the parser can process it //as a single solid character token. //So, there are 3 types of character tokens in parse5: - //1)NULL_CHARACTER_TOKEN - \u0000-character sequences (e.g. '\u0000\u0000\u0000') - //2)WHITESPACE_CHARACTER_TOKEN - any whitespace/new-line character sequences (e.g. '\n \r\t \f') - //3)CHARACTER_TOKEN - any character sequence which don't belong to groups 1 and 2 (e.g. 'abcdef1234@@#$%^') + //1)TokenType.NULL_CHARACTER - \u0000-character sequences (e.g. '\u0000\u0000\u0000') + //2)TokenType.WHITESPACE_CHARACTER - any whitespace/new-line character sequences (e.g. '\n \r\t \f') + //3)TokenType.CHARACTER - any character sequence which don't belong to groups 1 and 2 (e.g. 'abcdef1234@@#$%^') _appendCharToCurrentCharacterToken(type, ch) { - if (this.currentCharacterToken && this.currentCharacterToken.type !== type) { - this._emitCurrentCharacterToken(); - } - if (this.currentCharacterToken) { - this.currentCharacterToken.chars += ch; - } else { - this._createCharacterToken(type, ch); + if (this.currentCharacterToken.type !== type) { + this.currentLocation = this.getCurrentLocation(0); + this._emitCurrentCharacterToken(this.currentLocation); + this.preprocessor.dropParsedChunk(); + } + else { + this.currentCharacterToken.chars += ch; + return; + } } + this._createCharacterToken(type, ch); } - _emitCodePoint(cp) { - let type = Tokenizer.CHARACTER_TOKEN; - + let type = token_js_1.TokenType.CHARACTER; if (isWhitespace(cp)) { - type = Tokenizer.WHITESPACE_CHARACTER_TOKEN; - } else if (cp === $.NULL) { - type = Tokenizer.NULL_CHARACTER_TOKEN; + type = token_js_1.TokenType.WHITESPACE_CHARACTER; } - - this._appendCharToCurrentCharacterToken(type, toChar(cp)); - } - - _emitSeveralCodePoints(codePoints) { - for (let i = 0; i < codePoints.length; i++) { - this._emitCodePoint(codePoints[i]); + else if (cp === unicode_js_1.CODE_POINTS.NULL) { + type = token_js_1.TokenType.NULL_CHARACTER; } + this._appendCharToCurrentCharacterToken(type, String.fromCodePoint(cp)); } - - //NOTE: used then we emit character explicitly. This is always a non-whitespace and a non-null character. - //So we can avoid additional checks here. + //NOTE: used when we emit characters explicitly. + //This is always for non-whitespace and non-null characters, which allows us to avoid additional checks. _emitChars(ch) { - this._appendCharToCurrentCharacterToken(Tokenizer.CHARACTER_TOKEN, ch); + this._appendCharToCurrentCharacterToken(token_js_1.TokenType.CHARACTER, ch); } - // Character reference helpers - _matchNamedCharacterReference(startCp) { + _matchNamedCharacterReference(cp) { let result = null; - let excess = 1; - let i = findNamedEntityTreeBranch(0, startCp); - - this.tempBuff.push(startCp); - - while (i > -1) { - const current = neTree[i]; - const inNode = current < MAX_BRANCH_MARKER_VALUE; - const nodeWithData = inNode && current & HAS_DATA_FLAG; - - if (nodeWithData) { - //NOTE: we use greedy search, so we continue lookup at this point - result = current & DATA_DUPLET_FLAG ? [neTree[++i], neTree[++i]] : [neTree[++i]]; - excess = 0; - } - - const cp = this._consume(); - - this.tempBuff.push(cp); - excess++; - - if (cp === $.EOF) { + let excess = 0; + let withoutSemicolon = false; + for (let i = 0, current = decode_js_1.htmlDecodeTree[0]; i >= 0; cp = this._consume()) { + i = (0, decode_js_1.determineBranch)(decode_js_1.htmlDecodeTree, current, i + 1, cp); + if (i < 0) break; - } - - if (inNode) { - i = current & HAS_BRANCHES_FLAG ? findNamedEntityTreeBranch(i, cp) : -1; - } else { - i = cp === current ? ++i : -1; + excess += 1; + current = decode_js_1.htmlDecodeTree[i]; + const masked = current & decode_js_1.BinTrieFlags.VALUE_LENGTH; + // If the branch is a value, store it and continue + if (masked) { + // The mask is the number of bytes of the value, including the current byte. + const valueLength = (masked >> 14) - 1; + // Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error. + // See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state + if (cp !== unicode_js_1.CODE_POINTS.SEMICOLON && + this._isCharacterReferenceInAttribute() && + isEntityInAttributeInvalidEnd(this.preprocessor.peek(1))) { + //NOTE: we don't flush all consumed code points here, and instead switch back to the original state after + //emitting an ampersand. This is fine, as alphanumeric characters won't be parsed differently in attributes. + result = [unicode_js_1.CODE_POINTS.AMPERSAND]; + // Skip over the value. + i += valueLength; + } + else { + // If this is a surrogate pair, consume the next two bytes. + result = + valueLength === 0 + ? [decode_js_1.htmlDecodeTree[i] & ~decode_js_1.BinTrieFlags.VALUE_LENGTH] + : valueLength === 1 + ? [decode_js_1.htmlDecodeTree[++i]] + : [decode_js_1.htmlDecodeTree[++i], decode_js_1.htmlDecodeTree[++i]]; + excess = 0; + withoutSemicolon = cp !== unicode_js_1.CODE_POINTS.SEMICOLON; + } + if (valueLength === 0) { + // If the value is zero-length, we're done. + this._consume(); + break; + } } } - - while (excess--) { - this.tempBuff.pop(); - this._unconsume(); + this._unconsume(excess); + if (withoutSemicolon && !this.preprocessor.endOfChunkHit) { + this._err(error_codes_js_1.ERR.missingSemicolonAfterCharacterReference); } - + // We want to emit the error above on the code point after the entity. + // We always consume one code point too many in the loop, and we wait to + // unconsume it until after the error is emitted. + this._unconsume(1); return result; } - _isCharacterReferenceInAttribute() { - return ( - this.returnState === ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE || - this.returnState === ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE || - this.returnState === ATTRIBUTE_VALUE_UNQUOTED_STATE - ); + return (this.returnState === State.ATTRIBUTE_VALUE_DOUBLE_QUOTED || + this.returnState === State.ATTRIBUTE_VALUE_SINGLE_QUOTED || + this.returnState === State.ATTRIBUTE_VALUE_UNQUOTED); } - - _isCharacterReferenceAttributeQuirk(withSemicolon) { - if (!withSemicolon && this._isCharacterReferenceInAttribute()) { - const nextCp = this._consume(); - - this._unconsume(); - - return nextCp === $.EQUALS_SIGN || isAsciiAlphaNumeric(nextCp); + _flushCodePointConsumedAsCharacterReference(cp) { + if (this._isCharacterReferenceInAttribute()) { + this.currentAttr.value += String.fromCodePoint(cp); + } + else { + this._emitCodePoint(cp); } - - return false; } - - _flushCodePointsConsumedAsCharacterReference() { - if (this._isCharacterReferenceInAttribute()) { - for (let i = 0; i < this.tempBuff.length; i++) { - this.currentAttr.value += toChar(this.tempBuff[i]); + // Calling states this way turns out to be much faster than any other approach. + _callState(cp) { + switch (this.state) { + case State.DATA: { + this._stateData(cp); + break; + } + case State.RCDATA: { + this._stateRcdata(cp); + break; + } + case State.RAWTEXT: { + this._stateRawtext(cp); + break; + } + case State.SCRIPT_DATA: { + this._stateScriptData(cp); + break; + } + case State.PLAINTEXT: { + this._statePlaintext(cp); + break; + } + case State.TAG_OPEN: { + this._stateTagOpen(cp); + break; + } + case State.END_TAG_OPEN: { + this._stateEndTagOpen(cp); + break; + } + case State.TAG_NAME: { + this._stateTagName(cp); + break; + } + case State.RCDATA_LESS_THAN_SIGN: { + this._stateRcdataLessThanSign(cp); + break; + } + case State.RCDATA_END_TAG_OPEN: { + this._stateRcdataEndTagOpen(cp); + break; + } + case State.RCDATA_END_TAG_NAME: { + this._stateRcdataEndTagName(cp); + break; + } + case State.RAWTEXT_LESS_THAN_SIGN: { + this._stateRawtextLessThanSign(cp); + break; + } + case State.RAWTEXT_END_TAG_OPEN: { + this._stateRawtextEndTagOpen(cp); + break; + } + case State.RAWTEXT_END_TAG_NAME: { + this._stateRawtextEndTagName(cp); + break; + } + case State.SCRIPT_DATA_LESS_THAN_SIGN: { + this._stateScriptDataLessThanSign(cp); + break; + } + case State.SCRIPT_DATA_END_TAG_OPEN: { + this._stateScriptDataEndTagOpen(cp); + break; + } + case State.SCRIPT_DATA_END_TAG_NAME: { + this._stateScriptDataEndTagName(cp); + break; + } + case State.SCRIPT_DATA_ESCAPE_START: { + this._stateScriptDataEscapeStart(cp); + break; + } + case State.SCRIPT_DATA_ESCAPE_START_DASH: { + this._stateScriptDataEscapeStartDash(cp); + break; + } + case State.SCRIPT_DATA_ESCAPED: { + this._stateScriptDataEscaped(cp); + break; + } + case State.SCRIPT_DATA_ESCAPED_DASH: { + this._stateScriptDataEscapedDash(cp); + break; + } + case State.SCRIPT_DATA_ESCAPED_DASH_DASH: { + this._stateScriptDataEscapedDashDash(cp); + break; + } + case State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN: { + this._stateScriptDataEscapedLessThanSign(cp); + break; + } + case State.SCRIPT_DATA_ESCAPED_END_TAG_OPEN: { + this._stateScriptDataEscapedEndTagOpen(cp); + break; + } + case State.SCRIPT_DATA_ESCAPED_END_TAG_NAME: { + this._stateScriptDataEscapedEndTagName(cp); + break; + } + case State.SCRIPT_DATA_DOUBLE_ESCAPE_START: { + this._stateScriptDataDoubleEscapeStart(cp); + break; + } + case State.SCRIPT_DATA_DOUBLE_ESCAPED: { + this._stateScriptDataDoubleEscaped(cp); + break; + } + case State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH: { + this._stateScriptDataDoubleEscapedDash(cp); + break; + } + case State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH: { + this._stateScriptDataDoubleEscapedDashDash(cp); + break; + } + case State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN: { + this._stateScriptDataDoubleEscapedLessThanSign(cp); + break; + } + case State.SCRIPT_DATA_DOUBLE_ESCAPE_END: { + this._stateScriptDataDoubleEscapeEnd(cp); + break; + } + case State.BEFORE_ATTRIBUTE_NAME: { + this._stateBeforeAttributeName(cp); + break; + } + case State.ATTRIBUTE_NAME: { + this._stateAttributeName(cp); + break; + } + case State.AFTER_ATTRIBUTE_NAME: { + this._stateAfterAttributeName(cp); + break; + } + case State.BEFORE_ATTRIBUTE_VALUE: { + this._stateBeforeAttributeValue(cp); + break; + } + case State.ATTRIBUTE_VALUE_DOUBLE_QUOTED: { + this._stateAttributeValueDoubleQuoted(cp); + break; + } + case State.ATTRIBUTE_VALUE_SINGLE_QUOTED: { + this._stateAttributeValueSingleQuoted(cp); + break; + } + case State.ATTRIBUTE_VALUE_UNQUOTED: { + this._stateAttributeValueUnquoted(cp); + break; + } + case State.AFTER_ATTRIBUTE_VALUE_QUOTED: { + this._stateAfterAttributeValueQuoted(cp); + break; + } + case State.SELF_CLOSING_START_TAG: { + this._stateSelfClosingStartTag(cp); + break; + } + case State.BOGUS_COMMENT: { + this._stateBogusComment(cp); + break; + } + case State.MARKUP_DECLARATION_OPEN: { + this._stateMarkupDeclarationOpen(cp); + break; + } + case State.COMMENT_START: { + this._stateCommentStart(cp); + break; + } + case State.COMMENT_START_DASH: { + this._stateCommentStartDash(cp); + break; + } + case State.COMMENT: { + this._stateComment(cp); + break; + } + case State.COMMENT_LESS_THAN_SIGN: { + this._stateCommentLessThanSign(cp); + break; + } + case State.COMMENT_LESS_THAN_SIGN_BANG: { + this._stateCommentLessThanSignBang(cp); + break; + } + case State.COMMENT_LESS_THAN_SIGN_BANG_DASH: { + this._stateCommentLessThanSignBangDash(cp); + break; + } + case State.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH: { + this._stateCommentLessThanSignBangDashDash(cp); + break; + } + case State.COMMENT_END_DASH: { + this._stateCommentEndDash(cp); + break; + } + case State.COMMENT_END: { + this._stateCommentEnd(cp); + break; + } + case State.COMMENT_END_BANG: { + this._stateCommentEndBang(cp); + break; + } + case State.DOCTYPE: { + this._stateDoctype(cp); + break; + } + case State.BEFORE_DOCTYPE_NAME: { + this._stateBeforeDoctypeName(cp); + break; + } + case State.DOCTYPE_NAME: { + this._stateDoctypeName(cp); + break; + } + case State.AFTER_DOCTYPE_NAME: { + this._stateAfterDoctypeName(cp); + break; + } + case State.AFTER_DOCTYPE_PUBLIC_KEYWORD: { + this._stateAfterDoctypePublicKeyword(cp); + break; + } + case State.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER: { + this._stateBeforeDoctypePublicIdentifier(cp); + break; + } + case State.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED: { + this._stateDoctypePublicIdentifierDoubleQuoted(cp); + break; + } + case State.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED: { + this._stateDoctypePublicIdentifierSingleQuoted(cp); + break; + } + case State.AFTER_DOCTYPE_PUBLIC_IDENTIFIER: { + this._stateAfterDoctypePublicIdentifier(cp); + break; + } + case State.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS: { + this._stateBetweenDoctypePublicAndSystemIdentifiers(cp); + break; + } + case State.AFTER_DOCTYPE_SYSTEM_KEYWORD: { + this._stateAfterDoctypeSystemKeyword(cp); + break; + } + case State.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER: { + this._stateBeforeDoctypeSystemIdentifier(cp); + break; + } + case State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED: { + this._stateDoctypeSystemIdentifierDoubleQuoted(cp); + break; + } + case State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED: { + this._stateDoctypeSystemIdentifierSingleQuoted(cp); + break; + } + case State.AFTER_DOCTYPE_SYSTEM_IDENTIFIER: { + this._stateAfterDoctypeSystemIdentifier(cp); + break; + } + case State.BOGUS_DOCTYPE: { + this._stateBogusDoctype(cp); + break; + } + case State.CDATA_SECTION: { + this._stateCdataSection(cp); + break; + } + case State.CDATA_SECTION_BRACKET: { + this._stateCdataSectionBracket(cp); + break; + } + case State.CDATA_SECTION_END: { + this._stateCdataSectionEnd(cp); + break; + } + case State.CHARACTER_REFERENCE: { + this._stateCharacterReference(cp); + break; + } + case State.NAMED_CHARACTER_REFERENCE: { + this._stateNamedCharacterReference(cp); + break; + } + case State.AMBIGUOUS_AMPERSAND: { + this._stateAmbiguousAmpersand(cp); + break; + } + case State.NUMERIC_CHARACTER_REFERENCE: { + this._stateNumericCharacterReference(cp); + break; + } + case State.HEXADEMICAL_CHARACTER_REFERENCE_START: { + this._stateHexademicalCharacterReferenceStart(cp); + break; + } + case State.DECIMAL_CHARACTER_REFERENCE_START: { + this._stateDecimalCharacterReferenceStart(cp); + break; + } + case State.HEXADEMICAL_CHARACTER_REFERENCE: { + this._stateHexademicalCharacterReference(cp); + break; + } + case State.DECIMAL_CHARACTER_REFERENCE: { + this._stateDecimalCharacterReference(cp); + break; + } + case State.NUMERIC_CHARACTER_REFERENCE_END: { + this._stateNumericCharacterReferenceEnd(); + break; + } + default: { + throw new Error('Unknown state'); } - } else { - this._emitSeveralCodePoints(this.tempBuff); } - - this.tempBuff = []; } - // State machine - // Data state //------------------------------------------------------------------ - [DATA_STATE](cp) { - this.preprocessor.dropParsedChunk(); - - if (cp === $.LESS_THAN_SIGN) { - this.state = TAG_OPEN_STATE; - } else if (cp === $.AMPERSAND) { - this.returnState = DATA_STATE; - this.state = CHARACTER_REFERENCE_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this._emitCodePoint(cp); - } else if (cp === $.EOF) { - this._emitEOFToken(); - } else { - this._emitCodePoint(cp); + _stateData(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + this.state = State.TAG_OPEN; + break; + } + case unicode_js_1.CODE_POINTS.AMPERSAND: { + this.returnState = State.DATA; + this.state = State.CHARACTER_REFERENCE; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this._emitCodePoint(cp); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._emitEOFToken(); + break; + } + default: { + this._emitCodePoint(cp); + } } } - // RCDATA state //------------------------------------------------------------------ - [RCDATA_STATE](cp) { - this.preprocessor.dropParsedChunk(); - - if (cp === $.AMPERSAND) { - this.returnState = RCDATA_STATE; - this.state = CHARACTER_REFERENCE_STATE; - } else if (cp === $.LESS_THAN_SIGN) { - this.state = RCDATA_LESS_THAN_SIGN_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this._emitChars(unicode.REPLACEMENT_CHARACTER); - } else if (cp === $.EOF) { - this._emitEOFToken(); - } else { - this._emitCodePoint(cp); + _stateRcdata(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.AMPERSAND: { + this.returnState = State.RCDATA; + this.state = State.CHARACTER_REFERENCE; + break; + } + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + this.state = State.RCDATA_LESS_THAN_SIGN; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._emitEOFToken(); + break; + } + default: { + this._emitCodePoint(cp); + } } } - // RAWTEXT state //------------------------------------------------------------------ - [RAWTEXT_STATE](cp) { - this.preprocessor.dropParsedChunk(); - - if (cp === $.LESS_THAN_SIGN) { - this.state = RAWTEXT_LESS_THAN_SIGN_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this._emitChars(unicode.REPLACEMENT_CHARACTER); - } else if (cp === $.EOF) { - this._emitEOFToken(); - } else { - this._emitCodePoint(cp); + _stateRawtext(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + this.state = State.RAWTEXT_LESS_THAN_SIGN; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._emitEOFToken(); + break; + } + default: { + this._emitCodePoint(cp); + } } } - // Script data state //------------------------------------------------------------------ - [SCRIPT_DATA_STATE](cp) { - this.preprocessor.dropParsedChunk(); - - if (cp === $.LESS_THAN_SIGN) { - this.state = SCRIPT_DATA_LESS_THAN_SIGN_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this._emitChars(unicode.REPLACEMENT_CHARACTER); - } else if (cp === $.EOF) { - this._emitEOFToken(); - } else { - this._emitCodePoint(cp); + _stateScriptData(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + this.state = State.SCRIPT_DATA_LESS_THAN_SIGN; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._emitEOFToken(); + break; + } + default: { + this._emitCodePoint(cp); + } } } - // PLAINTEXT state //------------------------------------------------------------------ - [PLAINTEXT_STATE](cp) { - this.preprocessor.dropParsedChunk(); - - if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this._emitChars(unicode.REPLACEMENT_CHARACTER); - } else if (cp === $.EOF) { - this._emitEOFToken(); - } else { - this._emitCodePoint(cp); + _statePlaintext(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._emitEOFToken(); + break; + } + default: { + this._emitCodePoint(cp); + } } } - // Tag open state //------------------------------------------------------------------ - [TAG_OPEN_STATE](cp) { - if (cp === $.EXCLAMATION_MARK) { - this.state = MARKUP_DECLARATION_OPEN_STATE; - } else if (cp === $.SOLIDUS) { - this.state = END_TAG_OPEN_STATE; - } else if (isAsciiLetter(cp)) { + _stateTagOpen(cp) { + if (isAsciiLetter(cp)) { this._createStartTagToken(); - this._reconsumeInState(TAG_NAME_STATE); - } else if (cp === $.QUESTION_MARK) { - this._err(ERR.unexpectedQuestionMarkInsteadOfTagName); - this._createCommentToken(); - this._reconsumeInState(BOGUS_COMMENT_STATE); - } else if (cp === $.EOF) { - this._err(ERR.eofBeforeTagName); - this._emitChars('<'); - this._emitEOFToken(); - } else { - this._err(ERR.invalidFirstCharacterOfTagName); - this._emitChars('<'); - this._reconsumeInState(DATA_STATE); + this.state = State.TAG_NAME; + this._stateTagName(cp); } + else + switch (cp) { + case unicode_js_1.CODE_POINTS.EXCLAMATION_MARK: { + this.state = State.MARKUP_DECLARATION_OPEN; + break; + } + case unicode_js_1.CODE_POINTS.SOLIDUS: { + this.state = State.END_TAG_OPEN; + break; + } + case unicode_js_1.CODE_POINTS.QUESTION_MARK: { + this._err(error_codes_js_1.ERR.unexpectedQuestionMarkInsteadOfTagName); + this._createCommentToken(1); + this.state = State.BOGUS_COMMENT; + this._stateBogusComment(cp); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofBeforeTagName); + this._emitChars('<'); + this._emitEOFToken(); + break; + } + default: { + this._err(error_codes_js_1.ERR.invalidFirstCharacterOfTagName); + this._emitChars('<'); + this.state = State.DATA; + this._stateData(cp); + } + } } - // End tag open state //------------------------------------------------------------------ - [END_TAG_OPEN_STATE](cp) { + _stateEndTagOpen(cp) { if (isAsciiLetter(cp)) { this._createEndTagToken(); - this._reconsumeInState(TAG_NAME_STATE); - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.missingEndTagName); - this.state = DATA_STATE; - } else if (cp === $.EOF) { - this._err(ERR.eofBeforeTagName); - this._emitChars('</'); - this._emitEOFToken(); - } else { - this._err(ERR.invalidFirstCharacterOfTagName); - this._createCommentToken(); - this._reconsumeInState(BOGUS_COMMENT_STATE); - } + this.state = State.TAG_NAME; + this._stateTagName(cp); + } + else + switch (cp) { + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.missingEndTagName); + this.state = State.DATA; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofBeforeTagName); + this._emitChars('</'); + this._emitEOFToken(); + break; + } + default: { + this._err(error_codes_js_1.ERR.invalidFirstCharacterOfTagName); + this._createCommentToken(2); + this.state = State.BOGUS_COMMENT; + this._stateBogusComment(cp); + } + } } - // Tag name state //------------------------------------------------------------------ - [TAG_NAME_STATE](cp) { - if (isWhitespace(cp)) { - this.state = BEFORE_ATTRIBUTE_NAME_STATE; - } else if (cp === $.SOLIDUS) { - this.state = SELF_CLOSING_START_TAG_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (isAsciiUpper(cp)) { - this.currentToken.tagName += toAsciiLowerChar(cp); - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.currentToken.tagName += unicode.REPLACEMENT_CHARACTER; - } else if (cp === $.EOF) { - this._err(ERR.eofInTag); - this._emitEOFToken(); - } else { - this.currentToken.tagName += toChar(cp); + _stateTagName(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + this.state = State.BEFORE_ATTRIBUTE_NAME; + break; + } + case unicode_js_1.CODE_POINTS.SOLIDUS: { + this.state = State.SELF_CLOSING_START_TAG; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.state = State.DATA; + this.emitCurrentTagToken(); + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + token.tagName += unicode_js_1.REPLACEMENT_CHARACTER; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInTag); + this._emitEOFToken(); + break; + } + default: { + token.tagName += String.fromCodePoint(isAsciiUpper(cp) ? toAsciiLower(cp) : cp); + } } } - // RCDATA less-than sign state //------------------------------------------------------------------ - [RCDATA_LESS_THAN_SIGN_STATE](cp) { - if (cp === $.SOLIDUS) { - this.tempBuff = []; - this.state = RCDATA_END_TAG_OPEN_STATE; - } else { + _stateRcdataLessThanSign(cp) { + if (cp === unicode_js_1.CODE_POINTS.SOLIDUS) { + this.state = State.RCDATA_END_TAG_OPEN; + } + else { this._emitChars('<'); - this._reconsumeInState(RCDATA_STATE); + this.state = State.RCDATA; + this._stateRcdata(cp); } } - // RCDATA end tag open state //------------------------------------------------------------------ - [RCDATA_END_TAG_OPEN_STATE](cp) { + _stateRcdataEndTagOpen(cp) { if (isAsciiLetter(cp)) { - this._createEndTagToken(); - this._reconsumeInState(RCDATA_END_TAG_NAME_STATE); - } else { + this.state = State.RCDATA_END_TAG_NAME; + this._stateRcdataEndTagName(cp); + } + else { this._emitChars('</'); - this._reconsumeInState(RCDATA_STATE); + this.state = State.RCDATA; + this._stateRcdata(cp); + } + } + handleSpecialEndTag(_cp) { + if (!this.preprocessor.startsWith(this.lastStartTagName, false)) { + return !this._ensureHibernation(); + } + this._createEndTagToken(); + const token = this.currentToken; + token.tagName = this.lastStartTagName; + const cp = this.preprocessor.peek(this.lastStartTagName.length); + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + this._advanceBy(this.lastStartTagName.length); + this.state = State.BEFORE_ATTRIBUTE_NAME; + return false; + } + case unicode_js_1.CODE_POINTS.SOLIDUS: { + this._advanceBy(this.lastStartTagName.length); + this.state = State.SELF_CLOSING_START_TAG; + return false; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._advanceBy(this.lastStartTagName.length); + this.emitCurrentTagToken(); + this.state = State.DATA; + return false; + } + default: { + return !this._ensureHibernation(); + } } } - // RCDATA end tag name state //------------------------------------------------------------------ - [RCDATA_END_TAG_NAME_STATE](cp) { - if (isAsciiUpper(cp)) { - this.currentToken.tagName += toAsciiLowerChar(cp); - this.tempBuff.push(cp); - } else if (isAsciiLower(cp)) { - this.currentToken.tagName += toChar(cp); - this.tempBuff.push(cp); - } else { - if (this.lastStartTagName === this.currentToken.tagName) { - if (isWhitespace(cp)) { - this.state = BEFORE_ATTRIBUTE_NAME_STATE; - return; - } - - if (cp === $.SOLIDUS) { - this.state = SELF_CLOSING_START_TAG_STATE; - return; - } - - if (cp === $.GREATER_THAN_SIGN) { - this.state = DATA_STATE; - this._emitCurrentToken(); - return; - } - } - + _stateRcdataEndTagName(cp) { + if (this.handleSpecialEndTag(cp)) { this._emitChars('</'); - this._emitSeveralCodePoints(this.tempBuff); - this._reconsumeInState(RCDATA_STATE); + this.state = State.RCDATA; + this._stateRcdata(cp); } } - // RAWTEXT less-than sign state //------------------------------------------------------------------ - [RAWTEXT_LESS_THAN_SIGN_STATE](cp) { - if (cp === $.SOLIDUS) { - this.tempBuff = []; - this.state = RAWTEXT_END_TAG_OPEN_STATE; - } else { + _stateRawtextLessThanSign(cp) { + if (cp === unicode_js_1.CODE_POINTS.SOLIDUS) { + this.state = State.RAWTEXT_END_TAG_OPEN; + } + else { this._emitChars('<'); - this._reconsumeInState(RAWTEXT_STATE); + this.state = State.RAWTEXT; + this._stateRawtext(cp); } } - // RAWTEXT end tag open state //------------------------------------------------------------------ - [RAWTEXT_END_TAG_OPEN_STATE](cp) { + _stateRawtextEndTagOpen(cp) { if (isAsciiLetter(cp)) { - this._createEndTagToken(); - this._reconsumeInState(RAWTEXT_END_TAG_NAME_STATE); - } else { + this.state = State.RAWTEXT_END_TAG_NAME; + this._stateRawtextEndTagName(cp); + } + else { this._emitChars('</'); - this._reconsumeInState(RAWTEXT_STATE); + this.state = State.RAWTEXT; + this._stateRawtext(cp); } } - // RAWTEXT end tag name state //------------------------------------------------------------------ - [RAWTEXT_END_TAG_NAME_STATE](cp) { - if (isAsciiUpper(cp)) { - this.currentToken.tagName += toAsciiLowerChar(cp); - this.tempBuff.push(cp); - } else if (isAsciiLower(cp)) { - this.currentToken.tagName += toChar(cp); - this.tempBuff.push(cp); - } else { - if (this.lastStartTagName === this.currentToken.tagName) { - if (isWhitespace(cp)) { - this.state = BEFORE_ATTRIBUTE_NAME_STATE; - return; - } - - if (cp === $.SOLIDUS) { - this.state = SELF_CLOSING_START_TAG_STATE; - return; - } - - if (cp === $.GREATER_THAN_SIGN) { - this._emitCurrentToken(); - this.state = DATA_STATE; - return; - } - } - + _stateRawtextEndTagName(cp) { + if (this.handleSpecialEndTag(cp)) { this._emitChars('</'); - this._emitSeveralCodePoints(this.tempBuff); - this._reconsumeInState(RAWTEXT_STATE); + this.state = State.RAWTEXT; + this._stateRawtext(cp); } } - // Script data less-than sign state //------------------------------------------------------------------ - [SCRIPT_DATA_LESS_THAN_SIGN_STATE](cp) { - if (cp === $.SOLIDUS) { - this.tempBuff = []; - this.state = SCRIPT_DATA_END_TAG_OPEN_STATE; - } else if (cp === $.EXCLAMATION_MARK) { - this.state = SCRIPT_DATA_ESCAPE_START_STATE; - this._emitChars('<!'); - } else { - this._emitChars('<'); - this._reconsumeInState(SCRIPT_DATA_STATE); + _stateScriptDataLessThanSign(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.SOLIDUS: { + this.state = State.SCRIPT_DATA_END_TAG_OPEN; + break; + } + case unicode_js_1.CODE_POINTS.EXCLAMATION_MARK: { + this.state = State.SCRIPT_DATA_ESCAPE_START; + this._emitChars('<!'); + break; + } + default: { + this._emitChars('<'); + this.state = State.SCRIPT_DATA; + this._stateScriptData(cp); + } } } - // Script data end tag open state //------------------------------------------------------------------ - [SCRIPT_DATA_END_TAG_OPEN_STATE](cp) { + _stateScriptDataEndTagOpen(cp) { if (isAsciiLetter(cp)) { - this._createEndTagToken(); - this._reconsumeInState(SCRIPT_DATA_END_TAG_NAME_STATE); - } else { + this.state = State.SCRIPT_DATA_END_TAG_NAME; + this._stateScriptDataEndTagName(cp); + } + else { this._emitChars('</'); - this._reconsumeInState(SCRIPT_DATA_STATE); + this.state = State.SCRIPT_DATA; + this._stateScriptData(cp); } } - // Script data end tag name state //------------------------------------------------------------------ - [SCRIPT_DATA_END_TAG_NAME_STATE](cp) { - if (isAsciiUpper(cp)) { - this.currentToken.tagName += toAsciiLowerChar(cp); - this.tempBuff.push(cp); - } else if (isAsciiLower(cp)) { - this.currentToken.tagName += toChar(cp); - this.tempBuff.push(cp); - } else { - if (this.lastStartTagName === this.currentToken.tagName) { - if (isWhitespace(cp)) { - this.state = BEFORE_ATTRIBUTE_NAME_STATE; - return; - } else if (cp === $.SOLIDUS) { - this.state = SELF_CLOSING_START_TAG_STATE; - return; - } else if (cp === $.GREATER_THAN_SIGN) { - this._emitCurrentToken(); - this.state = DATA_STATE; - return; - } - } - + _stateScriptDataEndTagName(cp) { + if (this.handleSpecialEndTag(cp)) { this._emitChars('</'); - this._emitSeveralCodePoints(this.tempBuff); - this._reconsumeInState(SCRIPT_DATA_STATE); + this.state = State.SCRIPT_DATA; + this._stateScriptData(cp); } } - // Script data escape start state //------------------------------------------------------------------ - [SCRIPT_DATA_ESCAPE_START_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.state = SCRIPT_DATA_ESCAPE_START_DASH_STATE; + _stateScriptDataEscapeStart(cp) { + if (cp === unicode_js_1.CODE_POINTS.HYPHEN_MINUS) { + this.state = State.SCRIPT_DATA_ESCAPE_START_DASH; this._emitChars('-'); - } else { - this._reconsumeInState(SCRIPT_DATA_STATE); + } + else { + this.state = State.SCRIPT_DATA; + this._stateScriptData(cp); } } - // Script data escape start dash state //------------------------------------------------------------------ - [SCRIPT_DATA_ESCAPE_START_DASH_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE; + _stateScriptDataEscapeStartDash(cp) { + if (cp === unicode_js_1.CODE_POINTS.HYPHEN_MINUS) { + this.state = State.SCRIPT_DATA_ESCAPED_DASH_DASH; this._emitChars('-'); - } else { - this._reconsumeInState(SCRIPT_DATA_STATE); + } + else { + this.state = State.SCRIPT_DATA; + this._stateScriptData(cp); } } - // Script data escaped state //------------------------------------------------------------------ - [SCRIPT_DATA_ESCAPED_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.state = SCRIPT_DATA_ESCAPED_DASH_STATE; - this._emitChars('-'); - } else if (cp === $.LESS_THAN_SIGN) { - this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this._emitChars(unicode.REPLACEMENT_CHARACTER); - } else if (cp === $.EOF) { - this._err(ERR.eofInScriptHtmlCommentLikeText); - this._emitEOFToken(); - } else { - this._emitCodePoint(cp); + _stateScriptDataEscaped(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: { + this.state = State.SCRIPT_DATA_ESCAPED_DASH; + this._emitChars('-'); + break; + } + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + this.state = State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInScriptHtmlCommentLikeText); + this._emitEOFToken(); + break; + } + default: { + this._emitCodePoint(cp); + } } } - // Script data escaped dash state //------------------------------------------------------------------ - [SCRIPT_DATA_ESCAPED_DASH_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE; - this._emitChars('-'); - } else if (cp === $.LESS_THAN_SIGN) { - this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.state = SCRIPT_DATA_ESCAPED_STATE; - this._emitChars(unicode.REPLACEMENT_CHARACTER); - } else if (cp === $.EOF) { - this._err(ERR.eofInScriptHtmlCommentLikeText); - this._emitEOFToken(); - } else { - this.state = SCRIPT_DATA_ESCAPED_STATE; - this._emitCodePoint(cp); + _stateScriptDataEscapedDash(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: { + this.state = State.SCRIPT_DATA_ESCAPED_DASH_DASH; + this._emitChars('-'); + break; + } + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + this.state = State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this.state = State.SCRIPT_DATA_ESCAPED; + this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInScriptHtmlCommentLikeText); + this._emitEOFToken(); + break; + } + default: { + this.state = State.SCRIPT_DATA_ESCAPED; + this._emitCodePoint(cp); + } } } - // Script data escaped dash dash state //------------------------------------------------------------------ - [SCRIPT_DATA_ESCAPED_DASH_DASH_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this._emitChars('-'); - } else if (cp === $.LESS_THAN_SIGN) { - this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this.state = SCRIPT_DATA_STATE; - this._emitChars('>'); - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.state = SCRIPT_DATA_ESCAPED_STATE; - this._emitChars(unicode.REPLACEMENT_CHARACTER); - } else if (cp === $.EOF) { - this._err(ERR.eofInScriptHtmlCommentLikeText); - this._emitEOFToken(); - } else { - this.state = SCRIPT_DATA_ESCAPED_STATE; - this._emitCodePoint(cp); + _stateScriptDataEscapedDashDash(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: { + this._emitChars('-'); + break; + } + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + this.state = State.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.state = State.SCRIPT_DATA; + this._emitChars('>'); + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this.state = State.SCRIPT_DATA_ESCAPED; + this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInScriptHtmlCommentLikeText); + this._emitEOFToken(); + break; + } + default: { + this.state = State.SCRIPT_DATA_ESCAPED; + this._emitCodePoint(cp); + } } } - // Script data escaped less-than sign state //------------------------------------------------------------------ - [SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE](cp) { - if (cp === $.SOLIDUS) { - this.tempBuff = []; - this.state = SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE; - } else if (isAsciiLetter(cp)) { - this.tempBuff = []; + _stateScriptDataEscapedLessThanSign(cp) { + if (cp === unicode_js_1.CODE_POINTS.SOLIDUS) { + this.state = State.SCRIPT_DATA_ESCAPED_END_TAG_OPEN; + } + else if (isAsciiLetter(cp)) { this._emitChars('<'); - this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE); - } else { + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPE_START; + this._stateScriptDataDoubleEscapeStart(cp); + } + else { this._emitChars('<'); - this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE); + this.state = State.SCRIPT_DATA_ESCAPED; + this._stateScriptDataEscaped(cp); } } - // Script data escaped end tag open state //------------------------------------------------------------------ - [SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE](cp) { + _stateScriptDataEscapedEndTagOpen(cp) { if (isAsciiLetter(cp)) { - this._createEndTagToken(); - this._reconsumeInState(SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE); - } else { + this.state = State.SCRIPT_DATA_ESCAPED_END_TAG_NAME; + this._stateScriptDataEscapedEndTagName(cp); + } + else { this._emitChars('</'); - this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE); + this.state = State.SCRIPT_DATA_ESCAPED; + this._stateScriptDataEscaped(cp); } } - // Script data escaped end tag name state //------------------------------------------------------------------ - [SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE](cp) { - if (isAsciiUpper(cp)) { - this.currentToken.tagName += toAsciiLowerChar(cp); - this.tempBuff.push(cp); - } else if (isAsciiLower(cp)) { - this.currentToken.tagName += toChar(cp); - this.tempBuff.push(cp); - } else { - if (this.lastStartTagName === this.currentToken.tagName) { - if (isWhitespace(cp)) { - this.state = BEFORE_ATTRIBUTE_NAME_STATE; - return; - } - - if (cp === $.SOLIDUS) { - this.state = SELF_CLOSING_START_TAG_STATE; - return; - } - - if (cp === $.GREATER_THAN_SIGN) { - this._emitCurrentToken(); - this.state = DATA_STATE; - return; - } - } - + _stateScriptDataEscapedEndTagName(cp) { + if (this.handleSpecialEndTag(cp)) { this._emitChars('</'); - this._emitSeveralCodePoints(this.tempBuff); - this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE); + this.state = State.SCRIPT_DATA_ESCAPED; + this._stateScriptDataEscaped(cp); } } - // Script data double escape start state //------------------------------------------------------------------ - [SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE](cp) { - if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) { - this.state = this._isTempBufferEqualToScriptString() - ? SCRIPT_DATA_DOUBLE_ESCAPED_STATE - : SCRIPT_DATA_ESCAPED_STATE; - this._emitCodePoint(cp); - } else if (isAsciiUpper(cp)) { - this.tempBuff.push(toAsciiLowerCodePoint(cp)); + _stateScriptDataDoubleEscapeStart(cp) { + if (this.preprocessor.startsWith(unicode_js_1.SEQUENCES.SCRIPT, false) && + isScriptDataDoubleEscapeSequenceEnd(this.preprocessor.peek(unicode_js_1.SEQUENCES.SCRIPT.length))) { this._emitCodePoint(cp); - } else if (isAsciiLower(cp)) { - this.tempBuff.push(cp); - this._emitCodePoint(cp); - } else { - this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE); + for (let i = 0; i < unicode_js_1.SEQUENCES.SCRIPT.length; i++) { + this._emitCodePoint(this._consume()); + } + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED; + } + else if (!this._ensureHibernation()) { + this.state = State.SCRIPT_DATA_ESCAPED; + this._stateScriptDataEscaped(cp); } } - // Script data double escaped state //------------------------------------------------------------------ - [SCRIPT_DATA_DOUBLE_ESCAPED_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE; - this._emitChars('-'); - } else if (cp === $.LESS_THAN_SIGN) { - this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE; - this._emitChars('<'); - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this._emitChars(unicode.REPLACEMENT_CHARACTER); - } else if (cp === $.EOF) { - this._err(ERR.eofInScriptHtmlCommentLikeText); - this._emitEOFToken(); - } else { - this._emitCodePoint(cp); + _stateScriptDataDoubleEscaped(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: { + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH; + this._emitChars('-'); + break; + } + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN; + this._emitChars('<'); + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInScriptHtmlCommentLikeText); + this._emitEOFToken(); + break; + } + default: { + this._emitCodePoint(cp); + } } } - // Script data double escaped dash state //------------------------------------------------------------------ - [SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE; - this._emitChars('-'); - } else if (cp === $.LESS_THAN_SIGN) { - this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE; - this._emitChars('<'); - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE; - this._emitChars(unicode.REPLACEMENT_CHARACTER); - } else if (cp === $.EOF) { - this._err(ERR.eofInScriptHtmlCommentLikeText); - this._emitEOFToken(); - } else { - this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE; - this._emitCodePoint(cp); + _stateScriptDataDoubleEscapedDash(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: { + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH; + this._emitChars('-'); + break; + } + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN; + this._emitChars('<'); + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED; + this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInScriptHtmlCommentLikeText); + this._emitEOFToken(); + break; + } + default: { + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED; + this._emitCodePoint(cp); + } } } - // Script data double escaped dash dash state //------------------------------------------------------------------ - [SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this._emitChars('-'); - } else if (cp === $.LESS_THAN_SIGN) { - this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE; - this._emitChars('<'); - } else if (cp === $.GREATER_THAN_SIGN) { - this.state = SCRIPT_DATA_STATE; - this._emitChars('>'); - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE; - this._emitChars(unicode.REPLACEMENT_CHARACTER); - } else if (cp === $.EOF) { - this._err(ERR.eofInScriptHtmlCommentLikeText); - this._emitEOFToken(); - } else { - this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE; - this._emitCodePoint(cp); + _stateScriptDataDoubleEscapedDashDash(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: { + this._emitChars('-'); + break; + } + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN; + this._emitChars('<'); + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.state = State.SCRIPT_DATA; + this._emitChars('>'); + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED; + this._emitChars(unicode_js_1.REPLACEMENT_CHARACTER); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInScriptHtmlCommentLikeText); + this._emitEOFToken(); + break; + } + default: { + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED; + this._emitCodePoint(cp); + } } } - // Script data double escaped less-than sign state //------------------------------------------------------------------ - [SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE](cp) { - if (cp === $.SOLIDUS) { - this.tempBuff = []; - this.state = SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE; + _stateScriptDataDoubleEscapedLessThanSign(cp) { + if (cp === unicode_js_1.CODE_POINTS.SOLIDUS) { + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPE_END; this._emitChars('/'); - } else { - this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE); + } + else { + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED; + this._stateScriptDataDoubleEscaped(cp); } } - // Script data double escape end state //------------------------------------------------------------------ - [SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE](cp) { - if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) { - this.state = this._isTempBufferEqualToScriptString() - ? SCRIPT_DATA_ESCAPED_STATE - : SCRIPT_DATA_DOUBLE_ESCAPED_STATE; - - this._emitCodePoint(cp); - } else if (isAsciiUpper(cp)) { - this.tempBuff.push(toAsciiLowerCodePoint(cp)); - this._emitCodePoint(cp); - } else if (isAsciiLower(cp)) { - this.tempBuff.push(cp); + _stateScriptDataDoubleEscapeEnd(cp) { + if (this.preprocessor.startsWith(unicode_js_1.SEQUENCES.SCRIPT, false) && + isScriptDataDoubleEscapeSequenceEnd(this.preprocessor.peek(unicode_js_1.SEQUENCES.SCRIPT.length))) { this._emitCodePoint(cp); - } else { - this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE); + for (let i = 0; i < unicode_js_1.SEQUENCES.SCRIPT.length; i++) { + this._emitCodePoint(this._consume()); + } + this.state = State.SCRIPT_DATA_ESCAPED; + } + else if (!this._ensureHibernation()) { + this.state = State.SCRIPT_DATA_DOUBLE_ESCAPED; + this._stateScriptDataDoubleEscaped(cp); } } - // Before attribute name state //------------------------------------------------------------------ - [BEFORE_ATTRIBUTE_NAME_STATE](cp) { - if (isWhitespace(cp)) { - return; - } - - if (cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN || cp === $.EOF) { - this._reconsumeInState(AFTER_ATTRIBUTE_NAME_STATE); - } else if (cp === $.EQUALS_SIGN) { - this._err(ERR.unexpectedEqualsSignBeforeAttributeName); - this._createAttr('='); - this.state = ATTRIBUTE_NAME_STATE; - } else { - this._createAttr(''); - this._reconsumeInState(ATTRIBUTE_NAME_STATE); + _stateBeforeAttributeName(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + // Ignore whitespace + break; + } + case unicode_js_1.CODE_POINTS.SOLIDUS: + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: + case unicode_js_1.CODE_POINTS.EOF: { + this.state = State.AFTER_ATTRIBUTE_NAME; + this._stateAfterAttributeName(cp); + break; + } + case unicode_js_1.CODE_POINTS.EQUALS_SIGN: { + this._err(error_codes_js_1.ERR.unexpectedEqualsSignBeforeAttributeName); + this._createAttr('='); + this.state = State.ATTRIBUTE_NAME; + break; + } + default: { + this._createAttr(''); + this.state = State.ATTRIBUTE_NAME; + this._stateAttributeName(cp); + } } } - // Attribute name state //------------------------------------------------------------------ - [ATTRIBUTE_NAME_STATE](cp) { - if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN || cp === $.EOF) { - this._leaveAttrName(AFTER_ATTRIBUTE_NAME_STATE); - this._unconsume(); - } else if (cp === $.EQUALS_SIGN) { - this._leaveAttrName(BEFORE_ATTRIBUTE_VALUE_STATE); - } else if (isAsciiUpper(cp)) { - this.currentAttr.name += toAsciiLowerChar(cp); - } else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN) { - this._err(ERR.unexpectedCharacterInAttributeName); - this.currentAttr.name += toChar(cp); - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.currentAttr.name += unicode.REPLACEMENT_CHARACTER; - } else { - this.currentAttr.name += toChar(cp); + _stateAttributeName(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: + case unicode_js_1.CODE_POINTS.SOLIDUS: + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: + case unicode_js_1.CODE_POINTS.EOF: { + this._leaveAttrName(); + this.state = State.AFTER_ATTRIBUTE_NAME; + this._stateAfterAttributeName(cp); + break; + } + case unicode_js_1.CODE_POINTS.EQUALS_SIGN: { + this._leaveAttrName(); + this.state = State.BEFORE_ATTRIBUTE_VALUE; + break; + } + case unicode_js_1.CODE_POINTS.QUOTATION_MARK: + case unicode_js_1.CODE_POINTS.APOSTROPHE: + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + this._err(error_codes_js_1.ERR.unexpectedCharacterInAttributeName); + this.currentAttr.name += String.fromCodePoint(cp); + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this.currentAttr.name += unicode_js_1.REPLACEMENT_CHARACTER; + break; + } + default: { + this.currentAttr.name += String.fromCodePoint(isAsciiUpper(cp) ? toAsciiLower(cp) : cp); + } } } - // After attribute name state //------------------------------------------------------------------ - [AFTER_ATTRIBUTE_NAME_STATE](cp) { - if (isWhitespace(cp)) { - return; - } - - if (cp === $.SOLIDUS) { - this.state = SELF_CLOSING_START_TAG_STATE; - } else if (cp === $.EQUALS_SIGN) { - this.state = BEFORE_ATTRIBUTE_VALUE_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (cp === $.EOF) { - this._err(ERR.eofInTag); - this._emitEOFToken(); - } else { - this._createAttr(''); - this._reconsumeInState(ATTRIBUTE_NAME_STATE); + _stateAfterAttributeName(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + // Ignore whitespace + break; + } + case unicode_js_1.CODE_POINTS.SOLIDUS: { + this.state = State.SELF_CLOSING_START_TAG; + break; + } + case unicode_js_1.CODE_POINTS.EQUALS_SIGN: { + this.state = State.BEFORE_ATTRIBUTE_VALUE; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.state = State.DATA; + this.emitCurrentTagToken(); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInTag); + this._emitEOFToken(); + break; + } + default: { + this._createAttr(''); + this.state = State.ATTRIBUTE_NAME; + this._stateAttributeName(cp); + } } } - // Before attribute value state //------------------------------------------------------------------ - [BEFORE_ATTRIBUTE_VALUE_STATE](cp) { - if (isWhitespace(cp)) { - return; - } - - if (cp === $.QUOTATION_MARK) { - this.state = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE; - } else if (cp === $.APOSTROPHE) { - this.state = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.missingAttributeValue); - this.state = DATA_STATE; - this._emitCurrentToken(); - } else { - this._reconsumeInState(ATTRIBUTE_VALUE_UNQUOTED_STATE); + _stateBeforeAttributeValue(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + // Ignore whitespace + break; + } + case unicode_js_1.CODE_POINTS.QUOTATION_MARK: { + this.state = State.ATTRIBUTE_VALUE_DOUBLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.APOSTROPHE: { + this.state = State.ATTRIBUTE_VALUE_SINGLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.missingAttributeValue); + this.state = State.DATA; + this.emitCurrentTagToken(); + break; + } + default: { + this.state = State.ATTRIBUTE_VALUE_UNQUOTED; + this._stateAttributeValueUnquoted(cp); + } } } - // Attribute value (double-quoted) state //------------------------------------------------------------------ - [ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE](cp) { - if (cp === $.QUOTATION_MARK) { - this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE; - } else if (cp === $.AMPERSAND) { - this.returnState = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE; - this.state = CHARACTER_REFERENCE_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.currentAttr.value += unicode.REPLACEMENT_CHARACTER; - } else if (cp === $.EOF) { - this._err(ERR.eofInTag); - this._emitEOFToken(); - } else { - this.currentAttr.value += toChar(cp); + _stateAttributeValueDoubleQuoted(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.QUOTATION_MARK: { + this.state = State.AFTER_ATTRIBUTE_VALUE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.AMPERSAND: { + this.returnState = State.ATTRIBUTE_VALUE_DOUBLE_QUOTED; + this.state = State.CHARACTER_REFERENCE; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this.currentAttr.value += unicode_js_1.REPLACEMENT_CHARACTER; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInTag); + this._emitEOFToken(); + break; + } + default: { + this.currentAttr.value += String.fromCodePoint(cp); + } } } - // Attribute value (single-quoted) state //------------------------------------------------------------------ - [ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE](cp) { - if (cp === $.APOSTROPHE) { - this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE; - } else if (cp === $.AMPERSAND) { - this.returnState = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE; - this.state = CHARACTER_REFERENCE_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.currentAttr.value += unicode.REPLACEMENT_CHARACTER; - } else if (cp === $.EOF) { - this._err(ERR.eofInTag); - this._emitEOFToken(); - } else { - this.currentAttr.value += toChar(cp); + _stateAttributeValueSingleQuoted(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.APOSTROPHE: { + this.state = State.AFTER_ATTRIBUTE_VALUE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.AMPERSAND: { + this.returnState = State.ATTRIBUTE_VALUE_SINGLE_QUOTED; + this.state = State.CHARACTER_REFERENCE; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this.currentAttr.value += unicode_js_1.REPLACEMENT_CHARACTER; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInTag); + this._emitEOFToken(); + break; + } + default: { + this.currentAttr.value += String.fromCodePoint(cp); + } } } - // Attribute value (unquoted) state //------------------------------------------------------------------ - [ATTRIBUTE_VALUE_UNQUOTED_STATE](cp) { - if (isWhitespace(cp)) { - this._leaveAttrValue(BEFORE_ATTRIBUTE_NAME_STATE); - } else if (cp === $.AMPERSAND) { - this.returnState = ATTRIBUTE_VALUE_UNQUOTED_STATE; - this.state = CHARACTER_REFERENCE_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this._leaveAttrValue(DATA_STATE); - this._emitCurrentToken(); - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.currentAttr.value += unicode.REPLACEMENT_CHARACTER; - } else if ( - cp === $.QUOTATION_MARK || - cp === $.APOSTROPHE || - cp === $.LESS_THAN_SIGN || - cp === $.EQUALS_SIGN || - cp === $.GRAVE_ACCENT - ) { - this._err(ERR.unexpectedCharacterInUnquotedAttributeValue); - this.currentAttr.value += toChar(cp); - } else if (cp === $.EOF) { - this._err(ERR.eofInTag); - this._emitEOFToken(); - } else { - this.currentAttr.value += toChar(cp); + _stateAttributeValueUnquoted(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + this._leaveAttrValue(); + this.state = State.BEFORE_ATTRIBUTE_NAME; + break; + } + case unicode_js_1.CODE_POINTS.AMPERSAND: { + this.returnState = State.ATTRIBUTE_VALUE_UNQUOTED; + this.state = State.CHARACTER_REFERENCE; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._leaveAttrValue(); + this.state = State.DATA; + this.emitCurrentTagToken(); + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this.currentAttr.value += unicode_js_1.REPLACEMENT_CHARACTER; + break; + } + case unicode_js_1.CODE_POINTS.QUOTATION_MARK: + case unicode_js_1.CODE_POINTS.APOSTROPHE: + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: + case unicode_js_1.CODE_POINTS.EQUALS_SIGN: + case unicode_js_1.CODE_POINTS.GRAVE_ACCENT: { + this._err(error_codes_js_1.ERR.unexpectedCharacterInUnquotedAttributeValue); + this.currentAttr.value += String.fromCodePoint(cp); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInTag); + this._emitEOFToken(); + break; + } + default: { + this.currentAttr.value += String.fromCodePoint(cp); + } } } - // After attribute value (quoted) state //------------------------------------------------------------------ - [AFTER_ATTRIBUTE_VALUE_QUOTED_STATE](cp) { - if (isWhitespace(cp)) { - this._leaveAttrValue(BEFORE_ATTRIBUTE_NAME_STATE); - } else if (cp === $.SOLIDUS) { - this._leaveAttrValue(SELF_CLOSING_START_TAG_STATE); - } else if (cp === $.GREATER_THAN_SIGN) { - this._leaveAttrValue(DATA_STATE); - this._emitCurrentToken(); - } else if (cp === $.EOF) { - this._err(ERR.eofInTag); - this._emitEOFToken(); - } else { - this._err(ERR.missingWhitespaceBetweenAttributes); - this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE); + _stateAfterAttributeValueQuoted(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + this._leaveAttrValue(); + this.state = State.BEFORE_ATTRIBUTE_NAME; + break; + } + case unicode_js_1.CODE_POINTS.SOLIDUS: { + this._leaveAttrValue(); + this.state = State.SELF_CLOSING_START_TAG; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._leaveAttrValue(); + this.state = State.DATA; + this.emitCurrentTagToken(); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInTag); + this._emitEOFToken(); + break; + } + default: { + this._err(error_codes_js_1.ERR.missingWhitespaceBetweenAttributes); + this.state = State.BEFORE_ATTRIBUTE_NAME; + this._stateBeforeAttributeName(cp); + } } } - // Self-closing start tag state //------------------------------------------------------------------ - [SELF_CLOSING_START_TAG_STATE](cp) { - if (cp === $.GREATER_THAN_SIGN) { - this.currentToken.selfClosing = true; - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (cp === $.EOF) { - this._err(ERR.eofInTag); - this._emitEOFToken(); - } else { - this._err(ERR.unexpectedSolidusInTag); - this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE); + _stateSelfClosingStartTag(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + const token = this.currentToken; + token.selfClosing = true; + this.state = State.DATA; + this.emitCurrentTagToken(); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInTag); + this._emitEOFToken(); + break; + } + default: { + this._err(error_codes_js_1.ERR.unexpectedSolidusInTag); + this.state = State.BEFORE_ATTRIBUTE_NAME; + this._stateBeforeAttributeName(cp); + } } } - // Bogus comment state //------------------------------------------------------------------ - [BOGUS_COMMENT_STATE](cp) { - if (cp === $.GREATER_THAN_SIGN) { - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (cp === $.EOF) { - this._emitCurrentToken(); - this._emitEOFToken(); - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.currentToken.data += unicode.REPLACEMENT_CHARACTER; - } else { - this.currentToken.data += toChar(cp); + _stateBogusComment(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.state = State.DATA; + this.emitCurrentComment(token); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this.emitCurrentComment(token); + this._emitEOFToken(); + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + token.data += unicode_js_1.REPLACEMENT_CHARACTER; + break; + } + default: { + token.data += String.fromCodePoint(cp); + } } } - // Markup declaration open state //------------------------------------------------------------------ - [MARKUP_DECLARATION_OPEN_STATE](cp) { - if (this._consumeSequenceIfMatch($$.DASH_DASH_STRING, cp, true)) { - this._createCommentToken(); - this.state = COMMENT_START_STATE; - } else if (this._consumeSequenceIfMatch($$.DOCTYPE_STRING, cp, false)) { - this.state = DOCTYPE_STATE; - } else if (this._consumeSequenceIfMatch($$.CDATA_START_STRING, cp, true)) { - if (this.allowCDATA) { - this.state = CDATA_SECTION_STATE; - } else { - this._err(ERR.cdataInHtmlContent); - this._createCommentToken(); + _stateMarkupDeclarationOpen(cp) { + if (this._consumeSequenceIfMatch(unicode_js_1.SEQUENCES.DASH_DASH, true)) { + this._createCommentToken(unicode_js_1.SEQUENCES.DASH_DASH.length + 1); + this.state = State.COMMENT_START; + } + else if (this._consumeSequenceIfMatch(unicode_js_1.SEQUENCES.DOCTYPE, false)) { + // NOTE: Doctypes tokens are created without fixed offsets. We keep track of the moment a doctype *might* start here. + this.currentLocation = this.getCurrentLocation(unicode_js_1.SEQUENCES.DOCTYPE.length + 1); + this.state = State.DOCTYPE; + } + else if (this._consumeSequenceIfMatch(unicode_js_1.SEQUENCES.CDATA_START, true)) { + if (this.inForeignNode) { + this.state = State.CDATA_SECTION; + } + else { + this._err(error_codes_js_1.ERR.cdataInHtmlContent); + this._createCommentToken(unicode_js_1.SEQUENCES.CDATA_START.length + 1); this.currentToken.data = '[CDATA['; - this.state = BOGUS_COMMENT_STATE; + this.state = State.BOGUS_COMMENT; } } - - //NOTE: sequence lookup can be abrupted by hibernation. In that case lookup + //NOTE: Sequence lookups can be abrupted by hibernation. In that case, lookup //results are no longer valid and we will need to start over. else if (!this._ensureHibernation()) { - this._err(ERR.incorrectlyOpenedComment); - this._createCommentToken(); - this._reconsumeInState(BOGUS_COMMENT_STATE); + this._err(error_codes_js_1.ERR.incorrectlyOpenedComment); + this._createCommentToken(2); + this.state = State.BOGUS_COMMENT; + this._stateBogusComment(cp); } } - // Comment start state //------------------------------------------------------------------ - [COMMENT_START_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.state = COMMENT_START_DASH_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.abruptClosingOfEmptyComment); - this.state = DATA_STATE; - this._emitCurrentToken(); - } else { - this._reconsumeInState(COMMENT_STATE); + _stateCommentStart(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: { + this.state = State.COMMENT_START_DASH; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.abruptClosingOfEmptyComment); + this.state = State.DATA; + const token = this.currentToken; + this.emitCurrentComment(token); + break; + } + default: { + this.state = State.COMMENT; + this._stateComment(cp); + } } } - // Comment start dash state //------------------------------------------------------------------ - [COMMENT_START_DASH_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.state = COMMENT_END_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.abruptClosingOfEmptyComment); - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (cp === $.EOF) { - this._err(ERR.eofInComment); - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this.currentToken.data += '-'; - this._reconsumeInState(COMMENT_STATE); + _stateCommentStartDash(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: { + this.state = State.COMMENT_END; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.abruptClosingOfEmptyComment); + this.state = State.DATA; + this.emitCurrentComment(token); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInComment); + this.emitCurrentComment(token); + this._emitEOFToken(); + break; + } + default: { + token.data += '-'; + this.state = State.COMMENT; + this._stateComment(cp); + } } } - // Comment state //------------------------------------------------------------------ - [COMMENT_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.state = COMMENT_END_DASH_STATE; - } else if (cp === $.LESS_THAN_SIGN) { - this.currentToken.data += '<'; - this.state = COMMENT_LESS_THAN_SIGN_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.currentToken.data += unicode.REPLACEMENT_CHARACTER; - } else if (cp === $.EOF) { - this._err(ERR.eofInComment); - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this.currentToken.data += toChar(cp); + _stateComment(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: { + this.state = State.COMMENT_END_DASH; + break; + } + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + token.data += '<'; + this.state = State.COMMENT_LESS_THAN_SIGN; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + token.data += unicode_js_1.REPLACEMENT_CHARACTER; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInComment); + this.emitCurrentComment(token); + this._emitEOFToken(); + break; + } + default: { + token.data += String.fromCodePoint(cp); + } } } - // Comment less-than sign state //------------------------------------------------------------------ - [COMMENT_LESS_THAN_SIGN_STATE](cp) { - if (cp === $.EXCLAMATION_MARK) { - this.currentToken.data += '!'; - this.state = COMMENT_LESS_THAN_SIGN_BANG_STATE; - } else if (cp === $.LESS_THAN_SIGN) { - this.currentToken.data += '!'; - } else { - this._reconsumeInState(COMMENT_STATE); + _stateCommentLessThanSign(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.EXCLAMATION_MARK: { + token.data += '!'; + this.state = State.COMMENT_LESS_THAN_SIGN_BANG; + break; + } + case unicode_js_1.CODE_POINTS.LESS_THAN_SIGN: { + token.data += '<'; + break; + } + default: { + this.state = State.COMMENT; + this._stateComment(cp); + } } } - // Comment less-than sign bang state //------------------------------------------------------------------ - [COMMENT_LESS_THAN_SIGN_BANG_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.state = COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE; - } else { - this._reconsumeInState(COMMENT_STATE); + _stateCommentLessThanSignBang(cp) { + if (cp === unicode_js_1.CODE_POINTS.HYPHEN_MINUS) { + this.state = State.COMMENT_LESS_THAN_SIGN_BANG_DASH; + } + else { + this.state = State.COMMENT; + this._stateComment(cp); } } - // Comment less-than sign bang dash state //------------------------------------------------------------------ - [COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.state = COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE; - } else { - this._reconsumeInState(COMMENT_END_DASH_STATE); + _stateCommentLessThanSignBangDash(cp) { + if (cp === unicode_js_1.CODE_POINTS.HYPHEN_MINUS) { + this.state = State.COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH; + } + else { + this.state = State.COMMENT_END_DASH; + this._stateCommentEndDash(cp); } } - // Comment less-than sign bang dash dash state //------------------------------------------------------------------ - [COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE](cp) { - if (cp !== $.GREATER_THAN_SIGN && cp !== $.EOF) { - this._err(ERR.nestedComment); + _stateCommentLessThanSignBangDashDash(cp) { + if (cp !== unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN && cp !== unicode_js_1.CODE_POINTS.EOF) { + this._err(error_codes_js_1.ERR.nestedComment); } - - this._reconsumeInState(COMMENT_END_STATE); + this.state = State.COMMENT_END; + this._stateCommentEnd(cp); } - // Comment end dash state //------------------------------------------------------------------ - [COMMENT_END_DASH_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.state = COMMENT_END_STATE; - } else if (cp === $.EOF) { - this._err(ERR.eofInComment); - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this.currentToken.data += '-'; - this._reconsumeInState(COMMENT_STATE); + _stateCommentEndDash(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: { + this.state = State.COMMENT_END; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInComment); + this.emitCurrentComment(token); + this._emitEOFToken(); + break; + } + default: { + token.data += '-'; + this.state = State.COMMENT; + this._stateComment(cp); + } } } - // Comment end state //------------------------------------------------------------------ - [COMMENT_END_STATE](cp) { - if (cp === $.GREATER_THAN_SIGN) { - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (cp === $.EXCLAMATION_MARK) { - this.state = COMMENT_END_BANG_STATE; - } else if (cp === $.HYPHEN_MINUS) { - this.currentToken.data += '-'; - } else if (cp === $.EOF) { - this._err(ERR.eofInComment); - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this.currentToken.data += '--'; - this._reconsumeInState(COMMENT_STATE); + _stateCommentEnd(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.state = State.DATA; + this.emitCurrentComment(token); + break; + } + case unicode_js_1.CODE_POINTS.EXCLAMATION_MARK: { + this.state = State.COMMENT_END_BANG; + break; + } + case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: { + token.data += '-'; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInComment); + this.emitCurrentComment(token); + this._emitEOFToken(); + break; + } + default: { + token.data += '--'; + this.state = State.COMMENT; + this._stateComment(cp); + } } } - // Comment end bang state //------------------------------------------------------------------ - [COMMENT_END_BANG_STATE](cp) { - if (cp === $.HYPHEN_MINUS) { - this.currentToken.data += '--!'; - this.state = COMMENT_END_DASH_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.incorrectlyClosedComment); - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (cp === $.EOF) { - this._err(ERR.eofInComment); - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this.currentToken.data += '--!'; - this._reconsumeInState(COMMENT_STATE); + _stateCommentEndBang(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.HYPHEN_MINUS: { + token.data += '--!'; + this.state = State.COMMENT_END_DASH; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.incorrectlyClosedComment); + this.state = State.DATA; + this.emitCurrentComment(token); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInComment); + this.emitCurrentComment(token); + this._emitEOFToken(); + break; + } + default: { + token.data += '--!'; + this.state = State.COMMENT; + this._stateComment(cp); + } } } - // DOCTYPE state //------------------------------------------------------------------ - [DOCTYPE_STATE](cp) { - if (isWhitespace(cp)) { - this.state = BEFORE_DOCTYPE_NAME_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this._reconsumeInState(BEFORE_DOCTYPE_NAME_STATE); - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this._createDoctypeToken(null); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this._err(ERR.missingWhitespaceBeforeDoctypeName); - this._reconsumeInState(BEFORE_DOCTYPE_NAME_STATE); + _stateDoctype(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + this.state = State.BEFORE_DOCTYPE_NAME; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.state = State.BEFORE_DOCTYPE_NAME; + this._stateBeforeDoctypeName(cp); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + this._createDoctypeToken(null); + const token = this.currentToken; + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + this._err(error_codes_js_1.ERR.missingWhitespaceBeforeDoctypeName); + this.state = State.BEFORE_DOCTYPE_NAME; + this._stateBeforeDoctypeName(cp); + } } } - // Before DOCTYPE name state //------------------------------------------------------------------ - [BEFORE_DOCTYPE_NAME_STATE](cp) { - if (isWhitespace(cp)) { - return; - } - + _stateBeforeDoctypeName(cp) { if (isAsciiUpper(cp)) { - this._createDoctypeToken(toAsciiLowerChar(cp)); - this.state = DOCTYPE_NAME_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this._createDoctypeToken(unicode.REPLACEMENT_CHARACTER); - this.state = DOCTYPE_NAME_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.missingDoctypeName); - this._createDoctypeToken(null); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this.state = DATA_STATE; - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this._createDoctypeToken(null); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this._createDoctypeToken(toChar(cp)); - this.state = DOCTYPE_NAME_STATE; - } + this._createDoctypeToken(String.fromCharCode(toAsciiLower(cp))); + this.state = State.DOCTYPE_NAME; + } + else + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + // Ignore whitespace + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + this._createDoctypeToken(unicode_js_1.REPLACEMENT_CHARACTER); + this.state = State.DOCTYPE_NAME; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.missingDoctypeName); + this._createDoctypeToken(null); + const token = this.currentToken; + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this.state = State.DATA; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + this._createDoctypeToken(null); + const token = this.currentToken; + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + this._createDoctypeToken(String.fromCodePoint(cp)); + this.state = State.DOCTYPE_NAME; + } + } } - // DOCTYPE name state //------------------------------------------------------------------ - [DOCTYPE_NAME_STATE](cp) { - if (isWhitespace(cp)) { - this.state = AFTER_DOCTYPE_NAME_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (isAsciiUpper(cp)) { - this.currentToken.name += toAsciiLowerChar(cp); - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.currentToken.name += unicode.REPLACEMENT_CHARACTER; - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this.currentToken.name += toChar(cp); + _stateDoctypeName(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + this.state = State.AFTER_DOCTYPE_NAME; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.state = State.DATA; + this.emitCurrentDoctype(token); + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + token.name += unicode_js_1.REPLACEMENT_CHARACTER; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + token.name += String.fromCodePoint(isAsciiUpper(cp) ? toAsciiLower(cp) : cp); + } } } - // After DOCTYPE name state //------------------------------------------------------------------ - [AFTER_DOCTYPE_NAME_STATE](cp) { - if (isWhitespace(cp)) { - return; - } - - if (cp === $.GREATER_THAN_SIGN) { - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else if (this._consumeSequenceIfMatch($$.PUBLIC_STRING, cp, false)) { - this.state = AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE; - } else if (this._consumeSequenceIfMatch($$.SYSTEM_STRING, cp, false)) { - this.state = AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE; - } - //NOTE: sequence lookup can be abrupted by hibernation. In that case lookup - //results are no longer valid and we will need to start over. - else if (!this._ensureHibernation()) { - this._err(ERR.invalidCharacterSequenceAfterDoctypeName); - this.currentToken.forceQuirks = true; - this._reconsumeInState(BOGUS_DOCTYPE_STATE); + _stateAfterDoctypeName(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + // Ignore whitespace + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.state = State.DATA; + this.emitCurrentDoctype(token); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: + if (this._consumeSequenceIfMatch(unicode_js_1.SEQUENCES.PUBLIC, false)) { + this.state = State.AFTER_DOCTYPE_PUBLIC_KEYWORD; + } + else if (this._consumeSequenceIfMatch(unicode_js_1.SEQUENCES.SYSTEM, false)) { + this.state = State.AFTER_DOCTYPE_SYSTEM_KEYWORD; + } + //NOTE: sequence lookup can be abrupted by hibernation. In that case lookup + //results are no longer valid and we will need to start over. + else if (!this._ensureHibernation()) { + this._err(error_codes_js_1.ERR.invalidCharacterSequenceAfterDoctypeName); + token.forceQuirks = true; + this.state = State.BOGUS_DOCTYPE; + this._stateBogusDoctype(cp); + } } } - // After DOCTYPE public keyword state //------------------------------------------------------------------ - [AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE](cp) { - if (isWhitespace(cp)) { - this.state = BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE; - } else if (cp === $.QUOTATION_MARK) { - this._err(ERR.missingWhitespaceAfterDoctypePublicKeyword); - this.currentToken.publicId = ''; - this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE; - } else if (cp === $.APOSTROPHE) { - this._err(ERR.missingWhitespaceAfterDoctypePublicKeyword); - this.currentToken.publicId = ''; - this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.missingDoctypePublicIdentifier); - this.currentToken.forceQuirks = true; - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this._err(ERR.missingQuoteBeforeDoctypePublicIdentifier); - this.currentToken.forceQuirks = true; - this._reconsumeInState(BOGUS_DOCTYPE_STATE); + _stateAfterDoctypePublicKeyword(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + this.state = State.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER; + break; + } + case unicode_js_1.CODE_POINTS.QUOTATION_MARK: { + this._err(error_codes_js_1.ERR.missingWhitespaceAfterDoctypePublicKeyword); + token.publicId = ''; + this.state = State.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.APOSTROPHE: { + this._err(error_codes_js_1.ERR.missingWhitespaceAfterDoctypePublicKeyword); + token.publicId = ''; + this.state = State.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.missingDoctypePublicIdentifier); + token.forceQuirks = true; + this.state = State.DATA; + this.emitCurrentDoctype(token); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + this._err(error_codes_js_1.ERR.missingQuoteBeforeDoctypePublicIdentifier); + token.forceQuirks = true; + this.state = State.BOGUS_DOCTYPE; + this._stateBogusDoctype(cp); + } } } - // Before DOCTYPE public identifier state //------------------------------------------------------------------ - [BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE](cp) { - if (isWhitespace(cp)) { - return; - } - - if (cp === $.QUOTATION_MARK) { - this.currentToken.publicId = ''; - this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE; - } else if (cp === $.APOSTROPHE) { - this.currentToken.publicId = ''; - this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.missingDoctypePublicIdentifier); - this.currentToken.forceQuirks = true; - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this._err(ERR.missingQuoteBeforeDoctypePublicIdentifier); - this.currentToken.forceQuirks = true; - this._reconsumeInState(BOGUS_DOCTYPE_STATE); + _stateBeforeDoctypePublicIdentifier(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + // Ignore whitespace + break; + } + case unicode_js_1.CODE_POINTS.QUOTATION_MARK: { + token.publicId = ''; + this.state = State.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.APOSTROPHE: { + token.publicId = ''; + this.state = State.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.missingDoctypePublicIdentifier); + token.forceQuirks = true; + this.state = State.DATA; + this.emitCurrentDoctype(token); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + this._err(error_codes_js_1.ERR.missingQuoteBeforeDoctypePublicIdentifier); + token.forceQuirks = true; + this.state = State.BOGUS_DOCTYPE; + this._stateBogusDoctype(cp); + } } } - // DOCTYPE public identifier (double-quoted) state //------------------------------------------------------------------ - [DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE](cp) { - if (cp === $.QUOTATION_MARK) { - this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.currentToken.publicId += unicode.REPLACEMENT_CHARACTER; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.abruptDoctypePublicIdentifier); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this.state = DATA_STATE; - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this.currentToken.publicId += toChar(cp); + _stateDoctypePublicIdentifierDoubleQuoted(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.QUOTATION_MARK: { + this.state = State.AFTER_DOCTYPE_PUBLIC_IDENTIFIER; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + token.publicId += unicode_js_1.REPLACEMENT_CHARACTER; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.abruptDoctypePublicIdentifier); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this.state = State.DATA; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + token.publicId += String.fromCodePoint(cp); + } } } - // DOCTYPE public identifier (single-quoted) state //------------------------------------------------------------------ - [DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE](cp) { - if (cp === $.APOSTROPHE) { - this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.currentToken.publicId += unicode.REPLACEMENT_CHARACTER; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.abruptDoctypePublicIdentifier); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this.state = DATA_STATE; - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this.currentToken.publicId += toChar(cp); + _stateDoctypePublicIdentifierSingleQuoted(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.APOSTROPHE: { + this.state = State.AFTER_DOCTYPE_PUBLIC_IDENTIFIER; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + token.publicId += unicode_js_1.REPLACEMENT_CHARACTER; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.abruptDoctypePublicIdentifier); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this.state = State.DATA; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + token.publicId += String.fromCodePoint(cp); + } } } - // After DOCTYPE public identifier state //------------------------------------------------------------------ - [AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE](cp) { - if (isWhitespace(cp)) { - this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (cp === $.QUOTATION_MARK) { - this._err(ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers); - this.currentToken.systemId = ''; - this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE; - } else if (cp === $.APOSTROPHE) { - this._err(ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers); - this.currentToken.systemId = ''; - this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE; - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier); - this.currentToken.forceQuirks = true; - this._reconsumeInState(BOGUS_DOCTYPE_STATE); + _stateAfterDoctypePublicIdentifier(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + this.state = State.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.state = State.DATA; + this.emitCurrentDoctype(token); + break; + } + case unicode_js_1.CODE_POINTS.QUOTATION_MARK: { + this._err(error_codes_js_1.ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers); + token.systemId = ''; + this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.APOSTROPHE: { + this._err(error_codes_js_1.ERR.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers); + token.systemId = ''; + this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + this._err(error_codes_js_1.ERR.missingQuoteBeforeDoctypeSystemIdentifier); + token.forceQuirks = true; + this.state = State.BOGUS_DOCTYPE; + this._stateBogusDoctype(cp); + } } } - // Between DOCTYPE public and system identifiers state //------------------------------------------------------------------ - [BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE](cp) { - if (isWhitespace(cp)) { - return; - } - - if (cp === $.GREATER_THAN_SIGN) { - this._emitCurrentToken(); - this.state = DATA_STATE; - } else if (cp === $.QUOTATION_MARK) { - this.currentToken.systemId = ''; - this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE; - } else if (cp === $.APOSTROPHE) { - this.currentToken.systemId = ''; - this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE; - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier); - this.currentToken.forceQuirks = true; - this._reconsumeInState(BOGUS_DOCTYPE_STATE); + _stateBetweenDoctypePublicAndSystemIdentifiers(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + // Ignore whitespace + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.emitCurrentDoctype(token); + this.state = State.DATA; + break; + } + case unicode_js_1.CODE_POINTS.QUOTATION_MARK: { + token.systemId = ''; + this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.APOSTROPHE: { + token.systemId = ''; + this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + this._err(error_codes_js_1.ERR.missingQuoteBeforeDoctypeSystemIdentifier); + token.forceQuirks = true; + this.state = State.BOGUS_DOCTYPE; + this._stateBogusDoctype(cp); + } } } - // After DOCTYPE system keyword state //------------------------------------------------------------------ - [AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE](cp) { - if (isWhitespace(cp)) { - this.state = BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE; - } else if (cp === $.QUOTATION_MARK) { - this._err(ERR.missingWhitespaceAfterDoctypeSystemKeyword); - this.currentToken.systemId = ''; - this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE; - } else if (cp === $.APOSTROPHE) { - this._err(ERR.missingWhitespaceAfterDoctypeSystemKeyword); - this.currentToken.systemId = ''; - this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.missingDoctypeSystemIdentifier); - this.currentToken.forceQuirks = true; - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier); - this.currentToken.forceQuirks = true; - this._reconsumeInState(BOGUS_DOCTYPE_STATE); + _stateAfterDoctypeSystemKeyword(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + this.state = State.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER; + break; + } + case unicode_js_1.CODE_POINTS.QUOTATION_MARK: { + this._err(error_codes_js_1.ERR.missingWhitespaceAfterDoctypeSystemKeyword); + token.systemId = ''; + this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.APOSTROPHE: { + this._err(error_codes_js_1.ERR.missingWhitespaceAfterDoctypeSystemKeyword); + token.systemId = ''; + this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.missingDoctypeSystemIdentifier); + token.forceQuirks = true; + this.state = State.DATA; + this.emitCurrentDoctype(token); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + this._err(error_codes_js_1.ERR.missingQuoteBeforeDoctypeSystemIdentifier); + token.forceQuirks = true; + this.state = State.BOGUS_DOCTYPE; + this._stateBogusDoctype(cp); + } } } - // Before DOCTYPE system identifier state //------------------------------------------------------------------ - [BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE](cp) { - if (isWhitespace(cp)) { - return; - } - - if (cp === $.QUOTATION_MARK) { - this.currentToken.systemId = ''; - this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE; - } else if (cp === $.APOSTROPHE) { - this.currentToken.systemId = ''; - this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.missingDoctypeSystemIdentifier); - this.currentToken.forceQuirks = true; - this.state = DATA_STATE; - this._emitCurrentToken(); - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this._err(ERR.missingQuoteBeforeDoctypeSystemIdentifier); - this.currentToken.forceQuirks = true; - this._reconsumeInState(BOGUS_DOCTYPE_STATE); + _stateBeforeDoctypeSystemIdentifier(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + // Ignore whitespace + break; + } + case unicode_js_1.CODE_POINTS.QUOTATION_MARK: { + token.systemId = ''; + this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.APOSTROPHE: { + token.systemId = ''; + this.state = State.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.missingDoctypeSystemIdentifier); + token.forceQuirks = true; + this.state = State.DATA; + this.emitCurrentDoctype(token); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + this._err(error_codes_js_1.ERR.missingQuoteBeforeDoctypeSystemIdentifier); + token.forceQuirks = true; + this.state = State.BOGUS_DOCTYPE; + this._stateBogusDoctype(cp); + } } } - // DOCTYPE system identifier (double-quoted) state //------------------------------------------------------------------ - [DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE](cp) { - if (cp === $.QUOTATION_MARK) { - this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.currentToken.systemId += unicode.REPLACEMENT_CHARACTER; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.abruptDoctypeSystemIdentifier); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this.state = DATA_STATE; - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this.currentToken.systemId += toChar(cp); + _stateDoctypeSystemIdentifierDoubleQuoted(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.QUOTATION_MARK: { + this.state = State.AFTER_DOCTYPE_SYSTEM_IDENTIFIER; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + token.systemId += unicode_js_1.REPLACEMENT_CHARACTER; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.abruptDoctypeSystemIdentifier); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this.state = State.DATA; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + token.systemId += String.fromCodePoint(cp); + } } } - // DOCTYPE system identifier (single-quoted) state //------------------------------------------------------------------ - [DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE](cp) { - if (cp === $.APOSTROPHE) { - this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - this.currentToken.systemId += unicode.REPLACEMENT_CHARACTER; - } else if (cp === $.GREATER_THAN_SIGN) { - this._err(ERR.abruptDoctypeSystemIdentifier); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this.state = DATA_STATE; - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this.currentToken.systemId += toChar(cp); + _stateDoctypeSystemIdentifierSingleQuoted(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.APOSTROPHE: { + this.state = State.AFTER_DOCTYPE_SYSTEM_IDENTIFIER; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + token.systemId += unicode_js_1.REPLACEMENT_CHARACTER; + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this._err(error_codes_js_1.ERR.abruptDoctypeSystemIdentifier); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this.state = State.DATA; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + token.systemId += String.fromCodePoint(cp); + } } } - // After DOCTYPE system identifier state //------------------------------------------------------------------ - [AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE](cp) { - if (isWhitespace(cp)) { - return; - } - - if (cp === $.GREATER_THAN_SIGN) { - this._emitCurrentToken(); - this.state = DATA_STATE; - } else if (cp === $.EOF) { - this._err(ERR.eofInDoctype); - this.currentToken.forceQuirks = true; - this._emitCurrentToken(); - this._emitEOFToken(); - } else { - this._err(ERR.unexpectedCharacterAfterDoctypeSystemIdentifier); - this._reconsumeInState(BOGUS_DOCTYPE_STATE); + _stateAfterDoctypeSystemIdentifier(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.SPACE: + case unicode_js_1.CODE_POINTS.LINE_FEED: + case unicode_js_1.CODE_POINTS.TABULATION: + case unicode_js_1.CODE_POINTS.FORM_FEED: { + // Ignore whitespace + break; + } + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.emitCurrentDoctype(token); + this.state = State.DATA; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInDoctype); + token.forceQuirks = true; + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: { + this._err(error_codes_js_1.ERR.unexpectedCharacterAfterDoctypeSystemIdentifier); + this.state = State.BOGUS_DOCTYPE; + this._stateBogusDoctype(cp); + } } } - // Bogus DOCTYPE state //------------------------------------------------------------------ - [BOGUS_DOCTYPE_STATE](cp) { - if (cp === $.GREATER_THAN_SIGN) { - this._emitCurrentToken(); - this.state = DATA_STATE; - } else if (cp === $.NULL) { - this._err(ERR.unexpectedNullCharacter); - } else if (cp === $.EOF) { - this._emitCurrentToken(); - this._emitEOFToken(); + _stateBogusDoctype(cp) { + const token = this.currentToken; + switch (cp) { + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.emitCurrentDoctype(token); + this.state = State.DATA; + break; + } + case unicode_js_1.CODE_POINTS.NULL: { + this._err(error_codes_js_1.ERR.unexpectedNullCharacter); + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this.emitCurrentDoctype(token); + this._emitEOFToken(); + break; + } + default: + // Do nothing } } - // CDATA section state //------------------------------------------------------------------ - [CDATA_SECTION_STATE](cp) { - if (cp === $.RIGHT_SQUARE_BRACKET) { - this.state = CDATA_SECTION_BRACKET_STATE; - } else if (cp === $.EOF) { - this._err(ERR.eofInCdata); - this._emitEOFToken(); - } else { - this._emitCodePoint(cp); + _stateCdataSection(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.RIGHT_SQUARE_BRACKET: { + this.state = State.CDATA_SECTION_BRACKET; + break; + } + case unicode_js_1.CODE_POINTS.EOF: { + this._err(error_codes_js_1.ERR.eofInCdata); + this._emitEOFToken(); + break; + } + default: { + this._emitCodePoint(cp); + } } } - // CDATA section bracket state //------------------------------------------------------------------ - [CDATA_SECTION_BRACKET_STATE](cp) { - if (cp === $.RIGHT_SQUARE_BRACKET) { - this.state = CDATA_SECTION_END_STATE; - } else { + _stateCdataSectionBracket(cp) { + if (cp === unicode_js_1.CODE_POINTS.RIGHT_SQUARE_BRACKET) { + this.state = State.CDATA_SECTION_END; + } + else { this._emitChars(']'); - this._reconsumeInState(CDATA_SECTION_STATE); + this.state = State.CDATA_SECTION; + this._stateCdataSection(cp); } } - // CDATA section end state //------------------------------------------------------------------ - [CDATA_SECTION_END_STATE](cp) { - if (cp === $.GREATER_THAN_SIGN) { - this.state = DATA_STATE; - } else if (cp === $.RIGHT_SQUARE_BRACKET) { - this._emitChars(']'); - } else { - this._emitChars(']]'); - this._reconsumeInState(CDATA_SECTION_STATE); + _stateCdataSectionEnd(cp) { + switch (cp) { + case unicode_js_1.CODE_POINTS.GREATER_THAN_SIGN: { + this.state = State.DATA; + break; + } + case unicode_js_1.CODE_POINTS.RIGHT_SQUARE_BRACKET: { + this._emitChars(']'); + break; + } + default: { + this._emitChars(']]'); + this.state = State.CDATA_SECTION; + this._stateCdataSection(cp); + } } } - // Character reference state //------------------------------------------------------------------ - [CHARACTER_REFERENCE_STATE](cp) { - this.tempBuff = [$.AMPERSAND]; - - if (cp === $.NUMBER_SIGN) { - this.tempBuff.push(cp); - this.state = NUMERIC_CHARACTER_REFERENCE_STATE; - } else if (isAsciiAlphaNumeric(cp)) { - this._reconsumeInState(NAMED_CHARACTER_REFERENCE_STATE); - } else { - this._flushCodePointsConsumedAsCharacterReference(); + _stateCharacterReference(cp) { + if (cp === unicode_js_1.CODE_POINTS.NUMBER_SIGN) { + this.state = State.NUMERIC_CHARACTER_REFERENCE; + } + else if (isAsciiAlphaNumeric(cp)) { + this.state = State.NAMED_CHARACTER_REFERENCE; + this._stateNamedCharacterReference(cp); + } + else { + this._flushCodePointConsumedAsCharacterReference(unicode_js_1.CODE_POINTS.AMPERSAND); this._reconsumeInState(this.returnState); } } - // Named character reference state //------------------------------------------------------------------ - [NAMED_CHARACTER_REFERENCE_STATE](cp) { + _stateNamedCharacterReference(cp) { const matchResult = this._matchNamedCharacterReference(cp); - - //NOTE: matching can be abrupted by hibernation. In that case match + //NOTE: Matching can be abrupted by hibernation. In that case, match //results are no longer valid and we will need to start over. if (this._ensureHibernation()) { - this.tempBuff = [$.AMPERSAND]; - } else if (matchResult) { - const withSemicolon = this.tempBuff[this.tempBuff.length - 1] === $.SEMICOLON; - - if (!this._isCharacterReferenceAttributeQuirk(withSemicolon)) { - if (!withSemicolon) { - this._errOnNextCodePoint(ERR.missingSemicolonAfterCharacterReference); - } - - this.tempBuff = matchResult; + // Stay in the state, try again. + } + else if (matchResult) { + for (let i = 0; i < matchResult.length; i++) { + this._flushCodePointConsumedAsCharacterReference(matchResult[i]); } - - this._flushCodePointsConsumedAsCharacterReference(); this.state = this.returnState; - } else { - this._flushCodePointsConsumedAsCharacterReference(); - this.state = AMBIGUOUS_AMPERSAND_STATE; + } + else { + this._flushCodePointConsumedAsCharacterReference(unicode_js_1.CODE_POINTS.AMPERSAND); + this.state = State.AMBIGUOUS_AMPERSAND; } } - // Ambiguos ampersand state //------------------------------------------------------------------ - [AMBIGUOUS_AMPERSAND_STATE](cp) { + _stateAmbiguousAmpersand(cp) { if (isAsciiAlphaNumeric(cp)) { - if (this._isCharacterReferenceInAttribute()) { - this.currentAttr.value += toChar(cp); - } else { - this._emitCodePoint(cp); - } - } else { - if (cp === $.SEMICOLON) { - this._err(ERR.unknownNamedCharacterReference); + this._flushCodePointConsumedAsCharacterReference(cp); + } + else { + if (cp === unicode_js_1.CODE_POINTS.SEMICOLON) { + this._err(error_codes_js_1.ERR.unknownNamedCharacterReference); } - this._reconsumeInState(this.returnState); } } - // Numeric character reference state //------------------------------------------------------------------ - [NUMERIC_CHARACTER_REFERENCE_STATE](cp) { + _stateNumericCharacterReference(cp) { this.charRefCode = 0; - - if (cp === $.LATIN_SMALL_X || cp === $.LATIN_CAPITAL_X) { - this.tempBuff.push(cp); - this.state = HEXADEMICAL_CHARACTER_REFERENCE_START_STATE; - } else { - this._reconsumeInState(DECIMAL_CHARACTER_REFERENCE_START_STATE); + if (cp === unicode_js_1.CODE_POINTS.LATIN_SMALL_X || cp === unicode_js_1.CODE_POINTS.LATIN_CAPITAL_X) { + this.state = State.HEXADEMICAL_CHARACTER_REFERENCE_START; + } + else { + this.state = State.DECIMAL_CHARACTER_REFERENCE_START; + this._stateDecimalCharacterReferenceStart(cp); } } - // Hexademical character reference start state //------------------------------------------------------------------ - [HEXADEMICAL_CHARACTER_REFERENCE_START_STATE](cp) { + _stateHexademicalCharacterReferenceStart(cp) { if (isAsciiHexDigit(cp)) { - this._reconsumeInState(HEXADEMICAL_CHARACTER_REFERENCE_STATE); - } else { - this._err(ERR.absenceOfDigitsInNumericCharacterReference); - this._flushCodePointsConsumedAsCharacterReference(); - this._reconsumeInState(this.returnState); + this.state = State.HEXADEMICAL_CHARACTER_REFERENCE; + this._stateHexademicalCharacterReference(cp); + } + else { + this._err(error_codes_js_1.ERR.absenceOfDigitsInNumericCharacterReference); + this._flushCodePointConsumedAsCharacterReference(unicode_js_1.CODE_POINTS.AMPERSAND); + this._flushCodePointConsumedAsCharacterReference(unicode_js_1.CODE_POINTS.NUMBER_SIGN); + this._unconsume(2); + this.state = this.returnState; } } - // Decimal character reference start state //------------------------------------------------------------------ - [DECIMAL_CHARACTER_REFERENCE_START_STATE](cp) { + _stateDecimalCharacterReferenceStart(cp) { if (isAsciiDigit(cp)) { - this._reconsumeInState(DECIMAL_CHARACTER_REFERENCE_STATE); - } else { - this._err(ERR.absenceOfDigitsInNumericCharacterReference); - this._flushCodePointsConsumedAsCharacterReference(); + this.state = State.DECIMAL_CHARACTER_REFERENCE; + this._stateDecimalCharacterReference(cp); + } + else { + this._err(error_codes_js_1.ERR.absenceOfDigitsInNumericCharacterReference); + this._flushCodePointConsumedAsCharacterReference(unicode_js_1.CODE_POINTS.AMPERSAND); + this._flushCodePointConsumedAsCharacterReference(unicode_js_1.CODE_POINTS.NUMBER_SIGN); this._reconsumeInState(this.returnState); } } - // Hexademical character reference state //------------------------------------------------------------------ - [HEXADEMICAL_CHARACTER_REFERENCE_STATE](cp) { + _stateHexademicalCharacterReference(cp) { if (isAsciiUpperHexDigit(cp)) { this.charRefCode = this.charRefCode * 16 + cp - 0x37; - } else if (isAsciiLowerHexDigit(cp)) { + } + else if (isAsciiLowerHexDigit(cp)) { this.charRefCode = this.charRefCode * 16 + cp - 0x57; - } else if (isAsciiDigit(cp)) { + } + else if (isAsciiDigit(cp)) { this.charRefCode = this.charRefCode * 16 + cp - 0x30; - } else if (cp === $.SEMICOLON) { - this.state = NUMERIC_CHARACTER_REFERENCE_END_STATE; - } else { - this._err(ERR.missingSemicolonAfterCharacterReference); - this._reconsumeInState(NUMERIC_CHARACTER_REFERENCE_END_STATE); + } + else if (cp === unicode_js_1.CODE_POINTS.SEMICOLON) { + this.state = State.NUMERIC_CHARACTER_REFERENCE_END; + } + else { + this._err(error_codes_js_1.ERR.missingSemicolonAfterCharacterReference); + this.state = State.NUMERIC_CHARACTER_REFERENCE_END; + this._stateNumericCharacterReferenceEnd(); } } - // Decimal character reference state //------------------------------------------------------------------ - [DECIMAL_CHARACTER_REFERENCE_STATE](cp) { + _stateDecimalCharacterReference(cp) { if (isAsciiDigit(cp)) { this.charRefCode = this.charRefCode * 10 + cp - 0x30; - } else if (cp === $.SEMICOLON) { - this.state = NUMERIC_CHARACTER_REFERENCE_END_STATE; - } else { - this._err(ERR.missingSemicolonAfterCharacterReference); - this._reconsumeInState(NUMERIC_CHARACTER_REFERENCE_END_STATE); + } + else if (cp === unicode_js_1.CODE_POINTS.SEMICOLON) { + this.state = State.NUMERIC_CHARACTER_REFERENCE_END; + } + else { + this._err(error_codes_js_1.ERR.missingSemicolonAfterCharacterReference); + this.state = State.NUMERIC_CHARACTER_REFERENCE_END; + this._stateNumericCharacterReferenceEnd(); } } - // Numeric character reference end state //------------------------------------------------------------------ - [NUMERIC_CHARACTER_REFERENCE_END_STATE]() { - if (this.charRefCode === $.NULL) { - this._err(ERR.nullCharacterReference); - this.charRefCode = $.REPLACEMENT_CHARACTER; - } else if (this.charRefCode > 0x10ffff) { - this._err(ERR.characterReferenceOutsideUnicodeRange); - this.charRefCode = $.REPLACEMENT_CHARACTER; - } else if (unicode.isSurrogate(this.charRefCode)) { - this._err(ERR.surrogateCharacterReference); - this.charRefCode = $.REPLACEMENT_CHARACTER; - } else if (unicode.isUndefinedCodePoint(this.charRefCode)) { - this._err(ERR.noncharacterCharacterReference); - } else if (unicode.isControlCodePoint(this.charRefCode) || this.charRefCode === $.CARRIAGE_RETURN) { - this._err(ERR.controlCharacterReference); - - const replacement = C1_CONTROLS_REFERENCE_REPLACEMENTS[this.charRefCode]; - - if (replacement) { + _stateNumericCharacterReferenceEnd() { + if (this.charRefCode === unicode_js_1.CODE_POINTS.NULL) { + this._err(error_codes_js_1.ERR.nullCharacterReference); + this.charRefCode = unicode_js_1.CODE_POINTS.REPLACEMENT_CHARACTER; + } + else if (this.charRefCode > 1114111) { + this._err(error_codes_js_1.ERR.characterReferenceOutsideUnicodeRange); + this.charRefCode = unicode_js_1.CODE_POINTS.REPLACEMENT_CHARACTER; + } + else if ((0, unicode_js_1.isSurrogate)(this.charRefCode)) { + this._err(error_codes_js_1.ERR.surrogateCharacterReference); + this.charRefCode = unicode_js_1.CODE_POINTS.REPLACEMENT_CHARACTER; + } + else if ((0, unicode_js_1.isUndefinedCodePoint)(this.charRefCode)) { + this._err(error_codes_js_1.ERR.noncharacterCharacterReference); + } + else if ((0, unicode_js_1.isControlCodePoint)(this.charRefCode) || this.charRefCode === unicode_js_1.CODE_POINTS.CARRIAGE_RETURN) { + this._err(error_codes_js_1.ERR.controlCharacterReference); + const replacement = C1_CONTROLS_REFERENCE_REPLACEMENTS.get(this.charRefCode); + if (replacement !== undefined) { this.charRefCode = replacement; } } - - this.tempBuff = [this.charRefCode]; - - this._flushCodePointsConsumedAsCharacterReference(); + this._flushCodePointConsumedAsCharacterReference(this.charRefCode); this._reconsumeInState(this.returnState); } } +exports.Tokenizer = Tokenizer; -//Token types -Tokenizer.CHARACTER_TOKEN = 'CHARACTER_TOKEN'; -Tokenizer.NULL_CHARACTER_TOKEN = 'NULL_CHARACTER_TOKEN'; -Tokenizer.WHITESPACE_CHARACTER_TOKEN = 'WHITESPACE_CHARACTER_TOKEN'; -Tokenizer.START_TAG_TOKEN = 'START_TAG_TOKEN'; -Tokenizer.END_TAG_TOKEN = 'END_TAG_TOKEN'; -Tokenizer.COMMENT_TOKEN = 'COMMENT_TOKEN'; -Tokenizer.DOCTYPE_TOKEN = 'DOCTYPE_TOKEN'; -Tokenizer.EOF_TOKEN = 'EOF_TOKEN'; -Tokenizer.HIBERNATION_TOKEN = 'HIBERNATION_TOKEN'; - -//Tokenizer initial states for different modes -Tokenizer.MODE = { - DATA: DATA_STATE, - RCDATA: RCDATA_STATE, - RAWTEXT: RAWTEXT_STATE, - SCRIPT_DATA: SCRIPT_DATA_STATE, - PLAINTEXT: PLAINTEXT_STATE -}; - -//Static -Tokenizer.getTokenAttr = function(token, attrName) { - for (let i = token.attrs.length - 1; i >= 0; i--) { - if (token.attrs[i].name === attrName) { - return token.attrs[i].value; - } - } - - return null; -}; - -module.exports = Tokenizer; - -},{"../common/error-codes":2,"../common/unicode":5,"./named-entity-data":20,"./preprocessor":21}],20:[function(require,module,exports){ -'use strict'; - -//NOTE: this file contains auto-generated array mapped radix tree that is used for the named entity references consumption -//(details: https://github.com/inikulin/parse5/tree/master/scripts/generate-named-entity-data/README.md) -module.exports = new Uint16Array([4,52,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,106,303,412,810,1432,1701,1796,1987,2114,2360,2420,2484,3170,3251,4140,4393,4575,4610,5106,5512,5728,6117,6274,6315,6345,6427,6516,7002,7910,8733,9323,9870,10170,10631,10893,11318,11386,11467,12773,13092,14474,14922,15448,15542,16419,17666,18166,18611,19004,19095,19298,19397,4,16,69,77,97,98,99,102,103,108,109,110,111,112,114,115,116,117,140,150,158,169,176,194,199,210,216,222,226,242,256,266,283,294,108,105,103,5,198,1,59,148,1,198,80,5,38,1,59,156,1,38,99,117,116,101,5,193,1,59,167,1,193,114,101,118,101,59,1,258,4,2,105,121,182,191,114,99,5,194,1,59,189,1,194,59,1,1040,114,59,3,55349,56580,114,97,118,101,5,192,1,59,208,1,192,112,104,97,59,1,913,97,99,114,59,1,256,100,59,1,10835,4,2,103,112,232,237,111,110,59,1,260,102,59,3,55349,56632,112,108,121,70,117,110,99,116,105,111,110,59,1,8289,105,110,103,5,197,1,59,264,1,197,4,2,99,115,272,277,114,59,3,55349,56476,105,103,110,59,1,8788,105,108,100,101,5,195,1,59,292,1,195,109,108,5,196,1,59,301,1,196,4,8,97,99,101,102,111,114,115,117,321,350,354,383,388,394,400,405,4,2,99,114,327,336,107,115,108,97,115,104,59,1,8726,4,2,118,119,342,345,59,1,10983,101,100,59,1,8966,121,59,1,1041,4,3,99,114,116,362,369,379,97,117,115,101,59,1,8757,110,111,117,108,108,105,115,59,1,8492,97,59,1,914,114,59,3,55349,56581,112,102,59,3,55349,56633,101,118,101,59,1,728,99,114,59,1,8492,109,112,101,113,59,1,8782,4,14,72,79,97,99,100,101,102,104,105,108,111,114,115,117,442,447,456,504,542,547,569,573,577,616,678,784,790,796,99,121,59,1,1063,80,89,5,169,1,59,454,1,169,4,3,99,112,121,464,470,497,117,116,101,59,1,262,4,2,59,105,476,478,1,8914,116,97,108,68,105,102,102,101,114,101,110,116,105,97,108,68,59,1,8517,108,101,121,115,59,1,8493,4,4,97,101,105,111,514,520,530,535,114,111,110,59,1,268,100,105,108,5,199,1,59,528,1,199,114,99,59,1,264,110,105,110,116,59,1,8752,111,116,59,1,266,4,2,100,110,553,560,105,108,108,97,59,1,184,116,101,114,68,111,116,59,1,183,114,59,1,8493,105,59,1,935,114,99,108,101,4,4,68,77,80,84,591,596,603,609,111,116,59,1,8857,105,110,117,115,59,1,8854,108,117,115,59,1,8853,105,109,101,115,59,1,8855,111,4,2,99,115,623,646,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8754,101,67,117,114,108,121,4,2,68,81,658,671,111,117,98,108,101,81,117,111,116,101,59,1,8221,117,111,116,101,59,1,8217,4,4,108,110,112,117,688,701,736,753,111,110,4,2,59,101,696,698,1,8759,59,1,10868,4,3,103,105,116,709,717,722,114,117,101,110,116,59,1,8801,110,116,59,1,8751,111,117,114,73,110,116,101,103,114,97,108,59,1,8750,4,2,102,114,742,745,59,1,8450,111,100,117,99,116,59,1,8720,110,116,101,114,67,108,111,99,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8755,111,115,115,59,1,10799,99,114,59,3,55349,56478,112,4,2,59,67,803,805,1,8915,97,112,59,1,8781,4,11,68,74,83,90,97,99,101,102,105,111,115,834,850,855,860,865,888,903,916,921,1011,1415,4,2,59,111,840,842,1,8517,116,114,97,104,100,59,1,10513,99,121,59,1,1026,99,121,59,1,1029,99,121,59,1,1039,4,3,103,114,115,873,879,883,103,101,114,59,1,8225,114,59,1,8609,104,118,59,1,10980,4,2,97,121,894,900,114,111,110,59,1,270,59,1,1044,108,4,2,59,116,910,912,1,8711,97,59,1,916,114,59,3,55349,56583,4,2,97,102,927,998,4,2,99,109,933,992,114,105,116,105,99,97,108,4,4,65,68,71,84,950,957,978,985,99,117,116,101,59,1,180,111,4,2,116,117,964,967,59,1,729,98,108,101,65,99,117,116,101,59,1,733,114,97,118,101,59,1,96,105,108,100,101,59,1,732,111,110,100,59,1,8900,102,101,114,101,110,116,105,97,108,68,59,1,8518,4,4,112,116,117,119,1021,1026,1048,1249,102,59,3,55349,56635,4,3,59,68,69,1034,1036,1041,1,168,111,116,59,1,8412,113,117,97,108,59,1,8784,98,108,101,4,6,67,68,76,82,85,86,1065,1082,1101,1189,1211,1236,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8751,111,4,2,116,119,1089,1092,59,1,168,110,65,114,114,111,119,59,1,8659,4,2,101,111,1107,1141,102,116,4,3,65,82,84,1117,1124,1136,114,114,111,119,59,1,8656,105,103,104,116,65,114,114,111,119,59,1,8660,101,101,59,1,10980,110,103,4,2,76,82,1149,1177,101,102,116,4,2,65,82,1158,1165,114,114,111,119,59,1,10232,105,103,104,116,65,114,114,111,119,59,1,10234,105,103,104,116,65,114,114,111,119,59,1,10233,105,103,104,116,4,2,65,84,1199,1206,114,114,111,119,59,1,8658,101,101,59,1,8872,112,4,2,65,68,1218,1225,114,114,111,119,59,1,8657,111,119,110,65,114,114,111,119,59,1,8661,101,114,116,105,99,97,108,66,97,114,59,1,8741,110,4,6,65,66,76,82,84,97,1264,1292,1299,1352,1391,1408,114,114,111,119,4,3,59,66,85,1276,1278,1283,1,8595,97,114,59,1,10515,112,65,114,114,111,119,59,1,8693,114,101,118,101,59,1,785,101,102,116,4,3,82,84,86,1310,1323,1334,105,103,104,116,86,101,99,116,111,114,59,1,10576,101,101,86,101,99,116,111,114,59,1,10590,101,99,116,111,114,4,2,59,66,1345,1347,1,8637,97,114,59,1,10582,105,103,104,116,4,2,84,86,1362,1373,101,101,86,101,99,116,111,114,59,1,10591,101,99,116,111,114,4,2,59,66,1384,1386,1,8641,97,114,59,1,10583,101,101,4,2,59,65,1399,1401,1,8868,114,114,111,119,59,1,8615,114,114,111,119,59,1,8659,4,2,99,116,1421,1426,114,59,3,55349,56479,114,111,107,59,1,272,4,16,78,84,97,99,100,102,103,108,109,111,112,113,115,116,117,120,1466,1470,1478,1489,1515,1520,1525,1536,1544,1593,1609,1617,1650,1664,1668,1677,71,59,1,330,72,5,208,1,59,1476,1,208,99,117,116,101,5,201,1,59,1487,1,201,4,3,97,105,121,1497,1503,1512,114,111,110,59,1,282,114,99,5,202,1,59,1510,1,202,59,1,1069,111,116,59,1,278,114,59,3,55349,56584,114,97,118,101,5,200,1,59,1534,1,200,101,109,101,110,116,59,1,8712,4,2,97,112,1550,1555,99,114,59,1,274,116,121,4,2,83,86,1563,1576,109,97,108,108,83,113,117,97,114,101,59,1,9723,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,1,9643,4,2,103,112,1599,1604,111,110,59,1,280,102,59,3,55349,56636,115,105,108,111,110,59,1,917,117,4,2,97,105,1624,1640,108,4,2,59,84,1631,1633,1,10869,105,108,100,101,59,1,8770,108,105,98,114,105,117,109,59,1,8652,4,2,99,105,1656,1660,114,59,1,8496,109,59,1,10867,97,59,1,919,109,108,5,203,1,59,1675,1,203,4,2,105,112,1683,1689,115,116,115,59,1,8707,111,110,101,110,116,105,97,108,69,59,1,8519,4,5,99,102,105,111,115,1713,1717,1722,1762,1791,121,59,1,1060,114,59,3,55349,56585,108,108,101,100,4,2,83,86,1732,1745,109,97,108,108,83,113,117,97,114,101,59,1,9724,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,1,9642,4,3,112,114,117,1770,1775,1781,102,59,3,55349,56637,65,108,108,59,1,8704,114,105,101,114,116,114,102,59,1,8497,99,114,59,1,8497,4,12,74,84,97,98,99,100,102,103,111,114,115,116,1822,1827,1834,1848,1855,1877,1882,1887,1890,1896,1978,1984,99,121,59,1,1027,5,62,1,59,1832,1,62,109,109,97,4,2,59,100,1843,1845,1,915,59,1,988,114,101,118,101,59,1,286,4,3,101,105,121,1863,1869,1874,100,105,108,59,1,290,114,99,59,1,284,59,1,1043,111,116,59,1,288,114,59,3,55349,56586,59,1,8921,112,102,59,3,55349,56638,101,97,116,101,114,4,6,69,70,71,76,83,84,1915,1933,1944,1953,1959,1971,113,117,97,108,4,2,59,76,1925,1927,1,8805,101,115,115,59,1,8923,117,108,108,69,113,117,97,108,59,1,8807,114,101,97,116,101,114,59,1,10914,101,115,115,59,1,8823,108,97,110,116,69,113,117,97,108,59,1,10878,105,108,100,101,59,1,8819,99,114,59,3,55349,56482,59,1,8811,4,8,65,97,99,102,105,111,115,117,2005,2012,2026,2032,2036,2049,2073,2089,82,68,99,121,59,1,1066,4,2,99,116,2018,2023,101,107,59,1,711,59,1,94,105,114,99,59,1,292,114,59,1,8460,108,98,101,114,116,83,112,97,99,101,59,1,8459,4,2,112,114,2055,2059,102,59,1,8461,105,122,111,110,116,97,108,76,105,110,101,59,1,9472,4,2,99,116,2079,2083,114,59,1,8459,114,111,107,59,1,294,109,112,4,2,68,69,2097,2107,111,119,110,72,117,109,112,59,1,8782,113,117,97,108,59,1,8783,4,14,69,74,79,97,99,100,102,103,109,110,111,115,116,117,2144,2149,2155,2160,2171,2189,2194,2198,2209,2245,2307,2329,2334,2341,99,121,59,1,1045,108,105,103,59,1,306,99,121,59,1,1025,99,117,116,101,5,205,1,59,2169,1,205,4,2,105,121,2177,2186,114,99,5,206,1,59,2184,1,206,59,1,1048,111,116,59,1,304,114,59,1,8465,114,97,118,101,5,204,1,59,2207,1,204,4,3,59,97,112,2217,2219,2238,1,8465,4,2,99,103,2225,2229,114,59,1,298,105,110,97,114,121,73,59,1,8520,108,105,101,115,59,1,8658,4,2,116,118,2251,2281,4,2,59,101,2257,2259,1,8748,4,2,103,114,2265,2271,114,97,108,59,1,8747,115,101,99,116,105,111,110,59,1,8898,105,115,105,98,108,101,4,2,67,84,2293,2300,111,109,109,97,59,1,8291,105,109,101,115,59,1,8290,4,3,103,112,116,2315,2320,2325,111,110,59,1,302,102,59,3,55349,56640,97,59,1,921,99,114,59,1,8464,105,108,100,101,59,1,296,4,2,107,109,2347,2352,99,121,59,1,1030,108,5,207,1,59,2358,1,207,4,5,99,102,111,115,117,2372,2386,2391,2397,2414,4,2,105,121,2378,2383,114,99,59,1,308,59,1,1049,114,59,3,55349,56589,112,102,59,3,55349,56641,4,2,99,101,2403,2408,114,59,3,55349,56485,114,99,121,59,1,1032,107,99,121,59,1,1028,4,7,72,74,97,99,102,111,115,2436,2441,2446,2452,2467,2472,2478,99,121,59,1,1061,99,121,59,1,1036,112,112,97,59,1,922,4,2,101,121,2458,2464,100,105,108,59,1,310,59,1,1050,114,59,3,55349,56590,112,102,59,3,55349,56642,99,114,59,3,55349,56486,4,11,74,84,97,99,101,102,108,109,111,115,116,2508,2513,2520,2562,2585,2981,2986,3004,3011,3146,3167,99,121,59,1,1033,5,60,1,59,2518,1,60,4,5,99,109,110,112,114,2532,2538,2544,2548,2558,117,116,101,59,1,313,98,100,97,59,1,923,103,59,1,10218,108,97,99,101,116,114,102,59,1,8466,114,59,1,8606,4,3,97,101,121,2570,2576,2582,114,111,110,59,1,317,100,105,108,59,1,315,59,1,1051,4,2,102,115,2591,2907,116,4,10,65,67,68,70,82,84,85,86,97,114,2614,2663,2672,2728,2735,2760,2820,2870,2888,2895,4,2,110,114,2620,2633,103,108,101,66,114,97,99,107,101,116,59,1,10216,114,111,119,4,3,59,66,82,2644,2646,2651,1,8592,97,114,59,1,8676,105,103,104,116,65,114,114,111,119,59,1,8646,101,105,108,105,110,103,59,1,8968,111,4,2,117,119,2679,2692,98,108,101,66,114,97,99,107,101,116,59,1,10214,110,4,2,84,86,2699,2710,101,101,86,101,99,116,111,114,59,1,10593,101,99,116,111,114,4,2,59,66,2721,2723,1,8643,97,114,59,1,10585,108,111,111,114,59,1,8970,105,103,104,116,4,2,65,86,2745,2752,114,114,111,119,59,1,8596,101,99,116,111,114,59,1,10574,4,2,101,114,2766,2792,101,4,3,59,65,86,2775,2777,2784,1,8867,114,114,111,119,59,1,8612,101,99,116,111,114,59,1,10586,105,97,110,103,108,101,4,3,59,66,69,2806,2808,2813,1,8882,97,114,59,1,10703,113,117,97,108,59,1,8884,112,4,3,68,84,86,2829,2841,2852,111,119,110,86,101,99,116,111,114,59,1,10577,101,101,86,101,99,116,111,114,59,1,10592,101,99,116,111,114,4,2,59,66,2863,2865,1,8639,97,114,59,1,10584,101,99,116,111,114,4,2,59,66,2881,2883,1,8636,97,114,59,1,10578,114,114,111,119,59,1,8656,105,103,104,116,97,114,114,111,119,59,1,8660,115,4,6,69,70,71,76,83,84,2922,2936,2947,2956,2962,2974,113,117,97,108,71,114,101,97,116,101,114,59,1,8922,117,108,108,69,113,117,97,108,59,1,8806,114,101,97,116,101,114,59,1,8822,101,115,115,59,1,10913,108,97,110,116,69,113,117,97,108,59,1,10877,105,108,100,101,59,1,8818,114,59,3,55349,56591,4,2,59,101,2992,2994,1,8920,102,116,97,114,114,111,119,59,1,8666,105,100,111,116,59,1,319,4,3,110,112,119,3019,3110,3115,103,4,4,76,82,108,114,3030,3058,3070,3098,101,102,116,4,2,65,82,3039,3046,114,114,111,119,59,1,10229,105,103,104,116,65,114,114,111,119,59,1,10231,105,103,104,116,65,114,114,111,119,59,1,10230,101,102,116,4,2,97,114,3079,3086,114,114,111,119,59,1,10232,105,103,104,116,97,114,114,111,119,59,1,10234,105,103,104,116,97,114,114,111,119,59,1,10233,102,59,3,55349,56643,101,114,4,2,76,82,3123,3134,101,102,116,65,114,114,111,119,59,1,8601,105,103,104,116,65,114,114,111,119,59,1,8600,4,3,99,104,116,3154,3158,3161,114,59,1,8466,59,1,8624,114,111,107,59,1,321,59,1,8810,4,8,97,99,101,102,105,111,115,117,3188,3192,3196,3222,3227,3237,3243,3248,112,59,1,10501,121,59,1,1052,4,2,100,108,3202,3213,105,117,109,83,112,97,99,101,59,1,8287,108,105,110,116,114,102,59,1,8499,114,59,3,55349,56592,110,117,115,80,108,117,115,59,1,8723,112,102,59,3,55349,56644,99,114,59,1,8499,59,1,924,4,9,74,97,99,101,102,111,115,116,117,3271,3276,3283,3306,3422,3427,4120,4126,4137,99,121,59,1,1034,99,117,116,101,59,1,323,4,3,97,101,121,3291,3297,3303,114,111,110,59,1,327,100,105,108,59,1,325,59,1,1053,4,3,103,115,119,3314,3380,3415,97,116,105,118,101,4,3,77,84,86,3327,3340,3365,101,100,105,117,109,83,112,97,99,101,59,1,8203,104,105,4,2,99,110,3348,3357,107,83,112,97,99,101,59,1,8203,83,112,97,99,101,59,1,8203,101,114,121,84,104,105,110,83,112,97,99,101,59,1,8203,116,101,100,4,2,71,76,3389,3405,114,101,97,116,101,114,71,114,101,97,116,101,114,59,1,8811,101,115,115,76,101,115,115,59,1,8810,76,105,110,101,59,1,10,114,59,3,55349,56593,4,4,66,110,112,116,3437,3444,3460,3464,114,101,97,107,59,1,8288,66,114,101,97,107,105,110,103,83,112,97,99,101,59,1,160,102,59,1,8469,4,13,59,67,68,69,71,72,76,78,80,82,83,84,86,3492,3494,3517,3536,3578,3657,3685,3784,3823,3860,3915,4066,4107,1,10988,4,2,111,117,3500,3510,110,103,114,117,101,110,116,59,1,8802,112,67,97,112,59,1,8813,111,117,98,108,101,86,101,114,116,105,99,97,108,66,97,114,59,1,8742,4,3,108,113,120,3544,3552,3571,101,109,101,110,116,59,1,8713,117,97,108,4,2,59,84,3561,3563,1,8800,105,108,100,101,59,3,8770,824,105,115,116,115,59,1,8708,114,101,97,116,101,114,4,7,59,69,70,71,76,83,84,3600,3602,3609,3621,3631,3637,3650,1,8815,113,117,97,108,59,1,8817,117,108,108,69,113,117,97,108,59,3,8807,824,114,101,97,116,101,114,59,3,8811,824,101,115,115,59,1,8825,108,97,110,116,69,113,117,97,108,59,3,10878,824,105,108,100,101,59,1,8821,117,109,112,4,2,68,69,3666,3677,111,119,110,72,117,109,112,59,3,8782,824,113,117,97,108,59,3,8783,824,101,4,2,102,115,3692,3724,116,84,114,105,97,110,103,108,101,4,3,59,66,69,3709,3711,3717,1,8938,97,114,59,3,10703,824,113,117,97,108,59,1,8940,115,4,6,59,69,71,76,83,84,3739,3741,3748,3757,3764,3777,1,8814,113,117,97,108,59,1,8816,114,101,97,116,101,114,59,1,8824,101,115,115,59,3,8810,824,108,97,110,116,69,113,117,97,108,59,3,10877,824,105,108,100,101,59,1,8820,101,115,116,101,100,4,2,71,76,3795,3812,114,101,97,116,101,114,71,114,101,97,116,101,114,59,3,10914,824,101,115,115,76,101,115,115,59,3,10913,824,114,101,99,101,100,101,115,4,3,59,69,83,3838,3840,3848,1,8832,113,117,97,108,59,3,10927,824,108,97,110,116,69,113,117,97,108,59,1,8928,4,2,101,105,3866,3881,118,101,114,115,101,69,108,101,109,101,110,116,59,1,8716,103,104,116,84,114,105,97,110,103,108,101,4,3,59,66,69,3900,3902,3908,1,8939,97,114,59,3,10704,824,113,117,97,108,59,1,8941,4,2,113,117,3921,3973,117,97,114,101,83,117,4,2,98,112,3933,3952,115,101,116,4,2,59,69,3942,3945,3,8847,824,113,117,97,108,59,1,8930,101,114,115,101,116,4,2,59,69,3963,3966,3,8848,824,113,117,97,108,59,1,8931,4,3,98,99,112,3981,4000,4045,115,101,116,4,2,59,69,3990,3993,3,8834,8402,113,117,97,108,59,1,8840,99,101,101,100,115,4,4,59,69,83,84,4015,4017,4025,4037,1,8833,113,117,97,108,59,3,10928,824,108,97,110,116,69,113,117,97,108,59,1,8929,105,108,100,101,59,3,8831,824,101,114,115,101,116,4,2,59,69,4056,4059,3,8835,8402,113,117,97,108,59,1,8841,105,108,100,101,4,4,59,69,70,84,4080,4082,4089,4100,1,8769,113,117,97,108,59,1,8772,117,108,108,69,113,117,97,108,59,1,8775,105,108,100,101,59,1,8777,101,114,116,105,99,97,108,66,97,114,59,1,8740,99,114,59,3,55349,56489,105,108,100,101,5,209,1,59,4135,1,209,59,1,925,4,14,69,97,99,100,102,103,109,111,112,114,115,116,117,118,4170,4176,4187,4205,4212,4217,4228,4253,4259,4292,4295,4316,4337,4346,108,105,103,59,1,338,99,117,116,101,5,211,1,59,4185,1,211,4,2,105,121,4193,4202,114,99,5,212,1,59,4200,1,212,59,1,1054,98,108,97,99,59,1,336,114,59,3,55349,56594,114,97,118,101,5,210,1,59,4226,1,210,4,3,97,101,105,4236,4241,4246,99,114,59,1,332,103,97,59,1,937,99,114,111,110,59,1,927,112,102,59,3,55349,56646,101,110,67,117,114,108,121,4,2,68,81,4272,4285,111,117,98,108,101,81,117,111,116,101,59,1,8220,117,111,116,101,59,1,8216,59,1,10836,4,2,99,108,4301,4306,114,59,3,55349,56490,97,115,104,5,216,1,59,4314,1,216,105,4,2,108,109,4323,4332,100,101,5,213,1,59,4330,1,213,101,115,59,1,10807,109,108,5,214,1,59,4344,1,214,101,114,4,2,66,80,4354,4380,4,2,97,114,4360,4364,114,59,1,8254,97,99,4,2,101,107,4372,4375,59,1,9182,101,116,59,1,9140,97,114,101,110,116,104,101,115,105,115,59,1,9180,4,9,97,99,102,104,105,108,111,114,115,4413,4422,4426,4431,4435,4438,4448,4471,4561,114,116,105,97,108,68,59,1,8706,121,59,1,1055,114,59,3,55349,56595,105,59,1,934,59,1,928,117,115,77,105,110,117,115,59,1,177,4,2,105,112,4454,4467,110,99,97,114,101,112,108,97,110,101,59,1,8460,102,59,1,8473,4,4,59,101,105,111,4481,4483,4526,4531,1,10939,99,101,100,101,115,4,4,59,69,83,84,4498,4500,4507,4519,1,8826,113,117,97,108,59,1,10927,108,97,110,116,69,113,117,97,108,59,1,8828,105,108,100,101,59,1,8830,109,101,59,1,8243,4,2,100,112,4537,4543,117,99,116,59,1,8719,111,114,116,105,111,110,4,2,59,97,4555,4557,1,8759,108,59,1,8733,4,2,99,105,4567,4572,114,59,3,55349,56491,59,1,936,4,4,85,102,111,115,4585,4594,4599,4604,79,84,5,34,1,59,4592,1,34,114,59,3,55349,56596,112,102,59,1,8474,99,114,59,3,55349,56492,4,12,66,69,97,99,101,102,104,105,111,114,115,117,4636,4642,4650,4681,4704,4763,4767,4771,5047,5069,5081,5094,97,114,114,59,1,10512,71,5,174,1,59,4648,1,174,4,3,99,110,114,4658,4664,4668,117,116,101,59,1,340,103,59,1,10219,114,4,2,59,116,4675,4677,1,8608,108,59,1,10518,4,3,97,101,121,4689,4695,4701,114,111,110,59,1,344,100,105,108,59,1,342,59,1,1056,4,2,59,118,4710,4712,1,8476,101,114,115,101,4,2,69,85,4722,4748,4,2,108,113,4728,4736,101,109,101,110,116,59,1,8715,117,105,108,105,98,114,105,117,109,59,1,8651,112,69,113,117,105,108,105,98,114,105,117,109,59,1,10607,114,59,1,8476,111,59,1,929,103,104,116,4,8,65,67,68,70,84,85,86,97,4792,4840,4849,4905,4912,4972,5022,5040,4,2,110,114,4798,4811,103,108,101,66,114,97,99,107,101,116,59,1,10217,114,111,119,4,3,59,66,76,4822,4824,4829,1,8594,97,114,59,1,8677,101,102,116,65,114,114,111,119,59,1,8644,101,105,108,105,110,103,59,1,8969,111,4,2,117,119,4856,4869,98,108,101,66,114,97,99,107,101,116,59,1,10215,110,4,2,84,86,4876,4887,101,101,86,101,99,116,111,114,59,1,10589,101,99,116,111,114,4,2,59,66,4898,4900,1,8642,97,114,59,1,10581,108,111,111,114,59,1,8971,4,2,101,114,4918,4944,101,4,3,59,65,86,4927,4929,4936,1,8866,114,114,111,119,59,1,8614,101,99,116,111,114,59,1,10587,105,97,110,103,108,101,4,3,59,66,69,4958,4960,4965,1,8883,97,114,59,1,10704,113,117,97,108,59,1,8885,112,4,3,68,84,86,4981,4993,5004,111,119,110,86,101,99,116,111,114,59,1,10575,101,101,86,101,99,116,111,114,59,1,10588,101,99,116,111,114,4,2,59,66,5015,5017,1,8638,97,114,59,1,10580,101,99,116,111,114,4,2,59,66,5033,5035,1,8640,97,114,59,1,10579,114,114,111,119,59,1,8658,4,2,112,117,5053,5057,102,59,1,8477,110,100,73,109,112,108,105,101,115,59,1,10608,105,103,104,116,97,114,114,111,119,59,1,8667,4,2,99,104,5087,5091,114,59,1,8475,59,1,8625,108,101,68,101,108,97,121,101,100,59,1,10740,4,13,72,79,97,99,102,104,105,109,111,113,115,116,117,5134,5150,5157,5164,5198,5203,5259,5265,5277,5283,5374,5380,5385,4,2,67,99,5140,5146,72,99,121,59,1,1065,121,59,1,1064,70,84,99,121,59,1,1068,99,117,116,101,59,1,346,4,5,59,97,101,105,121,5176,5178,5184,5190,5195,1,10940,114,111,110,59,1,352,100,105,108,59,1,350,114,99,59,1,348,59,1,1057,114,59,3,55349,56598,111,114,116,4,4,68,76,82,85,5216,5227,5238,5250,111,119,110,65,114,114,111,119,59,1,8595,101,102,116,65,114,114,111,119,59,1,8592,105,103,104,116,65,114,114,111,119,59,1,8594,112,65,114,114,111,119,59,1,8593,103,109,97,59,1,931,97,108,108,67,105,114,99,108,101,59,1,8728,112,102,59,3,55349,56650,4,2,114,117,5289,5293,116,59,1,8730,97,114,101,4,4,59,73,83,85,5306,5308,5322,5367,1,9633,110,116,101,114,115,101,99,116,105,111,110,59,1,8851,117,4,2,98,112,5329,5347,115,101,116,4,2,59,69,5338,5340,1,8847,113,117,97,108,59,1,8849,101,114,115,101,116,4,2,59,69,5358,5360,1,8848,113,117,97,108,59,1,8850,110,105,111,110,59,1,8852,99,114,59,3,55349,56494,97,114,59,1,8902,4,4,98,99,109,112,5395,5420,5475,5478,4,2,59,115,5401,5403,1,8912,101,116,4,2,59,69,5411,5413,1,8912,113,117,97,108,59,1,8838,4,2,99,104,5426,5468,101,101,100,115,4,4,59,69,83,84,5440,5442,5449,5461,1,8827,113,117,97,108,59,1,10928,108,97,110,116,69,113,117,97,108,59,1,8829,105,108,100,101,59,1,8831,84,104,97,116,59,1,8715,59,1,8721,4,3,59,101,115,5486,5488,5507,1,8913,114,115,101,116,4,2,59,69,5498,5500,1,8835,113,117,97,108,59,1,8839,101,116,59,1,8913,4,11,72,82,83,97,99,102,104,105,111,114,115,5536,5546,5552,5567,5579,5602,5607,5655,5695,5701,5711,79,82,78,5,222,1,59,5544,1,222,65,68,69,59,1,8482,4,2,72,99,5558,5563,99,121,59,1,1035,121,59,1,1062,4,2,98,117,5573,5576,59,1,9,59,1,932,4,3,97,101,121,5587,5593,5599,114,111,110,59,1,356,100,105,108,59,1,354,59,1,1058,114,59,3,55349,56599,4,2,101,105,5613,5631,4,2,114,116,5619,5627,101,102,111,114,101,59,1,8756,97,59,1,920,4,2,99,110,5637,5647,107,83,112,97,99,101,59,3,8287,8202,83,112,97,99,101,59,1,8201,108,100,101,4,4,59,69,70,84,5668,5670,5677,5688,1,8764,113,117,97,108,59,1,8771,117,108,108,69,113,117,97,108,59,1,8773,105,108,100,101,59,1,8776,112,102,59,3,55349,56651,105,112,108,101,68,111,116,59,1,8411,4,2,99,116,5717,5722,114,59,3,55349,56495,114,111,107,59,1,358,4,14,97,98,99,100,102,103,109,110,111,112,114,115,116,117,5758,5789,5805,5823,5830,5835,5846,5852,5921,5937,6089,6095,6101,6108,4,2,99,114,5764,5774,117,116,101,5,218,1,59,5772,1,218,114,4,2,59,111,5781,5783,1,8607,99,105,114,59,1,10569,114,4,2,99,101,5796,5800,121,59,1,1038,118,101,59,1,364,4,2,105,121,5811,5820,114,99,5,219,1,59,5818,1,219,59,1,1059,98,108,97,99,59,1,368,114,59,3,55349,56600,114,97,118,101,5,217,1,59,5844,1,217,97,99,114,59,1,362,4,2,100,105,5858,5905,101,114,4,2,66,80,5866,5892,4,2,97,114,5872,5876,114,59,1,95,97,99,4,2,101,107,5884,5887,59,1,9183,101,116,59,1,9141,97,114,101,110,116,104,101,115,105,115,59,1,9181,111,110,4,2,59,80,5913,5915,1,8899,108,117,115,59,1,8846,4,2,103,112,5927,5932,111,110,59,1,370,102,59,3,55349,56652,4,8,65,68,69,84,97,100,112,115,5955,5985,5996,6009,6026,6033,6044,6075,114,114,111,119,4,3,59,66,68,5967,5969,5974,1,8593,97,114,59,1,10514,111,119,110,65,114,114,111,119,59,1,8645,111,119,110,65,114,114,111,119,59,1,8597,113,117,105,108,105,98,114,105,117,109,59,1,10606,101,101,4,2,59,65,6017,6019,1,8869,114,114,111,119,59,1,8613,114,114,111,119,59,1,8657,111,119,110,97,114,114,111,119,59,1,8661,101,114,4,2,76,82,6052,6063,101,102,116,65,114,114,111,119,59,1,8598,105,103,104,116,65,114,114,111,119,59,1,8599,105,4,2,59,108,6082,6084,1,978,111,110,59,1,933,105,110,103,59,1,366,99,114,59,3,55349,56496,105,108,100,101,59,1,360,109,108,5,220,1,59,6115,1,220,4,9,68,98,99,100,101,102,111,115,118,6137,6143,6148,6152,6166,6250,6255,6261,6267,97,115,104,59,1,8875,97,114,59,1,10987,121,59,1,1042,97,115,104,4,2,59,108,6161,6163,1,8873,59,1,10982,4,2,101,114,6172,6175,59,1,8897,4,3,98,116,121,6183,6188,6238,97,114,59,1,8214,4,2,59,105,6194,6196,1,8214,99,97,108,4,4,66,76,83,84,6209,6214,6220,6231,97,114,59,1,8739,105,110,101,59,1,124,101,112,97,114,97,116,111,114,59,1,10072,105,108,100,101,59,1,8768,84,104,105,110,83,112,97,99,101,59,1,8202,114,59,3,55349,56601,112,102,59,3,55349,56653,99,114,59,3,55349,56497,100,97,115,104,59,1,8874,4,5,99,101,102,111,115,6286,6292,6298,6303,6309,105,114,99,59,1,372,100,103,101,59,1,8896,114,59,3,55349,56602,112,102,59,3,55349,56654,99,114,59,3,55349,56498,4,4,102,105,111,115,6325,6330,6333,6339,114,59,3,55349,56603,59,1,926,112,102,59,3,55349,56655,99,114,59,3,55349,56499,4,9,65,73,85,97,99,102,111,115,117,6365,6370,6375,6380,6391,6405,6410,6416,6422,99,121,59,1,1071,99,121,59,1,1031,99,121,59,1,1070,99,117,116,101,5,221,1,59,6389,1,221,4,2,105,121,6397,6402,114,99,59,1,374,59,1,1067,114,59,3,55349,56604,112,102,59,3,55349,56656,99,114,59,3,55349,56500,109,108,59,1,376,4,8,72,97,99,100,101,102,111,115,6445,6450,6457,6472,6477,6501,6505,6510,99,121,59,1,1046,99,117,116,101,59,1,377,4,2,97,121,6463,6469,114,111,110,59,1,381,59,1,1047,111,116,59,1,379,4,2,114,116,6483,6497,111,87,105,100,116,104,83,112,97,99,101,59,1,8203,97,59,1,918,114,59,1,8488,112,102,59,1,8484,99,114,59,3,55349,56501,4,16,97,98,99,101,102,103,108,109,110,111,112,114,115,116,117,119,6550,6561,6568,6612,6622,6634,6645,6672,6699,6854,6870,6923,6933,6963,6974,6983,99,117,116,101,5,225,1,59,6559,1,225,114,101,118,101,59,1,259,4,6,59,69,100,105,117,121,6582,6584,6588,6591,6600,6609,1,8766,59,3,8766,819,59,1,8767,114,99,5,226,1,59,6598,1,226,116,101,5,180,1,59,6607,1,180,59,1,1072,108,105,103,5,230,1,59,6620,1,230,4,2,59,114,6628,6630,1,8289,59,3,55349,56606,114,97,118,101,5,224,1,59,6643,1,224,4,2,101,112,6651,6667,4,2,102,112,6657,6663,115,121,109,59,1,8501,104,59,1,8501,104,97,59,1,945,4,2,97,112,6678,6692,4,2,99,108,6684,6688,114,59,1,257,103,59,1,10815,5,38,1,59,6697,1,38,4,2,100,103,6705,6737,4,5,59,97,100,115,118,6717,6719,6724,6727,6734,1,8743,110,100,59,1,10837,59,1,10844,108,111,112,101,59,1,10840,59,1,10842,4,7,59,101,108,109,114,115,122,6753,6755,6758,6762,6814,6835,6848,1,8736,59,1,10660,101,59,1,8736,115,100,4,2,59,97,6770,6772,1,8737,4,8,97,98,99,100,101,102,103,104,6790,6793,6796,6799,6802,6805,6808,6811,59,1,10664,59,1,10665,59,1,10666,59,1,10667,59,1,10668,59,1,10669,59,1,10670,59,1,10671,116,4,2,59,118,6821,6823,1,8735,98,4,2,59,100,6830,6832,1,8894,59,1,10653,4,2,112,116,6841,6845,104,59,1,8738,59,1,197,97,114,114,59,1,9084,4,2,103,112,6860,6865,111,110,59,1,261,102,59,3,55349,56658,4,7,59,69,97,101,105,111,112,6886,6888,6891,6897,6900,6904,6908,1,8776,59,1,10864,99,105,114,59,1,10863,59,1,8778,100,59,1,8779,115,59,1,39,114,111,120,4,2,59,101,6917,6919,1,8776,113,59,1,8778,105,110,103,5,229,1,59,6931,1,229,4,3,99,116,121,6941,6946,6949,114,59,3,55349,56502,59,1,42,109,112,4,2,59,101,6957,6959,1,8776,113,59,1,8781,105,108,100,101,5,227,1,59,6972,1,227,109,108,5,228,1,59,6981,1,228,4,2,99,105,6989,6997,111,110,105,110,116,59,1,8755,110,116,59,1,10769,4,16,78,97,98,99,100,101,102,105,107,108,110,111,112,114,115,117,7036,7041,7119,7135,7149,7155,7219,7224,7347,7354,7463,7489,7786,7793,7814,7866,111,116,59,1,10989,4,2,99,114,7047,7094,107,4,4,99,101,112,115,7058,7064,7073,7080,111,110,103,59,1,8780,112,115,105,108,111,110,59,1,1014,114,105,109,101,59,1,8245,105,109,4,2,59,101,7088,7090,1,8765,113,59,1,8909,4,2,118,119,7100,7105,101,101,59,1,8893,101,100,4,2,59,103,7113,7115,1,8965,101,59,1,8965,114,107,4,2,59,116,7127,7129,1,9141,98,114,107,59,1,9142,4,2,111,121,7141,7146,110,103,59,1,8780,59,1,1073,113,117,111,59,1,8222,4,5,99,109,112,114,116,7167,7181,7188,7193,7199,97,117,115,4,2,59,101,7176,7178,1,8757,59,1,8757,112,116,121,118,59,1,10672,115,105,59,1,1014,110,111,117,59,1,8492,4,3,97,104,119,7207,7210,7213,59,1,946,59,1,8502,101,101,110,59,1,8812,114,59,3,55349,56607,103,4,7,99,111,115,116,117,118,119,7241,7262,7288,7305,7328,7335,7340,4,3,97,105,117,7249,7253,7258,112,59,1,8898,114,99,59,1,9711,112,59,1,8899,4,3,100,112,116,7270,7275,7281,111,116,59,1,10752,108,117,115,59,1,10753,105,109,101,115,59,1,10754,4,2,113,116,7294,7300,99,117,112,59,1,10758,97,114,59,1,9733,114,105,97,110,103,108,101,4,2,100,117,7318,7324,111,119,110,59,1,9661,112,59,1,9651,112,108,117,115,59,1,10756,101,101,59,1,8897,101,100,103,101,59,1,8896,97,114,111,119,59,1,10509,4,3,97,107,111,7362,7436,7458,4,2,99,110,7368,7432,107,4,3,108,115,116,7377,7386,7394,111,122,101,110,103,101,59,1,10731,113,117,97,114,101,59,1,9642,114,105,97,110,103,108,101,4,4,59,100,108,114,7411,7413,7419,7425,1,9652,111,119,110,59,1,9662,101,102,116,59,1,9666,105,103,104,116,59,1,9656,107,59,1,9251,4,2,49,51,7442,7454,4,2,50,52,7448,7451,59,1,9618,59,1,9617,52,59,1,9619,99,107,59,1,9608,4,2,101,111,7469,7485,4,2,59,113,7475,7478,3,61,8421,117,105,118,59,3,8801,8421,116,59,1,8976,4,4,112,116,119,120,7499,7504,7517,7523,102,59,3,55349,56659,4,2,59,116,7510,7512,1,8869,111,109,59,1,8869,116,105,101,59,1,8904,4,12,68,72,85,86,98,100,104,109,112,116,117,118,7549,7571,7597,7619,7655,7660,7682,7708,7715,7721,7728,7750,4,4,76,82,108,114,7559,7562,7565,7568,59,1,9559,59,1,9556,59,1,9558,59,1,9555,4,5,59,68,85,100,117,7583,7585,7588,7591,7594,1,9552,59,1,9574,59,1,9577,59,1,9572,59,1,9575,4,4,76,82,108,114,7607,7610,7613,7616,59,1,9565,59,1,9562,59,1,9564,59,1,9561,4,7,59,72,76,82,104,108,114,7635,7637,7640,7643,7646,7649,7652,1,9553,59,1,9580,59,1,9571,59,1,9568,59,1,9579,59,1,9570,59,1,9567,111,120,59,1,10697,4,4,76,82,108,114,7670,7673,7676,7679,59,1,9557,59,1,9554,59,1,9488,59,1,9484,4,5,59,68,85,100,117,7694,7696,7699,7702,7705,1,9472,59,1,9573,59,1,9576,59,1,9516,59,1,9524,105,110,117,115,59,1,8863,108,117,115,59,1,8862,105,109,101,115,59,1,8864,4,4,76,82,108,114,7738,7741,7744,7747,59,1,9563,59,1,9560,59,1,9496,59,1,9492,4,7,59,72,76,82,104,108,114,7766,7768,7771,7774,7777,7780,7783,1,9474,59,1,9578,59,1,9569,59,1,9566,59,1,9532,59,1,9508,59,1,9500,114,105,109,101,59,1,8245,4,2,101,118,7799,7804,118,101,59,1,728,98,97,114,5,166,1,59,7812,1,166,4,4,99,101,105,111,7824,7829,7834,7846,114,59,3,55349,56503,109,105,59,1,8271,109,4,2,59,101,7841,7843,1,8765,59,1,8909,108,4,3,59,98,104,7855,7857,7860,1,92,59,1,10693,115,117,98,59,1,10184,4,2,108,109,7872,7885,108,4,2,59,101,7879,7881,1,8226,116,59,1,8226,112,4,3,59,69,101,7894,7896,7899,1,8782,59,1,10926,4,2,59,113,7905,7907,1,8783,59,1,8783,4,15,97,99,100,101,102,104,105,108,111,114,115,116,117,119,121,7942,8021,8075,8080,8121,8126,8157,8279,8295,8430,8446,8485,8491,8707,8726,4,3,99,112,114,7950,7956,8007,117,116,101,59,1,263,4,6,59,97,98,99,100,115,7970,7972,7977,7984,7998,8003,1,8745,110,100,59,1,10820,114,99,117,112,59,1,10825,4,2,97,117,7990,7994,112,59,1,10827,112,59,1,10823,111,116,59,1,10816,59,3,8745,65024,4,2,101,111,8013,8017,116,59,1,8257,110,59,1,711,4,4,97,101,105,117,8031,8046,8056,8061,4,2,112,114,8037,8041,115,59,1,10829,111,110,59,1,269,100,105,108,5,231,1,59,8054,1,231,114,99,59,1,265,112,115,4,2,59,115,8069,8071,1,10828,109,59,1,10832,111,116,59,1,267,4,3,100,109,110,8088,8097,8104,105,108,5,184,1,59,8095,1,184,112,116,121,118,59,1,10674,116,5,162,2,59,101,8112,8114,1,162,114,100,111,116,59,1,183,114,59,3,55349,56608,4,3,99,101,105,8134,8138,8154,121,59,1,1095,99,107,4,2,59,109,8146,8148,1,10003,97,114,107,59,1,10003,59,1,967,114,4,7,59,69,99,101,102,109,115,8174,8176,8179,8258,8261,8268,8273,1,9675,59,1,10691,4,3,59,101,108,8187,8189,8193,1,710,113,59,1,8791,101,4,2,97,100,8200,8223,114,114,111,119,4,2,108,114,8210,8216,101,102,116,59,1,8634,105,103,104,116,59,1,8635,4,5,82,83,97,99,100,8235,8238,8241,8246,8252,59,1,174,59,1,9416,115,116,59,1,8859,105,114,99,59,1,8858,97,115,104,59,1,8861,59,1,8791,110,105,110,116,59,1,10768,105,100,59,1,10991,99,105,114,59,1,10690,117,98,115,4,2,59,117,8288,8290,1,9827,105,116,59,1,9827,4,4,108,109,110,112,8305,8326,8376,8400,111,110,4,2,59,101,8313,8315,1,58,4,2,59,113,8321,8323,1,8788,59,1,8788,4,2,109,112,8332,8344,97,4,2,59,116,8339,8341,1,44,59,1,64,4,3,59,102,108,8352,8354,8358,1,8705,110,59,1,8728,101,4,2,109,120,8365,8371,101,110,116,59,1,8705,101,115,59,1,8450,4,2,103,105,8382,8395,4,2,59,100,8388,8390,1,8773,111,116,59,1,10861,110,116,59,1,8750,4,3,102,114,121,8408,8412,8417,59,3,55349,56660,111,100,59,1,8720,5,169,2,59,115,8424,8426,1,169,114,59,1,8471,4,2,97,111,8436,8441,114,114,59,1,8629,115,115,59,1,10007,4,2,99,117,8452,8457,114,59,3,55349,56504,4,2,98,112,8463,8474,4,2,59,101,8469,8471,1,10959,59,1,10961,4,2,59,101,8480,8482,1,10960,59,1,10962,100,111,116,59,1,8943,4,7,100,101,108,112,114,118,119,8507,8522,8536,8550,8600,8697,8702,97,114,114,4,2,108,114,8516,8519,59,1,10552,59,1,10549,4,2,112,115,8528,8532,114,59,1,8926,99,59,1,8927,97,114,114,4,2,59,112,8545,8547,1,8630,59,1,10557,4,6,59,98,99,100,111,115,8564,8566,8573,8587,8592,8596,1,8746,114,99,97,112,59,1,10824,4,2,97,117,8579,8583,112,59,1,10822,112,59,1,10826,111,116,59,1,8845,114,59,1,10821,59,3,8746,65024,4,4,97,108,114,118,8610,8623,8663,8672,114,114,4,2,59,109,8618,8620,1,8631,59,1,10556,121,4,3,101,118,119,8632,8651,8656,113,4,2,112,115,8639,8645,114,101,99,59,1,8926,117,99,99,59,1,8927,101,101,59,1,8910,101,100,103,101,59,1,8911,101,110,5,164,1,59,8670,1,164,101,97,114,114,111,119,4,2,108,114,8684,8690,101,102,116,59,1,8630,105,103,104,116,59,1,8631,101,101,59,1,8910,101,100,59,1,8911,4,2,99,105,8713,8721,111,110,105,110,116,59,1,8754,110,116,59,1,8753,108,99,116,121,59,1,9005,4,19,65,72,97,98,99,100,101,102,104,105,106,108,111,114,115,116,117,119,122,8773,8778,8783,8821,8839,8854,8887,8914,8930,8944,9036,9041,9058,9197,9227,9258,9281,9297,9305,114,114,59,1,8659,97,114,59,1,10597,4,4,103,108,114,115,8793,8799,8805,8809,103,101,114,59,1,8224,101,116,104,59,1,8504,114,59,1,8595,104,4,2,59,118,8816,8818,1,8208,59,1,8867,4,2,107,108,8827,8834,97,114,111,119,59,1,10511,97,99,59,1,733,4,2,97,121,8845,8851,114,111,110,59,1,271,59,1,1076,4,3,59,97,111,8862,8864,8880,1,8518,4,2,103,114,8870,8876,103,101,114,59,1,8225,114,59,1,8650,116,115,101,113,59,1,10871,4,3,103,108,109,8895,8902,8907,5,176,1,59,8900,1,176,116,97,59,1,948,112,116,121,118,59,1,10673,4,2,105,114,8920,8926,115,104,116,59,1,10623,59,3,55349,56609,97,114,4,2,108,114,8938,8941,59,1,8643,59,1,8642,4,5,97,101,103,115,118,8956,8986,8989,8996,9001,109,4,3,59,111,115,8965,8967,8983,1,8900,110,100,4,2,59,115,8975,8977,1,8900,117,105,116,59,1,9830,59,1,9830,59,1,168,97,109,109,97,59,1,989,105,110,59,1,8946,4,3,59,105,111,9009,9011,9031,1,247,100,101,5,247,2,59,111,9020,9022,1,247,110,116,105,109,101,115,59,1,8903,110,120,59,1,8903,99,121,59,1,1106,99,4,2,111,114,9048,9053,114,110,59,1,8990,111,112,59,1,8973,4,5,108,112,116,117,119,9070,9076,9081,9130,9144,108,97,114,59,1,36,102,59,3,55349,56661,4,5,59,101,109,112,115,9093,9095,9109,9116,9122,1,729,113,4,2,59,100,9102,9104,1,8784,111,116,59,1,8785,105,110,117,115,59,1,8760,108,117,115,59,1,8724,113,117,97,114,101,59,1,8865,98,108,101,98,97,114,119,101,100,103,101,59,1,8966,110,4,3,97,100,104,9153,9160,9172,114,114,111,119,59,1,8595,111,119,110,97,114,114,111,119,115,59,1,8650,97,114,112,111,111,110,4,2,108,114,9184,9190,101,102,116,59,1,8643,105,103,104,116,59,1,8642,4,2,98,99,9203,9211,107,97,114,111,119,59,1,10512,4,2,111,114,9217,9222,114,110,59,1,8991,111,112,59,1,8972,4,3,99,111,116,9235,9248,9252,4,2,114,121,9241,9245,59,3,55349,56505,59,1,1109,108,59,1,10742,114,111,107,59,1,273,4,2,100,114,9264,9269,111,116,59,1,8945,105,4,2,59,102,9276,9278,1,9663,59,1,9662,4,2,97,104,9287,9292,114,114,59,1,8693,97,114,59,1,10607,97,110,103,108,101,59,1,10662,4,2,99,105,9311,9315,121,59,1,1119,103,114,97,114,114,59,1,10239,4,18,68,97,99,100,101,102,103,108,109,110,111,112,113,114,115,116,117,120,9361,9376,9398,9439,9444,9447,9462,9495,9531,9585,9598,9614,9659,9755,9771,9792,9808,9826,4,2,68,111,9367,9372,111,116,59,1,10871,116,59,1,8785,4,2,99,115,9382,9392,117,116,101,5,233,1,59,9390,1,233,116,101,114,59,1,10862,4,4,97,105,111,121,9408,9414,9430,9436,114,111,110,59,1,283,114,4,2,59,99,9421,9423,1,8790,5,234,1,59,9428,1,234,108,111,110,59,1,8789,59,1,1101,111,116,59,1,279,59,1,8519,4,2,68,114,9453,9458,111,116,59,1,8786,59,3,55349,56610,4,3,59,114,115,9470,9472,9482,1,10906,97,118,101,5,232,1,59,9480,1,232,4,2,59,100,9488,9490,1,10902,111,116,59,1,10904,4,4,59,105,108,115,9505,9507,9515,9518,1,10905,110,116,101,114,115,59,1,9191,59,1,8467,4,2,59,100,9524,9526,1,10901,111,116,59,1,10903,4,3,97,112,115,9539,9544,9564,99,114,59,1,275,116,121,4,3,59,115,118,9554,9556,9561,1,8709,101,116,59,1,8709,59,1,8709,112,4,2,49,59,9571,9583,4,2,51,52,9577,9580,59,1,8196,59,1,8197,1,8195,4,2,103,115,9591,9594,59,1,331,112,59,1,8194,4,2,103,112,9604,9609,111,110,59,1,281,102,59,3,55349,56662,4,3,97,108,115,9622,9635,9640,114,4,2,59,115,9629,9631,1,8917,108,59,1,10723,117,115,59,1,10865,105,4,3,59,108,118,9649,9651,9656,1,949,111,110,59,1,949,59,1,1013,4,4,99,115,117,118,9669,9686,9716,9747,4,2,105,111,9675,9680,114,99,59,1,8790,108,111,110,59,1,8789,4,2,105,108,9692,9696,109,59,1,8770,97,110,116,4,2,103,108,9705,9710,116,114,59,1,10902,101,115,115,59,1,10901,4,3,97,101,105,9724,9729,9734,108,115,59,1,61,115,116,59,1,8799,118,4,2,59,68,9741,9743,1,8801,68,59,1,10872,112,97,114,115,108,59,1,10725,4,2,68,97,9761,9766,111,116,59,1,8787,114,114,59,1,10609,4,3,99,100,105,9779,9783,9788,114,59,1,8495,111,116,59,1,8784,109,59,1,8770,4,2,97,104,9798,9801,59,1,951,5,240,1,59,9806,1,240,4,2,109,114,9814,9822,108,5,235,1,59,9820,1,235,111,59,1,8364,4,3,99,105,112,9834,9838,9843,108,59,1,33,115,116,59,1,8707,4,2,101,111,9849,9859,99,116,97,116,105,111,110,59,1,8496,110,101,110,116,105,97,108,101,59,1,8519,4,12,97,99,101,102,105,106,108,110,111,112,114,115,9896,9910,9914,9921,9954,9960,9967,9989,9994,10027,10036,10164,108,108,105,110,103,100,111,116,115,101,113,59,1,8786,121,59,1,1092,109,97,108,101,59,1,9792,4,3,105,108,114,9929,9935,9950,108,105,103,59,1,64259,4,2,105,108,9941,9945,103,59,1,64256,105,103,59,1,64260,59,3,55349,56611,108,105,103,59,1,64257,108,105,103,59,3,102,106,4,3,97,108,116,9975,9979,9984,116,59,1,9837,105,103,59,1,64258,110,115,59,1,9649,111,102,59,1,402,4,2,112,114,10000,10005,102,59,3,55349,56663,4,2,97,107,10011,10016,108,108,59,1,8704,4,2,59,118,10022,10024,1,8916,59,1,10969,97,114,116,105,110,116,59,1,10765,4,2,97,111,10042,10159,4,2,99,115,10048,10155,4,6,49,50,51,52,53,55,10062,10102,10114,10135,10139,10151,4,6,50,51,52,53,54,56,10076,10083,10086,10093,10096,10099,5,189,1,59,10081,1,189,59,1,8531,5,188,1,59,10091,1,188,59,1,8533,59,1,8537,59,1,8539,4,2,51,53,10108,10111,59,1,8532,59,1,8534,4,3,52,53,56,10122,10129,10132,5,190,1,59,10127,1,190,59,1,8535,59,1,8540,53,59,1,8536,4,2,54,56,10145,10148,59,1,8538,59,1,8541,56,59,1,8542,108,59,1,8260,119,110,59,1,8994,99,114,59,3,55349,56507,4,17,69,97,98,99,100,101,102,103,105,106,108,110,111,114,115,116,118,10206,10217,10247,10254,10268,10273,10358,10363,10374,10380,10385,10406,10458,10464,10470,10497,10610,4,2,59,108,10212,10214,1,8807,59,1,10892,4,3,99,109,112,10225,10231,10244,117,116,101,59,1,501,109,97,4,2,59,100,10239,10241,1,947,59,1,989,59,1,10886,114,101,118,101,59,1,287,4,2,105,121,10260,10265,114,99,59,1,285,59,1,1075,111,116,59,1,289,4,4,59,108,113,115,10283,10285,10288,10308,1,8805,59,1,8923,4,3,59,113,115,10296,10298,10301,1,8805,59,1,8807,108,97,110,116,59,1,10878,4,4,59,99,100,108,10318,10320,10324,10345,1,10878,99,59,1,10921,111,116,4,2,59,111,10332,10334,1,10880,4,2,59,108,10340,10342,1,10882,59,1,10884,4,2,59,101,10351,10354,3,8923,65024,115,59,1,10900,114,59,3,55349,56612,4,2,59,103,10369,10371,1,8811,59,1,8921,109,101,108,59,1,8503,99,121,59,1,1107,4,4,59,69,97,106,10395,10397,10400,10403,1,8823,59,1,10898,59,1,10917,59,1,10916,4,4,69,97,101,115,10416,10419,10434,10453,59,1,8809,112,4,2,59,112,10426,10428,1,10890,114,111,120,59,1,10890,4,2,59,113,10440,10442,1,10888,4,2,59,113,10448,10450,1,10888,59,1,8809,105,109,59,1,8935,112,102,59,3,55349,56664,97,118,101,59,1,96,4,2,99,105,10476,10480,114,59,1,8458,109,4,3,59,101,108,10489,10491,10494,1,8819,59,1,10894,59,1,10896,5,62,6,59,99,100,108,113,114,10512,10514,10527,10532,10538,10545,1,62,4,2,99,105,10520,10523,59,1,10919,114,59,1,10874,111,116,59,1,8919,80,97,114,59,1,10645,117,101,115,116,59,1,10876,4,5,97,100,101,108,115,10557,10574,10579,10599,10605,4,2,112,114,10563,10570,112,114,111,120,59,1,10886,114,59,1,10616,111,116,59,1,8919,113,4,2,108,113,10586,10592,101,115,115,59,1,8923,108,101,115,115,59,1,10892,101,115,115,59,1,8823,105,109,59,1,8819,4,2,101,110,10616,10626,114,116,110,101,113,113,59,3,8809,65024,69,59,3,8809,65024,4,10,65,97,98,99,101,102,107,111,115,121,10653,10658,10713,10718,10724,10760,10765,10786,10850,10875,114,114,59,1,8660,4,4,105,108,109,114,10668,10674,10678,10684,114,115,112,59,1,8202,102,59,1,189,105,108,116,59,1,8459,4,2,100,114,10690,10695,99,121,59,1,1098,4,3,59,99,119,10703,10705,10710,1,8596,105,114,59,1,10568,59,1,8621,97,114,59,1,8463,105,114,99,59,1,293,4,3,97,108,114,10732,10748,10754,114,116,115,4,2,59,117,10741,10743,1,9829,105,116,59,1,9829,108,105,112,59,1,8230,99,111,110,59,1,8889,114,59,3,55349,56613,115,4,2,101,119,10772,10779,97,114,111,119,59,1,10533,97,114,111,119,59,1,10534,4,5,97,109,111,112,114,10798,10803,10809,10839,10844,114,114,59,1,8703,116,104,116,59,1,8763,107,4,2,108,114,10816,10827,101,102,116,97,114,114,111,119,59,1,8617,105,103,104,116,97,114,114,111,119,59,1,8618,102,59,3,55349,56665,98,97,114,59,1,8213,4,3,99,108,116,10858,10863,10869,114,59,3,55349,56509,97,115,104,59,1,8463,114,111,107,59,1,295,4,2,98,112,10881,10887,117,108,108,59,1,8259,104,101,110,59,1,8208,4,15,97,99,101,102,103,105,106,109,110,111,112,113,115,116,117,10925,10936,10958,10977,10990,11001,11039,11045,11101,11192,11220,11226,11237,11285,11299,99,117,116,101,5,237,1,59,10934,1,237,4,3,59,105,121,10944,10946,10955,1,8291,114,99,5,238,1,59,10953,1,238,59,1,1080,4,2,99,120,10964,10968,121,59,1,1077,99,108,5,161,1,59,10975,1,161,4,2,102,114,10983,10986,59,1,8660,59,3,55349,56614,114,97,118,101,5,236,1,59,10999,1,236,4,4,59,105,110,111,11011,11013,11028,11034,1,8520,4,2,105,110,11019,11024,110,116,59,1,10764,116,59,1,8749,102,105,110,59,1,10716,116,97,59,1,8489,108,105,103,59,1,307,4,3,97,111,112,11053,11092,11096,4,3,99,103,116,11061,11065,11088,114,59,1,299,4,3,101,108,112,11073,11076,11082,59,1,8465,105,110,101,59,1,8464,97,114,116,59,1,8465,104,59,1,305,102,59,1,8887,101,100,59,1,437,4,5,59,99,102,111,116,11113,11115,11121,11136,11142,1,8712,97,114,101,59,1,8453,105,110,4,2,59,116,11129,11131,1,8734,105,101,59,1,10717,100,111,116,59,1,305,4,5,59,99,101,108,112,11154,11156,11161,11179,11186,1,8747,97,108,59,1,8890,4,2,103,114,11167,11173,101,114,115,59,1,8484,99,97,108,59,1,8890,97,114,104,107,59,1,10775,114,111,100,59,1,10812,4,4,99,103,112,116,11202,11206,11211,11216,121,59,1,1105,111,110,59,1,303,102,59,3,55349,56666,97,59,1,953,114,111,100,59,1,10812,117,101,115,116,5,191,1,59,11235,1,191,4,2,99,105,11243,11248,114,59,3,55349,56510,110,4,5,59,69,100,115,118,11261,11263,11266,11271,11282,1,8712,59,1,8953,111,116,59,1,8949,4,2,59,118,11277,11279,1,8948,59,1,8947,59,1,8712,4,2,59,105,11291,11293,1,8290,108,100,101,59,1,297,4,2,107,109,11305,11310,99,121,59,1,1110,108,5,239,1,59,11316,1,239,4,6,99,102,109,111,115,117,11332,11346,11351,11357,11363,11380,4,2,105,121,11338,11343,114,99,59,1,309,59,1,1081,114,59,3,55349,56615,97,116,104,59,1,567,112,102,59,3,55349,56667,4,2,99,101,11369,11374,114,59,3,55349,56511,114,99,121,59,1,1112,107,99,121,59,1,1108,4,8,97,99,102,103,104,106,111,115,11404,11418,11433,11438,11445,11450,11455,11461,112,112,97,4,2,59,118,11413,11415,1,954,59,1,1008,4,2,101,121,11424,11430,100,105,108,59,1,311,59,1,1082,114,59,3,55349,56616,114,101,101,110,59,1,312,99,121,59,1,1093,99,121,59,1,1116,112,102,59,3,55349,56668,99,114,59,3,55349,56512,4,23,65,66,69,72,97,98,99,100,101,102,103,104,106,108,109,110,111,112,114,115,116,117,118,11515,11538,11544,11555,11560,11721,11780,11818,11868,12136,12160,12171,12203,12208,12246,12275,12327,12509,12523,12569,12641,12732,12752,4,3,97,114,116,11523,11528,11532,114,114,59,1,8666,114,59,1,8656,97,105,108,59,1,10523,97,114,114,59,1,10510,4,2,59,103,11550,11552,1,8806,59,1,10891,97,114,59,1,10594,4,9,99,101,103,109,110,112,113,114,116,11580,11586,11594,11600,11606,11624,11627,11636,11694,117,116,101,59,1,314,109,112,116,121,118,59,1,10676,114,97,110,59,1,8466,98,100,97,59,1,955,103,4,3,59,100,108,11615,11617,11620,1,10216,59,1,10641,101,59,1,10216,59,1,10885,117,111,5,171,1,59,11634,1,171,114,4,8,59,98,102,104,108,112,115,116,11655,11657,11669,11673,11677,11681,11685,11690,1,8592,4,2,59,102,11663,11665,1,8676,115,59,1,10527,115,59,1,10525,107,59,1,8617,112,59,1,8619,108,59,1,10553,105,109,59,1,10611,108,59,1,8610,4,3,59,97,101,11702,11704,11709,1,10923,105,108,59,1,10521,4,2,59,115,11715,11717,1,10925,59,3,10925,65024,4,3,97,98,114,11729,11734,11739,114,114,59,1,10508,114,107,59,1,10098,4,2,97,107,11745,11758,99,4,2,101,107,11752,11755,59,1,123,59,1,91,4,2,101,115,11764,11767,59,1,10635,108,4,2,100,117,11774,11777,59,1,10639,59,1,10637,4,4,97,101,117,121,11790,11796,11811,11815,114,111,110,59,1,318,4,2,100,105,11802,11807,105,108,59,1,316,108,59,1,8968,98,59,1,123,59,1,1083,4,4,99,113,114,115,11828,11832,11845,11864,97,59,1,10550,117,111,4,2,59,114,11840,11842,1,8220,59,1,8222,4,2,100,117,11851,11857,104,97,114,59,1,10599,115,104,97,114,59,1,10571,104,59,1,8626,4,5,59,102,103,113,115,11880,11882,12008,12011,12031,1,8804,116,4,5,97,104,108,114,116,11895,11913,11935,11947,11996,114,114,111,119,4,2,59,116,11905,11907,1,8592,97,105,108,59,1,8610,97,114,112,111,111,110,4,2,100,117,11925,11931,111,119,110,59,1,8637,112,59,1,8636,101,102,116,97,114,114,111,119,115,59,1,8647,105,103,104,116,4,3,97,104,115,11959,11974,11984,114,114,111,119,4,2,59,115,11969,11971,1,8596,59,1,8646,97,114,112,111,111,110,115,59,1,8651,113,117,105,103,97,114,114,111,119,59,1,8621,104,114,101,101,116,105,109,101,115,59,1,8907,59,1,8922,4,3,59,113,115,12019,12021,12024,1,8804,59,1,8806,108,97,110,116,59,1,10877,4,5,59,99,100,103,115,12043,12045,12049,12070,12083,1,10877,99,59,1,10920,111,116,4,2,59,111,12057,12059,1,10879,4,2,59,114,12065,12067,1,10881,59,1,10883,4,2,59,101,12076,12079,3,8922,65024,115,59,1,10899,4,5,97,100,101,103,115,12095,12103,12108,12126,12131,112,112,114,111,120,59,1,10885,111,116,59,1,8918,113,4,2,103,113,12115,12120,116,114,59,1,8922,103,116,114,59,1,10891,116,114,59,1,8822,105,109,59,1,8818,4,3,105,108,114,12144,12150,12156,115,104,116,59,1,10620,111,111,114,59,1,8970,59,3,55349,56617,4,2,59,69,12166,12168,1,8822,59,1,10897,4,2,97,98,12177,12198,114,4,2,100,117,12184,12187,59,1,8637,4,2,59,108,12193,12195,1,8636,59,1,10602,108,107,59,1,9604,99,121,59,1,1113,4,5,59,97,99,104,116,12220,12222,12227,12235,12241,1,8810,114,114,59,1,8647,111,114,110,101,114,59,1,8990,97,114,100,59,1,10603,114,105,59,1,9722,4,2,105,111,12252,12258,100,111,116,59,1,320,117,115,116,4,2,59,97,12267,12269,1,9136,99,104,101,59,1,9136,4,4,69,97,101,115,12285,12288,12303,12322,59,1,8808,112,4,2,59,112,12295,12297,1,10889,114,111,120,59,1,10889,4,2,59,113,12309,12311,1,10887,4,2,59,113,12317,12319,1,10887,59,1,8808,105,109,59,1,8934,4,8,97,98,110,111,112,116,119,122,12345,12359,12364,12421,12446,12467,12474,12490,4,2,110,114,12351,12355,103,59,1,10220,114,59,1,8701,114,107,59,1,10214,103,4,3,108,109,114,12373,12401,12409,101,102,116,4,2,97,114,12382,12389,114,114,111,119,59,1,10229,105,103,104,116,97,114,114,111,119,59,1,10231,97,112,115,116,111,59,1,10236,105,103,104,116,97,114,114,111,119,59,1,10230,112,97,114,114,111,119,4,2,108,114,12433,12439,101,102,116,59,1,8619,105,103,104,116,59,1,8620,4,3,97,102,108,12454,12458,12462,114,59,1,10629,59,3,55349,56669,117,115,59,1,10797,105,109,101,115,59,1,10804,4,2,97,98,12480,12485,115,116,59,1,8727,97,114,59,1,95,4,3,59,101,102,12498,12500,12506,1,9674,110,103,101,59,1,9674,59,1,10731,97,114,4,2,59,108,12517,12519,1,40,116,59,1,10643,4,5,97,99,104,109,116,12535,12540,12548,12561,12564,114,114,59,1,8646,111,114,110,101,114,59,1,8991,97,114,4,2,59,100,12556,12558,1,8651,59,1,10605,59,1,8206,114,105,59,1,8895,4,6,97,99,104,105,113,116,12583,12589,12594,12597,12614,12635,113,117,111,59,1,8249,114,59,3,55349,56513,59,1,8624,109,4,3,59,101,103,12606,12608,12611,1,8818,59,1,10893,59,1,10895,4,2,98,117,12620,12623,59,1,91,111,4,2,59,114,12630,12632,1,8216,59,1,8218,114,111,107,59,1,322,5,60,8,59,99,100,104,105,108,113,114,12660,12662,12675,12680,12686,12692,12698,12705,1,60,4,2,99,105,12668,12671,59,1,10918,114,59,1,10873,111,116,59,1,8918,114,101,101,59,1,8907,109,101,115,59,1,8905,97,114,114,59,1,10614,117,101,115,116,59,1,10875,4,2,80,105,12711,12716,97,114,59,1,10646,4,3,59,101,102,12724,12726,12729,1,9667,59,1,8884,59,1,9666,114,4,2,100,117,12739,12746,115,104,97,114,59,1,10570,104,97,114,59,1,10598,4,2,101,110,12758,12768,114,116,110,101,113,113,59,3,8808,65024,69,59,3,8808,65024,4,14,68,97,99,100,101,102,104,105,108,110,111,112,115,117,12803,12809,12893,12908,12914,12928,12933,12937,13011,13025,13032,13049,13052,13069,68,111,116,59,1,8762,4,4,99,108,112,114,12819,12827,12849,12887,114,5,175,1,59,12825,1,175,4,2,101,116,12833,12836,59,1,9794,4,2,59,101,12842,12844,1,10016,115,101,59,1,10016,4,2,59,115,12855,12857,1,8614,116,111,4,4,59,100,108,117,12869,12871,12877,12883,1,8614,111,119,110,59,1,8615,101,102,116,59,1,8612,112,59,1,8613,107,101,114,59,1,9646,4,2,111,121,12899,12905,109,109,97,59,1,10793,59,1,1084,97,115,104,59,1,8212,97,115,117,114,101,100,97,110,103,108,101,59,1,8737,114,59,3,55349,56618,111,59,1,8487,4,3,99,100,110,12945,12954,12985,114,111,5,181,1,59,12952,1,181,4,4,59,97,99,100,12964,12966,12971,12976,1,8739,115,116,59,1,42,105,114,59,1,10992,111,116,5,183,1,59,12983,1,183,117,115,4,3,59,98,100,12995,12997,13000,1,8722,59,1,8863,4,2,59,117,13006,13008,1,8760,59,1,10794,4,2,99,100,13017,13021,112,59,1,10971,114,59,1,8230,112,108,117,115,59,1,8723,4,2,100,112,13038,13044,101,108,115,59,1,8871,102,59,3,55349,56670,59,1,8723,4,2,99,116,13058,13063,114,59,3,55349,56514,112,111,115,59,1,8766,4,3,59,108,109,13077,13079,13087,1,956,116,105,109,97,112,59,1,8888,97,112,59,1,8888,4,24,71,76,82,86,97,98,99,100,101,102,103,104,105,106,108,109,111,112,114,115,116,117,118,119,13142,13165,13217,13229,13247,13330,13359,13414,13420,13508,13513,13579,13602,13626,13631,13762,13767,13855,13936,13995,14214,14285,14312,14432,4,2,103,116,13148,13152,59,3,8921,824,4,2,59,118,13158,13161,3,8811,8402,59,3,8811,824,4,3,101,108,116,13173,13200,13204,102,116,4,2,97,114,13181,13188,114,114,111,119,59,1,8653,105,103,104,116,97,114,114,111,119,59,1,8654,59,3,8920,824,4,2,59,118,13210,13213,3,8810,8402,59,3,8810,824,105,103,104,116,97,114,114,111,119,59,1,8655,4,2,68,100,13235,13241,97,115,104,59,1,8879,97,115,104,59,1,8878,4,5,98,99,110,112,116,13259,13264,13270,13275,13308,108,97,59,1,8711,117,116,101,59,1,324,103,59,3,8736,8402,4,5,59,69,105,111,112,13287,13289,13293,13298,13302,1,8777,59,3,10864,824,100,59,3,8779,824,115,59,1,329,114,111,120,59,1,8777,117,114,4,2,59,97,13316,13318,1,9838,108,4,2,59,115,13325,13327,1,9838,59,1,8469,4,2,115,117,13336,13344,112,5,160,1,59,13342,1,160,109,112,4,2,59,101,13352,13355,3,8782,824,59,3,8783,824,4,5,97,101,111,117,121,13371,13385,13391,13407,13411,4,2,112,114,13377,13380,59,1,10819,111,110,59,1,328,100,105,108,59,1,326,110,103,4,2,59,100,13399,13401,1,8775,111,116,59,3,10861,824,112,59,1,10818,59,1,1085,97,115,104,59,1,8211,4,7,59,65,97,100,113,115,120,13436,13438,13443,13466,13472,13478,13494,1,8800,114,114,59,1,8663,114,4,2,104,114,13450,13454,107,59,1,10532,4,2,59,111,13460,13462,1,8599,119,59,1,8599,111,116,59,3,8784,824,117,105,118,59,1,8802,4,2,101,105,13484,13489,97,114,59,1,10536,109,59,3,8770,824,105,115,116,4,2,59,115,13503,13505,1,8708,59,1,8708,114,59,3,55349,56619,4,4,69,101,115,116,13523,13527,13563,13568,59,3,8807,824,4,3,59,113,115,13535,13537,13559,1,8817,4,3,59,113,115,13545,13547,13551,1,8817,59,3,8807,824,108,97,110,116,59,3,10878,824,59,3,10878,824,105,109,59,1,8821,4,2,59,114,13574,13576,1,8815,59,1,8815,4,3,65,97,112,13587,13592,13597,114,114,59,1,8654,114,114,59,1,8622,97,114,59,1,10994,4,3,59,115,118,13610,13612,13623,1,8715,4,2,59,100,13618,13620,1,8956,59,1,8954,59,1,8715,99,121,59,1,1114,4,7,65,69,97,100,101,115,116,13647,13652,13656,13661,13665,13737,13742,114,114,59,1,8653,59,3,8806,824,114,114,59,1,8602,114,59,1,8229,4,4,59,102,113,115,13675,13677,13703,13725,1,8816,116,4,2,97,114,13684,13691,114,114,111,119,59,1,8602,105,103,104,116,97,114,114,111,119,59,1,8622,4,3,59,113,115,13711,13713,13717,1,8816,59,3,8806,824,108,97,110,116,59,3,10877,824,4,2,59,115,13731,13734,3,10877,824,59,1,8814,105,109,59,1,8820,4,2,59,114,13748,13750,1,8814,105,4,2,59,101,13757,13759,1,8938,59,1,8940,105,100,59,1,8740,4,2,112,116,13773,13778,102,59,3,55349,56671,5,172,3,59,105,110,13787,13789,13829,1,172,110,4,4,59,69,100,118,13800,13802,13806,13812,1,8713,59,3,8953,824,111,116,59,3,8949,824,4,3,97,98,99,13820,13823,13826,59,1,8713,59,1,8951,59,1,8950,105,4,2,59,118,13836,13838,1,8716,4,3,97,98,99,13846,13849,13852,59,1,8716,59,1,8958,59,1,8957,4,3,97,111,114,13863,13892,13899,114,4,4,59,97,115,116,13874,13876,13883,13888,1,8742,108,108,101,108,59,1,8742,108,59,3,11005,8421,59,3,8706,824,108,105,110,116,59,1,10772,4,3,59,99,101,13907,13909,13914,1,8832,117,101,59,1,8928,4,2,59,99,13920,13923,3,10927,824,4,2,59,101,13929,13931,1,8832,113,59,3,10927,824,4,4,65,97,105,116,13946,13951,13971,13982,114,114,59,1,8655,114,114,4,3,59,99,119,13961,13963,13967,1,8603,59,3,10547,824,59,3,8605,824,103,104,116,97,114,114,111,119,59,1,8603,114,105,4,2,59,101,13990,13992,1,8939,59,1,8941,4,7,99,104,105,109,112,113,117,14011,14036,14060,14080,14085,14090,14106,4,4,59,99,101,114,14021,14023,14028,14032,1,8833,117,101,59,1,8929,59,3,10928,824,59,3,55349,56515,111,114,116,4,2,109,112,14045,14050,105,100,59,1,8740,97,114,97,108,108,101,108,59,1,8742,109,4,2,59,101,14067,14069,1,8769,4,2,59,113,14075,14077,1,8772,59,1,8772,105,100,59,1,8740,97,114,59,1,8742,115,117,4,2,98,112,14098,14102,101,59,1,8930,101,59,1,8931,4,3,98,99,112,14114,14157,14171,4,4,59,69,101,115,14124,14126,14130,14133,1,8836,59,3,10949,824,59,1,8840,101,116,4,2,59,101,14141,14144,3,8834,8402,113,4,2,59,113,14151,14153,1,8840,59,3,10949,824,99,4,2,59,101,14164,14166,1,8833,113,59,3,10928,824,4,4,59,69,101,115,14181,14183,14187,14190,1,8837,59,3,10950,824,59,1,8841,101,116,4,2,59,101,14198,14201,3,8835,8402,113,4,2,59,113,14208,14210,1,8841,59,3,10950,824,4,4,103,105,108,114,14224,14228,14238,14242,108,59,1,8825,108,100,101,5,241,1,59,14236,1,241,103,59,1,8824,105,97,110,103,108,101,4,2,108,114,14254,14269,101,102,116,4,2,59,101,14263,14265,1,8938,113,59,1,8940,105,103,104,116,4,2,59,101,14279,14281,1,8939,113,59,1,8941,4,2,59,109,14291,14293,1,957,4,3,59,101,115,14301,14303,14308,1,35,114,111,59,1,8470,112,59,1,8199,4,9,68,72,97,100,103,105,108,114,115,14332,14338,14344,14349,14355,14369,14376,14408,14426,97,115,104,59,1,8877,97,114,114,59,1,10500,112,59,3,8781,8402,97,115,104,59,1,8876,4,2,101,116,14361,14365,59,3,8805,8402,59,3,62,8402,110,102,105,110,59,1,10718,4,3,65,101,116,14384,14389,14393,114,114,59,1,10498,59,3,8804,8402,4,2,59,114,14399,14402,3,60,8402,105,101,59,3,8884,8402,4,2,65,116,14414,14419,114,114,59,1,10499,114,105,101,59,3,8885,8402,105,109,59,3,8764,8402,4,3,65,97,110,14440,14445,14468,114,114,59,1,8662,114,4,2,104,114,14452,14456,107,59,1,10531,4,2,59,111,14462,14464,1,8598,119,59,1,8598,101,97,114,59,1,10535,4,18,83,97,99,100,101,102,103,104,105,108,109,111,112,114,115,116,117,118,14512,14515,14535,14560,14597,14603,14618,14643,14657,14662,14701,14741,14747,14769,14851,14877,14907,14916,59,1,9416,4,2,99,115,14521,14531,117,116,101,5,243,1,59,14529,1,243,116,59,1,8859,4,2,105,121,14541,14557,114,4,2,59,99,14548,14550,1,8858,5,244,1,59,14555,1,244,59,1,1086,4,5,97,98,105,111,115,14572,14577,14583,14587,14591,115,104,59,1,8861,108,97,99,59,1,337,118,59,1,10808,116,59,1,8857,111,108,100,59,1,10684,108,105,103,59,1,339,4,2,99,114,14609,14614,105,114,59,1,10687,59,3,55349,56620,4,3,111,114,116,14626,14630,14640,110,59,1,731,97,118,101,5,242,1,59,14638,1,242,59,1,10689,4,2,98,109,14649,14654,97,114,59,1,10677,59,1,937,110,116,59,1,8750,4,4,97,99,105,116,14672,14677,14693,14698,114,114,59,1,8634,4,2,105,114,14683,14687,114,59,1,10686,111,115,115,59,1,10683,110,101,59,1,8254,59,1,10688,4,3,97,101,105,14709,14714,14719,99,114,59,1,333,103,97,59,1,969,4,3,99,100,110,14727,14733,14736,114,111,110,59,1,959,59,1,10678,117,115,59,1,8854,112,102,59,3,55349,56672,4,3,97,101,108,14755,14759,14764,114,59,1,10679,114,112,59,1,10681,117,115,59,1,8853,4,7,59,97,100,105,111,115,118,14785,14787,14792,14831,14837,14841,14848,1,8744,114,114,59,1,8635,4,4,59,101,102,109,14802,14804,14817,14824,1,10845,114,4,2,59,111,14811,14813,1,8500,102,59,1,8500,5,170,1,59,14822,1,170,5,186,1,59,14829,1,186,103,111,102,59,1,8886,114,59,1,10838,108,111,112,101,59,1,10839,59,1,10843,4,3,99,108,111,14859,14863,14873,114,59,1,8500,97,115,104,5,248,1,59,14871,1,248,108,59,1,8856,105,4,2,108,109,14884,14893,100,101,5,245,1,59,14891,1,245,101,115,4,2,59,97,14901,14903,1,8855,115,59,1,10806,109,108,5,246,1,59,14914,1,246,98,97,114,59,1,9021,4,12,97,99,101,102,104,105,108,109,111,114,115,117,14948,14992,14996,15033,15038,15068,15090,15189,15192,15222,15427,15441,114,4,4,59,97,115,116,14959,14961,14976,14989,1,8741,5,182,2,59,108,14968,14970,1,182,108,101,108,59,1,8741,4,2,105,108,14982,14986,109,59,1,10995,59,1,11005,59,1,8706,121,59,1,1087,114,4,5,99,105,109,112,116,15009,15014,15019,15024,15027,110,116,59,1,37,111,100,59,1,46,105,108,59,1,8240,59,1,8869,101,110,107,59,1,8241,114,59,3,55349,56621,4,3,105,109,111,15046,15057,15063,4,2,59,118,15052,15054,1,966,59,1,981,109,97,116,59,1,8499,110,101,59,1,9742,4,3,59,116,118,15076,15078,15087,1,960,99,104,102,111,114,107,59,1,8916,59,1,982,4,2,97,117,15096,15119,110,4,2,99,107,15103,15115,107,4,2,59,104,15110,15112,1,8463,59,1,8462,118,59,1,8463,115,4,9,59,97,98,99,100,101,109,115,116,15140,15142,15148,15151,15156,15168,15171,15179,15184,1,43,99,105,114,59,1,10787,59,1,8862,105,114,59,1,10786,4,2,111,117,15162,15165,59,1,8724,59,1,10789,59,1,10866,110,5,177,1,59,15177,1,177,105,109,59,1,10790,119,111,59,1,10791,59,1,177,4,3,105,112,117,15200,15208,15213,110,116,105,110,116,59,1,10773,102,59,3,55349,56673,110,100,5,163,1,59,15220,1,163,4,10,59,69,97,99,101,105,110,111,115,117,15244,15246,15249,15253,15258,15334,15347,15367,15416,15421,1,8826,59,1,10931,112,59,1,10935,117,101,59,1,8828,4,2,59,99,15264,15266,1,10927,4,6,59,97,99,101,110,115,15280,15282,15290,15299,15303,15329,1,8826,112,112,114,111,120,59,1,10935,117,114,108,121,101,113,59,1,8828,113,59,1,10927,4,3,97,101,115,15311,15319,15324,112,112,114,111,120,59,1,10937,113,113,59,1,10933,105,109,59,1,8936,105,109,59,1,8830,109,101,4,2,59,115,15342,15344,1,8242,59,1,8473,4,3,69,97,115,15355,15358,15362,59,1,10933,112,59,1,10937,105,109,59,1,8936,4,3,100,102,112,15375,15378,15404,59,1,8719,4,3,97,108,115,15386,15392,15398,108,97,114,59,1,9006,105,110,101,59,1,8978,117,114,102,59,1,8979,4,2,59,116,15410,15412,1,8733,111,59,1,8733,105,109,59,1,8830,114,101,108,59,1,8880,4,2,99,105,15433,15438,114,59,3,55349,56517,59,1,968,110,99,115,112,59,1,8200,4,6,102,105,111,112,115,117,15462,15467,15472,15478,15485,15491,114,59,3,55349,56622,110,116,59,1,10764,112,102,59,3,55349,56674,114,105,109,101,59,1,8279,99,114,59,3,55349,56518,4,3,97,101,111,15499,15520,15534,116,4,2,101,105,15506,15515,114,110,105,111,110,115,59,1,8461,110,116,59,1,10774,115,116,4,2,59,101,15528,15530,1,63,113,59,1,8799,116,5,34,1,59,15540,1,34,4,21,65,66,72,97,98,99,100,101,102,104,105,108,109,110,111,112,114,115,116,117,120,15586,15609,15615,15620,15796,15855,15893,15931,15977,16001,16039,16183,16204,16222,16228,16285,16312,16318,16363,16408,16416,4,3,97,114,116,15594,15599,15603,114,114,59,1,8667,114,59,1,8658,97,105,108,59,1,10524,97,114,114,59,1,10511,97,114,59,1,10596,4,7,99,100,101,110,113,114,116,15636,15651,15656,15664,15687,15696,15770,4,2,101,117,15642,15646,59,3,8765,817,116,101,59,1,341,105,99,59,1,8730,109,112,116,121,118,59,1,10675,103,4,4,59,100,101,108,15675,15677,15680,15683,1,10217,59,1,10642,59,1,10661,101,59,1,10217,117,111,5,187,1,59,15694,1,187,114,4,11,59,97,98,99,102,104,108,112,115,116,119,15721,15723,15727,15739,15742,15746,15750,15754,15758,15763,15767,1,8594,112,59,1,10613,4,2,59,102,15733,15735,1,8677,115,59,1,10528,59,1,10547,115,59,1,10526,107,59,1,8618,112,59,1,8620,108,59,1,10565,105,109,59,1,10612,108,59,1,8611,59,1,8605,4,2,97,105,15776,15781,105,108,59,1,10522,111,4,2,59,110,15788,15790,1,8758,97,108,115,59,1,8474,4,3,97,98,114,15804,15809,15814,114,114,59,1,10509,114,107,59,1,10099,4,2,97,107,15820,15833,99,4,2,101,107,15827,15830,59,1,125,59,1,93,4,2,101,115,15839,15842,59,1,10636,108,4,2,100,117,15849,15852,59,1,10638,59,1,10640,4,4,97,101,117,121,15865,15871,15886,15890,114,111,110,59,1,345,4,2,100,105,15877,15882,105,108,59,1,343,108,59,1,8969,98,59,1,125,59,1,1088,4,4,99,108,113,115,15903,15907,15914,15927,97,59,1,10551,100,104,97,114,59,1,10601,117,111,4,2,59,114,15922,15924,1,8221,59,1,8221,104,59,1,8627,4,3,97,99,103,15939,15966,15970,108,4,4,59,105,112,115,15950,15952,15957,15963,1,8476,110,101,59,1,8475,97,114,116,59,1,8476,59,1,8477,116,59,1,9645,5,174,1,59,15975,1,174,4,3,105,108,114,15985,15991,15997,115,104,116,59,1,10621,111,111,114,59,1,8971,59,3,55349,56623,4,2,97,111,16007,16028,114,4,2,100,117,16014,16017,59,1,8641,4,2,59,108,16023,16025,1,8640,59,1,10604,4,2,59,118,16034,16036,1,961,59,1,1009,4,3,103,110,115,16047,16167,16171,104,116,4,6,97,104,108,114,115,116,16063,16081,16103,16130,16143,16155,114,114,111,119,4,2,59,116,16073,16075,1,8594,97,105,108,59,1,8611,97,114,112,111,111,110,4,2,100,117,16093,16099,111,119,110,59,1,8641,112,59,1,8640,101,102,116,4,2,97,104,16112,16120,114,114,111,119,115,59,1,8644,97,114,112,111,111,110,115,59,1,8652,105,103,104,116,97,114,114,111,119,115,59,1,8649,113,117,105,103,97,114,114,111,119,59,1,8605,104,114,101,101,116,105,109,101,115,59,1,8908,103,59,1,730,105,110,103,100,111,116,115,101,113,59,1,8787,4,3,97,104,109,16191,16196,16201,114,114,59,1,8644,97,114,59,1,8652,59,1,8207,111,117,115,116,4,2,59,97,16214,16216,1,9137,99,104,101,59,1,9137,109,105,100,59,1,10990,4,4,97,98,112,116,16238,16252,16257,16278,4,2,110,114,16244,16248,103,59,1,10221,114,59,1,8702,114,107,59,1,10215,4,3,97,102,108,16265,16269,16273,114,59,1,10630,59,3,55349,56675,117,115,59,1,10798,105,109,101,115,59,1,10805,4,2,97,112,16291,16304,114,4,2,59,103,16298,16300,1,41,116,59,1,10644,111,108,105,110,116,59,1,10770,97,114,114,59,1,8649,4,4,97,99,104,113,16328,16334,16339,16342,113,117,111,59,1,8250,114,59,3,55349,56519,59,1,8625,4,2,98,117,16348,16351,59,1,93,111,4,2,59,114,16358,16360,1,8217,59,1,8217,4,3,104,105,114,16371,16377,16383,114,101,101,59,1,8908,109,101,115,59,1,8906,105,4,4,59,101,102,108,16394,16396,16399,16402,1,9657,59,1,8885,59,1,9656,116,114,105,59,1,10702,108,117,104,97,114,59,1,10600,59,1,8478,4,19,97,98,99,100,101,102,104,105,108,109,111,112,113,114,115,116,117,119,122,16459,16466,16472,16572,16590,16672,16687,16746,16844,16850,16924,16963,16988,17115,17121,17154,17206,17614,17656,99,117,116,101,59,1,347,113,117,111,59,1,8218,4,10,59,69,97,99,101,105,110,112,115,121,16494,16496,16499,16513,16518,16531,16536,16556,16564,16569,1,8827,59,1,10932,4,2,112,114,16505,16508,59,1,10936,111,110,59,1,353,117,101,59,1,8829,4,2,59,100,16524,16526,1,10928,105,108,59,1,351,114,99,59,1,349,4,3,69,97,115,16544,16547,16551,59,1,10934,112,59,1,10938,105,109,59,1,8937,111,108,105,110,116,59,1,10771,105,109,59,1,8831,59,1,1089,111,116,4,3,59,98,101,16582,16584,16587,1,8901,59,1,8865,59,1,10854,4,7,65,97,99,109,115,116,120,16606,16611,16634,16642,16646,16652,16668,114,114,59,1,8664,114,4,2,104,114,16618,16622,107,59,1,10533,4,2,59,111,16628,16630,1,8600,119,59,1,8600,116,5,167,1,59,16640,1,167,105,59,1,59,119,97,114,59,1,10537,109,4,2,105,110,16659,16665,110,117,115,59,1,8726,59,1,8726,116,59,1,10038,114,4,2,59,111,16679,16682,3,55349,56624,119,110,59,1,8994,4,4,97,99,111,121,16697,16702,16716,16739,114,112,59,1,9839,4,2,104,121,16708,16713,99,121,59,1,1097,59,1,1096,114,116,4,2,109,112,16724,16729,105,100,59,1,8739,97,114,97,108,108,101,108,59,1,8741,5,173,1,59,16744,1,173,4,2,103,109,16752,16770,109,97,4,3,59,102,118,16762,16764,16767,1,963,59,1,962,59,1,962,4,8,59,100,101,103,108,110,112,114,16788,16790,16795,16806,16817,16828,16832,16838,1,8764,111,116,59,1,10858,4,2,59,113,16801,16803,1,8771,59,1,8771,4,2,59,69,16812,16814,1,10910,59,1,10912,4,2,59,69,16823,16825,1,10909,59,1,10911,101,59,1,8774,108,117,115,59,1,10788,97,114,114,59,1,10610,97,114,114,59,1,8592,4,4,97,101,105,116,16860,16883,16891,16904,4,2,108,115,16866,16878,108,115,101,116,109,105,110,117,115,59,1,8726,104,112,59,1,10803,112,97,114,115,108,59,1,10724,4,2,100,108,16897,16900,59,1,8739,101,59,1,8995,4,2,59,101,16910,16912,1,10922,4,2,59,115,16918,16920,1,10924,59,3,10924,65024,4,3,102,108,112,16932,16938,16958,116,99,121,59,1,1100,4,2,59,98,16944,16946,1,47,4,2,59,97,16952,16954,1,10692,114,59,1,9023,102,59,3,55349,56676,97,4,2,100,114,16970,16985,101,115,4,2,59,117,16978,16980,1,9824,105,116,59,1,9824,59,1,8741,4,3,99,115,117,16996,17028,17089,4,2,97,117,17002,17015,112,4,2,59,115,17009,17011,1,8851,59,3,8851,65024,112,4,2,59,115,17022,17024,1,8852,59,3,8852,65024,117,4,2,98,112,17035,17062,4,3,59,101,115,17043,17045,17048,1,8847,59,1,8849,101,116,4,2,59,101,17056,17058,1,8847,113,59,1,8849,4,3,59,101,115,17070,17072,17075,1,8848,59,1,8850,101,116,4,2,59,101,17083,17085,1,8848,113,59,1,8850,4,3,59,97,102,17097,17099,17112,1,9633,114,4,2,101,102,17106,17109,59,1,9633,59,1,9642,59,1,9642,97,114,114,59,1,8594,4,4,99,101,109,116,17131,17136,17142,17148,114,59,3,55349,56520,116,109,110,59,1,8726,105,108,101,59,1,8995,97,114,102,59,1,8902,4,2,97,114,17160,17172,114,4,2,59,102,17167,17169,1,9734,59,1,9733,4,2,97,110,17178,17202,105,103,104,116,4,2,101,112,17188,17197,112,115,105,108,111,110,59,1,1013,104,105,59,1,981,115,59,1,175,4,5,98,99,109,110,112,17218,17351,17420,17423,17427,4,9,59,69,100,101,109,110,112,114,115,17238,17240,17243,17248,17261,17267,17279,17285,17291,1,8834,59,1,10949,111,116,59,1,10941,4,2,59,100,17254,17256,1,8838,111,116,59,1,10947,117,108,116,59,1,10945,4,2,69,101,17273,17276,59,1,10955,59,1,8842,108,117,115,59,1,10943,97,114,114,59,1,10617,4,3,101,105,117,17299,17335,17339,116,4,3,59,101,110,17308,17310,17322,1,8834,113,4,2,59,113,17317,17319,1,8838,59,1,10949,101,113,4,2,59,113,17330,17332,1,8842,59,1,10955,109,59,1,10951,4,2,98,112,17345,17348,59,1,10965,59,1,10963,99,4,6,59,97,99,101,110,115,17366,17368,17376,17385,17389,17415,1,8827,112,112,114,111,120,59,1,10936,117,114,108,121,101,113,59,1,8829,113,59,1,10928,4,3,97,101,115,17397,17405,17410,112,112,114,111,120,59,1,10938,113,113,59,1,10934,105,109,59,1,8937,105,109,59,1,8831,59,1,8721,103,59,1,9834,4,13,49,50,51,59,69,100,101,104,108,109,110,112,115,17455,17462,17469,17476,17478,17481,17496,17509,17524,17530,17536,17548,17554,5,185,1,59,17460,1,185,5,178,1,59,17467,1,178,5,179,1,59,17474,1,179,1,8835,59,1,10950,4,2,111,115,17487,17491,116,59,1,10942,117,98,59,1,10968,4,2,59,100,17502,17504,1,8839,111,116,59,1,10948,115,4,2,111,117,17516,17520,108,59,1,10185,98,59,1,10967,97,114,114,59,1,10619,117,108,116,59,1,10946,4,2,69,101,17542,17545,59,1,10956,59,1,8843,108,117,115,59,1,10944,4,3,101,105,117,17562,17598,17602,116,4,3,59,101,110,17571,17573,17585,1,8835,113,4,2,59,113,17580,17582,1,8839,59,1,10950,101,113,4,2,59,113,17593,17595,1,8843,59,1,10956,109,59,1,10952,4,2,98,112,17608,17611,59,1,10964,59,1,10966,4,3,65,97,110,17622,17627,17650,114,114,59,1,8665,114,4,2,104,114,17634,17638,107,59,1,10534,4,2,59,111,17644,17646,1,8601,119,59,1,8601,119,97,114,59,1,10538,108,105,103,5,223,1,59,17664,1,223,4,13,97,98,99,100,101,102,104,105,111,112,114,115,119,17694,17709,17714,17737,17742,17749,17754,17860,17905,17957,17964,18090,18122,4,2,114,117,17700,17706,103,101,116,59,1,8982,59,1,964,114,107,59,1,9140,4,3,97,101,121,17722,17728,17734,114,111,110,59,1,357,100,105,108,59,1,355,59,1,1090,111,116,59,1,8411,108,114,101,99,59,1,8981,114,59,3,55349,56625,4,4,101,105,107,111,17764,17805,17836,17851,4,2,114,116,17770,17786,101,4,2,52,102,17777,17780,59,1,8756,111,114,101,59,1,8756,97,4,3,59,115,118,17795,17797,17802,1,952,121,109,59,1,977,59,1,977,4,2,99,110,17811,17831,107,4,2,97,115,17818,17826,112,112,114,111,120,59,1,8776,105,109,59,1,8764,115,112,59,1,8201,4,2,97,115,17842,17846,112,59,1,8776,105,109,59,1,8764,114,110,5,254,1,59,17858,1,254,4,3,108,109,110,17868,17873,17901,100,101,59,1,732,101,115,5,215,3,59,98,100,17884,17886,17898,1,215,4,2,59,97,17892,17894,1,8864,114,59,1,10801,59,1,10800,116,59,1,8749,4,3,101,112,115,17913,17917,17953,97,59,1,10536,4,4,59,98,99,102,17927,17929,17934,17939,1,8868,111,116,59,1,9014,105,114,59,1,10993,4,2,59,111,17945,17948,3,55349,56677,114,107,59,1,10970,97,59,1,10537,114,105,109,101,59,1,8244,4,3,97,105,112,17972,17977,18082,100,101,59,1,8482,4,7,97,100,101,109,112,115,116,17993,18051,18056,18059,18066,18072,18076,110,103,108,101,4,5,59,100,108,113,114,18009,18011,18017,18032,18035,1,9653,111,119,110,59,1,9663,101,102,116,4,2,59,101,18026,18028,1,9667,113,59,1,8884,59,1,8796,105,103,104,116,4,2,59,101,18045,18047,1,9657,113,59,1,8885,111,116,59,1,9708,59,1,8796,105,110,117,115,59,1,10810,108,117,115,59,1,10809,98,59,1,10701,105,109,101,59,1,10811,101,122,105,117,109,59,1,9186,4,3,99,104,116,18098,18111,18116,4,2,114,121,18104,18108,59,3,55349,56521,59,1,1094,99,121,59,1,1115,114,111,107,59,1,359,4,2,105,111,18128,18133,120,116,59,1,8812,104,101,97,100,4,2,108,114,18143,18154,101,102,116,97,114,114,111,119,59,1,8606,105,103,104,116,97,114,114,111,119,59,1,8608,4,18,65,72,97,98,99,100,102,103,104,108,109,111,112,114,115,116,117,119,18204,18209,18214,18234,18250,18268,18292,18308,18319,18343,18379,18397,18413,18504,18547,18553,18584,18603,114,114,59,1,8657,97,114,59,1,10595,4,2,99,114,18220,18230,117,116,101,5,250,1,59,18228,1,250,114,59,1,8593,114,4,2,99,101,18241,18245,121,59,1,1118,118,101,59,1,365,4,2,105,121,18256,18265,114,99,5,251,1,59,18263,1,251,59,1,1091,4,3,97,98,104,18276,18281,18287,114,114,59,1,8645,108,97,99,59,1,369,97,114,59,1,10606,4,2,105,114,18298,18304,115,104,116,59,1,10622,59,3,55349,56626,114,97,118,101,5,249,1,59,18317,1,249,4,2,97,98,18325,18338,114,4,2,108,114,18332,18335,59,1,8639,59,1,8638,108,107,59,1,9600,4,2,99,116,18349,18374,4,2,111,114,18355,18369,114,110,4,2,59,101,18363,18365,1,8988,114,59,1,8988,111,112,59,1,8975,114,105,59,1,9720,4,2,97,108,18385,18390,99,114,59,1,363,5,168,1,59,18395,1,168,4,2,103,112,18403,18408,111,110,59,1,371,102,59,3,55349,56678,4,6,97,100,104,108,115,117,18427,18434,18445,18470,18475,18494,114,114,111,119,59,1,8593,111,119,110,97,114,114,111,119,59,1,8597,97,114,112,111,111,110,4,2,108,114,18457,18463,101,102,116,59,1,8639,105,103,104,116,59,1,8638,117,115,59,1,8846,105,4,3,59,104,108,18484,18486,18489,1,965,59,1,978,111,110,59,1,965,112,97,114,114,111,119,115,59,1,8648,4,3,99,105,116,18512,18537,18542,4,2,111,114,18518,18532,114,110,4,2,59,101,18526,18528,1,8989,114,59,1,8989,111,112,59,1,8974,110,103,59,1,367,114,105,59,1,9721,99,114,59,3,55349,56522,4,3,100,105,114,18561,18566,18572,111,116,59,1,8944,108,100,101,59,1,361,105,4,2,59,102,18579,18581,1,9653,59,1,9652,4,2,97,109,18590,18595,114,114,59,1,8648,108,5,252,1,59,18601,1,252,97,110,103,108,101,59,1,10663,4,15,65,66,68,97,99,100,101,102,108,110,111,112,114,115,122,18643,18648,18661,18667,18847,18851,18857,18904,18909,18915,18931,18937,18943,18949,18996,114,114,59,1,8661,97,114,4,2,59,118,18656,18658,1,10984,59,1,10985,97,115,104,59,1,8872,4,2,110,114,18673,18679,103,114,116,59,1,10652,4,7,101,107,110,112,114,115,116,18695,18704,18711,18720,18742,18754,18810,112,115,105,108,111,110,59,1,1013,97,112,112,97,59,1,1008,111,116,104,105,110,103,59,1,8709,4,3,104,105,114,18728,18732,18735,105,59,1,981,59,1,982,111,112,116,111,59,1,8733,4,2,59,104,18748,18750,1,8597,111,59,1,1009,4,2,105,117,18760,18766,103,109,97,59,1,962,4,2,98,112,18772,18791,115,101,116,110,101,113,4,2,59,113,18784,18787,3,8842,65024,59,3,10955,65024,115,101,116,110,101,113,4,2,59,113,18803,18806,3,8843,65024,59,3,10956,65024,4,2,104,114,18816,18822,101,116,97,59,1,977,105,97,110,103,108,101,4,2,108,114,18834,18840,101,102,116,59,1,8882,105,103,104,116,59,1,8883,121,59,1,1074,97,115,104,59,1,8866,4,3,101,108,114,18865,18884,18890,4,3,59,98,101,18873,18875,18880,1,8744,97,114,59,1,8891,113,59,1,8794,108,105,112,59,1,8942,4,2,98,116,18896,18901,97,114,59,1,124,59,1,124,114,59,3,55349,56627,116,114,105,59,1,8882,115,117,4,2,98,112,18923,18927,59,3,8834,8402,59,3,8835,8402,112,102,59,3,55349,56679,114,111,112,59,1,8733,116,114,105,59,1,8883,4,2,99,117,18955,18960,114,59,3,55349,56523,4,2,98,112,18966,18981,110,4,2,69,101,18973,18977,59,3,10955,65024,59,3,8842,65024,110,4,2,69,101,18988,18992,59,3,10956,65024,59,3,8843,65024,105,103,122,97,103,59,1,10650,4,7,99,101,102,111,112,114,115,19020,19026,19061,19066,19072,19075,19089,105,114,99,59,1,373,4,2,100,105,19032,19055,4,2,98,103,19038,19043,97,114,59,1,10847,101,4,2,59,113,19050,19052,1,8743,59,1,8793,101,114,112,59,1,8472,114,59,3,55349,56628,112,102,59,3,55349,56680,59,1,8472,4,2,59,101,19081,19083,1,8768,97,116,104,59,1,8768,99,114,59,3,55349,56524,4,14,99,100,102,104,105,108,109,110,111,114,115,117,118,119,19125,19146,19152,19157,19173,19176,19192,19197,19202,19236,19252,19269,19286,19291,4,3,97,105,117,19133,19137,19142,112,59,1,8898,114,99,59,1,9711,112,59,1,8899,116,114,105,59,1,9661,114,59,3,55349,56629,4,2,65,97,19163,19168,114,114,59,1,10234,114,114,59,1,10231,59,1,958,4,2,65,97,19182,19187,114,114,59,1,10232,114,114,59,1,10229,97,112,59,1,10236,105,115,59,1,8955,4,3,100,112,116,19210,19215,19230,111,116,59,1,10752,4,2,102,108,19221,19225,59,3,55349,56681,117,115,59,1,10753,105,109,101,59,1,10754,4,2,65,97,19242,19247,114,114,59,1,10233,114,114,59,1,10230,4,2,99,113,19258,19263,114,59,3,55349,56525,99,117,112,59,1,10758,4,2,112,116,19275,19281,108,117,115,59,1,10756,114,105,59,1,9651,101,101,59,1,8897,101,100,103,101,59,1,8896,4,8,97,99,101,102,105,111,115,117,19316,19335,19349,19357,19362,19367,19373,19379,99,4,2,117,121,19323,19332,116,101,5,253,1,59,19330,1,253,59,1,1103,4,2,105,121,19341,19346,114,99,59,1,375,59,1,1099,110,5,165,1,59,19355,1,165,114,59,3,55349,56630,99,121,59,1,1111,112,102,59,3,55349,56682,99,114,59,3,55349,56526,4,2,99,109,19385,19389,121,59,1,1102,108,5,255,1,59,19395,1,255,4,10,97,99,100,101,102,104,105,111,115,119,19419,19426,19441,19446,19462,19467,19472,19480,19486,19492,99,117,116,101,59,1,378,4,2,97,121,19432,19438,114,111,110,59,1,382,59,1,1079,111,116,59,1,380,4,2,101,116,19452,19458,116,114,102,59,1,8488,97,59,1,950,114,59,3,55349,56631,99,121,59,1,1078,103,114,97,114,114,59,1,8669,112,102,59,3,55349,56683,99,114,59,3,55349,56527,4,2,106,110,19498,19501,59,1,8205,106,59,1,8204]); -},{}],21:[function(require,module,exports){ -'use strict'; - -const unicode = require('../common/unicode'); -const ERR = require('../common/error-codes'); - -//Aliases -const $ = unicode.CODE_POINTS; - +},{"../common/error-codes.js":2,"../common/html.js":4,"../common/token.js":5,"../common/unicode.js":6,"./preprocessor.js":13,"entities/lib/decode.js":15}],13:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Preprocessor = void 0; +const unicode_js_1 = require("../common/unicode.js"); +const error_codes_js_1 = require("../common/error-codes.js"); //Const const DEFAULT_BUFFER_WATERLINE = 1 << 16; - //Preprocessor //NOTE: HTML input preprocessing //(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#preprocessing-the-input-stream) class Preprocessor { - constructor() { - this.html = null; - + constructor(handler) { + this.handler = handler; + this.html = ''; this.pos = -1; - this.lastGapPos = -1; - this.lastCharPos = -1; - + // NOTE: Initial `lastGapPos` is -2, to ensure `col` on initialisation is 0 + this.lastGapPos = -2; this.gapStack = []; - this.skipNextNewLine = false; - this.lastChunkWritten = false; this.endOfChunkHit = false; this.bufferWaterline = DEFAULT_BUFFER_WATERLINE; + this.isEol = false; + this.lineStartPos = 0; + this.droppedBufferSize = 0; + this.line = 1; + //NOTE: avoid reporting errors twice on advance/retreat + this.lastErrOffset = -1; } - - _err() { - // NOTE: err reporting is noop by default. Enabled by mixin. + /** The column on the current line. If we just saw a gap (eg. a surrogate pair), return the index before. */ + get col() { + return this.pos - this.lineStartPos + Number(this.lastGapPos !== this.pos); + } + get offset() { + return this.droppedBufferSize + this.pos; + } + getError(code) { + const { line, col, offset } = this; + return { + code, + startLine: line, + endLine: line, + startCol: col, + endCol: col, + startOffset: offset, + endOffset: offset, + }; + } + _err(code) { + if (this.handler.onParseError && this.lastErrOffset !== this.offset) { + this.lastErrOffset = this.offset; + this.handler.onParseError(this.getError(code)); + } } - _addGap() { this.gapStack.push(this.lastGapPos); this.lastGapPos = this.pos; } - _processSurrogate(cp) { //NOTE: try to peek a surrogate pair - if (this.pos !== this.lastCharPos) { + if (this.pos !== this.html.length - 1) { const nextCp = this.html.charCodeAt(this.pos + 1); - - if (unicode.isSurrogatePair(nextCp)) { + if ((0, unicode_js_1.isSurrogatePair)(nextCp)) { //NOTE: we have a surrogate pair. Peek pair character and recalculate code point. this.pos++; - - //NOTE: add gap that should be avoided during retreat + //NOTE: add a gap that should be avoided during retreat this._addGap(); - - return unicode.getSurrogatePairCodePoint(cp, nextCp); + return (0, unicode_js_1.getSurrogatePairCodePoint)(cp, nextCp); } } - - //NOTE: we are at the end of a chunk, therefore we can't infer surrogate pair yet. + //NOTE: we are at the end of a chunk, therefore we can't infer the surrogate pair yet. else if (!this.lastChunkWritten) { this.endOfChunkHit = true; - return $.EOF; + return unicode_js_1.CODE_POINTS.EOF; } - //NOTE: isolated surrogate - this._err(ERR.surrogateInInputStream); - + this._err(error_codes_js_1.ERR.surrogateInInputStream); return cp; } - + willDropParsedChunk() { + return this.pos > this.bufferWaterline; + } dropParsedChunk() { - if (this.pos > this.bufferWaterline) { - this.lastCharPos -= this.pos; + if (this.willDropParsedChunk()) { this.html = this.html.substring(this.pos); + this.lineStartPos -= this.pos; + this.droppedBufferSize += this.pos; this.pos = 0; - this.lastGapPos = -1; - this.gapStack = []; + this.lastGapPos = -2; + this.gapStack.length = 0; } } - write(chunk, isLastChunk) { - if (this.html) { + if (this.html.length > 0) { this.html += chunk; - } else { + } + else { this.html = chunk; } - - this.lastCharPos = this.html.length - 1; this.endOfChunkHit = false; this.lastChunkWritten = isLastChunk; } - insertHtmlAtCurrentPos(chunk) { - this.html = this.html.substring(0, this.pos + 1) + chunk + this.html.substring(this.pos + 1, this.html.length); - - this.lastCharPos = this.html.length - 1; + this.html = this.html.substring(0, this.pos + 1) + chunk + this.html.substring(this.pos + 1); this.endOfChunkHit = false; } - + startsWith(pattern, caseSensitive) { + // Check if our buffer has enough characters + if (this.pos + pattern.length > this.html.length) { + this.endOfChunkHit = !this.lastChunkWritten; + return false; + } + if (caseSensitive) { + return this.html.startsWith(pattern, this.pos); + } + for (let i = 0; i < pattern.length; i++) { + const cp = this.html.charCodeAt(this.pos + i) | 0x20; + if (cp !== pattern.charCodeAt(i)) { + return false; + } + } + return true; + } + peek(offset) { + const pos = this.pos + offset; + if (pos >= this.html.length) { + this.endOfChunkHit = !this.lastChunkWritten; + return unicode_js_1.CODE_POINTS.EOF; + } + return this.html.charCodeAt(pos); + } advance() { this.pos++; - - if (this.pos > this.lastCharPos) { + //NOTE: LF should be in the last column of the line + if (this.isEol) { + this.isEol = false; + this.line++; + this.lineStartPos = this.pos; + } + if (this.pos >= this.html.length) { this.endOfChunkHit = !this.lastChunkWritten; - return $.EOF; + return unicode_js_1.CODE_POINTS.EOF; } - let cp = this.html.charCodeAt(this.pos); - - //NOTE: any U+000A LINE FEED (LF) characters that immediately follow a U+000D CARRIAGE RETURN (CR) character - //must be ignored. - if (this.skipNextNewLine && cp === $.LINE_FEED) { - this.skipNextNewLine = false; - this._addGap(); - return this.advance(); - } - //NOTE: all U+000D CARRIAGE RETURN (CR) characters must be converted to U+000A LINE FEED (LF) characters - if (cp === $.CARRIAGE_RETURN) { + if (cp === unicode_js_1.CODE_POINTS.CARRIAGE_RETURN) { + this.isEol = true; this.skipNextNewLine = true; - return $.LINE_FEED; + return unicode_js_1.CODE_POINTS.LINE_FEED; + } + //NOTE: any U+000A LINE FEED (LF) characters that immediately follow a U+000D CARRIAGE RETURN (CR) character + //must be ignored. + if (cp === unicode_js_1.CODE_POINTS.LINE_FEED) { + this.isEol = true; + if (this.skipNextNewLine) { + // `line` will be bumped again in the recursive call. + this.line--; + this.skipNextNewLine = false; + this._addGap(); + return this.advance(); + } } - this.skipNextNewLine = false; - - if (unicode.isSurrogate(cp)) { + if ((0, unicode_js_1.isSurrogate)(cp)) { cp = this._processSurrogate(cp); } - //OPTIMIZATION: first check if code point is in the common allowed //range (ASCII alphanumeric, whitespaces, big chunk of BMP) //before going into detailed performance cost validation. - const isCommonValidRange = - (cp > 0x1f && cp < 0x7f) || cp === $.LINE_FEED || cp === $.CARRIAGE_RETURN || (cp > 0x9f && cp < 0xfdd0); - + const isCommonValidRange = this.handler.onParseError === null || + (cp > 0x1f && cp < 0x7f) || + cp === unicode_js_1.CODE_POINTS.LINE_FEED || + cp === unicode_js_1.CODE_POINTS.CARRIAGE_RETURN || + (cp > 0x9f && cp < 64976); if (!isCommonValidRange) { this._checkForProblematicCharacters(cp); } - return cp; } - _checkForProblematicCharacters(cp) { - if (unicode.isControlCodePoint(cp)) { - this._err(ERR.controlCharacterInInputStream); - } else if (unicode.isUndefinedCodePoint(cp)) { - this._err(ERR.noncharacterInInputStream); + if ((0, unicode_js_1.isControlCodePoint)(cp)) { + this._err(error_codes_js_1.ERR.controlCharacterInInputStream); + } + else if ((0, unicode_js_1.isUndefinedCodePoint)(cp)) { + this._err(error_codes_js_1.ERR.noncharacterInInputStream); } } - - retreat() { - if (this.pos === this.lastGapPos) { + retreat(count) { + this.pos -= count; + while (this.pos < this.lastGapPos) { this.lastGapPos = this.gapStack.pop(); this.pos--; } - - this.pos--; + this.isEol = false; } } - -module.exports = Preprocessor; - -},{"../common/error-codes":2,"../common/unicode":5}],22:[function(require,module,exports){ -'use strict'; - -const { DOCUMENT_MODE } = require('../common/html'); - -//Node construction -exports.createDocument = function() { - return { - nodeName: '#document', - mode: DOCUMENT_MODE.NO_QUIRKS, - childNodes: [] - }; -}; - -exports.createDocumentFragment = function() { +exports.Preprocessor = Preprocessor; + +},{"../common/error-codes.js":2,"../common/unicode.js":6}],14:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.defaultTreeAdapter = exports.NodeType = void 0; +const html_js_1 = require("../common/html.js"); +var NodeType; +(function (NodeType) { + NodeType["Document"] = "#document"; + NodeType["DocumentFragment"] = "#document-fragment"; + NodeType["Comment"] = "#comment"; + NodeType["Text"] = "#text"; + NodeType["DocumentType"] = "#documentType"; +})(NodeType = exports.NodeType || (exports.NodeType = {})); +function createTextNode(value) { return { - nodeName: '#document-fragment', - childNodes: [] + nodeName: NodeType.Text, + value, + parentNode: null, }; -}; - -exports.createElement = function(tagName, namespaceURI, attrs) { - return { - nodeName: tagName, - tagName: tagName, - attrs: attrs, - namespaceURI: namespaceURI, - childNodes: [], - parentNode: null - }; -}; - -exports.createCommentNode = function(data) { - return { - nodeName: '#comment', - data: data, - parentNode: null - }; -}; - -const createTextNode = function(value) { - return { - nodeName: '#text', - value: value, - parentNode: null - }; -}; - -//Tree mutation -const appendChild = (exports.appendChild = function(parentNode, newNode) { - parentNode.childNodes.push(newNode); - newNode.parentNode = parentNode; -}); - -const insertBefore = (exports.insertBefore = function(parentNode, newNode, referenceNode) { - const insertionIdx = parentNode.childNodes.indexOf(referenceNode); - - parentNode.childNodes.splice(insertionIdx, 0, newNode); - newNode.parentNode = parentNode; -}); - -exports.setTemplateContent = function(templateElement, contentElement) { - templateElement.content = contentElement; -}; - -exports.getTemplateContent = function(templateElement) { - return templateElement.content; -}; - -exports.setDocumentType = function(document, name, publicId, systemId) { - let doctypeNode = null; - - for (let i = 0; i < document.childNodes.length; i++) { - if (document.childNodes[i].nodeName === '#documentType') { - doctypeNode = document.childNodes[i]; - break; +} +exports.defaultTreeAdapter = { + //Node construction + createDocument() { + return { + nodeName: NodeType.Document, + mode: html_js_1.DOCUMENT_MODE.NO_QUIRKS, + childNodes: [], + }; + }, + createDocumentFragment() { + return { + nodeName: NodeType.DocumentFragment, + childNodes: [], + }; + }, + createElement(tagName, namespaceURI, attrs) { + return { + nodeName: tagName, + tagName, + attrs, + namespaceURI, + childNodes: [], + parentNode: null, + }; + }, + createCommentNode(data) { + return { + nodeName: NodeType.Comment, + data, + parentNode: null, + }; + }, + //Tree mutation + appendChild(parentNode, newNode) { + parentNode.childNodes.push(newNode); + newNode.parentNode = parentNode; + }, + insertBefore(parentNode, newNode, referenceNode) { + const insertionIdx = parentNode.childNodes.indexOf(referenceNode); + parentNode.childNodes.splice(insertionIdx, 0, newNode); + newNode.parentNode = parentNode; + }, + setTemplateContent(templateElement, contentElement) { + templateElement.content = contentElement; + }, + getTemplateContent(templateElement) { + return templateElement.content; + }, + setDocumentType(document, name, publicId, systemId) { + const doctypeNode = document.childNodes.find((node) => node.nodeName === NodeType.DocumentType); + if (doctypeNode) { + doctypeNode.name = name; + doctypeNode.publicId = publicId; + doctypeNode.systemId = systemId; + } + else { + const node = { + nodeName: NodeType.DocumentType, + name, + publicId, + systemId, + parentNode: null, + }; + exports.defaultTreeAdapter.appendChild(document, node); } - } - - if (doctypeNode) { - doctypeNode.name = name; - doctypeNode.publicId = publicId; - doctypeNode.systemId = systemId; - } else { - appendChild(document, { - nodeName: '#documentType', - name: name, - publicId: publicId, - systemId: systemId - }); - } -}; - -exports.setDocumentMode = function(document, mode) { - document.mode = mode; -}; - -exports.getDocumentMode = function(document) { - return document.mode; -}; - -exports.detachNode = function(node) { - if (node.parentNode) { - const idx = node.parentNode.childNodes.indexOf(node); - - node.parentNode.childNodes.splice(idx, 1); - node.parentNode = null; - } -}; - -exports.insertText = function(parentNode, text) { - if (parentNode.childNodes.length) { - const prevNode = parentNode.childNodes[parentNode.childNodes.length - 1]; - - if (prevNode.nodeName === '#text') { + }, + setDocumentMode(document, mode) { + document.mode = mode; + }, + getDocumentMode(document) { + return document.mode; + }, + detachNode(node) { + if (node.parentNode) { + const idx = node.parentNode.childNodes.indexOf(node); + node.parentNode.childNodes.splice(idx, 1); + node.parentNode = null; + } + }, + insertText(parentNode, text) { + if (parentNode.childNodes.length > 0) { + const prevNode = parentNode.childNodes[parentNode.childNodes.length - 1]; + if (exports.defaultTreeAdapter.isTextNode(prevNode)) { + prevNode.value += text; + return; + } + } + exports.defaultTreeAdapter.appendChild(parentNode, createTextNode(text)); + }, + insertTextBefore(parentNode, text, referenceNode) { + const prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1]; + if (prevNode && exports.defaultTreeAdapter.isTextNode(prevNode)) { prevNode.value += text; - return; } - } - - appendChild(parentNode, createTextNode(text)); -}; - -exports.insertTextBefore = function(parentNode, text, referenceNode) { - const prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1]; - - if (prevNode && prevNode.nodeName === '#text') { - prevNode.value += text; - } else { - insertBefore(parentNode, createTextNode(text), referenceNode); - } -}; - -exports.adoptAttributes = function(recipient, attrs) { - const recipientAttrsMap = []; - - for (let i = 0; i < recipient.attrs.length; i++) { - recipientAttrsMap.push(recipient.attrs[i].name); - } - - for (let j = 0; j < attrs.length; j++) { - if (recipientAttrsMap.indexOf(attrs[j].name) === -1) { - recipient.attrs.push(attrs[j]); + else { + exports.defaultTreeAdapter.insertBefore(parentNode, createTextNode(text), referenceNode); } - } -}; - -//Tree traversing -exports.getFirstChild = function(node) { - return node.childNodes[0]; -}; - -exports.getChildNodes = function(node) { - return node.childNodes; -}; - -exports.getParentNode = function(node) { - return node.parentNode; -}; - -exports.getAttrList = function(element) { - return element.attrs; -}; - -//Node data -exports.getTagName = function(element) { - return element.tagName; -}; - -exports.getNamespaceURI = function(element) { - return element.namespaceURI; -}; - -exports.getTextNodeContent = function(textNode) { - return textNode.value; -}; - -exports.getCommentNodeContent = function(commentNode) { - return commentNode.data; -}; - -exports.getDocumentTypeNodeName = function(doctypeNode) { - return doctypeNode.name; -}; - -exports.getDocumentTypeNodePublicId = function(doctypeNode) { - return doctypeNode.publicId; -}; - -exports.getDocumentTypeNodeSystemId = function(doctypeNode) { - return doctypeNode.systemId; -}; - -//Node types -exports.isTextNode = function(node) { - return node.nodeName === '#text'; -}; - -exports.isCommentNode = function(node) { - return node.nodeName === '#comment'; -}; - -exports.isDocumentTypeNode = function(node) { - return node.nodeName === '#documentType'; -}; - -exports.isElementNode = function(node) { - return !!node.tagName; -}; - -// Source code location -exports.setNodeSourceCodeLocation = function(node, location) { - node.sourceCodeLocation = location; -}; - -exports.getNodeSourceCodeLocation = function(node) { - return node.sourceCodeLocation; -}; - -exports.updateNodeSourceCodeLocation = function(node, endLocation) { - node.sourceCodeLocation = Object.assign(node.sourceCodeLocation, endLocation); + }, + adoptAttributes(recipient, attrs) { + const recipientAttrsMap = new Set(recipient.attrs.map((attr) => attr.name)); + for (let j = 0; j < attrs.length; j++) { + if (!recipientAttrsMap.has(attrs[j].name)) { + recipient.attrs.push(attrs[j]); + } + } + }, + //Tree traversing + getFirstChild(node) { + return node.childNodes[0]; + }, + getChildNodes(node) { + return node.childNodes; + }, + getParentNode(node) { + return node.parentNode; + }, + getAttrList(element) { + return element.attrs; + }, + //Node data + getTagName(element) { + return element.tagName; + }, + getNamespaceURI(element) { + return element.namespaceURI; + }, + getTextNodeContent(textNode) { + return textNode.value; + }, + getCommentNodeContent(commentNode) { + return commentNode.data; + }, + getDocumentTypeNodeName(doctypeNode) { + return doctypeNode.name; + }, + getDocumentTypeNodePublicId(doctypeNode) { + return doctypeNode.publicId; + }, + getDocumentTypeNodeSystemId(doctypeNode) { + return doctypeNode.systemId; + }, + //Node types + isTextNode(node) { + return node.nodeName === '#text'; + }, + isCommentNode(node) { + return node.nodeName === '#comment'; + }, + isDocumentTypeNode(node) { + return node.nodeName === NodeType.DocumentType; + }, + isElementNode(node) { + return Object.prototype.hasOwnProperty.call(node, 'tagName'); + }, + // Source code location + setNodeSourceCodeLocation(node, location) { + node.sourceCodeLocation = location; + }, + getNodeSourceCodeLocation(node) { + return node.sourceCodeLocation; + }, + updateNodeSourceCodeLocation(node, endLocation) { + node.sourceCodeLocation = Object.assign(Object.assign({}, node.sourceCodeLocation), endLocation); + }, }; -},{"../common/html":4}],23:[function(require,module,exports){ -'use strict'; - -module.exports = function mergeOptions(defaults, options) { - options = options || Object.create(null); - - return [defaults, options].reduce((merged, optObj) => { - Object.keys(optObj).forEach(key => { - merged[key] = optObj[key]; - }); - - return merged; - }, Object.create(null)); +},{"../common/html.js":4}],15:[function(require,module,exports){ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; }; - -},{}],24:[function(require,module,exports){ -'use strict'; - -class Mixin { - constructor(host) { - const originalMethods = {}; - const overriddenMethods = this._getOverriddenMethods(this, originalMethods); - - for (const key of Object.keys(overriddenMethods)) { - if (typeof overriddenMethods[key] === 'function') { - originalMethods[key] = host[key]; - host[key] = overriddenMethods[key]; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.decodeXML = exports.decodeHTMLStrict = exports.decodeHTML = exports.determineBranch = exports.BinTrieFlags = exports.fromCodePoint = exports.replaceCodePoint = exports.decodeCodePoint = exports.xmlDecodeTree = exports.htmlDecodeTree = void 0; +var decode_data_html_js_1 = __importDefault(require("./generated/decode-data-html.js")); +exports.htmlDecodeTree = decode_data_html_js_1.default; +var decode_data_xml_js_1 = __importDefault(require("./generated/decode-data-xml.js")); +exports.xmlDecodeTree = decode_data_xml_js_1.default; +var decode_codepoint_js_1 = __importDefault(require("./decode_codepoint.js")); +exports.decodeCodePoint = decode_codepoint_js_1.default; +var decode_codepoint_js_2 = require("./decode_codepoint.js"); +Object.defineProperty(exports, "replaceCodePoint", { enumerable: true, get: function () { return decode_codepoint_js_2.replaceCodePoint; } }); +Object.defineProperty(exports, "fromCodePoint", { enumerable: true, get: function () { return decode_codepoint_js_2.fromCodePoint; } }); +var CharCodes; +(function (CharCodes) { + CharCodes[CharCodes["NUM"] = 35] = "NUM"; + CharCodes[CharCodes["SEMI"] = 59] = "SEMI"; + CharCodes[CharCodes["ZERO"] = 48] = "ZERO"; + CharCodes[CharCodes["NINE"] = 57] = "NINE"; + CharCodes[CharCodes["LOWER_A"] = 97] = "LOWER_A"; + CharCodes[CharCodes["LOWER_F"] = 102] = "LOWER_F"; + CharCodes[CharCodes["LOWER_X"] = 120] = "LOWER_X"; + /** Bit that needs to be set to convert an upper case ASCII character to lower case */ + CharCodes[CharCodes["To_LOWER_BIT"] = 32] = "To_LOWER_BIT"; +})(CharCodes || (CharCodes = {})); +var BinTrieFlags; +(function (BinTrieFlags) { + BinTrieFlags[BinTrieFlags["VALUE_LENGTH"] = 49152] = "VALUE_LENGTH"; + BinTrieFlags[BinTrieFlags["BRANCH_LENGTH"] = 16256] = "BRANCH_LENGTH"; + BinTrieFlags[BinTrieFlags["JUMP_TABLE"] = 127] = "JUMP_TABLE"; +})(BinTrieFlags = exports.BinTrieFlags || (exports.BinTrieFlags = {})); +function getDecoder(decodeTree) { + return function decodeHTMLBinary(str, strict) { + var ret = ""; + var lastIdx = 0; + var strIdx = 0; + while ((strIdx = str.indexOf("&", strIdx)) >= 0) { + ret += str.slice(lastIdx, strIdx); + lastIdx = strIdx; + // Skip the "&" + strIdx += 1; + // If we have a numeric entity, handle this separately. + if (str.charCodeAt(strIdx) === CharCodes.NUM) { + // Skip the leading "&#". For hex entities, also skip the leading "x". + var start = strIdx + 1; + var base = 10; + var cp = str.charCodeAt(start); + if ((cp | CharCodes.To_LOWER_BIT) === CharCodes.LOWER_X) { + base = 16; + strIdx += 1; + start += 1; + } + do + cp = str.charCodeAt(++strIdx); + while ((cp >= CharCodes.ZERO && cp <= CharCodes.NINE) || + (base === 16 && + (cp | CharCodes.To_LOWER_BIT) >= CharCodes.LOWER_A && + (cp | CharCodes.To_LOWER_BIT) <= CharCodes.LOWER_F)); + if (start !== strIdx) { + var entity = str.substring(start, strIdx); + var parsed = parseInt(entity, base); + if (str.charCodeAt(strIdx) === CharCodes.SEMI) { + strIdx += 1; + } + else if (strict) { + continue; + } + ret += (0, decode_codepoint_js_1.default)(parsed); + lastIdx = strIdx; + } + continue; + } + var resultIdx = 0; + var excess = 1; + var treeIdx = 0; + var current = decodeTree[treeIdx]; + for (; strIdx < str.length; strIdx++, excess++) { + treeIdx = determineBranch(decodeTree, current, treeIdx + 1, str.charCodeAt(strIdx)); + if (treeIdx < 0) + break; + current = decodeTree[treeIdx]; + var masked = current & BinTrieFlags.VALUE_LENGTH; + // If the branch is a value, store it and continue + if (masked) { + // If we have a legacy entity while parsing strictly, just skip the number of bytes + if (!strict || str.charCodeAt(strIdx) === CharCodes.SEMI) { + resultIdx = treeIdx; + excess = 0; + } + // The mask is the number of bytes of the value, including the current byte. + var valueLength = (masked >> 14) - 1; + if (valueLength === 0) + break; + treeIdx += valueLength; + } + } + if (resultIdx !== 0) { + var valueLength = (decodeTree[resultIdx] & BinTrieFlags.VALUE_LENGTH) >> 14; + ret += + valueLength === 1 + ? String.fromCharCode(decodeTree[resultIdx] & ~BinTrieFlags.VALUE_LENGTH) + : valueLength === 2 + ? String.fromCharCode(decodeTree[resultIdx + 1]) + : String.fromCharCode(decodeTree[resultIdx + 1], decodeTree[resultIdx + 2]); + lastIdx = strIdx - excess + 1; } } - } - - _getOverriddenMethods() { - throw new Error('Not implemented'); - } + return ret + str.slice(lastIdx); + }; } - -Mixin.install = function(host, Ctor, opts) { - if (!host.__mixins) { - host.__mixins = []; - } - - for (let i = 0; i < host.__mixins.length; i++) { - if (host.__mixins[i].constructor === Ctor) { - return host.__mixins[i]; +function determineBranch(decodeTree, current, nodeIdx, char) { + var branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7; + var jumpOffset = current & BinTrieFlags.JUMP_TABLE; + // Case 1: Single branch encoded in jump offset + if (branchCount === 0) { + return jumpOffset !== 0 && char === jumpOffset ? nodeIdx : -1; + } + // Case 2: Multiple branches encoded in jump table + if (jumpOffset) { + var value = char - jumpOffset; + return value < 0 || value > branchCount + ? -1 + : decodeTree[nodeIdx + value] - 1; + } + // Case 3: Multiple branches encoded in dictionary + // Binary search for the character. + var lo = nodeIdx; + var hi = lo + branchCount - 1; + while (lo <= hi) { + var mid = (lo + hi) >>> 1; + var midVal = decodeTree[mid]; + if (midVal < char) { + lo = mid + 1; + } + else if (midVal > char) { + hi = mid - 1; + } + else { + return decodeTree[mid + branchCount]; } } - - const mixin = new Ctor(host, opts); - - host.__mixins.push(mixin); - - return mixin; + return -1; +} +exports.determineBranch = determineBranch; +var htmlDecoder = getDecoder(decode_data_html_js_1.default); +var xmlDecoder = getDecoder(decode_data_xml_js_1.default); +function decodeHTML(str) { + return htmlDecoder(str, false); +} +exports.decodeHTML = decodeHTML; +function decodeHTMLStrict(str) { + return htmlDecoder(str, true); +} +exports.decodeHTMLStrict = decodeHTMLStrict; +function decodeXML(str) { + return xmlDecoder(str, true); +} +exports.decodeXML = decodeXML; + +},{"./decode_codepoint.js":16,"./generated/decode-data-html.js":18,"./generated/decode-data-xml.js":19}],16:[function(require,module,exports){ +"use strict"; +// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134 +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.replaceCodePoint = exports.fromCodePoint = void 0; +var decodeMap = new Map([ + [0, 65533], + [128, 8364], + [130, 8218], + [131, 402], + [132, 8222], + [133, 8230], + [134, 8224], + [135, 8225], + [136, 710], + [137, 8240], + [138, 352], + [139, 8249], + [140, 338], + [142, 381], + [145, 8216], + [146, 8217], + [147, 8220], + [148, 8221], + [149, 8226], + [150, 8211], + [151, 8212], + [152, 732], + [153, 8482], + [154, 353], + [155, 8250], + [156, 339], + [158, 382], + [159, 376], +]); +exports.fromCodePoint = +// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, node/no-unsupported-features/es-builtins +(_a = String.fromCodePoint) !== null && _a !== void 0 ? _a : function (codePoint) { + var output = ""; + if (codePoint > 0xffff) { + codePoint -= 0x10000; + output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800); + codePoint = 0xdc00 | (codePoint & 0x3ff); + } + output += String.fromCharCode(codePoint); + return output; }; - -module.exports = Mixin; - -},{}]},{},[14])(14) +function replaceCodePoint(codePoint) { + var _a; + if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) { + return 0xfffd; + } + return (_a = decodeMap.get(codePoint)) !== null && _a !== void 0 ? _a : codePoint; +} +exports.replaceCodePoint = replaceCodePoint; +function decodeCodePoint(codePoint) { + return (0, exports.fromCodePoint)(replaceCodePoint(codePoint)); +} +exports.default = decodeCodePoint; + +},{}],17:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.escapeText = exports.escapeAttribute = exports.escapeUTF8 = exports.escape = exports.encodeXML = exports.getCodePoint = exports.xmlReplacer = void 0; +exports.xmlReplacer = /["&'<>$\x80-\uFFFF]/g; +var xmlCodeMap = new Map([ + [34, """], + [38, "&"], + [39, "'"], + [60, "<"], + [62, ">"], +]); +// For compatibility with node < 4, we wrap `codePointAt` +exports.getCodePoint = +// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition +String.prototype.codePointAt != null + ? function (str, index) { return str.codePointAt(index); } + : // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + function (c, index) { + return (c.charCodeAt(index) & 0xfc00) === 0xd800 + ? (c.charCodeAt(index) - 0xd800) * 0x400 + + c.charCodeAt(index + 1) - + 0xdc00 + + 0x10000 + : c.charCodeAt(index); + }; +/** + * Encodes all non-ASCII characters, as well as characters not valid in XML + * documents using XML entities. + * + * If a character has no equivalent entity, a + * numeric hexadecimal reference (eg. `ü`) will be used. + */ +function encodeXML(str) { + var ret = ""; + var lastIdx = 0; + var match; + while ((match = exports.xmlReplacer.exec(str)) !== null) { + var i = match.index; + var char = str.charCodeAt(i); + var next = xmlCodeMap.get(char); + if (next !== undefined) { + ret += str.substring(lastIdx, i) + next; + lastIdx = i + 1; + } + else { + ret += "".concat(str.substring(lastIdx, i), "&#x").concat((0, exports.getCodePoint)(str, i).toString(16), ";"); + // Increase by 1 if we have a surrogate pair + lastIdx = exports.xmlReplacer.lastIndex += Number((char & 0xfc00) === 0xd800); + } + } + return ret + str.substr(lastIdx); +} +exports.encodeXML = encodeXML; +/** + * Encodes all non-ASCII characters, as well as characters not valid in XML + * documents using numeric hexadecimal reference (eg. `ü`). + * + * Have a look at `escapeUTF8` if you want a more concise output at the expense + * of reduced transportability. + * + * @param data String to escape. + */ +exports.escape = encodeXML; +function getEscaper(regex, map) { + return function escape(data) { + var match; + var lastIdx = 0; + var result = ""; + while ((match = regex.exec(data))) { + if (lastIdx !== match.index) { + result += data.substring(lastIdx, match.index); + } + // We know that this chararcter will be in the map. + result += map.get(match[0].charCodeAt(0)); + // Every match will be of length 1 + lastIdx = match.index + 1; + } + return result + data.substring(lastIdx); + }; +} +/** + * Encodes all characters not valid in XML documents using XML entities. + * + * Note that the output will be character-set dependent. + * + * @param data String to escape. + */ +exports.escapeUTF8 = getEscaper(/[&<>'"]/g, xmlCodeMap); +/** + * Encodes all characters that have to be escaped in HTML attributes, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + * + * @param data String to escape. + */ +exports.escapeAttribute = getEscaper(/["&\u00A0]/g, new Map([ + [34, """], + [38, "&"], + [160, " "], +])); +/** + * Encodes all characters that have to be escaped in HTML text, + * following {@link https://html.spec.whatwg.org/multipage/parsing.html#escapingString}. + * + * @param data String to escape. + */ +exports.escapeText = getEscaper(/[&<>\u00A0]/g, new Map([ + [38, "&"], + [60, "<"], + [62, ">"], + [160, " "], +])); + +},{}],18:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// Generated using scripts/write-decode-map.ts +// prettier-ignore +exports.default = new Uint16Array([7489, 60, 213, 305, 650, 1181, 1403, 1488, 1653, 1758, 1954, 2006, 2063, 2634, 2705, 3489, 3693, 3849, 3878, 4298, 4648, 4833, 5141, 5277, 5315, 5343, 5413, 0, 0, 0, 0, 0, 0, 5483, 5837, 6541, 7186, 7645, 8062, 8288, 8624, 8845, 9152, 9211, 9282, 10276, 10514, 11528, 11848, 12238, 12310, 12986, 13881, 14252, 14590, 14888, 14961, 15072, 15150, 2048, 69, 77, 97, 98, 99, 102, 103, 108, 109, 110, 111, 112, 114, 115, 116, 117, 92, 98, 102, 109, 115, 127, 132, 139, 144, 149, 152, 166, 179, 185, 200, 207, 108, 105, 103, 32827, 198, 16582, 80, 32827, 38, 16422, 99, 117, 116, 101, 32827, 193, 16577, 114, 101, 118, 101, 59, 16642, 256, 105, 121, 120, 125, 114, 99, 32827, 194, 16578, 59, 17424, 114, 59, 49152, 55349, 56580, 114, 97, 118, 101, 32827, 192, 16576, 112, 104, 97, 59, 17297, 97, 99, 114, 59, 16640, 100, 59, 27219, 256, 103, 112, 157, 161, 111, 110, 59, 16644, 102, 59, 49152, 55349, 56632, 112, 108, 121, 70, 117, 110, 99, 116, 105, 111, 110, 59, 24673, 105, 110, 103, 32827, 197, 16581, 256, 99, 115, 190, 195, 114, 59, 49152, 55349, 56476, 105, 103, 110, 59, 25172, 105, 108, 100, 101, 32827, 195, 16579, 109, 108, 32827, 196, 16580, 1024, 97, 99, 101, 102, 111, 114, 115, 117, 229, 251, 254, 279, 284, 290, 295, 298, 256, 99, 114, 234, 242, 107, 115, 108, 97, 115, 104, 59, 25110, 374, 246, 248, 59, 27367, 101, 100, 59, 25350, 121, 59, 17425, 384, 99, 114, 116, 261, 267, 276, 97, 117, 115, 101, 59, 25141, 110, 111, 117, 108, 108, 105, 115, 59, 24876, 97, 59, 17298, 114, 59, 49152, 55349, 56581, 112, 102, 59, 49152, 55349, 56633, 101, 118, 101, 59, 17112, 99, 242, 275, 109, 112, 101, 113, 59, 25166, 1792, 72, 79, 97, 99, 100, 101, 102, 104, 105, 108, 111, 114, 115, 117, 333, 337, 342, 384, 414, 418, 437, 439, 442, 476, 533, 627, 632, 638, 99, 121, 59, 17447, 80, 89, 32827, 169, 16553, 384, 99, 112, 121, 349, 354, 378, 117, 116, 101, 59, 16646, 256, 59, 105, 359, 360, 25298, 116, 97, 108, 68, 105, 102, 102, 101, 114, 101, 110, 116, 105, 97, 108, 68, 59, 24901, 108, 101, 121, 115, 59, 24877, 512, 97, 101, 105, 111, 393, 398, 404, 408, 114, 111, 110, 59, 16652, 100, 105, 108, 32827, 199, 16583, 114, 99, 59, 16648, 110, 105, 110, 116, 59, 25136, 111, 116, 59, 16650, 256, 100, 110, 423, 429, 105, 108, 108, 97, 59, 16568, 116, 101, 114, 68, 111, 116, 59, 16567, 242, 383, 105, 59, 17319, 114, 99, 108, 101, 512, 68, 77, 80, 84, 455, 459, 465, 470, 111, 116, 59, 25241, 105, 110, 117, 115, 59, 25238, 108, 117, 115, 59, 25237, 105, 109, 101, 115, 59, 25239, 111, 256, 99, 115, 482, 504, 107, 119, 105, 115, 101, 67, 111, 110, 116, 111, 117, 114, 73, 110, 116, 101, 103, 114, 97, 108, 59, 25138, 101, 67, 117, 114, 108, 121, 256, 68, 81, 515, 527, 111, 117, 98, 108, 101, 81, 117, 111, 116, 101, 59, 24605, 117, 111, 116, 101, 59, 24601, 512, 108, 110, 112, 117, 542, 552, 583, 597, 111, 110, 256, 59, 101, 549, 550, 25143, 59, 27252, 384, 103, 105, 116, 559, 566, 570, 114, 117, 101, 110, 116, 59, 25185, 110, 116, 59, 25135, 111, 117, 114, 73, 110, 116, 101, 103, 114, 97, 108, 59, 25134, 256, 102, 114, 588, 590, 59, 24834, 111, 100, 117, 99, 116, 59, 25104, 110, 116, 101, 114, 67, 108, 111, 99, 107, 119, 105, 115, 101, 67, 111, 110, 116, 111, 117, 114, 73, 110, 116, 101, 103, 114, 97, 108, 59, 25139, 111, 115, 115, 59, 27183, 99, 114, 59, 49152, 55349, 56478, 112, 256, 59, 67, 644, 645, 25299, 97, 112, 59, 25165, 1408, 68, 74, 83, 90, 97, 99, 101, 102, 105, 111, 115, 672, 684, 688, 692, 696, 715, 727, 737, 742, 819, 1165, 256, 59, 111, 377, 677, 116, 114, 97, 104, 100, 59, 26897, 99, 121, 59, 17410, 99, 121, 59, 17413, 99, 121, 59, 17423, 384, 103, 114, 115, 703, 708, 711, 103, 101, 114, 59, 24609, 114, 59, 24993, 104, 118, 59, 27364, 256, 97, 121, 720, 725, 114, 111, 110, 59, 16654, 59, 17428, 108, 256, 59, 116, 733, 734, 25095, 97, 59, 17300, 114, 59, 49152, 55349, 56583, 256, 97, 102, 747, 807, 256, 99, 109, 752, 802, 114, 105, 116, 105, 99, 97, 108, 512, 65, 68, 71, 84, 768, 774, 790, 796, 99, 117, 116, 101, 59, 16564, 111, 372, 779, 781, 59, 17113, 98, 108, 101, 65, 99, 117, 116, 101, 59, 17117, 114, 97, 118, 101, 59, 16480, 105, 108, 100, 101, 59, 17116, 111, 110, 100, 59, 25284, 102, 101, 114, 101, 110, 116, 105, 97, 108, 68, 59, 24902, 1136, 829, 0, 0, 0, 834, 852, 0, 1029, 102, 59, 49152, 55349, 56635, 384, 59, 68, 69, 840, 841, 845, 16552, 111, 116, 59, 24796, 113, 117, 97, 108, 59, 25168, 98, 108, 101, 768, 67, 68, 76, 82, 85, 86, 867, 882, 898, 975, 994, 1016, 111, 110, 116, 111, 117, 114, 73, 110, 116, 101, 103, 114, 97, 236, 569, 111, 628, 889, 0, 0, 891, 187, 841, 110, 65, 114, 114, 111, 119, 59, 25043, 256, 101, 111, 903, 932, 102, 116, 384, 65, 82, 84, 912, 918, 929, 114, 114, 111, 119, 59, 25040, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 25044, 101, 229, 714, 110, 103, 256, 76, 82, 939, 964, 101, 102, 116, 256, 65, 82, 947, 953, 114, 114, 111, 119, 59, 26616, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 26618, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 26617, 105, 103, 104, 116, 256, 65, 84, 984, 990, 114, 114, 111, 119, 59, 25042, 101, 101, 59, 25256, 112, 577, 1001, 0, 0, 1007, 114, 114, 111, 119, 59, 25041, 111, 119, 110, 65, 114, 114, 111, 119, 59, 25045, 101, 114, 116, 105, 99, 97, 108, 66, 97, 114, 59, 25125, 110, 768, 65, 66, 76, 82, 84, 97, 1042, 1066, 1072, 1118, 1151, 892, 114, 114, 111, 119, 384, 59, 66, 85, 1053, 1054, 1058, 24979, 97, 114, 59, 26899, 112, 65, 114, 114, 111, 119, 59, 25077, 114, 101, 118, 101, 59, 17169, 101, 102, 116, 722, 1082, 0, 1094, 0, 1104, 105, 103, 104, 116, 86, 101, 99, 116, 111, 114, 59, 26960, 101, 101, 86, 101, 99, 116, 111, 114, 59, 26974, 101, 99, 116, 111, 114, 256, 59, 66, 1113, 1114, 25021, 97, 114, 59, 26966, 105, 103, 104, 116, 468, 1127, 0, 1137, 101, 101, 86, 101, 99, 116, 111, 114, 59, 26975, 101, 99, 116, 111, 114, 256, 59, 66, 1146, 1147, 25025, 97, 114, 59, 26967, 101, 101, 256, 59, 65, 1158, 1159, 25252, 114, 114, 111, 119, 59, 24999, 256, 99, 116, 1170, 1175, 114, 59, 49152, 55349, 56479, 114, 111, 107, 59, 16656, 2048, 78, 84, 97, 99, 100, 102, 103, 108, 109, 111, 112, 113, 115, 116, 117, 120, 1213, 1216, 1220, 1227, 1246, 1250, 1255, 1262, 1269, 1313, 1327, 1334, 1362, 1373, 1376, 1381, 71, 59, 16714, 72, 32827, 208, 16592, 99, 117, 116, 101, 32827, 201, 16585, 384, 97, 105, 121, 1234, 1239, 1244, 114, 111, 110, 59, 16666, 114, 99, 32827, 202, 16586, 59, 17453, 111, 116, 59, 16662, 114, 59, 49152, 55349, 56584, 114, 97, 118, 101, 32827, 200, 16584, 101, 109, 101, 110, 116, 59, 25096, 256, 97, 112, 1274, 1278, 99, 114, 59, 16658, 116, 121, 595, 1286, 0, 0, 1298, 109, 97, 108, 108, 83, 113, 117, 97, 114, 101, 59, 26107, 101, 114, 121, 83, 109, 97, 108, 108, 83, 113, 117, 97, 114, 101, 59, 26027, 256, 103, 112, 1318, 1322, 111, 110, 59, 16664, 102, 59, 49152, 55349, 56636, 115, 105, 108, 111, 110, 59, 17301, 117, 256, 97, 105, 1340, 1353, 108, 256, 59, 84, 1346, 1347, 27253, 105, 108, 100, 101, 59, 25154, 108, 105, 98, 114, 105, 117, 109, 59, 25036, 256, 99, 105, 1367, 1370, 114, 59, 24880, 109, 59, 27251, 97, 59, 17303, 109, 108, 32827, 203, 16587, 256, 105, 112, 1386, 1391, 115, 116, 115, 59, 25091, 111, 110, 101, 110, 116, 105, 97, 108, 69, 59, 24903, 640, 99, 102, 105, 111, 115, 1413, 1416, 1421, 1458, 1484, 121, 59, 17444, 114, 59, 49152, 55349, 56585, 108, 108, 101, 100, 595, 1431, 0, 0, 1443, 109, 97, 108, 108, 83, 113, 117, 97, 114, 101, 59, 26108, 101, 114, 121, 83, 109, 97, 108, 108, 83, 113, 117, 97, 114, 101, 59, 26026, 880, 1466, 0, 1471, 0, 0, 1476, 102, 59, 49152, 55349, 56637, 65, 108, 108, 59, 25088, 114, 105, 101, 114, 116, 114, 102, 59, 24881, 99, 242, 1483, 1536, 74, 84, 97, 98, 99, 100, 102, 103, 111, 114, 115, 116, 1512, 1516, 1519, 1530, 1536, 1554, 1558, 1563, 1565, 1571, 1644, 1650, 99, 121, 59, 17411, 32827, 62, 16446, 109, 109, 97, 256, 59, 100, 1527, 1528, 17299, 59, 17372, 114, 101, 118, 101, 59, 16670, 384, 101, 105, 121, 1543, 1548, 1552, 100, 105, 108, 59, 16674, 114, 99, 59, 16668, 59, 17427, 111, 116, 59, 16672, 114, 59, 49152, 55349, 56586, 59, 25305, 112, 102, 59, 49152, 55349, 56638, 101, 97, 116, 101, 114, 768, 69, 70, 71, 76, 83, 84, 1589, 1604, 1614, 1622, 1627, 1638, 113, 117, 97, 108, 256, 59, 76, 1598, 1599, 25189, 101, 115, 115, 59, 25307, 117, 108, 108, 69, 113, 117, 97, 108, 59, 25191, 114, 101, 97, 116, 101, 114, 59, 27298, 101, 115, 115, 59, 25207, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 27262, 105, 108, 100, 101, 59, 25203, 99, 114, 59, 49152, 55349, 56482, 59, 25195, 1024, 65, 97, 99, 102, 105, 111, 115, 117, 1669, 1675, 1686, 1691, 1694, 1706, 1726, 1738, 82, 68, 99, 121, 59, 17450, 256, 99, 116, 1680, 1684, 101, 107, 59, 17095, 59, 16478, 105, 114, 99, 59, 16676, 114, 59, 24844, 108, 98, 101, 114, 116, 83, 112, 97, 99, 101, 59, 24843, 496, 1711, 0, 1714, 102, 59, 24845, 105, 122, 111, 110, 116, 97, 108, 76, 105, 110, 101, 59, 25856, 256, 99, 116, 1731, 1733, 242, 1705, 114, 111, 107, 59, 16678, 109, 112, 324, 1744, 1752, 111, 119, 110, 72, 117, 109, 240, 303, 113, 117, 97, 108, 59, 25167, 1792, 69, 74, 79, 97, 99, 100, 102, 103, 109, 110, 111, 115, 116, 117, 1786, 1790, 1795, 1799, 1806, 1818, 1822, 1825, 1832, 1860, 1912, 1931, 1935, 1941, 99, 121, 59, 17429, 108, 105, 103, 59, 16690, 99, 121, 59, 17409, 99, 117, 116, 101, 32827, 205, 16589, 256, 105, 121, 1811, 1816, 114, 99, 32827, 206, 16590, 59, 17432, 111, 116, 59, 16688, 114, 59, 24849, 114, 97, 118, 101, 32827, 204, 16588, 384, 59, 97, 112, 1824, 1839, 1855, 256, 99, 103, 1844, 1847, 114, 59, 16682, 105, 110, 97, 114, 121, 73, 59, 24904, 108, 105, 101, 243, 989, 500, 1865, 0, 1890, 256, 59, 101, 1869, 1870, 25132, 256, 103, 114, 1875, 1880, 114, 97, 108, 59, 25131, 115, 101, 99, 116, 105, 111, 110, 59, 25282, 105, 115, 105, 98, 108, 101, 256, 67, 84, 1900, 1906, 111, 109, 109, 97, 59, 24675, 105, 109, 101, 115, 59, 24674, 384, 103, 112, 116, 1919, 1923, 1928, 111, 110, 59, 16686, 102, 59, 49152, 55349, 56640, 97, 59, 17305, 99, 114, 59, 24848, 105, 108, 100, 101, 59, 16680, 491, 1946, 0, 1950, 99, 121, 59, 17414, 108, 32827, 207, 16591, 640, 99, 102, 111, 115, 117, 1964, 1975, 1980, 1986, 2000, 256, 105, 121, 1969, 1973, 114, 99, 59, 16692, 59, 17433, 114, 59, 49152, 55349, 56589, 112, 102, 59, 49152, 55349, 56641, 483, 1991, 0, 1996, 114, 59, 49152, 55349, 56485, 114, 99, 121, 59, 17416, 107, 99, 121, 59, 17412, 896, 72, 74, 97, 99, 102, 111, 115, 2020, 2024, 2028, 2033, 2045, 2050, 2056, 99, 121, 59, 17445, 99, 121, 59, 17420, 112, 112, 97, 59, 17306, 256, 101, 121, 2038, 2043, 100, 105, 108, 59, 16694, 59, 17434, 114, 59, 49152, 55349, 56590, 112, 102, 59, 49152, 55349, 56642, 99, 114, 59, 49152, 55349, 56486, 1408, 74, 84, 97, 99, 101, 102, 108, 109, 111, 115, 116, 2085, 2089, 2092, 2128, 2147, 2483, 2488, 2503, 2509, 2615, 2631, 99, 121, 59, 17417, 32827, 60, 16444, 640, 99, 109, 110, 112, 114, 2103, 2108, 2113, 2116, 2125, 117, 116, 101, 59, 16697, 98, 100, 97, 59, 17307, 103, 59, 26602, 108, 97, 99, 101, 116, 114, 102, 59, 24850, 114, 59, 24990, 384, 97, 101, 121, 2135, 2140, 2145, 114, 111, 110, 59, 16701, 100, 105, 108, 59, 16699, 59, 17435, 256, 102, 115, 2152, 2416, 116, 1280, 65, 67, 68, 70, 82, 84, 85, 86, 97, 114, 2174, 2217, 2225, 2272, 2278, 2300, 2351, 2395, 912, 2410, 256, 110, 114, 2179, 2191, 103, 108, 101, 66, 114, 97, 99, 107, 101, 116, 59, 26600, 114, 111, 119, 384, 59, 66, 82, 2201, 2202, 2206, 24976, 97, 114, 59, 25060, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 25030, 101, 105, 108, 105, 110, 103, 59, 25352, 111, 501, 2231, 0, 2243, 98, 108, 101, 66, 114, 97, 99, 107, 101, 116, 59, 26598, 110, 468, 2248, 0, 2258, 101, 101, 86, 101, 99, 116, 111, 114, 59, 26977, 101, 99, 116, 111, 114, 256, 59, 66, 2267, 2268, 25027, 97, 114, 59, 26969, 108, 111, 111, 114, 59, 25354, 105, 103, 104, 116, 256, 65, 86, 2287, 2293, 114, 114, 111, 119, 59, 24980, 101, 99, 116, 111, 114, 59, 26958, 256, 101, 114, 2305, 2327, 101, 384, 59, 65, 86, 2313, 2314, 2320, 25251, 114, 114, 111, 119, 59, 24996, 101, 99, 116, 111, 114, 59, 26970, 105, 97, 110, 103, 108, 101, 384, 59, 66, 69, 2340, 2341, 2345, 25266, 97, 114, 59, 27087, 113, 117, 97, 108, 59, 25268, 112, 384, 68, 84, 86, 2359, 2370, 2380, 111, 119, 110, 86, 101, 99, 116, 111, 114, 59, 26961, 101, 101, 86, 101, 99, 116, 111, 114, 59, 26976, 101, 99, 116, 111, 114, 256, 59, 66, 2390, 2391, 25023, 97, 114, 59, 26968, 101, 99, 116, 111, 114, 256, 59, 66, 2405, 2406, 25020, 97, 114, 59, 26962, 105, 103, 104, 116, 225, 924, 115, 768, 69, 70, 71, 76, 83, 84, 2430, 2443, 2453, 2461, 2466, 2477, 113, 117, 97, 108, 71, 114, 101, 97, 116, 101, 114, 59, 25306, 117, 108, 108, 69, 113, 117, 97, 108, 59, 25190, 114, 101, 97, 116, 101, 114, 59, 25206, 101, 115, 115, 59, 27297, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 27261, 105, 108, 100, 101, 59, 25202, 114, 59, 49152, 55349, 56591, 256, 59, 101, 2493, 2494, 25304, 102, 116, 97, 114, 114, 111, 119, 59, 25050, 105, 100, 111, 116, 59, 16703, 384, 110, 112, 119, 2516, 2582, 2587, 103, 512, 76, 82, 108, 114, 2526, 2551, 2562, 2576, 101, 102, 116, 256, 65, 82, 2534, 2540, 114, 114, 111, 119, 59, 26613, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 26615, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 26614, 101, 102, 116, 256, 97, 114, 947, 2570, 105, 103, 104, 116, 225, 959, 105, 103, 104, 116, 225, 970, 102, 59, 49152, 55349, 56643, 101, 114, 256, 76, 82, 2594, 2604, 101, 102, 116, 65, 114, 114, 111, 119, 59, 24985, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 24984, 384, 99, 104, 116, 2622, 2624, 2626, 242, 2124, 59, 25008, 114, 111, 107, 59, 16705, 59, 25194, 1024, 97, 99, 101, 102, 105, 111, 115, 117, 2650, 2653, 2656, 2679, 2684, 2693, 2699, 2702, 112, 59, 26885, 121, 59, 17436, 256, 100, 108, 2661, 2671, 105, 117, 109, 83, 112, 97, 99, 101, 59, 24671, 108, 105, 110, 116, 114, 102, 59, 24883, 114, 59, 49152, 55349, 56592, 110, 117, 115, 80, 108, 117, 115, 59, 25107, 112, 102, 59, 49152, 55349, 56644, 99, 242, 2678, 59, 17308, 1152, 74, 97, 99, 101, 102, 111, 115, 116, 117, 2723, 2727, 2733, 2752, 2836, 2841, 3473, 3479, 3486, 99, 121, 59, 17418, 99, 117, 116, 101, 59, 16707, 384, 97, 101, 121, 2740, 2745, 2750, 114, 111, 110, 59, 16711, 100, 105, 108, 59, 16709, 59, 17437, 384, 103, 115, 119, 2759, 2800, 2830, 97, 116, 105, 118, 101, 384, 77, 84, 86, 2771, 2783, 2792, 101, 100, 105, 117, 109, 83, 112, 97, 99, 101, 59, 24587, 104, 105, 256, 99, 110, 2790, 2776, 235, 2777, 101, 114, 121, 84, 104, 105, 238, 2777, 116, 101, 100, 256, 71, 76, 2808, 2822, 114, 101, 97, 116, 101, 114, 71, 114, 101, 97, 116, 101, 242, 1651, 101, 115, 115, 76, 101, 115, 243, 2632, 76, 105, 110, 101, 59, 16394, 114, 59, 49152, 55349, 56593, 512, 66, 110, 112, 116, 2850, 2856, 2871, 2874, 114, 101, 97, 107, 59, 24672, 66, 114, 101, 97, 107, 105, 110, 103, 83, 112, 97, 99, 101, 59, 16544, 102, 59, 24853, 1664, 59, 67, 68, 69, 71, 72, 76, 78, 80, 82, 83, 84, 86, 2901, 2902, 2922, 2940, 2977, 3051, 3076, 3166, 3204, 3238, 3288, 3425, 3461, 27372, 256, 111, 117, 2907, 2916, 110, 103, 114, 117, 101, 110, 116, 59, 25186, 112, 67, 97, 112, 59, 25197, 111, 117, 98, 108, 101, 86, 101, 114, 116, 105, 99, 97, 108, 66, 97, 114, 59, 25126, 384, 108, 113, 120, 2947, 2954, 2971, 101, 109, 101, 110, 116, 59, 25097, 117, 97, 108, 256, 59, 84, 2962, 2963, 25184, 105, 108, 100, 101, 59, 49152, 8770, 824, 105, 115, 116, 115, 59, 25092, 114, 101, 97, 116, 101, 114, 896, 59, 69, 70, 71, 76, 83, 84, 2998, 2999, 3005, 3017, 3027, 3032, 3045, 25199, 113, 117, 97, 108, 59, 25201, 117, 108, 108, 69, 113, 117, 97, 108, 59, 49152, 8807, 824, 114, 101, 97, 116, 101, 114, 59, 49152, 8811, 824, 101, 115, 115, 59, 25209, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 49152, 10878, 824, 105, 108, 100, 101, 59, 25205, 117, 109, 112, 324, 3058, 3069, 111, 119, 110, 72, 117, 109, 112, 59, 49152, 8782, 824, 113, 117, 97, 108, 59, 49152, 8783, 824, 101, 256, 102, 115, 3082, 3111, 116, 84, 114, 105, 97, 110, 103, 108, 101, 384, 59, 66, 69, 3098, 3099, 3105, 25322, 97, 114, 59, 49152, 10703, 824, 113, 117, 97, 108, 59, 25324, 115, 768, 59, 69, 71, 76, 83, 84, 3125, 3126, 3132, 3140, 3147, 3160, 25198, 113, 117, 97, 108, 59, 25200, 114, 101, 97, 116, 101, 114, 59, 25208, 101, 115, 115, 59, 49152, 8810, 824, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 49152, 10877, 824, 105, 108, 100, 101, 59, 25204, 101, 115, 116, 101, 100, 256, 71, 76, 3176, 3193, 114, 101, 97, 116, 101, 114, 71, 114, 101, 97, 116, 101, 114, 59, 49152, 10914, 824, 101, 115, 115, 76, 101, 115, 115, 59, 49152, 10913, 824, 114, 101, 99, 101, 100, 101, 115, 384, 59, 69, 83, 3218, 3219, 3227, 25216, 113, 117, 97, 108, 59, 49152, 10927, 824, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 25312, 256, 101, 105, 3243, 3257, 118, 101, 114, 115, 101, 69, 108, 101, 109, 101, 110, 116, 59, 25100, 103, 104, 116, 84, 114, 105, 97, 110, 103, 108, 101, 384, 59, 66, 69, 3275, 3276, 3282, 25323, 97, 114, 59, 49152, 10704, 824, 113, 117, 97, 108, 59, 25325, 256, 113, 117, 3293, 3340, 117, 97, 114, 101, 83, 117, 256, 98, 112, 3304, 3321, 115, 101, 116, 256, 59, 69, 3312, 3315, 49152, 8847, 824, 113, 117, 97, 108, 59, 25314, 101, 114, 115, 101, 116, 256, 59, 69, 3331, 3334, 49152, 8848, 824, 113, 117, 97, 108, 59, 25315, 384, 98, 99, 112, 3347, 3364, 3406, 115, 101, 116, 256, 59, 69, 3355, 3358, 49152, 8834, 8402, 113, 117, 97, 108, 59, 25224, 99, 101, 101, 100, 115, 512, 59, 69, 83, 84, 3378, 3379, 3387, 3398, 25217, 113, 117, 97, 108, 59, 49152, 10928, 824, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 25313, 105, 108, 100, 101, 59, 49152, 8831, 824, 101, 114, 115, 101, 116, 256, 59, 69, 3416, 3419, 49152, 8835, 8402, 113, 117, 97, 108, 59, 25225, 105, 108, 100, 101, 512, 59, 69, 70, 84, 3438, 3439, 3445, 3455, 25153, 113, 117, 97, 108, 59, 25156, 117, 108, 108, 69, 113, 117, 97, 108, 59, 25159, 105, 108, 100, 101, 59, 25161, 101, 114, 116, 105, 99, 97, 108, 66, 97, 114, 59, 25124, 99, 114, 59, 49152, 55349, 56489, 105, 108, 100, 101, 32827, 209, 16593, 59, 17309, 1792, 69, 97, 99, 100, 102, 103, 109, 111, 112, 114, 115, 116, 117, 118, 3517, 3522, 3529, 3541, 3547, 3552, 3559, 3580, 3586, 3616, 3618, 3634, 3647, 3652, 108, 105, 103, 59, 16722, 99, 117, 116, 101, 32827, 211, 16595, 256, 105, 121, 3534, 3539, 114, 99, 32827, 212, 16596, 59, 17438, 98, 108, 97, 99, 59, 16720, 114, 59, 49152, 55349, 56594, 114, 97, 118, 101, 32827, 210, 16594, 384, 97, 101, 105, 3566, 3570, 3574, 99, 114, 59, 16716, 103, 97, 59, 17321, 99, 114, 111, 110, 59, 17311, 112, 102, 59, 49152, 55349, 56646, 101, 110, 67, 117, 114, 108, 121, 256, 68, 81, 3598, 3610, 111, 117, 98, 108, 101, 81, 117, 111, 116, 101, 59, 24604, 117, 111, 116, 101, 59, 24600, 59, 27220, 256, 99, 108, 3623, 3628, 114, 59, 49152, 55349, 56490, 97, 115, 104, 32827, 216, 16600, 105, 364, 3639, 3644, 100, 101, 32827, 213, 16597, 101, 115, 59, 27191, 109, 108, 32827, 214, 16598, 101, 114, 256, 66, 80, 3659, 3680, 256, 97, 114, 3664, 3667, 114, 59, 24638, 97, 99, 256, 101, 107, 3674, 3676, 59, 25566, 101, 116, 59, 25524, 97, 114, 101, 110, 116, 104, 101, 115, 105, 115, 59, 25564, 1152, 97, 99, 102, 104, 105, 108, 111, 114, 115, 3711, 3719, 3722, 3727, 3730, 3732, 3741, 3760, 3836, 114, 116, 105, 97, 108, 68, 59, 25090, 121, 59, 17439, 114, 59, 49152, 55349, 56595, 105, 59, 17318, 59, 17312, 117, 115, 77, 105, 110, 117, 115, 59, 16561, 256, 105, 112, 3746, 3757, 110, 99, 97, 114, 101, 112, 108, 97, 110, 229, 1693, 102, 59, 24857, 512, 59, 101, 105, 111, 3769, 3770, 3808, 3812, 27323, 99, 101, 100, 101, 115, 512, 59, 69, 83, 84, 3784, 3785, 3791, 3802, 25210, 113, 117, 97, 108, 59, 27311, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 25212, 105, 108, 100, 101, 59, 25214, 109, 101, 59, 24627, 256, 100, 112, 3817, 3822, 117, 99, 116, 59, 25103, 111, 114, 116, 105, 111, 110, 256, 59, 97, 549, 3833, 108, 59, 25117, 256, 99, 105, 3841, 3846, 114, 59, 49152, 55349, 56491, 59, 17320, 512, 85, 102, 111, 115, 3857, 3862, 3867, 3871, 79, 84, 32827, 34, 16418, 114, 59, 49152, 55349, 56596, 112, 102, 59, 24858, 99, 114, 59, 49152, 55349, 56492, 1536, 66, 69, 97, 99, 101, 102, 104, 105, 111, 114, 115, 117, 3902, 3907, 3911, 3936, 3955, 4007, 4010, 4013, 4246, 4265, 4276, 4286, 97, 114, 114, 59, 26896, 71, 32827, 174, 16558, 384, 99, 110, 114, 3918, 3923, 3926, 117, 116, 101, 59, 16724, 103, 59, 26603, 114, 256, 59, 116, 3932, 3933, 24992, 108, 59, 26902, 384, 97, 101, 121, 3943, 3948, 3953, 114, 111, 110, 59, 16728, 100, 105, 108, 59, 16726, 59, 17440, 256, 59, 118, 3960, 3961, 24860, 101, 114, 115, 101, 256, 69, 85, 3970, 3993, 256, 108, 113, 3975, 3982, 101, 109, 101, 110, 116, 59, 25099, 117, 105, 108, 105, 98, 114, 105, 117, 109, 59, 25035, 112, 69, 113, 117, 105, 108, 105, 98, 114, 105, 117, 109, 59, 26991, 114, 187, 3961, 111, 59, 17313, 103, 104, 116, 1024, 65, 67, 68, 70, 84, 85, 86, 97, 4033, 4075, 4083, 4130, 4136, 4187, 4231, 984, 256, 110, 114, 4038, 4050, 103, 108, 101, 66, 114, 97, 99, 107, 101, 116, 59, 26601, 114, 111, 119, 384, 59, 66, 76, 4060, 4061, 4065, 24978, 97, 114, 59, 25061, 101, 102, 116, 65, 114, 114, 111, 119, 59, 25028, 101, 105, 108, 105, 110, 103, 59, 25353, 111, 501, 4089, 0, 4101, 98, 108, 101, 66, 114, 97, 99, 107, 101, 116, 59, 26599, 110, 468, 4106, 0, 4116, 101, 101, 86, 101, 99, 116, 111, 114, 59, 26973, 101, 99, 116, 111, 114, 256, 59, 66, 4125, 4126, 25026, 97, 114, 59, 26965, 108, 111, 111, 114, 59, 25355, 256, 101, 114, 4141, 4163, 101, 384, 59, 65, 86, 4149, 4150, 4156, 25250, 114, 114, 111, 119, 59, 24998, 101, 99, 116, 111, 114, 59, 26971, 105, 97, 110, 103, 108, 101, 384, 59, 66, 69, 4176, 4177, 4181, 25267, 97, 114, 59, 27088, 113, 117, 97, 108, 59, 25269, 112, 384, 68, 84, 86, 4195, 4206, 4216, 111, 119, 110, 86, 101, 99, 116, 111, 114, 59, 26959, 101, 101, 86, 101, 99, 116, 111, 114, 59, 26972, 101, 99, 116, 111, 114, 256, 59, 66, 4226, 4227, 25022, 97, 114, 59, 26964, 101, 99, 116, 111, 114, 256, 59, 66, 4241, 4242, 25024, 97, 114, 59, 26963, 256, 112, 117, 4251, 4254, 102, 59, 24861, 110, 100, 73, 109, 112, 108, 105, 101, 115, 59, 26992, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 25051, 256, 99, 104, 4281, 4284, 114, 59, 24859, 59, 25009, 108, 101, 68, 101, 108, 97, 121, 101, 100, 59, 27124, 1664, 72, 79, 97, 99, 102, 104, 105, 109, 111, 113, 115, 116, 117, 4324, 4337, 4343, 4349, 4377, 4382, 4433, 4438, 4449, 4455, 4533, 4539, 4543, 256, 67, 99, 4329, 4334, 72, 99, 121, 59, 17449, 121, 59, 17448, 70, 84, 99, 121, 59, 17452, 99, 117, 116, 101, 59, 16730, 640, 59, 97, 101, 105, 121, 4360, 4361, 4366, 4371, 4375, 27324, 114, 111, 110, 59, 16736, 100, 105, 108, 59, 16734, 114, 99, 59, 16732, 59, 17441, 114, 59, 49152, 55349, 56598, 111, 114, 116, 512, 68, 76, 82, 85, 4394, 4404, 4414, 4425, 111, 119, 110, 65, 114, 114, 111, 119, 187, 1054, 101, 102, 116, 65, 114, 114, 111, 119, 187, 2202, 105, 103, 104, 116, 65, 114, 114, 111, 119, 187, 4061, 112, 65, 114, 114, 111, 119, 59, 24977, 103, 109, 97, 59, 17315, 97, 108, 108, 67, 105, 114, 99, 108, 101, 59, 25112, 112, 102, 59, 49152, 55349, 56650, 626, 4461, 0, 0, 4464, 116, 59, 25114, 97, 114, 101, 512, 59, 73, 83, 85, 4475, 4476, 4489, 4527, 26017, 110, 116, 101, 114, 115, 101, 99, 116, 105, 111, 110, 59, 25235, 117, 256, 98, 112, 4495, 4510, 115, 101, 116, 256, 59, 69, 4503, 4504, 25231, 113, 117, 97, 108, 59, 25233, 101, 114, 115, 101, 116, 256, 59, 69, 4520, 4521, 25232, 113, 117, 97, 108, 59, 25234, 110, 105, 111, 110, 59, 25236, 99, 114, 59, 49152, 55349, 56494, 97, 114, 59, 25286, 512, 98, 99, 109, 112, 4552, 4571, 4617, 4619, 256, 59, 115, 4557, 4558, 25296, 101, 116, 256, 59, 69, 4557, 4565, 113, 117, 97, 108, 59, 25222, 256, 99, 104, 4576, 4613, 101, 101, 100, 115, 512, 59, 69, 83, 84, 4589, 4590, 4596, 4607, 25211, 113, 117, 97, 108, 59, 27312, 108, 97, 110, 116, 69, 113, 117, 97, 108, 59, 25213, 105, 108, 100, 101, 59, 25215, 84, 104, 225, 3980, 59, 25105, 384, 59, 101, 115, 4626, 4627, 4643, 25297, 114, 115, 101, 116, 256, 59, 69, 4636, 4637, 25219, 113, 117, 97, 108, 59, 25223, 101, 116, 187, 4627, 1408, 72, 82, 83, 97, 99, 102, 104, 105, 111, 114, 115, 4670, 4676, 4681, 4693, 4702, 4721, 4726, 4767, 4802, 4808, 4817, 79, 82, 78, 32827, 222, 16606, 65, 68, 69, 59, 24866, 256, 72, 99, 4686, 4690, 99, 121, 59, 17419, 121, 59, 17446, 256, 98, 117, 4698, 4700, 59, 16393, 59, 17316, 384, 97, 101, 121, 4709, 4714, 4719, 114, 111, 110, 59, 16740, 100, 105, 108, 59, 16738, 59, 17442, 114, 59, 49152, 55349, 56599, 256, 101, 105, 4731, 4745, 498, 4736, 0, 4743, 101, 102, 111, 114, 101, 59, 25140, 97, 59, 17304, 256, 99, 110, 4750, 4760, 107, 83, 112, 97, 99, 101, 59, 49152, 8287, 8202, 83, 112, 97, 99, 101, 59, 24585, 108, 100, 101, 512, 59, 69, 70, 84, 4779, 4780, 4786, 4796, 25148, 113, 117, 97, 108, 59, 25155, 117, 108, 108, 69, 113, 117, 97, 108, 59, 25157, 105, 108, 100, 101, 59, 25160, 112, 102, 59, 49152, 55349, 56651, 105, 112, 108, 101, 68, 111, 116, 59, 24795, 256, 99, 116, 4822, 4827, 114, 59, 49152, 55349, 56495, 114, 111, 107, 59, 16742, 2785, 4855, 4878, 4890, 4902, 0, 4908, 4913, 0, 0, 0, 0, 0, 4920, 4925, 4983, 4997, 0, 5119, 5124, 5130, 5136, 256, 99, 114, 4859, 4865, 117, 116, 101, 32827, 218, 16602, 114, 256, 59, 111, 4871, 4872, 24991, 99, 105, 114, 59, 26953, 114, 483, 4883, 0, 4886, 121, 59, 17422, 118, 101, 59, 16748, 256, 105, 121, 4894, 4899, 114, 99, 32827, 219, 16603, 59, 17443, 98, 108, 97, 99, 59, 16752, 114, 59, 49152, 55349, 56600, 114, 97, 118, 101, 32827, 217, 16601, 97, 99, 114, 59, 16746, 256, 100, 105, 4929, 4969, 101, 114, 256, 66, 80, 4936, 4957, 256, 97, 114, 4941, 4944, 114, 59, 16479, 97, 99, 256, 101, 107, 4951, 4953, 59, 25567, 101, 116, 59, 25525, 97, 114, 101, 110, 116, 104, 101, 115, 105, 115, 59, 25565, 111, 110, 256, 59, 80, 4976, 4977, 25283, 108, 117, 115, 59, 25230, 256, 103, 112, 4987, 4991, 111, 110, 59, 16754, 102, 59, 49152, 55349, 56652, 1024, 65, 68, 69, 84, 97, 100, 112, 115, 5013, 5038, 5048, 5060, 1000, 5074, 5079, 5107, 114, 114, 111, 119, 384, 59, 66, 68, 4432, 5024, 5028, 97, 114, 59, 26898, 111, 119, 110, 65, 114, 114, 111, 119, 59, 25029, 111, 119, 110, 65, 114, 114, 111, 119, 59, 24981, 113, 117, 105, 108, 105, 98, 114, 105, 117, 109, 59, 26990, 101, 101, 256, 59, 65, 5067, 5068, 25253, 114, 114, 111, 119, 59, 24997, 111, 119, 110, 225, 1011, 101, 114, 256, 76, 82, 5086, 5096, 101, 102, 116, 65, 114, 114, 111, 119, 59, 24982, 105, 103, 104, 116, 65, 114, 114, 111, 119, 59, 24983, 105, 256, 59, 108, 5113, 5114, 17362, 111, 110, 59, 17317, 105, 110, 103, 59, 16750, 99, 114, 59, 49152, 55349, 56496, 105, 108, 100, 101, 59, 16744, 109, 108, 32827, 220, 16604, 1152, 68, 98, 99, 100, 101, 102, 111, 115, 118, 5159, 5164, 5168, 5171, 5182, 5253, 5258, 5264, 5270, 97, 115, 104, 59, 25259, 97, 114, 59, 27371, 121, 59, 17426, 97, 115, 104, 256, 59, 108, 5179, 5180, 25257, 59, 27366, 256, 101, 114, 5187, 5189, 59, 25281, 384, 98, 116, 121, 5196, 5200, 5242, 97, 114, 59, 24598, 256, 59, 105, 5199, 5205, 99, 97, 108, 512, 66, 76, 83, 84, 5217, 5221, 5226, 5236, 97, 114, 59, 25123, 105, 110, 101, 59, 16508, 101, 112, 97, 114, 97, 116, 111, 114, 59, 26456, 105, 108, 100, 101, 59, 25152, 84, 104, 105, 110, 83, 112, 97, 99, 101, 59, 24586, 114, 59, 49152, 55349, 56601, 112, 102, 59, 49152, 55349, 56653, 99, 114, 59, 49152, 55349, 56497, 100, 97, 115, 104, 59, 25258, 640, 99, 101, 102, 111, 115, 5287, 5292, 5297, 5302, 5308, 105, 114, 99, 59, 16756, 100, 103, 101, 59, 25280, 114, 59, 49152, 55349, 56602, 112, 102, 59, 49152, 55349, 56654, 99, 114, 59, 49152, 55349, 56498, 512, 102, 105, 111, 115, 5323, 5328, 5330, 5336, 114, 59, 49152, 55349, 56603, 59, 17310, 112, 102, 59, 49152, 55349, 56655, 99, 114, 59, 49152, 55349, 56499, 1152, 65, 73, 85, 97, 99, 102, 111, 115, 117, 5361, 5365, 5369, 5373, 5380, 5391, 5396, 5402, 5408, 99, 121, 59, 17455, 99, 121, 59, 17415, 99, 121, 59, 17454, 99, 117, 116, 101, 32827, 221, 16605, 256, 105, 121, 5385, 5389, 114, 99, 59, 16758, 59, 17451, 114, 59, 49152, 55349, 56604, 112, 102, 59, 49152, 55349, 56656, 99, 114, 59, 49152, 55349, 56500, 109, 108, 59, 16760, 1024, 72, 97, 99, 100, 101, 102, 111, 115, 5429, 5433, 5439, 5451, 5455, 5469, 5472, 5476, 99, 121, 59, 17430, 99, 117, 116, 101, 59, 16761, 256, 97, 121, 5444, 5449, 114, 111, 110, 59, 16765, 59, 17431, 111, 116, 59, 16763, 498, 5460, 0, 5467, 111, 87, 105, 100, 116, 232, 2777, 97, 59, 17302, 114, 59, 24872, 112, 102, 59, 24868, 99, 114, 59, 49152, 55349, 56501, 3041, 5507, 5514, 5520, 0, 5552, 5558, 5567, 0, 0, 0, 0, 5574, 5595, 5611, 5727, 5741, 0, 5781, 5787, 5810, 5817, 0, 5822, 99, 117, 116, 101, 32827, 225, 16609, 114, 101, 118, 101, 59, 16643, 768, 59, 69, 100, 105, 117, 121, 5532, 5533, 5537, 5539, 5544, 5549, 25150, 59, 49152, 8766, 819, 59, 25151, 114, 99, 32827, 226, 16610, 116, 101, 32955, 180, 774, 59, 17456, 108, 105, 103, 32827, 230, 16614, 256, 59, 114, 178, 5562, 59, 49152, 55349, 56606, 114, 97, 118, 101, 32827, 224, 16608, 256, 101, 112, 5578, 5590, 256, 102, 112, 5583, 5588, 115, 121, 109, 59, 24885, 232, 5587, 104, 97, 59, 17329, 256, 97, 112, 5599, 99, 256, 99, 108, 5604, 5607, 114, 59, 16641, 103, 59, 27199, 612, 5616, 0, 0, 5642, 640, 59, 97, 100, 115, 118, 5626, 5627, 5631, 5633, 5639, 25127, 110, 100, 59, 27221, 59, 27228, 108, 111, 112, 101, 59, 27224, 59, 27226, 896, 59, 101, 108, 109, 114, 115, 122, 5656, 5657, 5659, 5662, 5695, 5711, 5721, 25120, 59, 27044, 101, 187, 5657, 115, 100, 256, 59, 97, 5669, 5670, 25121, 1121, 5680, 5682, 5684, 5686, 5688, 5690, 5692, 5694, 59, 27048, 59, 27049, 59, 27050, 59, 27051, 59, 27052, 59, 27053, 59, 27054, 59, 27055, 116, 256, 59, 118, 5701, 5702, 25119, 98, 256, 59, 100, 5708, 5709, 25278, 59, 27037, 256, 112, 116, 5716, 5719, 104, 59, 25122, 187, 185, 97, 114, 114, 59, 25468, 256, 103, 112, 5731, 5735, 111, 110, 59, 16645, 102, 59, 49152, 55349, 56658, 896, 59, 69, 97, 101, 105, 111, 112, 4801, 5755, 5757, 5762, 5764, 5767, 5770, 59, 27248, 99, 105, 114, 59, 27247, 59, 25162, 100, 59, 25163, 115, 59, 16423, 114, 111, 120, 256, 59, 101, 4801, 5778, 241, 5763, 105, 110, 103, 32827, 229, 16613, 384, 99, 116, 121, 5793, 5798, 5800, 114, 59, 49152, 55349, 56502, 59, 16426, 109, 112, 256, 59, 101, 4801, 5807, 241, 648, 105, 108, 100, 101, 32827, 227, 16611, 109, 108, 32827, 228, 16612, 256, 99, 105, 5826, 5832, 111, 110, 105, 110, 244, 626, 110, 116, 59, 27153, 2048, 78, 97, 98, 99, 100, 101, 102, 105, 107, 108, 110, 111, 112, 114, 115, 117, 5869, 5873, 5936, 5948, 5955, 5960, 6008, 6013, 6112, 6118, 6201, 6224, 5901, 6461, 6472, 6512, 111, 116, 59, 27373, 256, 99, 114, 5878, 5918, 107, 512, 99, 101, 112, 115, 5888, 5893, 5901, 5907, 111, 110, 103, 59, 25164, 112, 115, 105, 108, 111, 110, 59, 17398, 114, 105, 109, 101, 59, 24629, 105, 109, 256, 59, 101, 5914, 5915, 25149, 113, 59, 25293, 374, 5922, 5926, 101, 101, 59, 25277, 101, 100, 256, 59, 103, 5932, 5933, 25349, 101, 187, 5933, 114, 107, 256, 59, 116, 4956, 5943, 98, 114, 107, 59, 25526, 256, 111, 121, 5889, 5953, 59, 17457, 113, 117, 111, 59, 24606, 640, 99, 109, 112, 114, 116, 5971, 5979, 5985, 5988, 5992, 97, 117, 115, 256, 59, 101, 266, 265, 112, 116, 121, 118, 59, 27056, 115, 233, 5900, 110, 111, 245, 275, 384, 97, 104, 119, 5999, 6001, 6003, 59, 17330, 59, 24886, 101, 101, 110, 59, 25196, 114, 59, 49152, 55349, 56607, 103, 896, 99, 111, 115, 116, 117, 118, 119, 6029, 6045, 6067, 6081, 6101, 6107, 6110, 384, 97, 105, 117, 6036, 6038, 6042, 240, 1888, 114, 99, 59, 26095, 112, 187, 4977, 384, 100, 112, 116, 6052, 6056, 6061, 111, 116, 59, 27136, 108, 117, 115, 59, 27137, 105, 109, 101, 115, 59, 27138, 625, 6073, 0, 0, 6078, 99, 117, 112, 59, 27142, 97, 114, 59, 26117, 114, 105, 97, 110, 103, 108, 101, 256, 100, 117, 6093, 6098, 111, 119, 110, 59, 26045, 112, 59, 26035, 112, 108, 117, 115, 59, 27140, 101, 229, 5188, 229, 5293, 97, 114, 111, 119, 59, 26893, 384, 97, 107, 111, 6125, 6182, 6197, 256, 99, 110, 6130, 6179, 107, 384, 108, 115, 116, 6138, 1451, 6146, 111, 122, 101, 110, 103, 101, 59, 27115, 114, 105, 97, 110, 103, 108, 101, 512, 59, 100, 108, 114, 6162, 6163, 6168, 6173, 26036, 111, 119, 110, 59, 26046, 101, 102, 116, 59, 26050, 105, 103, 104, 116, 59, 26040, 107, 59, 25635, 433, 6187, 0, 6195, 434, 6191, 0, 6193, 59, 26002, 59, 26001, 52, 59, 26003, 99, 107, 59, 25992, 256, 101, 111, 6206, 6221, 256, 59, 113, 6211, 6214, 49152, 61, 8421, 117, 105, 118, 59, 49152, 8801, 8421, 116, 59, 25360, 512, 112, 116, 119, 120, 6233, 6238, 6247, 6252, 102, 59, 49152, 55349, 56659, 256, 59, 116, 5067, 6243, 111, 109, 187, 5068, 116, 105, 101, 59, 25288, 1536, 68, 72, 85, 86, 98, 100, 104, 109, 112, 116, 117, 118, 6277, 6294, 6314, 6331, 6359, 6363, 6380, 6399, 6405, 6410, 6416, 6433, 512, 76, 82, 108, 114, 6286, 6288, 6290, 6292, 59, 25943, 59, 25940, 59, 25942, 59, 25939, 640, 59, 68, 85, 100, 117, 6305, 6306, 6308, 6310, 6312, 25936, 59, 25958, 59, 25961, 59, 25956, 59, 25959, 512, 76, 82, 108, 114, 6323, 6325, 6327, 6329, 59, 25949, 59, 25946, 59, 25948, 59, 25945, 896, 59, 72, 76, 82, 104, 108, 114, 6346, 6347, 6349, 6351, 6353, 6355, 6357, 25937, 59, 25964, 59, 25955, 59, 25952, 59, 25963, 59, 25954, 59, 25951, 111, 120, 59, 27081, 512, 76, 82, 108, 114, 6372, 6374, 6376, 6378, 59, 25941, 59, 25938, 59, 25872, 59, 25868, 640, 59, 68, 85, 100, 117, 1725, 6391, 6393, 6395, 6397, 59, 25957, 59, 25960, 59, 25900, 59, 25908, 105, 110, 117, 115, 59, 25247, 108, 117, 115, 59, 25246, 105, 109, 101, 115, 59, 25248, 512, 76, 82, 108, 114, 6425, 6427, 6429, 6431, 59, 25947, 59, 25944, 59, 25880, 59, 25876, 896, 59, 72, 76, 82, 104, 108, 114, 6448, 6449, 6451, 6453, 6455, 6457, 6459, 25858, 59, 25962, 59, 25953, 59, 25950, 59, 25916, 59, 25892, 59, 25884, 256, 101, 118, 291, 6466, 98, 97, 114, 32827, 166, 16550, 512, 99, 101, 105, 111, 6481, 6486, 6490, 6496, 114, 59, 49152, 55349, 56503, 109, 105, 59, 24655, 109, 256, 59, 101, 5914, 5916, 108, 384, 59, 98, 104, 6504, 6505, 6507, 16476, 59, 27077, 115, 117, 98, 59, 26568, 364, 6516, 6526, 108, 256, 59, 101, 6521, 6522, 24610, 116, 187, 6522, 112, 384, 59, 69, 101, 303, 6533, 6535, 59, 27310, 256, 59, 113, 1756, 1755, 3297, 6567, 0, 6632, 6673, 6677, 6706, 0, 6711, 6736, 0, 0, 6836, 0, 0, 6849, 0, 0, 6945, 6958, 6989, 6994, 0, 7165, 0, 7180, 384, 99, 112, 114, 6573, 6578, 6621, 117, 116, 101, 59, 16647, 768, 59, 97, 98, 99, 100, 115, 6591, 6592, 6596, 6602, 6613, 6617, 25129, 110, 100, 59, 27204, 114, 99, 117, 112, 59, 27209, 256, 97, 117, 6607, 6610, 112, 59, 27211, 112, 59, 27207, 111, 116, 59, 27200, 59, 49152, 8745, 65024, 256, 101, 111, 6626, 6629, 116, 59, 24641, 238, 1683, 512, 97, 101, 105, 117, 6640, 6651, 6657, 6661, 496, 6645, 0, 6648, 115, 59, 27213, 111, 110, 59, 16653, 100, 105, 108, 32827, 231, 16615, 114, 99, 59, 16649, 112, 115, 256, 59, 115, 6668, 6669, 27212, 109, 59, 27216, 111, 116, 59, 16651, 384, 100, 109, 110, 6683, 6688, 6694, 105, 108, 32955, 184, 429, 112, 116, 121, 118, 59, 27058, 116, 33024, 162, 59, 101, 6701, 6702, 16546, 114, 228, 434, 114, 59, 49152, 55349, 56608, 384, 99, 101, 105, 6717, 6720, 6733, 121, 59, 17479, 99, 107, 256, 59, 109, 6727, 6728, 26387, 97, 114, 107, 187, 6728, 59, 17351, 114, 896, 59, 69, 99, 101, 102, 109, 115, 6751, 6752, 6754, 6763, 6820, 6826, 6830, 26059, 59, 27075, 384, 59, 101, 108, 6761, 6762, 6765, 17094, 113, 59, 25175, 101, 609, 6772, 0, 0, 6792, 114, 114, 111, 119, 256, 108, 114, 6780, 6785, 101, 102, 116, 59, 25018, 105, 103, 104, 116, 59, 25019, 640, 82, 83, 97, 99, 100, 6802, 6804, 6806, 6810, 6815, 187, 3911, 59, 25800, 115, 116, 59, 25243, 105, 114, 99, 59, 25242, 97, 115, 104, 59, 25245, 110, 105, 110, 116, 59, 27152, 105, 100, 59, 27375, 99, 105, 114, 59, 27074, 117, 98, 115, 256, 59, 117, 6843, 6844, 26211, 105, 116, 187, 6844, 748, 6855, 6868, 6906, 0, 6922, 111, 110, 256, 59, 101, 6861, 6862, 16442, 256, 59, 113, 199, 198, 621, 6873, 0, 0, 6882, 97, 256, 59, 116, 6878, 6879, 16428, 59, 16448, 384, 59, 102, 108, 6888, 6889, 6891, 25089, 238, 4448, 101, 256, 109, 120, 6897, 6902, 101, 110, 116, 187, 6889, 101, 243, 589, 487, 6910, 0, 6919, 256, 59, 100, 4795, 6914, 111, 116, 59, 27245, 110, 244, 582, 384, 102, 114, 121, 6928, 6932, 6935, 59, 49152, 55349, 56660, 111, 228, 596, 33024, 169, 59, 115, 341, 6941, 114, 59, 24855, 256, 97, 111, 6949, 6953, 114, 114, 59, 25013, 115, 115, 59, 26391, 256, 99, 117, 6962, 6967, 114, 59, 49152, 55349, 56504, 256, 98, 112, 6972, 6980, 256, 59, 101, 6977, 6978, 27343, 59, 27345, 256, 59, 101, 6985, 6986, 27344, 59, 27346, 100, 111, 116, 59, 25327, 896, 100, 101, 108, 112, 114, 118, 119, 7008, 7020, 7031, 7042, 7084, 7124, 7161, 97, 114, 114, 256, 108, 114, 7016, 7018, 59, 26936, 59, 26933, 624, 7026, 0, 0, 7029, 114, 59, 25310, 99, 59, 25311, 97, 114, 114, 256, 59, 112, 7039, 7040, 25014, 59, 26941, 768, 59, 98, 99, 100, 111, 115, 7055, 7056, 7062, 7073, 7077, 7080, 25130, 114, 99, 97, 112, 59, 27208, 256, 97, 117, 7067, 7070, 112, 59, 27206, 112, 59, 27210, 111, 116, 59, 25229, 114, 59, 27205, 59, 49152, 8746, 65024, 512, 97, 108, 114, 118, 7093, 7103, 7134, 7139, 114, 114, 256, 59, 109, 7100, 7101, 25015, 59, 26940, 121, 384, 101, 118, 119, 7111, 7124, 7128, 113, 624, 7118, 0, 0, 7122, 114, 101, 227, 7027, 117, 227, 7029, 101, 101, 59, 25294, 101, 100, 103, 101, 59, 25295, 101, 110, 32827, 164, 16548, 101, 97, 114, 114, 111, 119, 256, 108, 114, 7150, 7155, 101, 102, 116, 187, 7040, 105, 103, 104, 116, 187, 7101, 101, 228, 7133, 256, 99, 105, 7169, 7175, 111, 110, 105, 110, 244, 503, 110, 116, 59, 25137, 108, 99, 116, 121, 59, 25389, 2432, 65, 72, 97, 98, 99, 100, 101, 102, 104, 105, 106, 108, 111, 114, 115, 116, 117, 119, 122, 7224, 7227, 7231, 7261, 7273, 7285, 7306, 7326, 7340, 7351, 7419, 7423, 7437, 7547, 7569, 7595, 7611, 7622, 7629, 114, 242, 897, 97, 114, 59, 26981, 512, 103, 108, 114, 115, 7240, 7245, 7250, 7252, 103, 101, 114, 59, 24608, 101, 116, 104, 59, 24888, 242, 4403, 104, 256, 59, 118, 7258, 7259, 24592, 187, 2314, 363, 7265, 7271, 97, 114, 111, 119, 59, 26895, 97, 227, 789, 256, 97, 121, 7278, 7283, 114, 111, 110, 59, 16655, 59, 17460, 384, 59, 97, 111, 818, 7292, 7300, 256, 103, 114, 703, 7297, 114, 59, 25034, 116, 115, 101, 113, 59, 27255, 384, 103, 108, 109, 7313, 7316, 7320, 32827, 176, 16560, 116, 97, 59, 17332, 112, 116, 121, 118, 59, 27057, 256, 105, 114, 7331, 7336, 115, 104, 116, 59, 27007, 59, 49152, 55349, 56609, 97, 114, 256, 108, 114, 7347, 7349, 187, 2268, 187, 4126, 640, 97, 101, 103, 115, 118, 7362, 888, 7382, 7388, 7392, 109, 384, 59, 111, 115, 806, 7370, 7380, 110, 100, 256, 59, 115, 806, 7377, 117, 105, 116, 59, 26214, 97, 109, 109, 97, 59, 17373, 105, 110, 59, 25330, 384, 59, 105, 111, 7399, 7400, 7416, 16631, 100, 101, 33024, 247, 59, 111, 7399, 7408, 110, 116, 105, 109, 101, 115, 59, 25287, 110, 248, 7415, 99, 121, 59, 17490, 99, 623, 7430, 0, 0, 7434, 114, 110, 59, 25374, 111, 112, 59, 25357, 640, 108, 112, 116, 117, 119, 7448, 7453, 7458, 7497, 7509, 108, 97, 114, 59, 16420, 102, 59, 49152, 55349, 56661, 640, 59, 101, 109, 112, 115, 779, 7469, 7479, 7485, 7490, 113, 256, 59, 100, 850, 7475, 111, 116, 59, 25169, 105, 110, 117, 115, 59, 25144, 108, 117, 115, 59, 25108, 113, 117, 97, 114, 101, 59, 25249, 98, 108, 101, 98, 97, 114, 119, 101, 100, 103, 229, 250, 110, 384, 97, 100, 104, 4398, 7517, 7527, 111, 119, 110, 97, 114, 114, 111, 119, 243, 7299, 97, 114, 112, 111, 111, 110, 256, 108, 114, 7538, 7542, 101, 102, 244, 7348, 105, 103, 104, 244, 7350, 354, 7551, 7557, 107, 97, 114, 111, 247, 3906, 623, 7562, 0, 0, 7566, 114, 110, 59, 25375, 111, 112, 59, 25356, 384, 99, 111, 116, 7576, 7587, 7590, 256, 114, 121, 7581, 7585, 59, 49152, 55349, 56505, 59, 17493, 108, 59, 27126, 114, 111, 107, 59, 16657, 256, 100, 114, 7600, 7604, 111, 116, 59, 25329, 105, 256, 59, 102, 7610, 6166, 26047, 256, 97, 104, 7616, 7619, 114, 242, 1065, 97, 242, 4006, 97, 110, 103, 108, 101, 59, 27046, 256, 99, 105, 7634, 7637, 121, 59, 17503, 103, 114, 97, 114, 114, 59, 26623, 2304, 68, 97, 99, 100, 101, 102, 103, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 120, 7681, 7689, 7705, 7736, 1400, 7740, 7753, 7777, 7806, 7845, 7855, 7869, 7905, 7978, 7991, 8004, 8014, 8026, 256, 68, 111, 7686, 7476, 111, 244, 7305, 256, 99, 115, 7694, 7700, 117, 116, 101, 32827, 233, 16617, 116, 101, 114, 59, 27246, 512, 97, 105, 111, 121, 7714, 7719, 7729, 7734, 114, 111, 110, 59, 16667, 114, 256, 59, 99, 7725, 7726, 25174, 32827, 234, 16618, 108, 111, 110, 59, 25173, 59, 17485, 111, 116, 59, 16663, 256, 68, 114, 7745, 7749, 111, 116, 59, 25170, 59, 49152, 55349, 56610, 384, 59, 114, 115, 7760, 7761, 7767, 27290, 97, 118, 101, 32827, 232, 16616, 256, 59, 100, 7772, 7773, 27286, 111, 116, 59, 27288, 512, 59, 105, 108, 115, 7786, 7787, 7794, 7796, 27289, 110, 116, 101, 114, 115, 59, 25575, 59, 24851, 256, 59, 100, 7801, 7802, 27285, 111, 116, 59, 27287, 384, 97, 112, 115, 7813, 7817, 7831, 99, 114, 59, 16659, 116, 121, 384, 59, 115, 118, 7826, 7827, 7829, 25093, 101, 116, 187, 7827, 112, 256, 49, 59, 7837, 7844, 307, 7841, 7843, 59, 24580, 59, 24581, 24579, 256, 103, 115, 7850, 7852, 59, 16715, 112, 59, 24578, 256, 103, 112, 7860, 7864, 111, 110, 59, 16665, 102, 59, 49152, 55349, 56662, 384, 97, 108, 115, 7876, 7886, 7890, 114, 256, 59, 115, 7882, 7883, 25301, 108, 59, 27107, 117, 115, 59, 27249, 105, 384, 59, 108, 118, 7898, 7899, 7903, 17333, 111, 110, 187, 7899, 59, 17397, 512, 99, 115, 117, 118, 7914, 7923, 7947, 7971, 256, 105, 111, 7919, 7729, 114, 99, 187, 7726, 617, 7929, 0, 0, 7931, 237, 1352, 97, 110, 116, 256, 103, 108, 7938, 7942, 116, 114, 187, 7773, 101, 115, 115, 187, 7802, 384, 97, 101, 105, 7954, 7958, 7962, 108, 115, 59, 16445, 115, 116, 59, 25183, 118, 256, 59, 68, 565, 7968, 68, 59, 27256, 112, 97, 114, 115, 108, 59, 27109, 256, 68, 97, 7983, 7987, 111, 116, 59, 25171, 114, 114, 59, 26993, 384, 99, 100, 105, 7998, 8001, 7928, 114, 59, 24879, 111, 244, 850, 256, 97, 104, 8009, 8011, 59, 17335, 32827, 240, 16624, 256, 109, 114, 8019, 8023, 108, 32827, 235, 16619, 111, 59, 24748, 384, 99, 105, 112, 8033, 8036, 8039, 108, 59, 16417, 115, 244, 1390, 256, 101, 111, 8044, 8052, 99, 116, 97, 116, 105, 111, 238, 1369, 110, 101, 110, 116, 105, 97, 108, 229, 1401, 2529, 8082, 0, 8094, 0, 8097, 8103, 0, 0, 8134, 8140, 0, 8147, 0, 8166, 8170, 8192, 0, 8200, 8282, 108, 108, 105, 110, 103, 100, 111, 116, 115, 101, 241, 7748, 121, 59, 17476, 109, 97, 108, 101, 59, 26176, 384, 105, 108, 114, 8109, 8115, 8129, 108, 105, 103, 59, 32768, 64259, 617, 8121, 0, 0, 8125, 103, 59, 32768, 64256, 105, 103, 59, 32768, 64260, 59, 49152, 55349, 56611, 108, 105, 103, 59, 32768, 64257, 108, 105, 103, 59, 49152, 102, 106, 384, 97, 108, 116, 8153, 8156, 8161, 116, 59, 26221, 105, 103, 59, 32768, 64258, 110, 115, 59, 26033, 111, 102, 59, 16786, 496, 8174, 0, 8179, 102, 59, 49152, 55349, 56663, 256, 97, 107, 1471, 8183, 256, 59, 118, 8188, 8189, 25300, 59, 27353, 97, 114, 116, 105, 110, 116, 59, 27149, 256, 97, 111, 8204, 8277, 256, 99, 115, 8209, 8274, 945, 8218, 8240, 8248, 8261, 8264, 0, 8272, 946, 8226, 8229, 8231, 8234, 8236, 0, 8238, 32827, 189, 16573, 59, 24915, 32827, 188, 16572, 59, 24917, 59, 24921, 59, 24923, 435, 8244, 0, 8246, 59, 24916, 59, 24918, 692, 8254, 8257, 0, 0, 8259, 32827, 190, 16574, 59, 24919, 59, 24924, 53, 59, 24920, 438, 8268, 0, 8270, 59, 24922, 59, 24925, 56, 59, 24926, 108, 59, 24644, 119, 110, 59, 25378, 99, 114, 59, 49152, 55349, 56507, 2176, 69, 97, 98, 99, 100, 101, 102, 103, 105, 106, 108, 110, 111, 114, 115, 116, 118, 8322, 8329, 8351, 8357, 8368, 8372, 8432, 8437, 8442, 8447, 8451, 8466, 8504, 791, 8510, 8530, 8606, 256, 59, 108, 1613, 8327, 59, 27276, 384, 99, 109, 112, 8336, 8341, 8349, 117, 116, 101, 59, 16885, 109, 97, 256, 59, 100, 8348, 7386, 17331, 59, 27270, 114, 101, 118, 101, 59, 16671, 256, 105, 121, 8362, 8366, 114, 99, 59, 16669, 59, 17459, 111, 116, 59, 16673, 512, 59, 108, 113, 115, 1598, 1602, 8381, 8393, 384, 59, 113, 115, 1598, 1612, 8388, 108, 97, 110, 244, 1637, 512, 59, 99, 100, 108, 1637, 8402, 8405, 8421, 99, 59, 27305, 111, 116, 256, 59, 111, 8412, 8413, 27264, 256, 59, 108, 8418, 8419, 27266, 59, 27268, 256, 59, 101, 8426, 8429, 49152, 8923, 65024, 115, 59, 27284, 114, 59, 49152, 55349, 56612, 256, 59, 103, 1651, 1563, 109, 101, 108, 59, 24887, 99, 121, 59, 17491, 512, 59, 69, 97, 106, 1626, 8460, 8462, 8464, 59, 27282, 59, 27301, 59, 27300, 512, 69, 97, 101, 115, 8475, 8477, 8489, 8500, 59, 25193, 112, 256, 59, 112, 8483, 8484, 27274, 114, 111, 120, 187, 8484, 256, 59, 113, 8494, 8495, 27272, 256, 59, 113, 8494, 8475, 105, 109, 59, 25319, 112, 102, 59, 49152, 55349, 56664, 256, 99, 105, 8515, 8518, 114, 59, 24842, 109, 384, 59, 101, 108, 1643, 8526, 8528, 59, 27278, 59, 27280, 33536, 62, 59, 99, 100, 108, 113, 114, 1518, 8544, 8554, 8558, 8563, 8569, 256, 99, 105, 8549, 8551, 59, 27303, 114, 59, 27258, 111, 116, 59, 25303, 80, 97, 114, 59, 27029, 117, 101, 115, 116, 59, 27260, 640, 97, 100, 101, 108, 115, 8580, 8554, 8592, 1622, 8603, 496, 8585, 0, 8590, 112, 114, 111, 248, 8350, 114, 59, 27000, 113, 256, 108, 113, 1599, 8598, 108, 101, 115, 243, 8328, 105, 237, 1643, 256, 101, 110, 8611, 8621, 114, 116, 110, 101, 113, 113, 59, 49152, 8809, 65024, 197, 8618, 1280, 65, 97, 98, 99, 101, 102, 107, 111, 115, 121, 8644, 8647, 8689, 8693, 8698, 8728, 8733, 8751, 8808, 8829, 114, 242, 928, 512, 105, 108, 109, 114, 8656, 8660, 8663, 8667, 114, 115, 240, 5252, 102, 187, 8228, 105, 108, 244, 1705, 256, 100, 114, 8672, 8676, 99, 121, 59, 17482, 384, 59, 99, 119, 2292, 8683, 8687, 105, 114, 59, 26952, 59, 25005, 97, 114, 59, 24847, 105, 114, 99, 59, 16677, 384, 97, 108, 114, 8705, 8718, 8723, 114, 116, 115, 256, 59, 117, 8713, 8714, 26213, 105, 116, 187, 8714, 108, 105, 112, 59, 24614, 99, 111, 110, 59, 25273, 114, 59, 49152, 55349, 56613, 115, 256, 101, 119, 8739, 8745, 97, 114, 111, 119, 59, 26917, 97, 114, 111, 119, 59, 26918, 640, 97, 109, 111, 112, 114, 8762, 8766, 8771, 8798, 8803, 114, 114, 59, 25087, 116, 104, 116, 59, 25147, 107, 256, 108, 114, 8777, 8787, 101, 102, 116, 97, 114, 114, 111, 119, 59, 25001, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 25002, 102, 59, 49152, 55349, 56665, 98, 97, 114, 59, 24597, 384, 99, 108, 116, 8815, 8820, 8824, 114, 59, 49152, 55349, 56509, 97, 115, 232, 8692, 114, 111, 107, 59, 16679, 256, 98, 112, 8834, 8839, 117, 108, 108, 59, 24643, 104, 101, 110, 187, 7259, 2785, 8867, 0, 8874, 0, 8888, 8901, 8910, 0, 8917, 8947, 0, 0, 8952, 8994, 9063, 9058, 9087, 0, 9094, 9130, 9140, 99, 117, 116, 101, 32827, 237, 16621, 384, 59, 105, 121, 1905, 8880, 8885, 114, 99, 32827, 238, 16622, 59, 17464, 256, 99, 120, 8892, 8895, 121, 59, 17461, 99, 108, 32827, 161, 16545, 256, 102, 114, 927, 8905, 59, 49152, 55349, 56614, 114, 97, 118, 101, 32827, 236, 16620, 512, 59, 105, 110, 111, 1854, 8925, 8937, 8942, 256, 105, 110, 8930, 8934, 110, 116, 59, 27148, 116, 59, 25133, 102, 105, 110, 59, 27100, 116, 97, 59, 24873, 108, 105, 103, 59, 16691, 384, 97, 111, 112, 8958, 8986, 8989, 384, 99, 103, 116, 8965, 8968, 8983, 114, 59, 16683, 384, 101, 108, 112, 1823, 8975, 8979, 105, 110, 229, 1934, 97, 114, 244, 1824, 104, 59, 16689, 102, 59, 25271, 101, 100, 59, 16821, 640, 59, 99, 102, 111, 116, 1268, 9004, 9009, 9021, 9025, 97, 114, 101, 59, 24837, 105, 110, 256, 59, 116, 9016, 9017, 25118, 105, 101, 59, 27101, 100, 111, 244, 8985, 640, 59, 99, 101, 108, 112, 1879, 9036, 9040, 9051, 9057, 97, 108, 59, 25274, 256, 103, 114, 9045, 9049, 101, 114, 243, 5475, 227, 9037, 97, 114, 104, 107, 59, 27159, 114, 111, 100, 59, 27196, 512, 99, 103, 112, 116, 9071, 9074, 9078, 9083, 121, 59, 17489, 111, 110, 59, 16687, 102, 59, 49152, 55349, 56666, 97, 59, 17337, 117, 101, 115, 116, 32827, 191, 16575, 256, 99, 105, 9098, 9103, 114, 59, 49152, 55349, 56510, 110, 640, 59, 69, 100, 115, 118, 1268, 9115, 9117, 9121, 1267, 59, 25337, 111, 116, 59, 25333, 256, 59, 118, 9126, 9127, 25332, 59, 25331, 256, 59, 105, 1911, 9134, 108, 100, 101, 59, 16681, 491, 9144, 0, 9148, 99, 121, 59, 17494, 108, 32827, 239, 16623, 768, 99, 102, 109, 111, 115, 117, 9164, 9175, 9180, 9185, 9191, 9205, 256, 105, 121, 9169, 9173, 114, 99, 59, 16693, 59, 17465, 114, 59, 49152, 55349, 56615, 97, 116, 104, 59, 16951, 112, 102, 59, 49152, 55349, 56667, 483, 9196, 0, 9201, 114, 59, 49152, 55349, 56511, 114, 99, 121, 59, 17496, 107, 99, 121, 59, 17492, 1024, 97, 99, 102, 103, 104, 106, 111, 115, 9227, 9238, 9250, 9255, 9261, 9265, 9269, 9275, 112, 112, 97, 256, 59, 118, 9235, 9236, 17338, 59, 17392, 256, 101, 121, 9243, 9248, 100, 105, 108, 59, 16695, 59, 17466, 114, 59, 49152, 55349, 56616, 114, 101, 101, 110, 59, 16696, 99, 121, 59, 17477, 99, 121, 59, 17500, 112, 102, 59, 49152, 55349, 56668, 99, 114, 59, 49152, 55349, 56512, 2944, 65, 66, 69, 72, 97, 98, 99, 100, 101, 102, 103, 104, 106, 108, 109, 110, 111, 112, 114, 115, 116, 117, 118, 9328, 9345, 9350, 9357, 9361, 9486, 9533, 9562, 9600, 9806, 9822, 9829, 9849, 9853, 9882, 9906, 9944, 10077, 10088, 10123, 10176, 10241, 10258, 384, 97, 114, 116, 9335, 9338, 9340, 114, 242, 2502, 242, 917, 97, 105, 108, 59, 26907, 97, 114, 114, 59, 26894, 256, 59, 103, 2452, 9355, 59, 27275, 97, 114, 59, 26978, 2403, 9381, 0, 9386, 0, 9393, 0, 0, 0, 0, 0, 9397, 9402, 0, 9414, 9416, 9421, 0, 9465, 117, 116, 101, 59, 16698, 109, 112, 116, 121, 118, 59, 27060, 114, 97, 238, 2124, 98, 100, 97, 59, 17339, 103, 384, 59, 100, 108, 2190, 9409, 9411, 59, 27025, 229, 2190, 59, 27269, 117, 111, 32827, 171, 16555, 114, 1024, 59, 98, 102, 104, 108, 112, 115, 116, 2201, 9438, 9446, 9449, 9451, 9454, 9457, 9461, 256, 59, 102, 2205, 9443, 115, 59, 26911, 115, 59, 26909, 235, 8786, 112, 59, 25003, 108, 59, 26937, 105, 109, 59, 26995, 108, 59, 24994, 384, 59, 97, 101, 9471, 9472, 9476, 27307, 105, 108, 59, 26905, 256, 59, 115, 9481, 9482, 27309, 59, 49152, 10925, 65024, 384, 97, 98, 114, 9493, 9497, 9501, 114, 114, 59, 26892, 114, 107, 59, 26482, 256, 97, 107, 9506, 9516, 99, 256, 101, 107, 9512, 9514, 59, 16507, 59, 16475, 256, 101, 115, 9521, 9523, 59, 27019, 108, 256, 100, 117, 9529, 9531, 59, 27023, 59, 27021, 512, 97, 101, 117, 121, 9542, 9547, 9558, 9560, 114, 111, 110, 59, 16702, 256, 100, 105, 9552, 9556, 105, 108, 59, 16700, 236, 2224, 226, 9513, 59, 17467, 512, 99, 113, 114, 115, 9571, 9574, 9581, 9597, 97, 59, 26934, 117, 111, 256, 59, 114, 3609, 5958, 256, 100, 117, 9586, 9591, 104, 97, 114, 59, 26983, 115, 104, 97, 114, 59, 26955, 104, 59, 25010, 640, 59, 102, 103, 113, 115, 9611, 9612, 2441, 9715, 9727, 25188, 116, 640, 97, 104, 108, 114, 116, 9624, 9636, 9655, 9666, 9704, 114, 114, 111, 119, 256, 59, 116, 2201, 9633, 97, 233, 9462, 97, 114, 112, 111, 111, 110, 256, 100, 117, 9647, 9652, 111, 119, 110, 187, 1114, 112, 187, 2406, 101, 102, 116, 97, 114, 114, 111, 119, 115, 59, 25031, 105, 103, 104, 116, 384, 97, 104, 115, 9677, 9686, 9694, 114, 114, 111, 119, 256, 59, 115, 2292, 2215, 97, 114, 112, 111, 111, 110, 243, 3992, 113, 117, 105, 103, 97, 114, 114, 111, 247, 8688, 104, 114, 101, 101, 116, 105, 109, 101, 115, 59, 25291, 384, 59, 113, 115, 9611, 2451, 9722, 108, 97, 110, 244, 2476, 640, 59, 99, 100, 103, 115, 2476, 9738, 9741, 9757, 9768, 99, 59, 27304, 111, 116, 256, 59, 111, 9748, 9749, 27263, 256, 59, 114, 9754, 9755, 27265, 59, 27267, 256, 59, 101, 9762, 9765, 49152, 8922, 65024, 115, 59, 27283, 640, 97, 100, 101, 103, 115, 9779, 9785, 9789, 9801, 9803, 112, 112, 114, 111, 248, 9414, 111, 116, 59, 25302, 113, 256, 103, 113, 9795, 9797, 244, 2441, 103, 116, 242, 9356, 244, 2459, 105, 237, 2482, 384, 105, 108, 114, 9813, 2273, 9818, 115, 104, 116, 59, 27004, 59, 49152, 55349, 56617, 256, 59, 69, 2460, 9827, 59, 27281, 353, 9833, 9846, 114, 256, 100, 117, 9650, 9838, 256, 59, 108, 2405, 9843, 59, 26986, 108, 107, 59, 25988, 99, 121, 59, 17497, 640, 59, 97, 99, 104, 116, 2632, 9864, 9867, 9873, 9878, 114, 242, 9665, 111, 114, 110, 101, 242, 7432, 97, 114, 100, 59, 26987, 114, 105, 59, 26106, 256, 105, 111, 9887, 9892, 100, 111, 116, 59, 16704, 117, 115, 116, 256, 59, 97, 9900, 9901, 25520, 99, 104, 101, 187, 9901, 512, 69, 97, 101, 115, 9915, 9917, 9929, 9940, 59, 25192, 112, 256, 59, 112, 9923, 9924, 27273, 114, 111, 120, 187, 9924, 256, 59, 113, 9934, 9935, 27271, 256, 59, 113, 9934, 9915, 105, 109, 59, 25318, 1024, 97, 98, 110, 111, 112, 116, 119, 122, 9961, 9972, 9975, 10010, 10031, 10049, 10055, 10064, 256, 110, 114, 9966, 9969, 103, 59, 26604, 114, 59, 25085, 114, 235, 2241, 103, 384, 108, 109, 114, 9983, 9997, 10004, 101, 102, 116, 256, 97, 114, 2534, 9991, 105, 103, 104, 116, 225, 2546, 97, 112, 115, 116, 111, 59, 26620, 105, 103, 104, 116, 225, 2557, 112, 97, 114, 114, 111, 119, 256, 108, 114, 10021, 10025, 101, 102, 244, 9453, 105, 103, 104, 116, 59, 25004, 384, 97, 102, 108, 10038, 10041, 10045, 114, 59, 27013, 59, 49152, 55349, 56669, 117, 115, 59, 27181, 105, 109, 101, 115, 59, 27188, 353, 10059, 10063, 115, 116, 59, 25111, 225, 4942, 384, 59, 101, 102, 10071, 10072, 6144, 26058, 110, 103, 101, 187, 10072, 97, 114, 256, 59, 108, 10084, 10085, 16424, 116, 59, 27027, 640, 97, 99, 104, 109, 116, 10099, 10102, 10108, 10117, 10119, 114, 242, 2216, 111, 114, 110, 101, 242, 7564, 97, 114, 256, 59, 100, 3992, 10115, 59, 26989, 59, 24590, 114, 105, 59, 25279, 768, 97, 99, 104, 105, 113, 116, 10136, 10141, 2624, 10146, 10158, 10171, 113, 117, 111, 59, 24633, 114, 59, 49152, 55349, 56513, 109, 384, 59, 101, 103, 2482, 10154, 10156, 59, 27277, 59, 27279, 256, 98, 117, 9514, 10163, 111, 256, 59, 114, 3615, 10169, 59, 24602, 114, 111, 107, 59, 16706, 33792, 60, 59, 99, 100, 104, 105, 108, 113, 114, 2091, 10194, 9785, 10204, 10208, 10213, 10218, 10224, 256, 99, 105, 10199, 10201, 59, 27302, 114, 59, 27257, 114, 101, 229, 9714, 109, 101, 115, 59, 25289, 97, 114, 114, 59, 26998, 117, 101, 115, 116, 59, 27259, 256, 80, 105, 10229, 10233, 97, 114, 59, 27030, 384, 59, 101, 102, 10240, 2349, 6171, 26051, 114, 256, 100, 117, 10247, 10253, 115, 104, 97, 114, 59, 26954, 104, 97, 114, 59, 26982, 256, 101, 110, 10263, 10273, 114, 116, 110, 101, 113, 113, 59, 49152, 8808, 65024, 197, 10270, 1792, 68, 97, 99, 100, 101, 102, 104, 105, 108, 110, 111, 112, 115, 117, 10304, 10309, 10370, 10382, 10387, 10400, 10405, 10408, 10458, 10466, 10468, 2691, 10483, 10498, 68, 111, 116, 59, 25146, 512, 99, 108, 112, 114, 10318, 10322, 10339, 10365, 114, 32827, 175, 16559, 256, 101, 116, 10327, 10329, 59, 26178, 256, 59, 101, 10334, 10335, 26400, 115, 101, 187, 10335, 256, 59, 115, 4155, 10344, 116, 111, 512, 59, 100, 108, 117, 4155, 10355, 10359, 10363, 111, 119, 238, 1164, 101, 102, 244, 2319, 240, 5073, 107, 101, 114, 59, 26030, 256, 111, 121, 10375, 10380, 109, 109, 97, 59, 27177, 59, 17468, 97, 115, 104, 59, 24596, 97, 115, 117, 114, 101, 100, 97, 110, 103, 108, 101, 187, 5670, 114, 59, 49152, 55349, 56618, 111, 59, 24871, 384, 99, 100, 110, 10415, 10420, 10441, 114, 111, 32827, 181, 16565, 512, 59, 97, 99, 100, 5220, 10429, 10432, 10436, 115, 244, 5799, 105, 114, 59, 27376, 111, 116, 32955, 183, 437, 117, 115, 384, 59, 98, 100, 10450, 6403, 10451, 25106, 256, 59, 117, 7484, 10456, 59, 27178, 355, 10462, 10465, 112, 59, 27355, 242, 8722, 240, 2689, 256, 100, 112, 10473, 10478, 101, 108, 115, 59, 25255, 102, 59, 49152, 55349, 56670, 256, 99, 116, 10488, 10493, 114, 59, 49152, 55349, 56514, 112, 111, 115, 187, 5533, 384, 59, 108, 109, 10505, 10506, 10509, 17340, 116, 105, 109, 97, 112, 59, 25272, 3072, 71, 76, 82, 86, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 108, 109, 111, 112, 114, 115, 116, 117, 118, 119, 10562, 10579, 10622, 10633, 10648, 10714, 10729, 10773, 10778, 10840, 10845, 10883, 10901, 10916, 10920, 11012, 11015, 11076, 11135, 11182, 11316, 11367, 11388, 11497, 256, 103, 116, 10567, 10571, 59, 49152, 8921, 824, 256, 59, 118, 10576, 3023, 49152, 8811, 8402, 384, 101, 108, 116, 10586, 10610, 10614, 102, 116, 256, 97, 114, 10593, 10599, 114, 114, 111, 119, 59, 25037, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 25038, 59, 49152, 8920, 824, 256, 59, 118, 10619, 3143, 49152, 8810, 8402, 105, 103, 104, 116, 97, 114, 114, 111, 119, 59, 25039, 256, 68, 100, 10638, 10643, 97, 115, 104, 59, 25263, 97, 115, 104, 59, 25262, 640, 98, 99, 110, 112, 116, 10659, 10663, 10668, 10673, 10700, 108, 97, 187, 734, 117, 116, 101, 59, 16708, 103, 59, 49152, 8736, 8402, 640, 59, 69, 105, 111, 112, 3460, 10684, 10688, 10693, 10696, 59, 49152, 10864, 824, 100, 59, 49152, 8779, 824, 115, 59, 16713, 114, 111, 248, 3460, 117, 114, 256, 59, 97, 10707, 10708, 26222, 108, 256, 59, 115, 10707, 2872, 499, 10719, 0, 10723, 112, 32955, 160, 2871, 109, 112, 256, 59, 101, 3065, 3072, 640, 97, 101, 111, 117, 121, 10740, 10750, 10755, 10768, 10771, 496, 10745, 0, 10747, 59, 27203, 111, 110, 59, 16712, 100, 105, 108, 59, 16710, 110, 103, 256, 59, 100, 3454, 10762, 111, 116, 59, 49152, 10861, 824, 112, 59, 27202, 59, 17469, 97, 115, 104, 59, 24595, 896, 59, 65, 97, 100, 113, 115, 120, 2962, 10793, 10797, 10811, 10817, 10821, 10832, 114, 114, 59, 25047, 114, 256, 104, 114, 10803, 10806, 107, 59, 26916, 256, 59, 111, 5106, 5104, 111, 116, 59, 49152, 8784, 824, 117, 105, 246, 2915, 256, 101, 105, 10826, 10830, 97, 114, 59, 26920, 237, 2968, 105, 115, 116, 256, 59, 115, 2976, 2975, 114, 59, 49152, 55349, 56619, 512, 69, 101, 115, 116, 3013, 10854, 10873, 10876, 384, 59, 113, 115, 3004, 10861, 3041, 384, 59, 113, 115, 3004, 3013, 10868, 108, 97, 110, 244, 3042, 105, 237, 3050, 256, 59, 114, 2998, 10881, 187, 2999, 384, 65, 97, 112, 10890, 10893, 10897, 114, 242, 10609, 114, 114, 59, 25006, 97, 114, 59, 27378, 384, 59, 115, 118, 3981, 10908, 3980, 256, 59, 100, 10913, 10914, 25340, 59, 25338, 99, 121, 59, 17498, 896, 65, 69, 97, 100, 101, 115, 116, 10935, 10938, 10942, 10946, 10949, 10998, 11001, 114, 242, 10598, 59, 49152, 8806, 824, 114, 114, 59, 24986, 114, 59, 24613, 512, 59, 102, 113, 115, 3131, 10958, 10979, 10991, 116, 256, 97, 114, 10964, 10969, 114, 114, 111, 247, 10945, 105, 103, 104, 116, 97, 114, 114, 111, 247, 10896, 384, 59, 113, 115, 3131, 10938, 10986, 108, 97, 110, 244, 3157, 256, 59, 115, 3157, 10996, 187, 3126, 105, 237, 3165, 256, 59, 114, 3125, 11006, 105, 256, 59, 101, 3098, 3109, 105, 228, 3472, 256, 112, 116, 11020, 11025, 102, 59, 49152, 55349, 56671, 33152, 172, 59, 105, 110, 11033, 11034, 11062, 16556, 110, 512, 59, 69, 100, 118, 2953, 11044, 11048, 11054, 59, 49152, 8953, 824, 111, 116, 59, 49152, 8949, 824, 481, 2953, 11059, 11061, 59, 25335, 59, 25334, 105, 256, 59, 118, 3256, 11068, 481, 3256, 11073, 11075, 59, 25342, 59, 25341, 384, 97, 111, 114, 11083, 11107, 11113, 114, 512, 59, 97, 115, 116, 2939, 11093, 11098, 11103, 108, 108, 101, 236, 2939, 108, 59, 49152, 11005, 8421, 59, 49152, 8706, 824, 108, 105, 110, 116, 59, 27156, 384, 59, 99, 101, 3218, 11120, 11123, 117, 229, 3237, 256, 59, 99, 3224, 11128, 256, 59, 101, 3218, 11133, 241, 3224, 512, 65, 97, 105, 116, 11144, 11147, 11165, 11175, 114, 242, 10632, 114, 114, 384, 59, 99, 119, 11156, 11157, 11161, 24987, 59, 49152, 10547, 824, 59, 49152, 8605, 824, 103, 104, 116, 97, 114, 114, 111, 119, 187, 11157, 114, 105, 256, 59, 101, 3275, 3286, 896, 99, 104, 105, 109, 112, 113, 117, 11197, 11213, 11225, 11012, 2936, 11236, 11247, 512, 59, 99, 101, 114, 3378, 11206, 3383, 11209, 117, 229, 3397, 59, 49152, 55349, 56515, 111, 114, 116, 621, 11013, 0, 0, 11222, 97, 114, 225, 11094, 109, 256, 59, 101, 3438, 11231, 256, 59, 113, 3444, 3443, 115, 117, 256, 98, 112, 11243, 11245, 229, 3320, 229, 3339, 384, 98, 99, 112, 11254, 11281, 11289, 512, 59, 69, 101, 115, 11263, 11264, 3362, 11268, 25220, 59, 49152, 10949, 824, 101, 116, 256, 59, 101, 3355, 11275, 113, 256, 59, 113, 3363, 11264, 99, 256, 59, 101, 3378, 11287, 241, 3384, 512, 59, 69, 101, 115, 11298, 11299, 3423, 11303, 25221, 59, 49152, 10950, 824, 101, 116, 256, 59, 101, 3416, 11310, 113, 256, 59, 113, 3424, 11299, 512, 103, 105, 108, 114, 11325, 11327, 11333, 11335, 236, 3031, 108, 100, 101, 32827, 241, 16625, 231, 3139, 105, 97, 110, 103, 108, 101, 256, 108, 114, 11346, 11356, 101, 102, 116, 256, 59, 101, 3098, 11354, 241, 3110, 105, 103, 104, 116, 256, 59, 101, 3275, 11365, 241, 3287, 256, 59, 109, 11372, 11373, 17341, 384, 59, 101, 115, 11380, 11381, 11385, 16419, 114, 111, 59, 24854, 112, 59, 24583, 1152, 68, 72, 97, 100, 103, 105, 108, 114, 115, 11407, 11412, 11417, 11422, 11427, 11440, 11446, 11475, 11491, 97, 115, 104, 59, 25261, 97, 114, 114, 59, 26884, 112, 59, 49152, 8781, 8402, 97, 115, 104, 59, 25260, 256, 101, 116, 11432, 11436, 59, 49152, 8805, 8402, 59, 49152, 62, 8402, 110, 102, 105, 110, 59, 27102, 384, 65, 101, 116, 11453, 11457, 11461, 114, 114, 59, 26882, 59, 49152, 8804, 8402, 256, 59, 114, 11466, 11469, 49152, 60, 8402, 105, 101, 59, 49152, 8884, 8402, 256, 65, 116, 11480, 11484, 114, 114, 59, 26883, 114, 105, 101, 59, 49152, 8885, 8402, 105, 109, 59, 49152, 8764, 8402, 384, 65, 97, 110, 11504, 11508, 11522, 114, 114, 59, 25046, 114, 256, 104, 114, 11514, 11517, 107, 59, 26915, 256, 59, 111, 5095, 5093, 101, 97, 114, 59, 26919, 4691, 6805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11565, 0, 11576, 11592, 11616, 11621, 11634, 11652, 6919, 0, 0, 11661, 11691, 0, 11720, 11726, 0, 11740, 11801, 11819, 11838, 11843, 256, 99, 115, 11569, 6807, 117, 116, 101, 32827, 243, 16627, 256, 105, 121, 11580, 11589, 114, 256, 59, 99, 6814, 11586, 32827, 244, 16628, 59, 17470, 640, 97, 98, 105, 111, 115, 6816, 11602, 11607, 456, 11610, 108, 97, 99, 59, 16721, 118, 59, 27192, 111, 108, 100, 59, 27068, 108, 105, 103, 59, 16723, 256, 99, 114, 11625, 11629, 105, 114, 59, 27071, 59, 49152, 55349, 56620, 879, 11641, 0, 0, 11644, 0, 11650, 110, 59, 17115, 97, 118, 101, 32827, 242, 16626, 59, 27073, 256, 98, 109, 11656, 3572, 97, 114, 59, 27061, 512, 97, 99, 105, 116, 11669, 11672, 11685, 11688, 114, 242, 6784, 256, 105, 114, 11677, 11680, 114, 59, 27070, 111, 115, 115, 59, 27067, 110, 229, 3666, 59, 27072, 384, 97, 101, 105, 11697, 11701, 11705, 99, 114, 59, 16717, 103, 97, 59, 17353, 384, 99, 100, 110, 11712, 11717, 461, 114, 111, 110, 59, 17343, 59, 27062, 112, 102, 59, 49152, 55349, 56672, 384, 97, 101, 108, 11732, 11735, 466, 114, 59, 27063, 114, 112, 59, 27065, 896, 59, 97, 100, 105, 111, 115, 118, 11754, 11755, 11758, 11784, 11789, 11792, 11798, 25128, 114, 242, 6790, 512, 59, 101, 102, 109, 11767, 11768, 11778, 11781, 27229, 114, 256, 59, 111, 11774, 11775, 24884, 102, 187, 11775, 32827, 170, 16554, 32827, 186, 16570, 103, 111, 102, 59, 25270, 114, 59, 27222, 108, 111, 112, 101, 59, 27223, 59, 27227, 384, 99, 108, 111, 11807, 11809, 11815, 242, 11777, 97, 115, 104, 32827, 248, 16632, 108, 59, 25240, 105, 364, 11823, 11828, 100, 101, 32827, 245, 16629, 101, 115, 256, 59, 97, 475, 11834, 115, 59, 27190, 109, 108, 32827, 246, 16630, 98, 97, 114, 59, 25405, 2785, 11870, 0, 11901, 0, 11904, 11933, 0, 11938, 11961, 0, 0, 11979, 3740, 0, 12051, 0, 0, 12075, 12220, 0, 12232, 114, 512, 59, 97, 115, 116, 1027, 11879, 11890, 3717, 33024, 182, 59, 108, 11885, 11886, 16566, 108, 101, 236, 1027, 617, 11896, 0, 0, 11899, 109, 59, 27379, 59, 27389, 121, 59, 17471, 114, 640, 99, 105, 109, 112, 116, 11915, 11919, 11923, 6245, 11927, 110, 116, 59, 16421, 111, 100, 59, 16430, 105, 108, 59, 24624, 101, 110, 107, 59, 24625, 114, 59, 49152, 55349, 56621, 384, 105, 109, 111, 11944, 11952, 11956, 256, 59, 118, 11949, 11950, 17350, 59, 17365, 109, 97, 244, 2678, 110, 101, 59, 26126, 384, 59, 116, 118, 11967, 11968, 11976, 17344, 99, 104, 102, 111, 114, 107, 187, 8189, 59, 17366, 256, 97, 117, 11983, 11999, 110, 256, 99, 107, 11989, 11997, 107, 256, 59, 104, 8692, 11995, 59, 24846, 246, 8692, 115, 1152, 59, 97, 98, 99, 100, 101, 109, 115, 116, 12019, 12020, 6408, 12025, 12029, 12036, 12038, 12042, 12046, 16427, 99, 105, 114, 59, 27171, 105, 114, 59, 27170, 256, 111, 117, 7488, 12034, 59, 27173, 59, 27250, 110, 32955, 177, 3741, 105, 109, 59, 27174, 119, 111, 59, 27175, 384, 105, 112, 117, 12057, 12064, 12069, 110, 116, 105, 110, 116, 59, 27157, 102, 59, 49152, 55349, 56673, 110, 100, 32827, 163, 16547, 1280, 59, 69, 97, 99, 101, 105, 110, 111, 115, 117, 3784, 12095, 12097, 12100, 12103, 12161, 12169, 12178, 12158, 12214, 59, 27315, 112, 59, 27319, 117, 229, 3801, 256, 59, 99, 3790, 12108, 768, 59, 97, 99, 101, 110, 115, 3784, 12121, 12127, 12134, 12136, 12158, 112, 112, 114, 111, 248, 12099, 117, 114, 108, 121, 101, 241, 3801, 241, 3790, 384, 97, 101, 115, 12143, 12150, 12154, 112, 112, 114, 111, 120, 59, 27321, 113, 113, 59, 27317, 105, 109, 59, 25320, 105, 237, 3807, 109, 101, 256, 59, 115, 12168, 3758, 24626, 384, 69, 97, 115, 12152, 12176, 12154, 240, 12149, 384, 100, 102, 112, 3820, 12185, 12207, 384, 97, 108, 115, 12192, 12197, 12202, 108, 97, 114, 59, 25390, 105, 110, 101, 59, 25362, 117, 114, 102, 59, 25363, 256, 59, 116, 3835, 12212, 239, 3835, 114, 101, 108, 59, 25264, 256, 99, 105, 12224, 12229, 114, 59, 49152, 55349, 56517, 59, 17352, 110, 99, 115, 112, 59, 24584, 768, 102, 105, 111, 112, 115, 117, 12250, 8930, 12255, 12261, 12267, 12273, 114, 59, 49152, 55349, 56622, 112, 102, 59, 49152, 55349, 56674, 114, 105, 109, 101, 59, 24663, 99, 114, 59, 49152, 55349, 56518, 384, 97, 101, 111, 12280, 12297, 12307, 116, 256, 101, 105, 12286, 12293, 114, 110, 105, 111, 110, 243, 1712, 110, 116, 59, 27158, 115, 116, 256, 59, 101, 12304, 12305, 16447, 241, 7961, 244, 3860, 2688, 65, 66, 72, 97, 98, 99, 100, 101, 102, 104, 105, 108, 109, 110, 111, 112, 114, 115, 116, 117, 120, 12352, 12369, 12373, 12377, 12512, 12558, 12587, 12615, 12642, 12658, 12686, 12806, 12821, 12836, 12841, 12888, 12910, 12914, 12944, 12976, 12983, 384, 97, 114, 116, 12359, 12362, 12364, 114, 242, 4275, 242, 989, 97, 105, 108, 59, 26908, 97, 114, 242, 7269, 97, 114, 59, 26980, 896, 99, 100, 101, 110, 113, 114, 116, 12392, 12405, 12408, 12415, 12431, 12436, 12492, 256, 101, 117, 12397, 12401, 59, 49152, 8765, 817, 116, 101, 59, 16725, 105, 227, 4462, 109, 112, 116, 121, 118, 59, 27059, 103, 512, 59, 100, 101, 108, 4049, 12425, 12427, 12429, 59, 27026, 59, 27045, 229, 4049, 117, 111, 32827, 187, 16571, 114, 1408, 59, 97, 98, 99, 102, 104, 108, 112, 115, 116, 119, 4060, 12460, 12463, 12471, 12473, 12476, 12478, 12480, 12483, 12487, 12490, 112, 59, 26997, 256, 59, 102, 4064, 12468, 115, 59, 26912, 59, 26931, 115, 59, 26910, 235, 8797, 240, 10030, 108, 59, 26949, 105, 109, 59, 26996, 108, 59, 24995, 59, 24989, 256, 97, 105, 12497, 12501, 105, 108, 59, 26906, 111, 256, 59, 110, 12507, 12508, 25142, 97, 108, 243, 3870, 384, 97, 98, 114, 12519, 12522, 12526, 114, 242, 6117, 114, 107, 59, 26483, 256, 97, 107, 12531, 12541, 99, 256, 101, 107, 12537, 12539, 59, 16509, 59, 16477, 256, 101, 115, 12546, 12548, 59, 27020, 108, 256, 100, 117, 12554, 12556, 59, 27022, 59, 27024, 512, 97, 101, 117, 121, 12567, 12572, 12583, 12585, 114, 111, 110, 59, 16729, 256, 100, 105, 12577, 12581, 105, 108, 59, 16727, 236, 4082, 226, 12538, 59, 17472, 512, 99, 108, 113, 115, 12596, 12599, 12605, 12612, 97, 59, 26935, 100, 104, 97, 114, 59, 26985, 117, 111, 256, 59, 114, 526, 525, 104, 59, 25011, 384, 97, 99, 103, 12622, 12639, 3908, 108, 512, 59, 105, 112, 115, 3960, 12632, 12635, 4252, 110, 229, 4283, 97, 114, 244, 4009, 116, 59, 26029, 384, 105, 108, 114, 12649, 4131, 12654, 115, 104, 116, 59, 27005, 59, 49152, 55349, 56623, 256, 97, 111, 12663, 12678, 114, 256, 100, 117, 12669, 12671, 187, 1147, 256, 59, 108, 4241, 12676, 59, 26988, 256, 59, 118, 12683, 12684, 17345, 59, 17393, 384, 103, 110, 115, 12693, 12793, 12796, 104, 116, 768, 97, 104, 108, 114, 115, 116, 12708, 12720, 12738, 12760, 12772, 12782, 114, 114, 111, 119, 256, 59, 116, 4060, 12717, 97, 233, 12488, 97, 114, 112, 111, 111, 110, 256, 100, 117, 12731, 12735, 111, 119, 238, 12670, 112, 187, 4242, 101, 102, 116, 256, 97, 104, 12746, 12752, 114, 114, 111, 119, 243, 4074, 97, 114, 112, 111, 111, 110, 243, 1361, 105, 103, 104, 116, 97, 114, 114, 111, 119, 115, 59, 25033, 113, 117, 105, 103, 97, 114, 114, 111, 247, 12491, 104, 114, 101, 101, 116, 105, 109, 101, 115, 59, 25292, 103, 59, 17114, 105, 110, 103, 100, 111, 116, 115, 101, 241, 7986, 384, 97, 104, 109, 12813, 12816, 12819, 114, 242, 4074, 97, 242, 1361, 59, 24591, 111, 117, 115, 116, 256, 59, 97, 12830, 12831, 25521, 99, 104, 101, 187, 12831, 109, 105, 100, 59, 27374, 512, 97, 98, 112, 116, 12850, 12861, 12864, 12882, 256, 110, 114, 12855, 12858, 103, 59, 26605, 114, 59, 25086, 114, 235, 4099, 384, 97, 102, 108, 12871, 12874, 12878, 114, 59, 27014, 59, 49152, 55349, 56675, 117, 115, 59, 27182, 105, 109, 101, 115, 59, 27189, 256, 97, 112, 12893, 12903, 114, 256, 59, 103, 12899, 12900, 16425, 116, 59, 27028, 111, 108, 105, 110, 116, 59, 27154, 97, 114, 242, 12771, 512, 97, 99, 104, 113, 12923, 12928, 4284, 12933, 113, 117, 111, 59, 24634, 114, 59, 49152, 55349, 56519, 256, 98, 117, 12539, 12938, 111, 256, 59, 114, 532, 531, 384, 104, 105, 114, 12951, 12955, 12960, 114, 101, 229, 12792, 109, 101, 115, 59, 25290, 105, 512, 59, 101, 102, 108, 12970, 4185, 6177, 12971, 26041, 116, 114, 105, 59, 27086, 108, 117, 104, 97, 114, 59, 26984, 59, 24862, 3425, 13013, 13019, 13023, 13100, 13112, 13169, 0, 13178, 13220, 0, 0, 13292, 13296, 0, 13352, 13384, 13402, 13485, 13489, 13514, 13553, 0, 13846, 0, 0, 13875, 99, 117, 116, 101, 59, 16731, 113, 117, 239, 10170, 1280, 59, 69, 97, 99, 101, 105, 110, 112, 115, 121, 4589, 13043, 13045, 13055, 13058, 13067, 13071, 13087, 13094, 13097, 59, 27316, 496, 13050, 0, 13052, 59, 27320, 111, 110, 59, 16737, 117, 229, 4606, 256, 59, 100, 4595, 13063, 105, 108, 59, 16735, 114, 99, 59, 16733, 384, 69, 97, 115, 13078, 13080, 13083, 59, 27318, 112, 59, 27322, 105, 109, 59, 25321, 111, 108, 105, 110, 116, 59, 27155, 105, 237, 4612, 59, 17473, 111, 116, 384, 59, 98, 101, 13108, 7495, 13109, 25285, 59, 27238, 896, 65, 97, 99, 109, 115, 116, 120, 13126, 13130, 13143, 13147, 13150, 13155, 13165, 114, 114, 59, 25048, 114, 256, 104, 114, 13136, 13138, 235, 8744, 256, 59, 111, 2614, 2612, 116, 32827, 167, 16551, 105, 59, 16443, 119, 97, 114, 59, 26921, 109, 256, 105, 110, 13161, 240, 110, 117, 243, 241, 116, 59, 26422, 114, 256, 59, 111, 13174, 8277, 49152, 55349, 56624, 512, 97, 99, 111, 121, 13186, 13190, 13201, 13216, 114, 112, 59, 26223, 256, 104, 121, 13195, 13199, 99, 121, 59, 17481, 59, 17480, 114, 116, 621, 13209, 0, 0, 13212, 105, 228, 5220, 97, 114, 97, 236, 11887, 32827, 173, 16557, 256, 103, 109, 13224, 13236, 109, 97, 384, 59, 102, 118, 13233, 13234, 13234, 17347, 59, 17346, 1024, 59, 100, 101, 103, 108, 110, 112, 114, 4779, 13253, 13257, 13262, 13270, 13278, 13281, 13286, 111, 116, 59, 27242, 256, 59, 113, 4785, 4784, 256, 59, 69, 13267, 13268, 27294, 59, 27296, 256, 59, 69, 13275, 13276, 27293, 59, 27295, 101, 59, 25158, 108, 117, 115, 59, 27172, 97, 114, 114, 59, 26994, 97, 114, 242, 4413, 512, 97, 101, 105, 116, 13304, 13320, 13327, 13335, 256, 108, 115, 13309, 13316, 108, 115, 101, 116, 109, 233, 13162, 104, 112, 59, 27187, 112, 97, 114, 115, 108, 59, 27108, 256, 100, 108, 5219, 13332, 101, 59, 25379, 256, 59, 101, 13340, 13341, 27306, 256, 59, 115, 13346, 13347, 27308, 59, 49152, 10924, 65024, 384, 102, 108, 112, 13358, 13363, 13378, 116, 99, 121, 59, 17484, 256, 59, 98, 13368, 13369, 16431, 256, 59, 97, 13374, 13375, 27076, 114, 59, 25407, 102, 59, 49152, 55349, 56676, 97, 256, 100, 114, 13389, 1026, 101, 115, 256, 59, 117, 13396, 13397, 26208, 105, 116, 187, 13397, 384, 99, 115, 117, 13408, 13433, 13471, 256, 97, 117, 13413, 13423, 112, 256, 59, 115, 4488, 13419, 59, 49152, 8851, 65024, 112, 256, 59, 115, 4532, 13429, 59, 49152, 8852, 65024, 117, 256, 98, 112, 13439, 13455, 384, 59, 101, 115, 4503, 4508, 13446, 101, 116, 256, 59, 101, 4503, 13453, 241, 4509, 384, 59, 101, 115, 4520, 4525, 13462, 101, 116, 256, 59, 101, 4520, 13469, 241, 4526, 384, 59, 97, 102, 4475, 13478, 1456, 114, 357, 13483, 1457, 187, 4476, 97, 114, 242, 4424, 512, 99, 101, 109, 116, 13497, 13502, 13506, 13509, 114, 59, 49152, 55349, 56520, 116, 109, 238, 241, 105, 236, 13333, 97, 114, 230, 4542, 256, 97, 114, 13518, 13525, 114, 256, 59, 102, 13524, 6079, 26118, 256, 97, 110, 13530, 13549, 105, 103, 104, 116, 256, 101, 112, 13539, 13546, 112, 115, 105, 108, 111, 238, 7904, 104, 233, 11951, 115, 187, 10322, 640, 98, 99, 109, 110, 112, 13563, 13662, 4617, 13707, 13710, 1152, 59, 69, 100, 101, 109, 110, 112, 114, 115, 13582, 13583, 13585, 13589, 13598, 13603, 13612, 13617, 13622, 25218, 59, 27333, 111, 116, 59, 27325, 256, 59, 100, 4570, 13594, 111, 116, 59, 27331, 117, 108, 116, 59, 27329, 256, 69, 101, 13608, 13610, 59, 27339, 59, 25226, 108, 117, 115, 59, 27327, 97, 114, 114, 59, 27001, 384, 101, 105, 117, 13629, 13650, 13653, 116, 384, 59, 101, 110, 13582, 13637, 13643, 113, 256, 59, 113, 4570, 13583, 101, 113, 256, 59, 113, 13611, 13608, 109, 59, 27335, 256, 98, 112, 13658, 13660, 59, 27349, 59, 27347, 99, 768, 59, 97, 99, 101, 110, 115, 4589, 13676, 13682, 13689, 13691, 13094, 112, 112, 114, 111, 248, 13050, 117, 114, 108, 121, 101, 241, 4606, 241, 4595, 384, 97, 101, 115, 13698, 13704, 13083, 112, 112, 114, 111, 248, 13082, 113, 241, 13079, 103, 59, 26218, 1664, 49, 50, 51, 59, 69, 100, 101, 104, 108, 109, 110, 112, 115, 13737, 13740, 13743, 4636, 13746, 13748, 13760, 13769, 13781, 13786, 13791, 13800, 13805, 32827, 185, 16569, 32827, 178, 16562, 32827, 179, 16563, 59, 27334, 256, 111, 115, 13753, 13756, 116, 59, 27326, 117, 98, 59, 27352, 256, 59, 100, 4642, 13765, 111, 116, 59, 27332, 115, 256, 111, 117, 13775, 13778, 108, 59, 26569, 98, 59, 27351, 97, 114, 114, 59, 27003, 117, 108, 116, 59, 27330, 256, 69, 101, 13796, 13798, 59, 27340, 59, 25227, 108, 117, 115, 59, 27328, 384, 101, 105, 117, 13812, 13833, 13836, 116, 384, 59, 101, 110, 4636, 13820, 13826, 113, 256, 59, 113, 4642, 13746, 101, 113, 256, 59, 113, 13799, 13796, 109, 59, 27336, 256, 98, 112, 13841, 13843, 59, 27348, 59, 27350, 384, 65, 97, 110, 13852, 13856, 13869, 114, 114, 59, 25049, 114, 256, 104, 114, 13862, 13864, 235, 8750, 256, 59, 111, 2603, 2601, 119, 97, 114, 59, 26922, 108, 105, 103, 32827, 223, 16607, 3041, 13905, 13917, 13920, 4814, 13939, 13945, 0, 13950, 14018, 0, 0, 0, 0, 0, 14043, 14083, 0, 14089, 14188, 0, 0, 0, 14215, 626, 13910, 0, 0, 13915, 103, 101, 116, 59, 25366, 59, 17348, 114, 235, 3679, 384, 97, 101, 121, 13926, 13931, 13936, 114, 111, 110, 59, 16741, 100, 105, 108, 59, 16739, 59, 17474, 108, 114, 101, 99, 59, 25365, 114, 59, 49152, 55349, 56625, 512, 101, 105, 107, 111, 13958, 13981, 14005, 14012, 498, 13963, 0, 13969, 101, 256, 52, 102, 4740, 4737, 97, 384, 59, 115, 118, 13976, 13977, 13979, 17336, 121, 109, 59, 17361, 256, 99, 110, 13986, 14002, 107, 256, 97, 115, 13992, 13998, 112, 112, 114, 111, 248, 4801, 105, 109, 187, 4780, 115, 240, 4766, 256, 97, 115, 14010, 13998, 240, 4801, 114, 110, 32827, 254, 16638, 492, 799, 14022, 8935, 101, 115, 33152, 215, 59, 98, 100, 14031, 14032, 14040, 16599, 256, 59, 97, 6415, 14037, 114, 59, 27185, 59, 27184, 384, 101, 112, 115, 14049, 14051, 14080, 225, 10829, 512, 59, 98, 99, 102, 1158, 14060, 14064, 14068, 111, 116, 59, 25398, 105, 114, 59, 27377, 256, 59, 111, 14073, 14076, 49152, 55349, 56677, 114, 107, 59, 27354, 225, 13154, 114, 105, 109, 101, 59, 24628, 384, 97, 105, 112, 14095, 14098, 14180, 100, 229, 4680, 896, 97, 100, 101, 109, 112, 115, 116, 14113, 14157, 14144, 14161, 14167, 14172, 14175, 110, 103, 108, 101, 640, 59, 100, 108, 113, 114, 14128, 14129, 14134, 14144, 14146, 26037, 111, 119, 110, 187, 7611, 101, 102, 116, 256, 59, 101, 10240, 14142, 241, 2350, 59, 25180, 105, 103, 104, 116, 256, 59, 101, 12970, 14155, 241, 4186, 111, 116, 59, 26092, 105, 110, 117, 115, 59, 27194, 108, 117, 115, 59, 27193, 98, 59, 27085, 105, 109, 101, 59, 27195, 101, 122, 105, 117, 109, 59, 25570, 384, 99, 104, 116, 14194, 14205, 14209, 256, 114, 121, 14199, 14203, 59, 49152, 55349, 56521, 59, 17478, 99, 121, 59, 17499, 114, 111, 107, 59, 16743, 256, 105, 111, 14219, 14222, 120, 244, 6007, 104, 101, 97, 100, 256, 108, 114, 14231, 14240, 101, 102, 116, 97, 114, 114, 111, 247, 2127, 105, 103, 104, 116, 97, 114, 114, 111, 119, 187, 3933, 2304, 65, 72, 97, 98, 99, 100, 102, 103, 104, 108, 109, 111, 112, 114, 115, 116, 117, 119, 14288, 14291, 14295, 14308, 14320, 14332, 14350, 14364, 14371, 14388, 14417, 14429, 14443, 14505, 14540, 14546, 14570, 14582, 114, 242, 1005, 97, 114, 59, 26979, 256, 99, 114, 14300, 14306, 117, 116, 101, 32827, 250, 16634, 242, 4432, 114, 483, 14314, 0, 14317, 121, 59, 17502, 118, 101, 59, 16749, 256, 105, 121, 14325, 14330, 114, 99, 32827, 251, 16635, 59, 17475, 384, 97, 98, 104, 14339, 14342, 14347, 114, 242, 5037, 108, 97, 99, 59, 16753, 97, 242, 5059, 256, 105, 114, 14355, 14360, 115, 104, 116, 59, 27006, 59, 49152, 55349, 56626, 114, 97, 118, 101, 32827, 249, 16633, 353, 14375, 14385, 114, 256, 108, 114, 14380, 14382, 187, 2391, 187, 4227, 108, 107, 59, 25984, 256, 99, 116, 14393, 14413, 623, 14399, 0, 0, 14410, 114, 110, 256, 59, 101, 14405, 14406, 25372, 114, 187, 14406, 111, 112, 59, 25359, 114, 105, 59, 26104, 256, 97, 108, 14422, 14426, 99, 114, 59, 16747, 32955, 168, 841, 256, 103, 112, 14434, 14438, 111, 110, 59, 16755, 102, 59, 49152, 55349, 56678, 768, 97, 100, 104, 108, 115, 117, 4427, 14456, 14461, 4978, 14481, 14496, 111, 119, 110, 225, 5043, 97, 114, 112, 111, 111, 110, 256, 108, 114, 14472, 14476, 101, 102, 244, 14381, 105, 103, 104, 244, 14383, 105, 384, 59, 104, 108, 14489, 14490, 14492, 17349, 187, 5114, 111, 110, 187, 14490, 112, 97, 114, 114, 111, 119, 115, 59, 25032, 384, 99, 105, 116, 14512, 14532, 14536, 623, 14518, 0, 0, 14529, 114, 110, 256, 59, 101, 14524, 14525, 25373, 114, 187, 14525, 111, 112, 59, 25358, 110, 103, 59, 16751, 114, 105, 59, 26105, 99, 114, 59, 49152, 55349, 56522, 384, 100, 105, 114, 14553, 14557, 14562, 111, 116, 59, 25328, 108, 100, 101, 59, 16745, 105, 256, 59, 102, 14128, 14568, 187, 6163, 256, 97, 109, 14575, 14578, 114, 242, 14504, 108, 32827, 252, 16636, 97, 110, 103, 108, 101, 59, 27047, 1920, 65, 66, 68, 97, 99, 100, 101, 102, 108, 110, 111, 112, 114, 115, 122, 14620, 14623, 14633, 14637, 14773, 14776, 14781, 14815, 14820, 14824, 14835, 14841, 14845, 14849, 14880, 114, 242, 1015, 97, 114, 256, 59, 118, 14630, 14631, 27368, 59, 27369, 97, 115, 232, 993, 256, 110, 114, 14642, 14647, 103, 114, 116, 59, 27036, 896, 101, 107, 110, 112, 114, 115, 116, 13539, 14662, 14667, 14674, 14685, 14692, 14742, 97, 112, 112, 225, 9237, 111, 116, 104, 105, 110, 231, 7830, 384, 104, 105, 114, 13547, 11976, 14681, 111, 112, 244, 12213, 256, 59, 104, 5047, 14690, 239, 12685, 256, 105, 117, 14697, 14701, 103, 109, 225, 13235, 256, 98, 112, 14706, 14724, 115, 101, 116, 110, 101, 113, 256, 59, 113, 14717, 14720, 49152, 8842, 65024, 59, 49152, 10955, 65024, 115, 101, 116, 110, 101, 113, 256, 59, 113, 14735, 14738, 49152, 8843, 65024, 59, 49152, 10956, 65024, 256, 104, 114, 14747, 14751, 101, 116, 225, 13980, 105, 97, 110, 103, 108, 101, 256, 108, 114, 14762, 14767, 101, 102, 116, 187, 2341, 105, 103, 104, 116, 187, 4177, 121, 59, 17458, 97, 115, 104, 187, 4150, 384, 101, 108, 114, 14788, 14802, 14807, 384, 59, 98, 101, 11754, 14795, 14799, 97, 114, 59, 25275, 113, 59, 25178, 108, 105, 112, 59, 25326, 256, 98, 116, 14812, 5224, 97, 242, 5225, 114, 59, 49152, 55349, 56627, 116, 114, 233, 14766, 115, 117, 256, 98, 112, 14831, 14833, 187, 3356, 187, 3417, 112, 102, 59, 49152, 55349, 56679, 114, 111, 240, 3835, 116, 114, 233, 14772, 256, 99, 117, 14854, 14859, 114, 59, 49152, 55349, 56523, 256, 98, 112, 14864, 14872, 110, 256, 69, 101, 14720, 14870, 187, 14718, 110, 256, 69, 101, 14738, 14878, 187, 14736, 105, 103, 122, 97, 103, 59, 27034, 896, 99, 101, 102, 111, 112, 114, 115, 14902, 14907, 14934, 14939, 14932, 14945, 14954, 105, 114, 99, 59, 16757, 256, 100, 105, 14912, 14929, 256, 98, 103, 14917, 14921, 97, 114, 59, 27231, 101, 256, 59, 113, 5626, 14927, 59, 25177, 101, 114, 112, 59, 24856, 114, 59, 49152, 55349, 56628, 112, 102, 59, 49152, 55349, 56680, 256, 59, 101, 5241, 14950, 97, 116, 232, 5241, 99, 114, 59, 49152, 55349, 56524, 2787, 6030, 14983, 0, 14987, 0, 14992, 15003, 0, 0, 15005, 15016, 15019, 15023, 0, 0, 15043, 15054, 0, 15064, 6108, 6111, 116, 114, 233, 6097, 114, 59, 49152, 55349, 56629, 256, 65, 97, 14996, 14999, 114, 242, 963, 114, 242, 2550, 59, 17342, 256, 65, 97, 15009, 15012, 114, 242, 952, 114, 242, 2539, 97, 240, 10003, 105, 115, 59, 25339, 384, 100, 112, 116, 6052, 15029, 15038, 256, 102, 108, 15034, 6057, 59, 49152, 55349, 56681, 105, 109, 229, 6066, 256, 65, 97, 15047, 15050, 114, 242, 974, 114, 242, 2561, 256, 99, 113, 15058, 6072, 114, 59, 49152, 55349, 56525, 256, 112, 116, 6102, 15068, 114, 233, 6100, 1024, 97, 99, 101, 102, 105, 111, 115, 117, 15088, 15101, 15112, 15116, 15121, 15125, 15131, 15137, 99, 256, 117, 121, 15094, 15099, 116, 101, 32827, 253, 16637, 59, 17487, 256, 105, 121, 15106, 15110, 114, 99, 59, 16759, 59, 17483, 110, 32827, 165, 16549, 114, 59, 49152, 55349, 56630, 99, 121, 59, 17495, 112, 102, 59, 49152, 55349, 56682, 99, 114, 59, 49152, 55349, 56526, 256, 99, 109, 15142, 15145, 121, 59, 17486, 108, 32827, 255, 16639, 1280, 97, 99, 100, 101, 102, 104, 105, 111, 115, 119, 15170, 15176, 15188, 15192, 15204, 15209, 15213, 15220, 15226, 15232, 99, 117, 116, 101, 59, 16762, 256, 97, 121, 15181, 15186, 114, 111, 110, 59, 16766, 59, 17463, 111, 116, 59, 16764, 256, 101, 116, 15197, 15201, 116, 114, 230, 5471, 97, 59, 17334, 114, 59, 49152, 55349, 56631, 99, 121, 59, 17462, 103, 114, 97, 114, 114, 59, 25053, 112, 102, 59, 49152, 55349, 56683, 99, 114, 59, 49152, 55349, 56527, 256, 106, 110, 15237, 15239, 59, 24589, 106, 59, 24588]); + +},{}],19:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// Generated using scripts/write-decode-map.ts +// prettier-ignore +exports.default = new Uint16Array([512, 97, 103, 108, 113, 9, 21, 24, 27, 621, 15, 0, 0, 18, 112, 59, 16422, 111, 115, 59, 16423, 116, 59, 16446, 116, 59, 16444, 117, 111, 116, 59, 16418]); + +},{}]},{},[7])(7) }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi9jb21tb24vZG9jdHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL2NvbW1vbi9lcnJvci1jb2Rlcy5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL2NvbW1vbi9mb3JlaWduLWNvbnRlbnQuanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi9jb21tb24vaHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL2NvbW1vbi91bmljb2RlLmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlNS9saWIvZXh0ZW5zaW9ucy9lcnJvci1yZXBvcnRpbmcvbWl4aW4tYmFzZS5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL2V4dGVuc2lvbnMvZXJyb3ItcmVwb3J0aW5nL3BhcnNlci1taXhpbi5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL2V4dGVuc2lvbnMvZXJyb3ItcmVwb3J0aW5nL3ByZXByb2Nlc3Nvci1taXhpbi5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL2V4dGVuc2lvbnMvZXJyb3ItcmVwb3J0aW5nL3Rva2VuaXplci1taXhpbi5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL2V4dGVuc2lvbnMvbG9jYXRpb24taW5mby9vcGVuLWVsZW1lbnQtc3RhY2stbWl4aW4uanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi9leHRlbnNpb25zL2xvY2F0aW9uLWluZm8vcGFyc2VyLW1peGluLmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlNS9saWIvZXh0ZW5zaW9ucy9sb2NhdGlvbi1pbmZvL3Rva2VuaXplci1taXhpbi5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL2V4dGVuc2lvbnMvcG9zaXRpb24tdHJhY2tpbmcvcHJlcHJvY2Vzc29yLW1peGluLmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlNS9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi9wYXJzZXIvZm9ybWF0dGluZy1lbGVtZW50LWxpc3QuanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi9wYXJzZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi9wYXJzZXIvb3Blbi1lbGVtZW50LXN0YWNrLmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlNS9saWIvc2VyaWFsaXplci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL3Rva2VuaXplci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL3Rva2VuaXplci9uYW1lZC1lbnRpdHktZGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9wYXJzZTUvbGliL3Rva2VuaXplci9wcmVwcm9jZXNzb3IuanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi90cmVlLWFkYXB0ZXJzL2RlZmF1bHQuanMiLCJub2RlX21vZHVsZXMvcGFyc2U1L2xpYi91dGlscy9tZXJnZS1vcHRpb25zLmpzIiwibm9kZV9tb2R1bGVzL3BhcnNlNS9saWIvdXRpbHMvbWl4aW4uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNTRGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcHBFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgRE9DVU1FTlRfTU9ERSB9ID0gcmVxdWlyZSgnLi9odG1sJyk7XG5cbi8vQ29uc3RcbmNvbnN0IFZBTElEX0RPQ1RZUEVfTkFNRSA9ICdodG1sJztcbmNvbnN0IFZBTElEX1NZU1RFTV9JRCA9ICdhYm91dDpsZWdhY3ktY29tcGF0JztcbmNvbnN0IFFVSVJLU19NT0RFX1NZU1RFTV9JRCA9ICdodHRwOi8vd3d3LmlibS5jb20vZGF0YS9kdGQvdjExL2libXhodG1sMS10cmFuc2l0aW9uYWwuZHRkJztcblxuY29uc3QgUVVJUktTX01PREVfUFVCTElDX0lEX1BSRUZJWEVTID0gW1xuICAgICcrLy9zaWxtYXJpbC8vZHRkIGh0bWwgcHJvIHYwcjExIDE5OTcwMTAxLy8nLFxuICAgICctLy9hcy8vZHRkIGh0bWwgMy4wIGFzd2VkaXQgKyBleHRlbnNpb25zLy8nLFxuICAgICctLy9hZHZhc29mdCBsdGQvL2R0ZCBodG1sIDMuMCBhc3dlZGl0ICsgZXh0ZW5zaW9ucy8vJyxcbiAgICAnLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIGxldmVsIDEvLycsXG4gICAgJy0vL2lldGYvL2R0ZCBodG1sIDIuMCBsZXZlbCAyLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCAyLjAgc3RyaWN0IGxldmVsIDEvLycsXG4gICAgJy0vL2lldGYvL2R0ZCBodG1sIDIuMCBzdHJpY3QgbGV2ZWwgMi8vJyxcbiAgICAnLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIHN0cmljdC8vJyxcbiAgICAnLS8vaWV0Zi8vZHRkIGh0bWwgMi4wLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCAyLjFlLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCAzLjAvLycsXG4gICAgJy0vL2lldGYvL2R0ZCBodG1sIDMuMiBmaW5hbC8vJyxcbiAgICAnLS8vaWV0Zi8vZHRkIGh0bWwgMy4yLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCAzLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAwLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAxLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAyLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAzLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QgbGV2ZWwgMC8vJyxcbiAgICAnLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDEvLycsXG4gICAgJy0vL2lldGYvL2R0ZCBodG1sIHN0cmljdCBsZXZlbCAyLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QgbGV2ZWwgMy8vJyxcbiAgICAnLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0Ly8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbC8vJyxcbiAgICAnLS8vbWV0cml1cy8vZHRkIG1ldHJpdXMgcHJlc2VudGF0aW9uYWwvLycsXG4gICAgJy0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDIuMCBodG1sIHN0cmljdC8vJyxcbiAgICAnLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMi4wIGh0bWwvLycsXG4gICAgJy0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDIuMCB0YWJsZXMvLycsXG4gICAgJy0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDMuMCBodG1sIHN0cmljdC8vJyxcbiAgICAnLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMy4wIGh0bWwvLycsXG4gICAgJy0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDMuMCB0YWJsZXMvLycsXG4gICAgJy0vL25ldHNjYXBlIGNvbW0uIGNvcnAuLy9kdGQgaHRtbC8vJyxcbiAgICAnLS8vbmV0c2NhcGUgY29tbS4gY29ycC4vL2R0ZCBzdHJpY3QgaHRtbC8vJyxcbiAgICBcIi0vL28ncmVpbGx5IGFuZCBhc3NvY2lhdGVzLy9kdGQgaHRtbCAyLjAvL1wiLFxuICAgIFwiLS8vbydyZWlsbHkgYW5kIGFzc29jaWF0ZXMvL2R0ZCBodG1sIGV4dGVuZGVkIDEuMC8vXCIsXG4gICAgXCItLy9vJ3JlaWxseSBhbmQgYXNzb2NpYXRlcy8vZHRkIGh0bWwgZXh0ZW5kZWQgcmVsYXhlZCAxLjAvL1wiLFxuICAgICctLy9zcS8vZHRkIGh0bWwgMi4wIGhvdG1ldGFsICsgZXh0ZW5zaW9ucy8vJyxcbiAgICAnLS8vc29mdHF1YWQgc29mdHdhcmUvL2R0ZCBob3RtZXRhbCBwcm8gNi4wOjoxOTk5MDYwMTo6ZXh0ZW5zaW9ucyB0byBodG1sIDQuMC8vJyxcbiAgICAnLS8vc29mdHF1YWQvL2R0ZCBob3RtZXRhbCBwcm8gNC4wOjoxOTk3MTAxMDo6ZXh0ZW5zaW9ucyB0byBodG1sIDQuMC8vJyxcbiAgICAnLS8vc3B5Z2xhc3MvL2R0ZCBodG1sIDIuMCBleHRlbmRlZC8vJyxcbiAgICAnLS8vc3VuIG1pY3Jvc3lzdGVtcyBjb3JwLi8vZHRkIGhvdGphdmEgaHRtbC8vJyxcbiAgICAnLS8vc3VuIG1pY3Jvc3lzdGVtcyBjb3JwLi8vZHRkIGhvdGphdmEgc3RyaWN0IGh0bWwvLycsXG4gICAgJy0vL3czYy8vZHRkIGh0bWwgMyAxOTk1LTAzLTI0Ly8nLFxuICAgICctLy93M2MvL2R0ZCBodG1sIDMuMiBkcmFmdC8vJyxcbiAgICAnLS8vdzNjLy9kdGQgaHRtbCAzLjIgZmluYWwvLycsXG4gICAgJy0vL3czYy8vZHRkIGh0bWwgMy4yLy8nLFxuICAgICctLy93M2MvL2R0ZCBodG1sIDMuMnMgZHJhZnQvLycsXG4gICAgJy0vL3czYy8vZHRkIGh0bWwgNC4wIGZyYW1lc2V0Ly8nLFxuICAgICctLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvLycsXG4gICAgJy0vL3czYy8vZHRkIGh0bWwgZXhwZXJpbWVudGFsIDE5OTYwNzEyLy8nLFxuICAgICctLy93M2MvL2R0ZCBodG1sIGV4cGVyaW1lbnRhbCA5NzA0MjEvLycsXG4gICAgJy0vL3czYy8vZHRkIHczIGh0bWwvLycsXG4gICAgJy0vL3czby8vZHRkIHczIGh0bWwgMy4wLy8nLFxuICAgICctLy93ZWJ0ZWNocy8vZHRkIG1vemlsbGEgaHRtbCAyLjAvLycsXG4gICAgJy0vL3dlYnRlY2hzLy9kdGQgbW96aWxsYSBodG1sLy8nXG5dO1xuXG5jb25zdCBRVUlSS1NfTU9ERV9OT19TWVNURU1fSURfUFVCTElDX0lEX1BSRUZJWEVTID0gUVVJUktTX01PREVfUFVCTElDX0lEX1BSRUZJWEVTLmNvbmNhdChbXG4gICAgJy0vL3czYy8vZHRkIGh0bWwgNC4wMSBmcmFtZXNldC8vJyxcbiAgICAnLS8vdzNjLy9kdGQgaHRtbCA0LjAxIHRyYW5zaXRpb25hbC8vJ1xuXSk7XG5cbmNvbnN0IFFVSVJLU19NT0RFX1BVQkxJQ19JRFMgPSBbJy0vL3czby8vZHRkIHczIGh0bWwgc3RyaWN0IDMuMC8vZW4vLycsICctL3czYy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsL2VuJywgJ2h0bWwnXTtcbmNvbnN0IExJTUlURURfUVVJUktTX1BVQkxJQ19JRF9QUkVGSVhFUyA9IFsnLS8vdzNjLy9kdGQgeGh0bWwgMS4wIGZyYW1lc2V0Ly8nLCAnLS8vdzNjLy9kdGQgeGh0bWwgMS4wIHRyYW5zaXRpb25hbC8vJ107XG5cbmNvbnN0IExJTUlURURfUVVJUktTX1dJVEhfU1lTVEVNX0lEX1BVQkxJQ19JRF9QUkVGSVhFUyA9IExJTUlURURfUVVJUktTX1BVQkxJQ19JRF9QUkVGSVhFUy5jb25jYXQoW1xuICAgICctLy93M2MvL2R0ZCBodG1sIDQuMDEgZnJhbWVzZXQvLycsXG4gICAgJy0vL3czYy8vZHRkIGh0bWwgNC4wMSB0cmFuc2l0aW9uYWwvLydcbl0pO1xuXG4vL1V0aWxzXG5mdW5jdGlvbiBlbnF1b3RlRG9jdHlwZUlkKGlkKSB7XG4gICAgY29uc3QgcXVvdGUgPSBpZC5pbmRleE9mKCdcIicpICE9PSAtMSA/IFwiJ1wiIDogJ1wiJztcblxuICAgIHJldHVybiBxdW90ZSArIGlkICsgcXVvdGU7XG59XG5cbmZ1bmN0aW9uIGhhc1ByZWZpeChwdWJsaWNJZCwgcHJlZml4ZXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwdWJsaWNJZC5pbmRleE9mKHByZWZpeGVzW2ldKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vQVBJXG5leHBvcnRzLmlzQ29uZm9ybWluZyA9IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgdG9rZW4ubmFtZSA9PT0gVkFMSURfRE9DVFlQRV9OQU1FICYmXG4gICAgICAgIHRva2VuLnB1YmxpY0lkID09PSBudWxsICYmXG4gICAgICAgICh0b2tlbi5zeXN0ZW1JZCA9PT0gbnVsbCB8fCB0b2tlbi5zeXN0ZW1JZCA9PT0gVkFMSURfU1lTVEVNX0lEKVxuICAgICk7XG59O1xuXG5leHBvcnRzLmdldERvY3VtZW50TW9kZSA9IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLm5hbWUgIT09IFZBTElEX0RPQ1RZUEVfTkFNRSkge1xuICAgICAgICByZXR1cm4gRE9DVU1FTlRfTU9ERS5RVUlSS1M7XG4gICAgfVxuXG4gICAgY29uc3Qgc3lzdGVtSWQgPSB0b2tlbi5zeXN0ZW1JZDtcblxuICAgIGlmIChzeXN0ZW1JZCAmJiBzeXN0ZW1JZC50b0xvd2VyQ2FzZSgpID09PSBRVUlSS1NfTU9ERV9TWVNURU1fSUQpIHtcbiAgICAgICAgcmV0dXJuIERPQ1VNRU5UX01PREUuUVVJUktTO1xuICAgIH1cblxuICAgIGxldCBwdWJsaWNJZCA9IHRva2VuLnB1YmxpY0lkO1xuXG4gICAgaWYgKHB1YmxpY0lkICE9PSBudWxsKSB7XG4gICAgICAgIHB1YmxpY0lkID0gcHVibGljSWQudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAoUVVJUktTX01PREVfUFVCTElDX0lEUy5pbmRleE9mKHB1YmxpY0lkKSA+IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gRE9DVU1FTlRfTU9ERS5RVUlSS1M7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJlZml4ZXMgPSBzeXN0ZW1JZCA9PT0gbnVsbCA/IFFVSVJLU19NT0RFX05PX1NZU1RFTV9JRF9QVUJMSUNfSURfUFJFRklYRVMgOiBRVUlSS1NfTU9ERV9QVUJMSUNfSURfUFJFRklYRVM7XG5cbiAgICAgICAgaWYgKGhhc1ByZWZpeChwdWJsaWNJZCwgcHJlZml4ZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gRE9DVU1FTlRfTU9ERS5RVUlSS1M7XG4gICAgICAgIH1cblxuICAgICAgICBwcmVmaXhlcyA9XG4gICAgICAgICAgICBzeXN0ZW1JZCA9PT0gbnVsbCA/IExJTUlURURfUVVJUktTX1BVQkxJQ19JRF9QUkVGSVhFUyA6IExJTUlURURfUVVJUktTX1dJVEhfU1lTVEVNX0lEX1BVQkxJQ19JRF9QUkVGSVhFUztcblxuICAgICAgICBpZiAoaGFzUHJlZml4KHB1YmxpY0lkLCBwcmVmaXhlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBET0NVTUVOVF9NT0RFLkxJTUlURURfUVVJUktTO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIERPQ1VNRU5UX01PREUuTk9fUVVJUktTO1xufTtcblxuZXhwb3J0cy5zZXJpYWxpemVDb250ZW50ID0gZnVuY3Rpb24obmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKSB7XG4gICAgbGV0IHN0ciA9ICchRE9DVFlQRSAnO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgICAgc3RyICs9IG5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHB1YmxpY0lkKSB7XG4gICAgICAgIHN0ciArPSAnIFBVQkxJQyAnICsgZW5xdW90ZURvY3R5cGVJZChwdWJsaWNJZCk7XG4gICAgfSBlbHNlIGlmIChzeXN0ZW1JZCkge1xuICAgICAgICBzdHIgKz0gJyBTWVNURU0nO1xuICAgIH1cblxuICAgIGlmIChzeXN0ZW1JZCAhPT0gbnVsbCkge1xuICAgICAgICBzdHIgKz0gJyAnICsgZW5xdW90ZURvY3R5cGVJZChzeXN0ZW1JZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGNvbnRyb2xDaGFyYWN0ZXJJbklucHV0U3RyZWFtOiAnY29udHJvbC1jaGFyYWN0ZXItaW4taW5wdXQtc3RyZWFtJyxcbiAgICBub25jaGFyYWN0ZXJJbklucHV0U3RyZWFtOiAnbm9uY2hhcmFjdGVyLWluLWlucHV0LXN0cmVhbScsXG4gICAgc3Vycm9nYXRlSW5JbnB1dFN0cmVhbTogJ3N1cnJvZ2F0ZS1pbi1pbnB1dC1zdHJlYW0nLFxuICAgIG5vblZvaWRIdG1sRWxlbWVudFN0YXJ0VGFnV2l0aFRyYWlsaW5nU29saWR1czogJ25vbi12b2lkLWh0bWwtZWxlbWVudC1zdGFydC10YWctd2l0aC10cmFpbGluZy1zb2xpZHVzJyxcbiAgICBlbmRUYWdXaXRoQXR0cmlidXRlczogJ2VuZC10YWctd2l0aC1hdHRyaWJ1dGVzJyxcbiAgICBlbmRUYWdXaXRoVHJhaWxpbmdTb2xpZHVzOiAnZW5kLXRhZy13aXRoLXRyYWlsaW5nLXNvbGlkdXMnLFxuICAgIHVuZXhwZWN0ZWRTb2xpZHVzSW5UYWc6ICd1bmV4cGVjdGVkLXNvbGlkdXMtaW4tdGFnJyxcbiAgICB1bmV4cGVjdGVkTnVsbENoYXJhY3RlcjogJ3VuZXhwZWN0ZWQtbnVsbC1jaGFyYWN0ZXInLFxuICAgIHVuZXhwZWN0ZWRRdWVzdGlvbk1hcmtJbnN0ZWFkT2ZUYWdOYW1lOiAndW5leHBlY3RlZC1xdWVzdGlvbi1tYXJrLWluc3RlYWQtb2YtdGFnLW5hbWUnLFxuICAgIGludmFsaWRGaXJzdENoYXJhY3Rlck9mVGFnTmFtZTogJ2ludmFsaWQtZmlyc3QtY2hhcmFjdGVyLW9mLXRhZy1uYW1lJyxcbiAgICB1bmV4cGVjdGVkRXF1YWxzU2lnbkJlZm9yZUF0dHJpYnV0ZU5hbWU6ICd1bmV4cGVjdGVkLWVxdWFscy1zaWduLWJlZm9yZS1hdHRyaWJ1dGUtbmFtZScsXG4gICAgbWlzc2luZ0VuZFRhZ05hbWU6ICdtaXNzaW5nLWVuZC10YWctbmFtZScsXG4gICAgdW5leHBlY3RlZENoYXJhY3RlckluQXR0cmlidXRlTmFtZTogJ3VuZXhwZWN0ZWQtY2hhcmFjdGVyLWluLWF0dHJpYnV0ZS1uYW1lJyxcbiAgICB1bmtub3duTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2U6ICd1bmtub3duLW5hbWVkLWNoYXJhY3Rlci1yZWZlcmVuY2UnLFxuICAgIG1pc3NpbmdTZW1pY29sb25BZnRlckNoYXJhY3RlclJlZmVyZW5jZTogJ21pc3Npbmctc2VtaWNvbG9uLWFmdGVyLWNoYXJhY3Rlci1yZWZlcmVuY2UnLFxuICAgIHVuZXhwZWN0ZWRDaGFyYWN0ZXJBZnRlckRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyOiAndW5leHBlY3RlZC1jaGFyYWN0ZXItYWZ0ZXItZG9jdHlwZS1zeXN0ZW0taWRlbnRpZmllcicsXG4gICAgdW5leHBlY3RlZENoYXJhY3RlckluVW5xdW90ZWRBdHRyaWJ1dGVWYWx1ZTogJ3VuZXhwZWN0ZWQtY2hhcmFjdGVyLWluLXVucXVvdGVkLWF0dHJpYnV0ZS12YWx1ZScsXG4gICAgZW9mQmVmb3JlVGFnTmFtZTogJ2VvZi1iZWZvcmUtdGFnLW5hbWUnLFxuICAgIGVvZkluVGFnOiAnZW9mLWluLXRhZycsXG4gICAgbWlzc2luZ0F0dHJpYnV0ZVZhbHVlOiAnbWlzc2luZy1hdHRyaWJ1dGUtdmFsdWUnLFxuICAgIG1pc3NpbmdXaGl0ZXNwYWNlQmV0d2VlbkF0dHJpYnV0ZXM6ICdtaXNzaW5nLXdoaXRlc3BhY2UtYmV0d2Vlbi1hdHRyaWJ1dGVzJyxcbiAgICBtaXNzaW5nV2hpdGVzcGFjZUFmdGVyRG9jdHlwZVB1YmxpY0tleXdvcmQ6ICdtaXNzaW5nLXdoaXRlc3BhY2UtYWZ0ZXItZG9jdHlwZS1wdWJsaWMta2V5d29yZCcsXG4gICAgbWlzc2luZ1doaXRlc3BhY2VCZXR3ZWVuRG9jdHlwZVB1YmxpY0FuZFN5c3RlbUlkZW50aWZpZXJzOlxuICAgICAgICAnbWlzc2luZy13aGl0ZXNwYWNlLWJldHdlZW4tZG9jdHlwZS1wdWJsaWMtYW5kLXN5c3RlbS1pZGVudGlmaWVycycsXG4gICAgbWlzc2luZ1doaXRlc3BhY2VBZnRlckRvY3R5cGVTeXN0ZW1LZXl3b3JkOiAnbWlzc2luZy13aGl0ZXNwYWNlLWFmdGVyLWRvY3R5cGUtc3lzdGVtLWtleXdvcmQnLFxuICAgIG1pc3NpbmdRdW90ZUJlZm9yZURvY3R5cGVQdWJsaWNJZGVudGlmaWVyOiAnbWlzc2luZy1xdW90ZS1iZWZvcmUtZG9jdHlwZS1wdWJsaWMtaWRlbnRpZmllcicsXG4gICAgbWlzc2luZ1F1b3RlQmVmb3JlRG9jdHlwZVN5c3RlbUlkZW50aWZpZXI6ICdtaXNzaW5nLXF1b3RlLWJlZm9yZS1kb2N0eXBlLXN5c3RlbS1pZGVudGlmaWVyJyxcbiAgICBtaXNzaW5nRG9jdHlwZVB1YmxpY0lkZW50aWZpZXI6ICdtaXNzaW5nLWRvY3R5cGUtcHVibGljLWlkZW50aWZpZXInLFxuICAgIG1pc3NpbmdEb2N0eXBlU3lzdGVtSWRlbnRpZmllcjogJ21pc3NpbmctZG9jdHlwZS1zeXN0ZW0taWRlbnRpZmllcicsXG4gICAgYWJydXB0RG9jdHlwZVB1YmxpY0lkZW50aWZpZXI6ICdhYnJ1cHQtZG9jdHlwZS1wdWJsaWMtaWRlbnRpZmllcicsXG4gICAgYWJydXB0RG9jdHlwZVN5c3RlbUlkZW50aWZpZXI6ICdhYnJ1cHQtZG9jdHlwZS1zeXN0ZW0taWRlbnRpZmllcicsXG4gICAgY2RhdGFJbkh0bWxDb250ZW50OiAnY2RhdGEtaW4taHRtbC1jb250ZW50JyxcbiAgICBpbmNvcnJlY3RseU9wZW5lZENvbW1lbnQ6ICdpbmNvcnJlY3RseS1vcGVuZWQtY29tbWVudCcsXG4gICAgZW9mSW5TY3JpcHRIdG1sQ29tbWVudExpa2VUZXh0OiAnZW9mLWluLXNjcmlwdC1odG1sLWNvbW1lbnQtbGlrZS10ZXh0JyxcbiAgICBlb2ZJbkRvY3R5cGU6ICdlb2YtaW4tZG9jdHlwZScsXG4gICAgbmVzdGVkQ29tbWVudDogJ25lc3RlZC1jb21tZW50JyxcbiAgICBhYnJ1cHRDbG9zaW5nT2ZFbXB0eUNvbW1lbnQ6ICdhYnJ1cHQtY2xvc2luZy1vZi1lbXB0eS1jb21tZW50JyxcbiAgICBlb2ZJbkNvbW1lbnQ6ICdlb2YtaW4tY29tbWVudCcsXG4gICAgaW5jb3JyZWN0bHlDbG9zZWRDb21tZW50OiAnaW5jb3JyZWN0bHktY2xvc2VkLWNvbW1lbnQnLFxuICAgIGVvZkluQ2RhdGE6ICdlb2YtaW4tY2RhdGEnLFxuICAgIGFic2VuY2VPZkRpZ2l0c0luTnVtZXJpY0NoYXJhY3RlclJlZmVyZW5jZTogJ2Fic2VuY2Utb2YtZGlnaXRzLWluLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZScsXG4gICAgbnVsbENoYXJhY3RlclJlZmVyZW5jZTogJ251bGwtY2hhcmFjdGVyLXJlZmVyZW5jZScsXG4gICAgc3Vycm9nYXRlQ2hhcmFjdGVyUmVmZXJlbmNlOiAnc3Vycm9nYXRlLWNoYXJhY3Rlci1yZWZlcmVuY2UnLFxuICAgIGNoYXJhY3RlclJlZmVyZW5jZU91dHNpZGVVbmljb2RlUmFuZ2U6ICdjaGFyYWN0ZXItcmVmZXJlbmNlLW91dHNpZGUtdW5pY29kZS1yYW5nZScsXG4gICAgY29udHJvbENoYXJhY3RlclJlZmVyZW5jZTogJ2NvbnRyb2wtY2hhcmFjdGVyLXJlZmVyZW5jZScsXG4gICAgbm9uY2hhcmFjdGVyQ2hhcmFjdGVyUmVmZXJlbmNlOiAnbm9uY2hhcmFjdGVyLWNoYXJhY3Rlci1yZWZlcmVuY2UnLFxuICAgIG1pc3NpbmdXaGl0ZXNwYWNlQmVmb3JlRG9jdHlwZU5hbWU6ICdtaXNzaW5nLXdoaXRlc3BhY2UtYmVmb3JlLWRvY3R5cGUtbmFtZScsXG4gICAgbWlzc2luZ0RvY3R5cGVOYW1lOiAnbWlzc2luZy1kb2N0eXBlLW5hbWUnLFxuICAgIGludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZUFmdGVyRG9jdHlwZU5hbWU6ICdpbnZhbGlkLWNoYXJhY3Rlci1zZXF1ZW5jZS1hZnRlci1kb2N0eXBlLW5hbWUnLFxuICAgIGR1cGxpY2F0ZUF0dHJpYnV0ZTogJ2R1cGxpY2F0ZS1hdHRyaWJ1dGUnLFxuICAgIG5vbkNvbmZvcm1pbmdEb2N0eXBlOiAnbm9uLWNvbmZvcm1pbmctZG9jdHlwZScsXG4gICAgbWlzc2luZ0RvY3R5cGU6ICdtaXNzaW5nLWRvY3R5cGUnLFxuICAgIG1pc3BsYWNlZERvY3R5cGU6ICdtaXNwbGFjZWQtZG9jdHlwZScsXG4gICAgZW5kVGFnV2l0aG91dE1hdGNoaW5nT3BlbkVsZW1lbnQ6ICdlbmQtdGFnLXdpdGhvdXQtbWF0Y2hpbmctb3Blbi1lbGVtZW50JyxcbiAgICBjbG9zaW5nT2ZFbGVtZW50V2l0aE9wZW5DaGlsZEVsZW1lbnRzOiAnY2xvc2luZy1vZi1lbGVtZW50LXdpdGgtb3Blbi1jaGlsZC1lbGVtZW50cycsXG4gICAgZGlzYWxsb3dlZENvbnRlbnRJbk5vc2NyaXB0SW5IZWFkOiAnZGlzYWxsb3dlZC1jb250ZW50LWluLW5vc2NyaXB0LWluLWhlYWQnLFxuICAgIG9wZW5FbGVtZW50c0xlZnRBZnRlckVvZjogJ29wZW4tZWxlbWVudHMtbGVmdC1hZnRlci1lb2YnLFxuICAgIGFiYW5kb25lZEhlYWRFbGVtZW50Q2hpbGQ6ICdhYmFuZG9uZWQtaGVhZC1lbGVtZW50LWNoaWxkJyxcbiAgICBtaXNwbGFjZWRTdGFydFRhZ0ZvckhlYWRFbGVtZW50OiAnbWlzcGxhY2VkLXN0YXJ0LXRhZy1mb3ItaGVhZC1lbGVtZW50JyxcbiAgICBuZXN0ZWROb3NjcmlwdEluSGVhZDogJ25lc3RlZC1ub3NjcmlwdC1pbi1oZWFkJyxcbiAgICBlb2ZJbkVsZW1lbnRUaGF0Q2FuQ29udGFpbk9ubHlUZXh0OiAnZW9mLWluLWVsZW1lbnQtdGhhdC1jYW4tY29udGFpbi1vbmx5LXRleHQnXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBUb2tlbml6ZXIgPSByZXF1aXJlKCcuLi90b2tlbml6ZXInKTtcbmNvbnN0IEhUTUwgPSByZXF1aXJlKCcuL2h0bWwnKTtcblxuLy9BbGlhc2VzXG5jb25zdCAkID0gSFRNTC5UQUdfTkFNRVM7XG5jb25zdCBOUyA9IEhUTUwuTkFNRVNQQUNFUztcbmNvbnN0IEFUVFJTID0gSFRNTC5BVFRSUztcblxuLy9NSU1FIHR5cGVzXG5jb25zdCBNSU1FX1RZUEVTID0ge1xuICAgIFRFWFRfSFRNTDogJ3RleHQvaHRtbCcsXG4gICAgQVBQTElDQVRJT05fWE1MOiAnYXBwbGljYXRpb24veGh0bWwreG1sJ1xufTtcblxuLy9BdHRyaWJ1dGVzXG5jb25zdCBERUZJTklUSU9OX1VSTF9BVFRSID0gJ2RlZmluaXRpb251cmwnO1xuY29uc3QgQURKVVNURURfREVGSU5JVElPTl9VUkxfQVRUUiA9ICdkZWZpbml0aW9uVVJMJztcbmNvbnN0IFNWR19BVFRSU19BREpVU1RNRU5UX01BUCA9IHtcbiAgICBhdHRyaWJ1dGVuYW1lOiAnYXR0cmlidXRlTmFtZScsXG4gICAgYXR0cmlidXRldHlwZTogJ2F0dHJpYnV0ZVR5cGUnLFxuICAgIGJhc2VmcmVxdWVuY3k6ICdiYXNlRnJlcXVlbmN5JyxcbiAgICBiYXNlcHJvZmlsZTogJ2Jhc2VQcm9maWxlJyxcbiAgICBjYWxjbW9kZTogJ2NhbGNNb2RlJyxcbiAgICBjbGlwcGF0aHVuaXRzOiAnY2xpcFBhdGhVbml0cycsXG4gICAgZGlmZnVzZWNvbnN0YW50OiAnZGlmZnVzZUNvbnN0YW50JyxcbiAgICBlZGdlbW9kZTogJ2VkZ2VNb2RlJyxcbiAgICBmaWx0ZXJ1bml0czogJ2ZpbHRlclVuaXRzJyxcbiAgICBnbHlwaHJlZjogJ2dseXBoUmVmJyxcbiAgICBncmFkaWVudHRyYW5zZm9ybTogJ2dyYWRpZW50VHJhbnNmb3JtJyxcbiAgICBncmFkaWVudHVuaXRzOiAnZ3JhZGllbnRVbml0cycsXG4gICAga2VybmVsbWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAgICBrZXJuZWx1bml0bGVuZ3RoOiAna2VybmVsVW5pdExlbmd0aCcsXG4gICAga2V5cG9pbnRzOiAna2V5UG9pbnRzJyxcbiAgICBrZXlzcGxpbmVzOiAna2V5U3BsaW5lcycsXG4gICAga2V5dGltZXM6ICdrZXlUaW1lcycsXG4gICAgbGVuZ3RoYWRqdXN0OiAnbGVuZ3RoQWRqdXN0JyxcbiAgICBsaW1pdGluZ2NvbmVhbmdsZTogJ2xpbWl0aW5nQ29uZUFuZ2xlJyxcbiAgICBtYXJrZXJoZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICAgIG1hcmtlcnVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICAgIG1hcmtlcndpZHRoOiAnbWFya2VyV2lkdGgnLFxuICAgIG1hc2tjb250ZW50dW5pdHM6ICdtYXNrQ29udGVudFVuaXRzJyxcbiAgICBtYXNrdW5pdHM6ICdtYXNrVW5pdHMnLFxuICAgIG51bW9jdGF2ZXM6ICdudW1PY3RhdmVzJyxcbiAgICBwYXRobGVuZ3RoOiAncGF0aExlbmd0aCcsXG4gICAgcGF0dGVybmNvbnRlbnR1bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICAgIHBhdHRlcm50cmFuc2Zvcm06ICdwYXR0ZXJuVHJhbnNmb3JtJyxcbiAgICBwYXR0ZXJudW5pdHM6ICdwYXR0ZXJuVW5pdHMnLFxuICAgIHBvaW50c2F0eDogJ3BvaW50c0F0WCcsXG4gICAgcG9pbnRzYXR5OiAncG9pbnRzQXRZJyxcbiAgICBwb2ludHNhdHo6ICdwb2ludHNBdFonLFxuICAgIHByZXNlcnZlYWxwaGE6ICdwcmVzZXJ2ZUFscGhhJyxcbiAgICBwcmVzZXJ2ZWFzcGVjdHJhdGlvOiAncHJlc2VydmVBc3BlY3RSYXRpbycsXG4gICAgcHJpbWl0aXZldW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gICAgcmVmeDogJ3JlZlgnLFxuICAgIHJlZnk6ICdyZWZZJyxcbiAgICByZXBlYXRjb3VudDogJ3JlcGVhdENvdW50JyxcbiAgICByZXBlYXRkdXI6ICdyZXBlYXREdXInLFxuICAgIHJlcXVpcmVkZXh0ZW5zaW9uczogJ3JlcXVpcmVkRXh0ZW5zaW9ucycsXG4gICAgcmVxdWlyZWRmZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICAgIHNwZWN1bGFyY29uc3RhbnQ6ICdzcGVjdWxhckNvbnN0YW50JyxcbiAgICBzcGVjdWxhcmV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gICAgc3ByZWFkbWV0aG9kOiAnc3ByZWFkTWV0aG9kJyxcbiAgICBzdGFydG9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgICBzdGRkZXZpYXRpb246ICdzdGREZXZpYXRpb24nLFxuICAgIHN0aXRjaHRpbGVzOiAnc3RpdGNoVGlsZXMnLFxuICAgIHN1cmZhY2VzY2FsZTogJ3N1cmZhY2VTY2FsZScsXG4gICAgc3lzdGVtbGFuZ3VhZ2U6ICdzeXN0ZW1MYW5ndWFnZScsXG4gICAgdGFibGV2YWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gICAgdGFyZ2V0eDogJ3RhcmdldFgnLFxuICAgIHRhcmdldHk6ICd0YXJnZXRZJyxcbiAgICB0ZXh0bGVuZ3RoOiAndGV4dExlbmd0aCcsXG4gICAgdmlld2JveDogJ3ZpZXdCb3gnLFxuICAgIHZpZXd0YXJnZXQ6ICd2aWV3VGFyZ2V0JyxcbiAgICB4Y2hhbm5lbHNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gICAgeWNoYW5uZWxzZWxlY3RvcjogJ3lDaGFubmVsU2VsZWN0b3InLFxuICAgIHpvb21hbmRwYW46ICd6b29tQW5kUGFuJ1xufTtcblxuY29uc3QgWE1MX0FUVFJTX0FESlVTVE1FTlRfTUFQID0ge1xuICAgICd4bGluazphY3R1YXRlJzogeyBwcmVmaXg6ICd4bGluaycsIG5hbWU6ICdhY3R1YXRlJywgbmFtZXNwYWNlOiBOUy5YTElOSyB9LFxuICAgICd4bGluazphcmNyb2xlJzogeyBwcmVmaXg6ICd4bGluaycsIG5hbWU6ICdhcmNyb2xlJywgbmFtZXNwYWNlOiBOUy5YTElOSyB9LFxuICAgICd4bGluazpocmVmJzogeyBwcmVmaXg6ICd4bGluaycsIG5hbWU6ICdocmVmJywgbmFtZXNwYWNlOiBOUy5YTElOSyB9LFxuICAgICd4bGluazpyb2xlJzogeyBwcmVmaXg6ICd4bGluaycsIG5hbWU6ICdyb2xlJywgbmFtZXNwYWNlOiBOUy5YTElOSyB9LFxuICAgICd4bGluazpzaG93JzogeyBwcmVmaXg6ICd4bGluaycsIG5hbWU6ICdzaG93JywgbmFtZXNwYWNlOiBOUy5YTElOSyB9LFxuICAgICd4bGluazp0aXRsZSc6IHsgcHJlZml4OiAneGxpbmsnLCBuYW1lOiAndGl0bGUnLCBuYW1lc3BhY2U6IE5TLlhMSU5LIH0sXG4gICAgJ3hsaW5rOnR5cGUnOiB7IHByZWZpeDogJ3hsaW5rJywgbmFtZTogJ3R5cGUnLCBuYW1lc3BhY2U6IE5TLlhMSU5LIH0sXG4gICAgJ3htbDpiYXNlJzogeyBwcmVmaXg6ICd4bWwnLCBuYW1lOiAnYmFzZScsIG5hbWVzcGFjZTogTlMuWE1MIH0sXG4gICAgJ3htbDpsYW5nJzogeyBwcmVmaXg6ICd4bWwnLCBuYW1lOiAnbGFuZycsIG5hbWVzcGFjZTogTlMuWE1MIH0sXG4gICAgJ3htbDpzcGFjZSc6IHsgcHJlZml4OiAneG1sJywgbmFtZTogJ3NwYWNlJywgbmFtZXNwYWNlOiBOUy5YTUwgfSxcbiAgICB4bWxuczogeyBwcmVmaXg6ICcnLCBuYW1lOiAneG1sbnMnLCBuYW1lc3BhY2U6IE5TLlhNTE5TIH0sXG4gICAgJ3htbG5zOnhsaW5rJzogeyBwcmVmaXg6ICd4bWxucycsIG5hbWU6ICd4bGluaycsIG5hbWVzcGFjZTogTlMuWE1MTlMgfVxufTtcblxuLy9TVkcgdGFnIG5hbWVzIGFkanVzdG1lbnQgbWFwXG5jb25zdCBTVkdfVEFHX05BTUVTX0FESlVTVE1FTlRfTUFQID0gKGV4cG9ydHMuU1ZHX1RBR19OQU1FU19BREpVU1RNRU5UX01BUCA9IHtcbiAgICBhbHRnbHlwaDogJ2FsdEdseXBoJyxcbiAgICBhbHRnbHlwaGRlZjogJ2FsdEdseXBoRGVmJyxcbiAgICBhbHRnbHlwaGl0ZW06ICdhbHRHbHlwaEl0ZW0nLFxuICAgIGFuaW1hdGVjb2xvcjogJ2FuaW1hdGVDb2xvcicsXG4gICAgYW5pbWF0ZW1vdGlvbjogJ2FuaW1hdGVNb3Rpb24nLFxuICAgIGFuaW1hdGV0cmFuc2Zvcm06ICdhbmltYXRlVHJhbnNmb3JtJyxcbiAgICBjbGlwcGF0aDogJ2NsaXBQYXRoJyxcbiAgICBmZWJsZW5kOiAnZmVCbGVuZCcsXG4gICAgZmVjb2xvcm1hdHJpeDogJ2ZlQ29sb3JNYXRyaXgnLFxuICAgIGZlY29tcG9uZW50dHJhbnNmZXI6ICdmZUNvbXBvbmVudFRyYW5zZmVyJyxcbiAgICBmZWNvbXBvc2l0ZTogJ2ZlQ29tcG9zaXRlJyxcbiAgICBmZWNvbnZvbHZlbWF0cml4OiAnZmVDb252b2x2ZU1hdHJpeCcsXG4gICAgZmVkaWZmdXNlbGlnaHRpbmc6ICdmZURpZmZ1c2VMaWdodGluZycsXG4gICAgZmVkaXNwbGFjZW1lbnRtYXA6ICdmZURpc3BsYWNlbWVudE1hcCcsXG4gICAgZmVkaXN0YW50bGlnaHQ6ICdmZURpc3RhbnRMaWdodCcsXG4gICAgZmVmbG9vZDogJ2ZlRmxvb2QnLFxuICAgIGZlZnVuY2E6ICdmZUZ1bmNBJyxcbiAgICBmZWZ1bmNiOiAnZmVGdW5jQicsXG4gICAgZmVmdW5jZzogJ2ZlRnVuY0cnLFxuICAgIGZlZnVuY3I6ICdmZUZ1bmNSJyxcbiAgICBmZWdhdXNzaWFuYmx1cjogJ2ZlR2F1c3NpYW5CbHVyJyxcbiAgICBmZWltYWdlOiAnZmVJbWFnZScsXG4gICAgZmVtZXJnZTogJ2ZlTWVyZ2UnLFxuICAgIGZlbWVyZ2Vub2RlOiAnZmVNZXJnZU5vZGUnLFxuICAgIGZlbW9ycGhvbG9neTogJ2ZlTW9ycGhvbG9neScsXG4gICAgZmVvZmZzZXQ6ICdmZU9mZnNldCcsXG4gICAgZmVwb2ludGxpZ2h0OiAnZmVQb2ludExpZ2h0JyxcbiAgICBmZXNwZWN1bGFybGlnaHRpbmc6ICdmZVNwZWN1bGFyTGlnaHRpbmcnLFxuICAgIGZlc3BvdGxpZ2h0OiAnZmVTcG90TGlnaHQnLFxuICAgIGZldGlsZTogJ2ZlVGlsZScsXG4gICAgZmV0dXJidWxlbmNlOiAnZmVUdXJidWxlbmNlJyxcbiAgICBmb3JlaWdub2JqZWN0OiAnZm9yZWlnbk9iamVjdCcsXG4gICAgZ2x5cGhyZWY6ICdnbHlwaFJlZicsXG4gICAgbGluZWFyZ3JhZGllbnQ6ICdsaW5lYXJHcmFkaWVudCcsXG4gICAgcmFkaWFsZ3JhZGllbnQ6ICdyYWRpYWxHcmFkaWVudCcsXG4gICAgdGV4dHBhdGg6ICd0ZXh0UGF0aCdcbn0pO1xuXG4vL1RhZ3MgdGhhdCBjYXVzZXMgZXhpdCBmcm9tIGZvcmVpZ24gY29udGVudFxuY29uc3QgRVhJVFNfRk9SRUlHTl9DT05URU5UID0ge1xuICAgIFskLkJdOiB0cnVlLFxuICAgIFskLkJJR106IHRydWUsXG4gICAgWyQuQkxPQ0tRVU9URV06IHRydWUsXG4gICAgWyQuQk9EWV06IHRydWUsXG4gICAgWyQuQlJdOiB0cnVlLFxuICAgIFskLkNFTlRFUl06IHRydWUsXG4gICAgWyQuQ09ERV06IHRydWUsXG4gICAgWyQuRERdOiB0cnVlLFxuICAgIFskLkRJVl06IHRydWUsXG4gICAgWyQuRExdOiB0cnVlLFxuICAgIFskLkRUXTogdHJ1ZSxcbiAgICBbJC5FTV06IHRydWUsXG4gICAgWyQuRU1CRURdOiB0cnVlLFxuICAgIFskLkgxXTogdHJ1ZSxcbiAgICBbJC5IMl06IHRydWUsXG4gICAgWyQuSDNdOiB0cnVlLFxuICAgIFskLkg0XTogdHJ1ZSxcbiAgICBbJC5INV06IHRydWUsXG4gICAgWyQuSDZdOiB0cnVlLFxuICAgIFskLkhFQURdOiB0cnVlLFxuICAgIFskLkhSXTogdHJ1ZSxcbiAgICBbJC5JXTogdHJ1ZSxcbiAgICBbJC5JTUddOiB0cnVlLFxuICAgIFskLkxJXTogdHJ1ZSxcbiAgICBbJC5MSVNUSU5HXTogdHJ1ZSxcbiAgICBbJC5NRU5VXTogdHJ1ZSxcbiAgICBbJC5NRVRBXTogdHJ1ZSxcbiAgICBbJC5OT0JSXTogdHJ1ZSxcbiAgICBbJC5PTF06IHRydWUsXG4gICAgWyQuUF06IHRydWUsXG4gICAgWyQuUFJFXTogdHJ1ZSxcbiAgICBbJC5SVUJZXTogdHJ1ZSxcbiAgICBbJC5TXTogdHJ1ZSxcbiAgICBbJC5TTUFMTF06IHRydWUsXG4gICAgWyQuU1BBTl06IHRydWUsXG4gICAgWyQuU1RST05HXTogdHJ1ZSxcbiAgICBbJC5TVFJJS0VdOiB0cnVlLFxuICAgIFskLlNVQl06IHRydWUsXG4gICAgWyQuU1VQXTogdHJ1ZSxcbiAgICBbJC5UQUJMRV06IHRydWUsXG4gICAgWyQuVFRdOiB0cnVlLFxuICAgIFskLlVdOiB0cnVlLFxuICAgIFskLlVMXTogdHJ1ZSxcbiAgICBbJC5WQVJdOiB0cnVlXG59O1xuXG4vL0NoZWNrIGV4aXQgZnJvbSBmb3JlaWduIGNvbnRlbnRcbmV4cG9ydHMuY2F1c2VzRXhpdCA9IGZ1bmN0aW9uKHN0YXJ0VGFnVG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHN0YXJ0VGFnVG9rZW4udGFnTmFtZTtcbiAgICBjb25zdCBpc0ZvbnRXaXRoQXR0cnMgPVxuICAgICAgICB0biA9PT0gJC5GT05UICYmXG4gICAgICAgIChUb2tlbml6ZXIuZ2V0VG9rZW5BdHRyKHN0YXJ0VGFnVG9rZW4sIEFUVFJTLkNPTE9SKSAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgVG9rZW5pemVyLmdldFRva2VuQXR0cihzdGFydFRhZ1Rva2VuLCBBVFRSUy5TSVpFKSAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgVG9rZW5pemVyLmdldFRva2VuQXR0cihzdGFydFRhZ1Rva2VuLCBBVFRSUy5GQUNFKSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gaXNGb250V2l0aEF0dHJzID8gdHJ1ZSA6IEVYSVRTX0ZPUkVJR05fQ09OVEVOVFt0bl07XG59O1xuXG4vL1Rva2VuIGFkanVzdG1lbnRzXG5leHBvcnRzLmFkanVzdFRva2VuTWF0aE1MQXR0cnMgPSBmdW5jdGlvbih0b2tlbikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW4uYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRva2VuLmF0dHJzW2ldLm5hbWUgPT09IERFRklOSVRJT05fVVJMX0FUVFIpIHtcbiAgICAgICAgICAgIHRva2VuLmF0dHJzW2ldLm5hbWUgPSBBREpVU1RFRF9ERUZJTklUSU9OX1VSTF9BVFRSO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnRzLmFkanVzdFRva2VuU1ZHQXR0cnMgPSBmdW5jdGlvbih0b2tlbikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW4uYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRBdHRyTmFtZSA9IFNWR19BVFRSU19BREpVU1RNRU5UX01BUFt0b2tlbi5hdHRyc1tpXS5uYW1lXTtcblxuICAgICAgICBpZiAoYWRqdXN0ZWRBdHRyTmFtZSkge1xuICAgICAgICAgICAgdG9rZW4uYXR0cnNbaV0ubmFtZSA9IGFkanVzdGVkQXR0ck5hbWU7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnRzLmFkanVzdFRva2VuWE1MQXR0cnMgPSBmdW5jdGlvbih0b2tlbikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW4uYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRBdHRyRW50cnkgPSBYTUxfQVRUUlNfQURKVVNUTUVOVF9NQVBbdG9rZW4uYXR0cnNbaV0ubmFtZV07XG5cbiAgICAgICAgaWYgKGFkanVzdGVkQXR0ckVudHJ5KSB7XG4gICAgICAgICAgICB0b2tlbi5hdHRyc1tpXS5wcmVmaXggPSBhZGp1c3RlZEF0dHJFbnRyeS5wcmVmaXg7XG4gICAgICAgICAgICB0b2tlbi5hdHRyc1tpXS5uYW1lID0gYWRqdXN0ZWRBdHRyRW50cnkubmFtZTtcbiAgICAgICAgICAgIHRva2VuLmF0dHJzW2ldLm5hbWVzcGFjZSA9IGFkanVzdGVkQXR0ckVudHJ5Lm5hbWVzcGFjZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydHMuYWRqdXN0VG9rZW5TVkdUYWdOYW1lID0gZnVuY3Rpb24odG9rZW4pIHtcbiAgICBjb25zdCBhZGp1c3RlZFRhZ05hbWUgPSBTVkdfVEFHX05BTUVTX0FESlVTVE1FTlRfTUFQW3Rva2VuLnRhZ05hbWVdO1xuXG4gICAgaWYgKGFkanVzdGVkVGFnTmFtZSkge1xuICAgICAgICB0b2tlbi50YWdOYW1lID0gYWRqdXN0ZWRUYWdOYW1lO1xuICAgIH1cbn07XG5cbi8vSW50ZWdyYXRpb24gcG9pbnRzXG5mdW5jdGlvbiBpc01hdGhNTFRleHRJbnRlZ3JhdGlvblBvaW50KHRuLCBucykge1xuICAgIHJldHVybiBucyA9PT0gTlMuTUFUSE1MICYmICh0biA9PT0gJC5NSSB8fCB0biA9PT0gJC5NTyB8fCB0biA9PT0gJC5NTiB8fCB0biA9PT0gJC5NUyB8fCB0biA9PT0gJC5NVEVYVCk7XG59XG5cbmZ1bmN0aW9uIGlzSHRtbEludGVncmF0aW9uUG9pbnQodG4sIG5zLCBhdHRycykge1xuICAgIGlmIChucyA9PT0gTlMuTUFUSE1MICYmIHRuID09PSAkLkFOTk9UQVRJT05fWE1MKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChhdHRyc1tpXS5uYW1lID09PSBBVFRSUy5FTkNPRElORykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXR0cnNbaV0udmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gTUlNRV9UWVBFUy5URVhUX0hUTUwgfHwgdmFsdWUgPT09IE1JTUVfVFlQRVMuQVBQTElDQVRJT05fWE1MO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5zID09PSBOUy5TVkcgJiYgKHRuID09PSAkLkZPUkVJR05fT0JKRUNUIHx8IHRuID09PSAkLkRFU0MgfHwgdG4gPT09ICQuVElUTEUpO1xufVxuXG5leHBvcnRzLmlzSW50ZWdyYXRpb25Qb2ludCA9IGZ1bmN0aW9uKHRuLCBucywgYXR0cnMsIGZvcmVpZ25OUykge1xuICAgIGlmICgoIWZvcmVpZ25OUyB8fCBmb3JlaWduTlMgPT09IE5TLkhUTUwpICYmIGlzSHRtbEludGVncmF0aW9uUG9pbnQodG4sIG5zLCBhdHRycykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCghZm9yZWlnbk5TIHx8IGZvcmVpZ25OUyA9PT0gTlMuTUFUSE1MKSAmJiBpc01hdGhNTFRleHRJbnRlZ3JhdGlvblBvaW50KHRuLCBucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgTlMgPSAoZXhwb3J0cy5OQU1FU1BBQ0VTID0ge1xuICAgIEhUTUw6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJyxcbiAgICBNQVRITUw6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MJyxcbiAgICBTVkc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsXG4gICAgWExJTks6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyxcbiAgICBYTUw6ICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnLFxuICAgIFhNTE5TOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8nXG59KTtcblxuZXhwb3J0cy5BVFRSUyA9IHtcbiAgICBUWVBFOiAndHlwZScsXG4gICAgQUNUSU9OOiAnYWN0aW9uJyxcbiAgICBFTkNPRElORzogJ2VuY29kaW5nJyxcbiAgICBQUk9NUFQ6ICdwcm9tcHQnLFxuICAgIE5BTUU6ICduYW1lJyxcbiAgICBDT0xPUjogJ2NvbG9yJyxcbiAgICBGQUNFOiAnZmFjZScsXG4gICAgU0laRTogJ3NpemUnXG59O1xuXG5leHBvcnRzLkRPQ1VNRU5UX01PREUgPSB7XG4gICAgTk9fUVVJUktTOiAnbm8tcXVpcmtzJyxcbiAgICBRVUlSS1M6ICdxdWlya3MnLFxuICAgIExJTUlURURfUVVJUktTOiAnbGltaXRlZC1xdWlya3MnXG59O1xuXG5jb25zdCAkID0gKGV4cG9ydHMuVEFHX05BTUVTID0ge1xuICAgIEE6ICdhJyxcbiAgICBBRERSRVNTOiAnYWRkcmVzcycsXG4gICAgQU5OT1RBVElPTl9YTUw6ICdhbm5vdGF0aW9uLXhtbCcsXG4gICAgQVBQTEVUOiAnYXBwbGV0JyxcbiAgICBBUkVBOiAnYXJlYScsXG4gICAgQVJUSUNMRTogJ2FydGljbGUnLFxuICAgIEFTSURFOiAnYXNpZGUnLFxuXG4gICAgQjogJ2InLFxuICAgIEJBU0U6ICdiYXNlJyxcbiAgICBCQVNFRk9OVDogJ2Jhc2Vmb250JyxcbiAgICBCR1NPVU5EOiAnYmdzb3VuZCcsXG4gICAgQklHOiAnYmlnJyxcbiAgICBCTE9DS1FVT1RFOiAnYmxvY2txdW90ZScsXG4gICAgQk9EWTogJ2JvZHknLFxuICAgIEJSOiAnYnInLFxuICAgIEJVVFRPTjogJ2J1dHRvbicsXG5cbiAgICBDQVBUSU9OOiAnY2FwdGlvbicsXG4gICAgQ0VOVEVSOiAnY2VudGVyJyxcbiAgICBDT0RFOiAnY29kZScsXG4gICAgQ09MOiAnY29sJyxcbiAgICBDT0xHUk9VUDogJ2NvbGdyb3VwJyxcblxuICAgIEREOiAnZGQnLFxuICAgIERFU0M6ICdkZXNjJyxcbiAgICBERVRBSUxTOiAnZGV0YWlscycsXG4gICAgRElBTE9HOiAnZGlhbG9nJyxcbiAgICBESVI6ICdkaXInLFxuICAgIERJVjogJ2RpdicsXG4gICAgREw6ICdkbCcsXG4gICAgRFQ6ICdkdCcsXG5cbiAgICBFTTogJ2VtJyxcbiAgICBFTUJFRDogJ2VtYmVkJyxcblxuICAgIEZJRUxEU0VUOiAnZmllbGRzZXQnLFxuICAgIEZJR0NBUFRJT046ICdmaWdjYXB0aW9uJyxcbiAgICBGSUdVUkU6ICdmaWd1cmUnLFxuICAgIEZPTlQ6ICdmb250JyxcbiAgICBGT09URVI6ICdmb290ZXInLFxuICAgIEZPUkVJR05fT0JKRUNUOiAnZm9yZWlnbk9iamVjdCcsXG4gICAgRk9STTogJ2Zvcm0nLFxuICAgIEZSQU1FOiAnZnJhbWUnLFxuICAgIEZSQU1FU0VUOiAnZnJhbWVzZXQnLFxuXG4gICAgSDE6ICdoMScsXG4gICAgSDI6ICdoMicsXG4gICAgSDM6ICdoMycsXG4gICAgSDQ6ICdoNCcsXG4gICAgSDU6ICdoNScsXG4gICAgSDY6ICdoNicsXG4gICAgSEVBRDogJ2hlYWQnLFxuICAgIEhFQURFUjogJ2hlYWRlcicsXG4gICAgSEdST1VQOiAnaGdyb3VwJyxcbiAgICBIUjogJ2hyJyxcbiAgICBIVE1MOiAnaHRtbCcsXG5cbiAgICBJOiAnaScsXG4gICAgSU1HOiAnaW1nJyxcbiAgICBJTUFHRTogJ2ltYWdlJyxcbiAgICBJTlBVVDogJ2lucHV0JyxcbiAgICBJRlJBTUU6ICdpZnJhbWUnLFxuXG4gICAgS0VZR0VOOiAna2V5Z2VuJyxcblxuICAgIExBQkVMOiAnbGFiZWwnLFxuICAgIExJOiAnbGknLFxuICAgIExJTks6ICdsaW5rJyxcbiAgICBMSVNUSU5HOiAnbGlzdGluZycsXG5cbiAgICBNQUlOOiAnbWFpbicsXG4gICAgTUFMSUdOTUFSSzogJ21hbGlnbm1hcmsnLFxuICAgIE1BUlFVRUU6ICdtYXJxdWVlJyxcbiAgICBNQVRIOiAnbWF0aCcsXG4gICAgTUVOVTogJ21lbnUnLFxuICAgIE1FVEE6ICdtZXRhJyxcbiAgICBNR0xZUEg6ICdtZ2x5cGgnLFxuICAgIE1JOiAnbWknLFxuICAgIE1POiAnbW8nLFxuICAgIE1OOiAnbW4nLFxuICAgIE1TOiAnbXMnLFxuICAgIE1URVhUOiAnbXRleHQnLFxuXG4gICAgTkFWOiAnbmF2JyxcbiAgICBOT0JSOiAnbm9icicsXG4gICAgTk9GUkFNRVM6ICdub2ZyYW1lcycsXG4gICAgTk9FTUJFRDogJ25vZW1iZWQnLFxuICAgIE5PU0NSSVBUOiAnbm9zY3JpcHQnLFxuXG4gICAgT0JKRUNUOiAnb2JqZWN0JyxcbiAgICBPTDogJ29sJyxcbiAgICBPUFRHUk9VUDogJ29wdGdyb3VwJyxcbiAgICBPUFRJT046ICdvcHRpb24nLFxuXG4gICAgUDogJ3AnLFxuICAgIFBBUkFNOiAncGFyYW0nLFxuICAgIFBMQUlOVEVYVDogJ3BsYWludGV4dCcsXG4gICAgUFJFOiAncHJlJyxcblxuICAgIFJCOiAncmInLFxuICAgIFJQOiAncnAnLFxuICAgIFJUOiAncnQnLFxuICAgIFJUQzogJ3J0YycsXG4gICAgUlVCWTogJ3J1YnknLFxuXG4gICAgUzogJ3MnLFxuICAgIFNDUklQVDogJ3NjcmlwdCcsXG4gICAgU0VDVElPTjogJ3NlY3Rpb24nLFxuICAgIFNFTEVDVDogJ3NlbGVjdCcsXG4gICAgU09VUkNFOiAnc291cmNlJyxcbiAgICBTTUFMTDogJ3NtYWxsJyxcbiAgICBTUEFOOiAnc3BhbicsXG4gICAgU1RSSUtFOiAnc3RyaWtlJyxcbiAgICBTVFJPTkc6ICdzdHJvbmcnLFxuICAgIFNUWUxFOiAnc3R5bGUnLFxuICAgIFNVQjogJ3N1YicsXG4gICAgU1VNTUFSWTogJ3N1bW1hcnknLFxuICAgIFNVUDogJ3N1cCcsXG5cbiAgICBUQUJMRTogJ3RhYmxlJyxcbiAgICBUQk9EWTogJ3Rib2R5JyxcbiAgICBURU1QTEFURTogJ3RlbXBsYXRlJyxcbiAgICBURVhUQVJFQTogJ3RleHRhcmVhJyxcbiAgICBURk9PVDogJ3Rmb290JyxcbiAgICBURDogJ3RkJyxcbiAgICBUSDogJ3RoJyxcbiAgICBUSEVBRDogJ3RoZWFkJyxcbiAgICBUSVRMRTogJ3RpdGxlJyxcbiAgICBUUjogJ3RyJyxcbiAgICBUUkFDSzogJ3RyYWNrJyxcbiAgICBUVDogJ3R0JyxcblxuICAgIFU6ICd1JyxcbiAgICBVTDogJ3VsJyxcblxuICAgIFNWRzogJ3N2ZycsXG5cbiAgICBWQVI6ICd2YXInLFxuXG4gICAgV0JSOiAnd2JyJyxcblxuICAgIFhNUDogJ3htcCdcbn0pO1xuXG5leHBvcnRzLlNQRUNJQUxfRUxFTUVOVFMgPSB7XG4gICAgW05TLkhUTUxdOiB7XG4gICAgICAgIFskLkFERFJFU1NdOiB0cnVlLFxuICAgICAgICBbJC5BUFBMRVRdOiB0cnVlLFxuICAgICAgICBbJC5BUkVBXTogdHJ1ZSxcbiAgICAgICAgWyQuQVJUSUNMRV06IHRydWUsXG4gICAgICAgIFskLkFTSURFXTogdHJ1ZSxcbiAgICAgICAgWyQuQkFTRV06IHRydWUsXG4gICAgICAgIFskLkJBU0VGT05UXTogdHJ1ZSxcbiAgICAgICAgWyQuQkdTT1VORF06IHRydWUsXG4gICAgICAgIFskLkJMT0NLUVVPVEVdOiB0cnVlLFxuICAgICAgICBbJC5CT0RZXTogdHJ1ZSxcbiAgICAgICAgWyQuQlJdOiB0cnVlLFxuICAgICAgICBbJC5CVVRUT05dOiB0cnVlLFxuICAgICAgICBbJC5DQVBUSU9OXTogdHJ1ZSxcbiAgICAgICAgWyQuQ0VOVEVSXTogdHJ1ZSxcbiAgICAgICAgWyQuQ09MXTogdHJ1ZSxcbiAgICAgICAgWyQuQ09MR1JPVVBdOiB0cnVlLFxuICAgICAgICBbJC5ERF06IHRydWUsXG4gICAgICAgIFskLkRFVEFJTFNdOiB0cnVlLFxuICAgICAgICBbJC5ESVJdOiB0cnVlLFxuICAgICAgICBbJC5ESVZdOiB0cnVlLFxuICAgICAgICBbJC5ETF06IHRydWUsXG4gICAgICAgIFskLkRUXTogdHJ1ZSxcbiAgICAgICAgWyQuRU1CRURdOiB0cnVlLFxuICAgICAgICBbJC5GSUVMRFNFVF06IHRydWUsXG4gICAgICAgIFskLkZJR0NBUFRJT05dOiB0cnVlLFxuICAgICAgICBbJC5GSUdVUkVdOiB0cnVlLFxuICAgICAgICBbJC5GT09URVJdOiB0cnVlLFxuICAgICAgICBbJC5GT1JNXTogdHJ1ZSxcbiAgICAgICAgWyQuRlJBTUVdOiB0cnVlLFxuICAgICAgICBbJC5GUkFNRVNFVF06IHRydWUsXG4gICAgICAgIFskLkgxXTogdHJ1ZSxcbiAgICAgICAgWyQuSDJdOiB0cnVlLFxuICAgICAgICBbJC5IM106IHRydWUsXG4gICAgICAgIFskLkg0XTogdHJ1ZSxcbiAgICAgICAgWyQuSDVdOiB0cnVlLFxuICAgICAgICBbJC5INl06IHRydWUsXG4gICAgICAgIFskLkhFQURdOiB0cnVlLFxuICAgICAgICBbJC5IRUFERVJdOiB0cnVlLFxuICAgICAgICBbJC5IR1JPVVBdOiB0cnVlLFxuICAgICAgICBbJC5IUl06IHRydWUsXG4gICAgICAgIFskLkhUTUxdOiB0cnVlLFxuICAgICAgICBbJC5JRlJBTUVdOiB0cnVlLFxuICAgICAgICBbJC5JTUddOiB0cnVlLFxuICAgICAgICBbJC5JTlBVVF06IHRydWUsXG4gICAgICAgIFskLkxJXTogdHJ1ZSxcbiAgICAgICAgWyQuTElOS106IHRydWUsXG4gICAgICAgIFskLkxJU1RJTkddOiB0cnVlLFxuICAgICAgICBbJC5NQUlOXTogdHJ1ZSxcbiAgICAgICAgWyQuTUFSUVVFRV06IHRydWUsXG4gICAgICAgIFskLk1FTlVdOiB0cnVlLFxuICAgICAgICBbJC5NRVRBXTogdHJ1ZSxcbiAgICAgICAgWyQuTkFWXTogdHJ1ZSxcbiAgICAgICAgWyQuTk9FTUJFRF06IHRydWUsXG4gICAgICAgIFskLk5PRlJBTUVTXTogdHJ1ZSxcbiAgICAgICAgWyQuTk9TQ1JJUFRdOiB0cnVlLFxuICAgICAgICBbJC5PQkpFQ1RdOiB0cnVlLFxuICAgICAgICBbJC5PTF06IHRydWUsXG4gICAgICAgIFskLlBdOiB0cnVlLFxuICAgICAgICBbJC5QQVJBTV06IHRydWUsXG4gICAgICAgIFskLlBMQUlOVEVYVF06IHRydWUsXG4gICAgICAgIFskLlBSRV06IHRydWUsXG4gICAgICAgIFskLlNDUklQVF06IHRydWUsXG4gICAgICAgIFskLlNFQ1RJT05dOiB0cnVlLFxuICAgICAgICBbJC5TRUxFQ1RdOiB0cnVlLFxuICAgICAgICBbJC5TT1VSQ0VdOiB0cnVlLFxuICAgICAgICBbJC5TVFlMRV06IHRydWUsXG4gICAgICAgIFskLlNVTU1BUlldOiB0cnVlLFxuICAgICAgICBbJC5UQUJMRV06IHRydWUsXG4gICAgICAgIFskLlRCT0RZXTogdHJ1ZSxcbiAgICAgICAgWyQuVERdOiB0cnVlLFxuICAgICAgICBbJC5URU1QTEFURV06IHRydWUsXG4gICAgICAgIFskLlRFWFRBUkVBXTogdHJ1ZSxcbiAgICAgICAgWyQuVEZPT1RdOiB0cnVlLFxuICAgICAgICBbJC5USF06IHRydWUsXG4gICAgICAgIFskLlRIRUFEXTogdHJ1ZSxcbiAgICAgICAgWyQuVElUTEVdOiB0cnVlLFxuICAgICAgICBbJC5UUl06IHRydWUsXG4gICAgICAgIFskLlRSQUNLXTogdHJ1ZSxcbiAgICAgICAgWyQuVUxdOiB0cnVlLFxuICAgICAgICBbJC5XQlJdOiB0cnVlLFxuICAgICAgICBbJC5YTVBdOiB0cnVlXG4gICAgfSxcbiAgICBbTlMuTUFUSE1MXToge1xuICAgICAgICBbJC5NSV06IHRydWUsXG4gICAgICAgIFskLk1PXTogdHJ1ZSxcbiAgICAgICAgWyQuTU5dOiB0cnVlLFxuICAgICAgICBbJC5NU106IHRydWUsXG4gICAgICAgIFskLk1URVhUXTogdHJ1ZSxcbiAgICAgICAgWyQuQU5OT1RBVElPTl9YTUxdOiB0cnVlXG4gICAgfSxcbiAgICBbTlMuU1ZHXToge1xuICAgICAgICBbJC5USVRMRV06IHRydWUsXG4gICAgICAgIFskLkZPUkVJR05fT0JKRUNUXTogdHJ1ZSxcbiAgICAgICAgWyQuREVTQ106IHRydWVcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBVTkRFRklORURfQ09ERV9QT0lOVFMgPSBbXG4gICAgMHhmZmZlLFxuICAgIDB4ZmZmZixcbiAgICAweDFmZmZlLFxuICAgIDB4MWZmZmYsXG4gICAgMHgyZmZmZSxcbiAgICAweDJmZmZmLFxuICAgIDB4M2ZmZmUsXG4gICAgMHgzZmZmZixcbiAgICAweDRmZmZlLFxuICAgIDB4NGZmZmYsXG4gICAgMHg1ZmZmZSxcbiAgICAweDVmZmZmLFxuICAgIDB4NmZmZmUsXG4gICAgMHg2ZmZmZixcbiAgICAweDdmZmZlLFxuICAgIDB4N2ZmZmYsXG4gICAgMHg4ZmZmZSxcbiAgICAweDhmZmZmLFxuICAgIDB4OWZmZmUsXG4gICAgMHg5ZmZmZixcbiAgICAweGFmZmZlLFxuICAgIDB4YWZmZmYsXG4gICAgMHhiZmZmZSxcbiAgICAweGJmZmZmLFxuICAgIDB4Y2ZmZmUsXG4gICAgMHhjZmZmZixcbiAgICAweGRmZmZlLFxuICAgIDB4ZGZmZmYsXG4gICAgMHhlZmZmZSxcbiAgICAweGVmZmZmLFxuICAgIDB4ZmZmZmUsXG4gICAgMHhmZmZmZixcbiAgICAweDEwZmZmZSxcbiAgICAweDEwZmZmZlxuXTtcblxuZXhwb3J0cy5SRVBMQUNFTUVOVF9DSEFSQUNURVIgPSAnXFx1RkZGRCc7XG5cbmV4cG9ydHMuQ09ERV9QT0lOVFMgPSB7XG4gICAgRU9GOiAtMSxcbiAgICBOVUxMOiAweDAwLFxuICAgIFRBQlVMQVRJT046IDB4MDksXG4gICAgQ0FSUklBR0VfUkVUVVJOOiAweDBkLFxuICAgIExJTkVfRkVFRDogMHgwYSxcbiAgICBGT1JNX0ZFRUQ6IDB4MGMsXG4gICAgU1BBQ0U6IDB4MjAsXG4gICAgRVhDTEFNQVRJT05fTUFSSzogMHgyMSxcbiAgICBRVU9UQVRJT05fTUFSSzogMHgyMixcbiAgICBOVU1CRVJfU0lHTjogMHgyMyxcbiAgICBBTVBFUlNBTkQ6IDB4MjYsXG4gICAgQVBPU1RST1BIRTogMHgyNyxcbiAgICBIWVBIRU5fTUlOVVM6IDB4MmQsXG4gICAgU09MSURVUzogMHgyZixcbiAgICBESUdJVF8wOiAweDMwLFxuICAgIERJR0lUXzk6IDB4MzksXG4gICAgU0VNSUNPTE9OOiAweDNiLFxuICAgIExFU1NfVEhBTl9TSUdOOiAweDNjLFxuICAgIEVRVUFMU19TSUdOOiAweDNkLFxuICAgIEdSRUFURVJfVEhBTl9TSUdOOiAweDNlLFxuICAgIFFVRVNUSU9OX01BUks6IDB4M2YsXG4gICAgTEFUSU5fQ0FQSVRBTF9BOiAweDQxLFxuICAgIExBVElOX0NBUElUQUxfRjogMHg0NixcbiAgICBMQVRJTl9DQVBJVEFMX1g6IDB4NTgsXG4gICAgTEFUSU5fQ0FQSVRBTF9aOiAweDVhLFxuICAgIFJJR0hUX1NRVUFSRV9CUkFDS0VUOiAweDVkLFxuICAgIEdSQVZFX0FDQ0VOVDogMHg2MCxcbiAgICBMQVRJTl9TTUFMTF9BOiAweDYxLFxuICAgIExBVElOX1NNQUxMX0Y6IDB4NjYsXG4gICAgTEFUSU5fU01BTExfWDogMHg3OCxcbiAgICBMQVRJTl9TTUFMTF9aOiAweDdhLFxuICAgIFJFUExBQ0VNRU5UX0NIQVJBQ1RFUjogMHhmZmZkXG59O1xuXG5leHBvcnRzLkNPREVfUE9JTlRfU0VRVUVOQ0VTID0ge1xuICAgIERBU0hfREFTSF9TVFJJTkc6IFsweDJkLCAweDJkXSwgLy8tLVxuICAgIERPQ1RZUEVfU1RSSU5HOiBbMHg0NCwgMHg0ZiwgMHg0MywgMHg1NCwgMHg1OSwgMHg1MCwgMHg0NV0sIC8vRE9DVFlQRVxuICAgIENEQVRBX1NUQVJUX1NUUklORzogWzB4NWIsIDB4NDMsIDB4NDQsIDB4NDEsIDB4NTQsIDB4NDEsIDB4NWJdLCAvL1tDREFUQVtcbiAgICBTQ1JJUFRfU1RSSU5HOiBbMHg3MywgMHg2MywgMHg3MiwgMHg2OSwgMHg3MCwgMHg3NF0sIC8vc2NyaXB0XG4gICAgUFVCTElDX1NUUklORzogWzB4NTAsIDB4NTUsIDB4NDIsIDB4NGMsIDB4NDksIDB4NDNdLCAvL1BVQkxJQ1xuICAgIFNZU1RFTV9TVFJJTkc6IFsweDUzLCAweDU5LCAweDUzLCAweDU0LCAweDQ1LCAweDRkXSAvL1NZU1RFTVxufTtcblxuLy9TdXJyb2dhdGVzXG5leHBvcnRzLmlzU3Vycm9nYXRlID0gZnVuY3Rpb24oY3ApIHtcbiAgICByZXR1cm4gY3AgPj0gMHhkODAwICYmIGNwIDw9IDB4ZGZmZjtcbn07XG5cbmV4cG9ydHMuaXNTdXJyb2dhdGVQYWlyID0gZnVuY3Rpb24oY3ApIHtcbiAgICByZXR1cm4gY3AgPj0gMHhkYzAwICYmIGNwIDw9IDB4ZGZmZjtcbn07XG5cbmV4cG9ydHMuZ2V0U3Vycm9nYXRlUGFpckNvZGVQb2ludCA9IGZ1bmN0aW9uKGNwMSwgY3AyKSB7XG4gICAgcmV0dXJuIChjcDEgLSAweGQ4MDApICogMHg0MDAgKyAweDI0MDAgKyBjcDI7XG59O1xuXG4vL05PVEU6IGV4Y2x1ZGluZyBOVUxMIGFuZCBBU0NJSSB3aGl0ZXNwYWNlXG5leHBvcnRzLmlzQ29udHJvbENvZGVQb2ludCA9IGZ1bmN0aW9uKGNwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgKGNwICE9PSAweDIwICYmIGNwICE9PSAweDBhICYmIGNwICE9PSAweDBkICYmIGNwICE9PSAweDA5ICYmIGNwICE9PSAweDBjICYmIGNwID49IDB4MDEgJiYgY3AgPD0gMHgxZikgfHxcbiAgICAgICAgKGNwID49IDB4N2YgJiYgY3AgPD0gMHg5ZilcbiAgICApO1xufTtcblxuZXhwb3J0cy5pc1VuZGVmaW5lZENvZGVQb2ludCA9IGZ1bmN0aW9uKGNwKSB7XG4gICAgcmV0dXJuIChjcCA+PSAweGZkZDAgJiYgY3AgPD0gMHhmZGVmKSB8fCBVTkRFRklORURfQ09ERV9QT0lOVFMuaW5kZXhPZihjcCkgPiAtMTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IE1peGluID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvbWl4aW4nKTtcblxuY2xhc3MgRXJyb3JSZXBvcnRpbmdNaXhpbkJhc2UgZXh0ZW5kcyBNaXhpbiB7XG4gICAgY29uc3RydWN0b3IoaG9zdCwgb3B0cykge1xuICAgICAgICBzdXBlcihob3N0KTtcblxuICAgICAgICB0aGlzLnBvc1RyYWNrZXIgPSBudWxsO1xuICAgICAgICB0aGlzLm9uUGFyc2VFcnJvciA9IG9wdHMub25QYXJzZUVycm9yO1xuICAgIH1cblxuICAgIF9zZXRFcnJvckxvY2F0aW9uKGVycikge1xuICAgICAgICBlcnIuc3RhcnRMaW5lID0gZXJyLmVuZExpbmUgPSB0aGlzLnBvc1RyYWNrZXIubGluZTtcbiAgICAgICAgZXJyLnN0YXJ0Q29sID0gZXJyLmVuZENvbCA9IHRoaXMucG9zVHJhY2tlci5jb2w7XG4gICAgICAgIGVyci5zdGFydE9mZnNldCA9IGVyci5lbmRPZmZzZXQgPSB0aGlzLnBvc1RyYWNrZXIub2Zmc2V0O1xuICAgIH1cblxuICAgIF9yZXBvcnRFcnJvcihjb2RlKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IHtcbiAgICAgICAgICAgIGNvZGU6IGNvZGUsXG4gICAgICAgICAgICBzdGFydExpbmU6IC0xLFxuICAgICAgICAgICAgc3RhcnRDb2w6IC0xLFxuICAgICAgICAgICAgc3RhcnRPZmZzZXQ6IC0xLFxuICAgICAgICAgICAgZW5kTGluZTogLTEsXG4gICAgICAgICAgICBlbmRDb2w6IC0xLFxuICAgICAgICAgICAgZW5kT2Zmc2V0OiAtMVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX3NldEVycm9yTG9jYXRpb24oZXJyKTtcbiAgICAgICAgdGhpcy5vblBhcnNlRXJyb3IoZXJyKTtcbiAgICB9XG5cbiAgICBfZ2V0T3ZlcnJpZGRlbk1ldGhvZHMobXhuKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfZXJyKGNvZGUpIHtcbiAgICAgICAgICAgICAgICBteG4uX3JlcG9ydEVycm9yKGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFcnJvclJlcG9ydGluZ01peGluQmFzZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgRXJyb3JSZXBvcnRpbmdNaXhpbkJhc2UgPSByZXF1aXJlKCcuL21peGluLWJhc2UnKTtcbmNvbnN0IEVycm9yUmVwb3J0aW5nVG9rZW5pemVyTWl4aW4gPSByZXF1aXJlKCcuL3Rva2VuaXplci1taXhpbicpO1xuY29uc3QgTG9jYXRpb25JbmZvVG9rZW5pemVyTWl4aW4gPSByZXF1aXJlKCcuLi9sb2NhdGlvbi1pbmZvL3Rva2VuaXplci1taXhpbicpO1xuY29uc3QgTWl4aW4gPSByZXF1aXJlKCcuLi8uLi91dGlscy9taXhpbicpO1xuXG5jbGFzcyBFcnJvclJlcG9ydGluZ1BhcnNlck1peGluIGV4dGVuZHMgRXJyb3JSZXBvcnRpbmdNaXhpbkJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHBhcnNlciwgb3B0cykge1xuICAgICAgICBzdXBlcihwYXJzZXIsIG9wdHMpO1xuXG4gICAgICAgIHRoaXMub3B0cyA9IG9wdHM7XG4gICAgICAgIHRoaXMuY3RMb2MgPSBudWxsO1xuICAgICAgICB0aGlzLmxvY0JlZm9yZVRva2VuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX3NldEVycm9yTG9jYXRpb24oZXJyKSB7XG4gICAgICAgIGlmICh0aGlzLmN0TG9jKSB7XG4gICAgICAgICAgICBlcnIuc3RhcnRMaW5lID0gdGhpcy5jdExvYy5zdGFydExpbmU7XG4gICAgICAgICAgICBlcnIuc3RhcnRDb2wgPSB0aGlzLmN0TG9jLnN0YXJ0Q29sO1xuICAgICAgICAgICAgZXJyLnN0YXJ0T2Zmc2V0ID0gdGhpcy5jdExvYy5zdGFydE9mZnNldDtcblxuICAgICAgICAgICAgZXJyLmVuZExpbmUgPSB0aGlzLmxvY0JlZm9yZVRva2VuID8gdGhpcy5jdExvYy5zdGFydExpbmUgOiB0aGlzLmN0TG9jLmVuZExpbmU7XG4gICAgICAgICAgICBlcnIuZW5kQ29sID0gdGhpcy5sb2NCZWZvcmVUb2tlbiA/IHRoaXMuY3RMb2Muc3RhcnRDb2wgOiB0aGlzLmN0TG9jLmVuZENvbDtcbiAgICAgICAgICAgIGVyci5lbmRPZmZzZXQgPSB0aGlzLmxvY0JlZm9yZVRva2VuID8gdGhpcy5jdExvYy5zdGFydE9mZnNldCA6IHRoaXMuY3RMb2MuZW5kT2Zmc2V0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2dldE92ZXJyaWRkZW5NZXRob2RzKG14biwgb3JpZykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX2Jvb3RzdHJhcChkb2N1bWVudCwgZnJhZ21lbnRDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgb3JpZy5fYm9vdHN0cmFwLmNhbGwodGhpcywgZG9jdW1lbnQsIGZyYWdtZW50Q29udGV4dCk7XG5cbiAgICAgICAgICAgICAgICBNaXhpbi5pbnN0YWxsKHRoaXMudG9rZW5pemVyLCBFcnJvclJlcG9ydGluZ1Rva2VuaXplck1peGluLCBteG4ub3B0cyk7XG4gICAgICAgICAgICAgICAgTWl4aW4uaW5zdGFsbCh0aGlzLnRva2VuaXplciwgTG9jYXRpb25JbmZvVG9rZW5pemVyTWl4aW4pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX3Byb2Nlc3NJbnB1dFRva2VuKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgbXhuLmN0TG9jID0gdG9rZW4ubG9jYXRpb247XG5cbiAgICAgICAgICAgICAgICBvcmlnLl9wcm9jZXNzSW5wdXRUb2tlbi5jYWxsKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIF9lcnIoY29kZSwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIG14bi5sb2NCZWZvcmVUb2tlbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5iZWZvcmVUb2tlbjtcbiAgICAgICAgICAgICAgICBteG4uX3JlcG9ydEVycm9yKGNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFcnJvclJlcG9ydGluZ1BhcnNlck1peGluO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFcnJvclJlcG9ydGluZ01peGluQmFzZSA9IHJlcXVpcmUoJy4vbWl4aW4tYmFzZScpO1xuY29uc3QgUG9zaXRpb25UcmFja2luZ1ByZXByb2Nlc3Nvck1peGluID0gcmVxdWlyZSgnLi4vcG9zaXRpb24tdHJhY2tpbmcvcHJlcHJvY2Vzc29yLW1peGluJyk7XG5jb25zdCBNaXhpbiA9IHJlcXVpcmUoJy4uLy4uL3V0aWxzL21peGluJyk7XG5cbmNsYXNzIEVycm9yUmVwb3J0aW5nUHJlcHJvY2Vzc29yTWl4aW4gZXh0ZW5kcyBFcnJvclJlcG9ydGluZ01peGluQmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJlcHJvY2Vzc29yLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKHByZXByb2Nlc3Nvciwgb3B0cyk7XG5cbiAgICAgICAgdGhpcy5wb3NUcmFja2VyID0gTWl4aW4uaW5zdGFsbChwcmVwcm9jZXNzb3IsIFBvc2l0aW9uVHJhY2tpbmdQcmVwcm9jZXNzb3JNaXhpbik7XG4gICAgICAgIHRoaXMubGFzdEVyck9mZnNldCA9IC0xO1xuICAgIH1cblxuICAgIF9yZXBvcnRFcnJvcihjb2RlKSB7XG4gICAgICAgIC8vTk9URTogYXZvaWQgcmVwb3J0aW5nIGVycm9yIHR3aWNlIG9uIGFkdmFuY2UvcmV0cmVhdFxuICAgICAgICBpZiAodGhpcy5sYXN0RXJyT2Zmc2V0ICE9PSB0aGlzLnBvc1RyYWNrZXIub2Zmc2V0KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RFcnJPZmZzZXQgPSB0aGlzLnBvc1RyYWNrZXIub2Zmc2V0O1xuICAgICAgICAgICAgc3VwZXIuX3JlcG9ydEVycm9yKGNvZGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVycm9yUmVwb3J0aW5nUHJlcHJvY2Vzc29yTWl4aW47XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IEVycm9yUmVwb3J0aW5nTWl4aW5CYXNlID0gcmVxdWlyZSgnLi9taXhpbi1iYXNlJyk7XG5jb25zdCBFcnJvclJlcG9ydGluZ1ByZXByb2Nlc3Nvck1peGluID0gcmVxdWlyZSgnLi9wcmVwcm9jZXNzb3ItbWl4aW4nKTtcbmNvbnN0IE1peGluID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvbWl4aW4nKTtcblxuY2xhc3MgRXJyb3JSZXBvcnRpbmdUb2tlbml6ZXJNaXhpbiBleHRlbmRzIEVycm9yUmVwb3J0aW5nTWl4aW5CYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcih0b2tlbml6ZXIsIG9wdHMpIHtcbiAgICAgICAgc3VwZXIodG9rZW5pemVyLCBvcHRzKTtcblxuICAgICAgICBjb25zdCBwcmVwcm9jZXNzb3JNaXhpbiA9IE1peGluLmluc3RhbGwodG9rZW5pemVyLnByZXByb2Nlc3NvciwgRXJyb3JSZXBvcnRpbmdQcmVwcm9jZXNzb3JNaXhpbiwgb3B0cyk7XG5cbiAgICAgICAgdGhpcy5wb3NUcmFja2VyID0gcHJlcHJvY2Vzc29yTWl4aW4ucG9zVHJhY2tlcjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRXJyb3JSZXBvcnRpbmdUb2tlbml6ZXJNaXhpbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgTWl4aW4gPSByZXF1aXJlKCcuLi8uLi91dGlscy9taXhpbicpO1xuXG5jbGFzcyBMb2NhdGlvbkluZm9PcGVuRWxlbWVudFN0YWNrTWl4aW4gZXh0ZW5kcyBNaXhpbiB7XG4gICAgY29uc3RydWN0b3Ioc3RhY2ssIG9wdHMpIHtcbiAgICAgICAgc3VwZXIoc3RhY2spO1xuXG4gICAgICAgIHRoaXMub25JdGVtUG9wID0gb3B0cy5vbkl0ZW1Qb3A7XG4gICAgfVxuXG4gICAgX2dldE92ZXJyaWRkZW5NZXRob2RzKG14biwgb3JpZykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcG9wKCkge1xuICAgICAgICAgICAgICAgIG14bi5vbkl0ZW1Qb3AodGhpcy5jdXJyZW50KTtcbiAgICAgICAgICAgICAgICBvcmlnLnBvcC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcG9wQWxsVXBUb0h0bWxFbGVtZW50KCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnN0YWNrVG9wOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIG14bi5vbkl0ZW1Qb3AodGhpcy5pdGVtc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgb3JpZy5wb3BBbGxVcFRvSHRtbEVsZW1lbnQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJlbW92ZShlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbXhuLm9uSXRlbVBvcCh0aGlzLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIG9yaWcucmVtb3ZlLmNhbGwodGhpcywgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExvY2F0aW9uSW5mb09wZW5FbGVtZW50U3RhY2tNaXhpbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgTWl4aW4gPSByZXF1aXJlKCcuLi8uLi91dGlscy9taXhpbicpO1xuY29uc3QgVG9rZW5pemVyID0gcmVxdWlyZSgnLi4vLi4vdG9rZW5pemVyJyk7XG5jb25zdCBMb2NhdGlvbkluZm9Ub2tlbml6ZXJNaXhpbiA9IHJlcXVpcmUoJy4vdG9rZW5pemVyLW1peGluJyk7XG5jb25zdCBMb2NhdGlvbkluZm9PcGVuRWxlbWVudFN0YWNrTWl4aW4gPSByZXF1aXJlKCcuL29wZW4tZWxlbWVudC1zdGFjay1taXhpbicpO1xuY29uc3QgSFRNTCA9IHJlcXVpcmUoJy4uLy4uL2NvbW1vbi9odG1sJyk7XG5cbi8vQWxpYXNlc1xuY29uc3QgJCA9IEhUTUwuVEFHX05BTUVTO1xuXG5jbGFzcyBMb2NhdGlvbkluZm9QYXJzZXJNaXhpbiBleHRlbmRzIE1peGluIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJzZXIpIHtcbiAgICAgICAgc3VwZXIocGFyc2VyKTtcblxuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy50cmVlQWRhcHRlciA9IHRoaXMucGFyc2VyLnRyZWVBZGFwdGVyO1xuICAgICAgICB0aGlzLnBvc1RyYWNrZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RTdGFydFRhZ1Rva2VuID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0Rm9zdGVyUGFyZW50aW5nTG9jYXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IG51bGw7XG4gICAgfVxuXG4gICAgX3NldFN0YXJ0TG9jYXRpb24oZWxlbWVudCkge1xuICAgICAgICBsZXQgbG9jID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5sYXN0U3RhcnRUYWdUb2tlbikge1xuICAgICAgICAgICAgbG9jID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5sYXN0U3RhcnRUYWdUb2tlbi5sb2NhdGlvbik7XG4gICAgICAgICAgICBsb2Muc3RhcnRUYWcgPSB0aGlzLmxhc3RTdGFydFRhZ1Rva2VuLmxvY2F0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50cmVlQWRhcHRlci5zZXROb2RlU291cmNlQ29kZUxvY2F0aW9uKGVsZW1lbnQsIGxvYyk7XG4gICAgfVxuXG4gICAgX3NldEVuZExvY2F0aW9uKGVsZW1lbnQsIGNsb3NpbmdUb2tlbikge1xuICAgICAgICBjb25zdCBsb2MgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5vZGVTb3VyY2VDb2RlTG9jYXRpb24oZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGxvYykge1xuICAgICAgICAgICAgaWYgKGNsb3NpbmdUb2tlbi5sb2NhdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN0TG9jID0gY2xvc2luZ1Rva2VuLmxvY2F0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRuID0gdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgLy8gTk9URTogRm9yIGNhc2VzIGxpa2UgPHA+IDxwPiA8L3A+IC0gRmlyc3QgJ3AnIGNsb3NlcyB3aXRob3V0IGEgY2xvc2luZ1xuICAgICAgICAgICAgICAgIC8vIHRhZyBhbmQgZm9yIGNhc2VzIGxpa2UgPHRkPiA8cD4gPC90ZD4gLSAncCcgY2xvc2VzIHdpdGhvdXQgYSBjbG9zaW5nIHRhZy5cbiAgICAgICAgICAgICAgICBjb25zdCBpc0Nsb3NpbmdFbmRUYWcgPSBjbG9zaW5nVG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLkVORF9UQUdfVE9LRU4gJiYgdG4gPT09IGNsb3NpbmdUb2tlbi50YWdOYW1lO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZExvYyA9IHt9O1xuICAgICAgICAgICAgICAgIGlmIChpc0Nsb3NpbmdFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kTG9jLmVuZFRhZyA9IE9iamVjdC5hc3NpZ24oe30sIGN0TG9jKTtcbiAgICAgICAgICAgICAgICAgICAgZW5kTG9jLmVuZExpbmUgPSBjdExvYy5lbmRMaW5lO1xuICAgICAgICAgICAgICAgICAgICBlbmRMb2MuZW5kQ29sID0gY3RMb2MuZW5kQ29sO1xuICAgICAgICAgICAgICAgICAgICBlbmRMb2MuZW5kT2Zmc2V0ID0gY3RMb2MuZW5kT2Zmc2V0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZExvYy5lbmRMaW5lID0gY3RMb2Muc3RhcnRMaW5lO1xuICAgICAgICAgICAgICAgICAgICBlbmRMb2MuZW5kQ29sID0gY3RMb2Muc3RhcnRDb2w7XG4gICAgICAgICAgICAgICAgICAgIGVuZExvYy5lbmRPZmZzZXQgPSBjdExvYy5zdGFydE9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLnVwZGF0ZU5vZGVTb3VyY2VDb2RlTG9jYXRpb24oZWxlbWVudCwgZW5kTG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9nZXRPdmVycmlkZGVuTWV0aG9kcyhteG4sIG9yaWcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9ib290c3RyYXAoZG9jdW1lbnQsIGZyYWdtZW50Q29udGV4dCkge1xuICAgICAgICAgICAgICAgIG9yaWcuX2Jvb3RzdHJhcC5jYWxsKHRoaXMsIGRvY3VtZW50LCBmcmFnbWVudENvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgbXhuLmxhc3RTdGFydFRhZ1Rva2VuID0gbnVsbDtcbiAgICAgICAgICAgICAgICBteG4ubGFzdEZvc3RlclBhcmVudGluZ0xvY2F0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICBteG4uY3VycmVudFRva2VuID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuaXplck1peGluID0gTWl4aW4uaW5zdGFsbCh0aGlzLnRva2VuaXplciwgTG9jYXRpb25JbmZvVG9rZW5pemVyTWl4aW4pO1xuXG4gICAgICAgICAgICAgICAgbXhuLnBvc1RyYWNrZXIgPSB0b2tlbml6ZXJNaXhpbi5wb3NUcmFja2VyO1xuXG4gICAgICAgICAgICAgICAgTWl4aW4uaW5zdGFsbCh0aGlzLm9wZW5FbGVtZW50cywgTG9jYXRpb25JbmZvT3BlbkVsZW1lbnRTdGFja01peGluLCB7XG4gICAgICAgICAgICAgICAgICAgIG9uSXRlbVBvcDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXhuLl9zZXRFbmRMb2NhdGlvbihlbGVtZW50LCBteG4uY3VycmVudFRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX3J1blBhcnNpbmdMb29wKHNjcmlwdEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBvcmlnLl9ydW5QYXJzaW5nTG9vcC5jYWxsKHRoaXMsIHNjcmlwdEhhbmRsZXIpO1xuXG4gICAgICAgICAgICAgICAgLy8gTk9URTogZ2VuZXJhdGUgbG9jYXRpb24gaW5mbyBmb3IgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyB0aGF0IHJlbWFpbnMgb24gb3BlbiBlbGVtZW50IHN0YWNrXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMub3BlbkVsZW1lbnRzLnN0YWNrVG9wOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBteG4uX3NldEVuZExvY2F0aW9uKHRoaXMub3BlbkVsZW1lbnRzLml0ZW1zW2ldLCBteG4uY3VycmVudFRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvL1Rva2VuIHByb2Nlc3NpbmdcbiAgICAgICAgICAgIF9wcm9jZXNzVG9rZW5JbkZvcmVpZ25Db250ZW50KHRva2VuKSB7XG4gICAgICAgICAgICAgICAgbXhuLmN1cnJlbnRUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgIG9yaWcuX3Byb2Nlc3NUb2tlbkluRm9yZWlnbkNvbnRlbnQuY2FsbCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBfcHJvY2Vzc1Rva2VuKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgbXhuLmN1cnJlbnRUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgIG9yaWcuX3Byb2Nlc3NUb2tlbi5jYWxsKHRoaXMsIHRva2VuKTtcblxuICAgICAgICAgICAgICAgIC8vTk9URTogPGJvZHk+IGFuZCA8aHRtbD4gYXJlIG5ldmVyIHBvcHBlZCBmcm9tIHRoZSBzdGFjaywgc28gd2UgbmVlZCB0byB1cGRhdGVkXG4gICAgICAgICAgICAgICAgLy90aGVpciBlbmQgbG9jYXRpb24gZXhwbGljaXRseS5cbiAgICAgICAgICAgICAgICBjb25zdCByZXF1aXJlRXhwbGljaXRVcGRhdGUgPVxuICAgICAgICAgICAgICAgICAgICB0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuRU5EX1RBR19UT0tFTiAmJlxuICAgICAgICAgICAgICAgICAgICAodG9rZW4udGFnTmFtZSA9PT0gJC5IVE1MIHx8ICh0b2tlbi50YWdOYW1lID09PSAkLkJPRFkgJiYgdGhpcy5vcGVuRWxlbWVudHMuaGFzSW5TY29wZSgkLkJPRFkpKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZUV4cGxpY2l0VXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm9wZW5FbGVtZW50cy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLm9wZW5FbGVtZW50cy5pdGVtc1tpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KSA9PT0gdG9rZW4udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14bi5fc2V0RW5kTG9jYXRpb24oZWxlbWVudCwgdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy9Eb2N0eXBlXG4gICAgICAgICAgICBfc2V0RG9jdW1lbnRUeXBlKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgb3JpZy5fc2V0RG9jdW1lbnRUeXBlLmNhbGwodGhpcywgdG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRDaGlsZHJlbiA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0Q2hpbGROb2Rlcyh0aGlzLmRvY3VtZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbkxlbmd0aCA9IGRvY3VtZW50Q2hpbGRyZW4ubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbkxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudENoaWxkcmVuW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyZWVBZGFwdGVyLmlzRG9jdW1lbnRUeXBlTm9kZShub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5zZXROb2RlU291cmNlQ29kZUxvY2F0aW9uKG5vZGUsIHRva2VuLmxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy9FbGVtZW50c1xuICAgICAgICAgICAgX2F0dGFjaEVsZW1lbnRUb1RyZWUoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vTk9URTogX2F0dGFjaEVsZW1lbnRUb1RyZWUgaXMgY2FsbGVkIGZyb20gX2FwcGVuZEVsZW1lbnQsIF9pbnNlcnRFbGVtZW50IGFuZCBfaW5zZXJ0VGVtcGxhdGUgbWV0aG9kcy5cbiAgICAgICAgICAgICAgICAvL1NvIHdlIHdpbGwgdXNlIHRva2VuIGxvY2F0aW9uIHN0b3JlZCBpbiB0aGlzIG1ldGhvZHMgZm9yIHRoZSBlbGVtZW50LlxuICAgICAgICAgICAgICAgIG14bi5fc2V0U3RhcnRMb2NhdGlvbihlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBteG4ubGFzdFN0YXJ0VGFnVG9rZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIG9yaWcuX2F0dGFjaEVsZW1lbnRUb1RyZWUuY2FsbCh0aGlzLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIF9hcHBlbmRFbGVtZW50KHRva2VuLCBuYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgICAgICBteG4ubGFzdFN0YXJ0VGFnVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICBvcmlnLl9hcHBlbmRFbGVtZW50LmNhbGwodGhpcywgdG9rZW4sIG5hbWVzcGFjZVVSSSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBfaW5zZXJ0RWxlbWVudCh0b2tlbiwgbmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICAgICAgbXhuLmxhc3RTdGFydFRhZ1Rva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgb3JpZy5faW5zZXJ0RWxlbWVudC5jYWxsKHRoaXMsIHRva2VuLCBuYW1lc3BhY2VVUkkpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX2luc2VydFRlbXBsYXRlKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgbXhuLmxhc3RTdGFydFRhZ1Rva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgb3JpZy5faW5zZXJ0VGVtcGxhdGUuY2FsbCh0aGlzLCB0b2tlbik7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0bXBsQ29udGVudCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGVtcGxhdGVDb250ZW50KHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5zZXROb2RlU291cmNlQ29kZUxvY2F0aW9uKHRtcGxDb250ZW50LCBudWxsKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIF9pbnNlcnRGYWtlUm9vdEVsZW1lbnQoKSB7XG4gICAgICAgICAgICAgICAgb3JpZy5faW5zZXJ0RmFrZVJvb3RFbGVtZW50LmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5zZXROb2RlU291cmNlQ29kZUxvY2F0aW9uKHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnQsIG51bGwpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy9Db21tZW50c1xuICAgICAgICAgICAgX2FwcGVuZENvbW1lbnROb2RlKHRva2VuLCBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBvcmlnLl9hcHBlbmRDb21tZW50Tm9kZS5jYWxsKHRoaXMsIHRva2VuLCBwYXJlbnQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldENoaWxkTm9kZXMocGFyZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50Tm9kZSA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5zZXROb2RlU291cmNlQ29kZUxvY2F0aW9uKGNvbW1lbnROb2RlLCB0b2tlbi5sb2NhdGlvbik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvL1RleHRcbiAgICAgICAgICAgIF9maW5kRm9zdGVyUGFyZW50aW5nTG9jYXRpb24oKSB7XG4gICAgICAgICAgICAgICAgLy9OT1RFOiBzdG9yZSBsYXN0IGZvc3RlciBwYXJlbnRpbmcgbG9jYXRpb24sIHNvIHdlIHdpbGwgYmUgYWJsZSB0byBmaW5kIGluc2VydGVkIHRleHRcbiAgICAgICAgICAgICAgICAvL2luIGNhc2Ugb2YgZm9zdGVyIHBhcmVudGluZ1xuICAgICAgICAgICAgICAgIG14bi5sYXN0Rm9zdGVyUGFyZW50aW5nTG9jYXRpb24gPSBvcmlnLl9maW5kRm9zdGVyUGFyZW50aW5nTG9jYXRpb24uY2FsbCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBteG4ubGFzdEZvc3RlclBhcmVudGluZ0xvY2F0aW9uO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX2luc2VydENoYXJhY3RlcnModG9rZW4pIHtcbiAgICAgICAgICAgICAgICBvcmlnLl9pbnNlcnRDaGFyYWN0ZXJzLmNhbGwodGhpcywgdG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaGFzRm9zdGVyUGFyZW50ID0gdGhpcy5fc2hvdWxkRm9zdGVyUGFyZW50T25JbnNlcnRpb24oKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9XG4gICAgICAgICAgICAgICAgICAgIChoYXNGb3N0ZXJQYXJlbnQgJiYgbXhuLmxhc3RGb3N0ZXJQYXJlbnRpbmdMb2NhdGlvbi5wYXJlbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnRUbXBsQ29udGVudCB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5FbGVtZW50cy5jdXJyZW50O1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSB0aGlzLnRyZWVBZGFwdGVyLmdldENoaWxkTm9kZXMocGFyZW50KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlSWR4ID1cbiAgICAgICAgICAgICAgICAgICAgaGFzRm9zdGVyUGFyZW50ICYmIG14bi5sYXN0Rm9zdGVyUGFyZW50aW5nTG9jYXRpb24uYmVmb3JlRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBzaWJsaW5ncy5pbmRleE9mKG14bi5sYXN0Rm9zdGVyUGFyZW50aW5nTG9jYXRpb24uYmVmb3JlRWxlbWVudCkgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHNpYmxpbmdzLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHNpYmxpbmdzW3RleHROb2RlSWR4XTtcblxuICAgICAgICAgICAgICAgIC8vTk9URTogaWYgd2UgaGF2ZSBsb2NhdGlvbiBhc3NpZ25lZCBieSBhbm90aGVyIHRva2VuLCB0aGVuIGp1c3QgdXBkYXRlIGVuZCBwb3NpdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHRuTG9jID0gdGhpcy50cmVlQWRhcHRlci5nZXROb2RlU291cmNlQ29kZUxvY2F0aW9uKHRleHROb2RlKTtcblxuICAgICAgICAgICAgICAgIGlmICh0bkxvYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGVuZExpbmUsIGVuZENvbCwgZW5kT2Zmc2V0IH0gPSB0b2tlbi5sb2NhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci51cGRhdGVOb2RlU291cmNlQ29kZUxvY2F0aW9uKHRleHROb2RlLCB7IGVuZExpbmUsIGVuZENvbCwgZW5kT2Zmc2V0IH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuc2V0Tm9kZVNvdXJjZUNvZGVMb2NhdGlvbih0ZXh0Tm9kZSwgdG9rZW4ubG9jYXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTG9jYXRpb25JbmZvUGFyc2VyTWl4aW47XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IE1peGluID0gcmVxdWlyZSgnLi4vLi4vdXRpbHMvbWl4aW4nKTtcbmNvbnN0IFRva2VuaXplciA9IHJlcXVpcmUoJy4uLy4uL3Rva2VuaXplcicpO1xuY29uc3QgUG9zaXRpb25UcmFja2luZ1ByZXByb2Nlc3Nvck1peGluID0gcmVxdWlyZSgnLi4vcG9zaXRpb24tdHJhY2tpbmcvcHJlcHJvY2Vzc29yLW1peGluJyk7XG5cbmNsYXNzIExvY2F0aW9uSW5mb1Rva2VuaXplck1peGluIGV4dGVuZHMgTWl4aW4ge1xuICAgIGNvbnN0cnVjdG9yKHRva2VuaXplcikge1xuICAgICAgICBzdXBlcih0b2tlbml6ZXIpO1xuXG4gICAgICAgIHRoaXMudG9rZW5pemVyID0gdG9rZW5pemVyO1xuICAgICAgICB0aGlzLnBvc1RyYWNrZXIgPSBNaXhpbi5pbnN0YWxsKHRva2VuaXplci5wcmVwcm9jZXNzb3IsIFBvc2l0aW9uVHJhY2tpbmdQcmVwcm9jZXNzb3JNaXhpbik7XG4gICAgICAgIHRoaXMuY3VycmVudEF0dHJMb2NhdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuY3RMb2MgPSBudWxsO1xuICAgIH1cblxuICAgIF9nZXRDdXJyZW50TG9jYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydExpbmU6IHRoaXMucG9zVHJhY2tlci5saW5lLFxuICAgICAgICAgICAgc3RhcnRDb2w6IHRoaXMucG9zVHJhY2tlci5jb2wsXG4gICAgICAgICAgICBzdGFydE9mZnNldDogdGhpcy5wb3NUcmFja2VyLm9mZnNldCxcbiAgICAgICAgICAgIGVuZExpbmU6IC0xLFxuICAgICAgICAgICAgZW5kQ29sOiAtMSxcbiAgICAgICAgICAgIGVuZE9mZnNldDogLTFcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfYXR0YWNoQ3VycmVudEF0dHJMb2NhdGlvbkluZm8oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEF0dHJMb2NhdGlvbi5lbmRMaW5lID0gdGhpcy5wb3NUcmFja2VyLmxpbmU7XG4gICAgICAgIHRoaXMuY3VycmVudEF0dHJMb2NhdGlvbi5lbmRDb2wgPSB0aGlzLnBvc1RyYWNrZXIuY29sO1xuICAgICAgICB0aGlzLmN1cnJlbnRBdHRyTG9jYXRpb24uZW5kT2Zmc2V0ID0gdGhpcy5wb3NUcmFja2VyLm9mZnNldDtcblxuICAgICAgICBjb25zdCBjdXJyZW50VG9rZW4gPSB0aGlzLnRva2VuaXplci5jdXJyZW50VG9rZW47XG4gICAgICAgIGNvbnN0IGN1cnJlbnRBdHRyID0gdGhpcy50b2tlbml6ZXIuY3VycmVudEF0dHI7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50VG9rZW4ubG9jYXRpb24uYXR0cnMpIHtcbiAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5sb2NhdGlvbi5hdHRycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VG9rZW4ubG9jYXRpb24uYXR0cnNbY3VycmVudEF0dHIubmFtZV0gPSB0aGlzLmN1cnJlbnRBdHRyTG9jYXRpb247XG4gICAgfVxuXG4gICAgX2dldE92ZXJyaWRkZW5NZXRob2RzKG14biwgb3JpZykge1xuICAgICAgICBjb25zdCBtZXRob2RzID0ge1xuICAgICAgICAgICAgX2NyZWF0ZVN0YXJ0VGFnVG9rZW4oKSB7XG4gICAgICAgICAgICAgICAgb3JpZy5fY3JlYXRlU3RhcnRUYWdUb2tlbi5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmxvY2F0aW9uID0gbXhuLmN0TG9jO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX2NyZWF0ZUVuZFRhZ1Rva2VuKCkge1xuICAgICAgICAgICAgICAgIG9yaWcuX2NyZWF0ZUVuZFRhZ1Rva2VuLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4ubG9jYXRpb24gPSBteG4uY3RMb2M7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBfY3JlYXRlQ29tbWVudFRva2VuKCkge1xuICAgICAgICAgICAgICAgIG9yaWcuX2NyZWF0ZUNvbW1lbnRUb2tlbi5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmxvY2F0aW9uID0gbXhuLmN0TG9jO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX2NyZWF0ZURvY3R5cGVUb2tlbihpbml0aWFsTmFtZSkge1xuICAgICAgICAgICAgICAgIG9yaWcuX2NyZWF0ZURvY3R5cGVUb2tlbi5jYWxsKHRoaXMsIGluaXRpYWxOYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5sb2NhdGlvbiA9IG14bi5jdExvYztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIF9jcmVhdGVDaGFyYWN0ZXJUb2tlbih0eXBlLCBjaCkge1xuICAgICAgICAgICAgICAgIG9yaWcuX2NyZWF0ZUNoYXJhY3RlclRva2VuLmNhbGwodGhpcywgdHlwZSwgY2gpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENoYXJhY3RlclRva2VuLmxvY2F0aW9uID0gbXhuLmN0TG9jO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX2NyZWF0ZUVPRlRva2VuKCkge1xuICAgICAgICAgICAgICAgIG9yaWcuX2NyZWF0ZUVPRlRva2VuLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4ubG9jYXRpb24gPSBteG4uX2dldEN1cnJlbnRMb2NhdGlvbigpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX2NyZWF0ZUF0dHIoYXR0ck5hbWVGaXJzdENoKSB7XG4gICAgICAgICAgICAgICAgb3JpZy5fY3JlYXRlQXR0ci5jYWxsKHRoaXMsIGF0dHJOYW1lRmlyc3RDaCk7XG4gICAgICAgICAgICAgICAgbXhuLmN1cnJlbnRBdHRyTG9jYXRpb24gPSBteG4uX2dldEN1cnJlbnRMb2NhdGlvbigpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX2xlYXZlQXR0ck5hbWUodG9TdGF0ZSkge1xuICAgICAgICAgICAgICAgIG9yaWcuX2xlYXZlQXR0ck5hbWUuY2FsbCh0aGlzLCB0b1N0YXRlKTtcbiAgICAgICAgICAgICAgICBteG4uX2F0dGFjaEN1cnJlbnRBdHRyTG9jYXRpb25JbmZvKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBfbGVhdmVBdHRyVmFsdWUodG9TdGF0ZSkge1xuICAgICAgICAgICAgICAgIG9yaWcuX2xlYXZlQXR0clZhbHVlLmNhbGwodGhpcywgdG9TdGF0ZSk7XG4gICAgICAgICAgICAgICAgbXhuLl9hdHRhY2hDdXJyZW50QXR0ckxvY2F0aW9uSW5mbygpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX2VtaXRDdXJyZW50VG9rZW4oKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3RMb2MgPSB0aGlzLmN1cnJlbnRUb2tlbi5sb2NhdGlvbjtcblxuICAgICAgICAgICAgICAgIC8vTk9URTogaWYgd2UgaGF2ZSBwZW5kaW5nIGNoYXJhY3RlciB0b2tlbiBtYWtlIGl0J3MgZW5kIGxvY2F0aW9uIGVxdWFsIHRvIHRoZVxuICAgICAgICAgICAgICAgIC8vY3VycmVudCB0b2tlbidzIHN0YXJ0IGxvY2F0aW9uLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbi5sb2NhdGlvbi5lbmRMaW5lID0gY3RMb2Muc3RhcnRMaW5lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbi5sb2NhdGlvbi5lbmRDb2wgPSBjdExvYy5zdGFydENvbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4ubG9jYXRpb24uZW5kT2Zmc2V0ID0gY3RMb2Muc3RhcnRPZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFRva2VuLnR5cGUgPT09IFRva2VuaXplci5FT0ZfVE9LRU4pIHtcbiAgICAgICAgICAgICAgICAgICAgY3RMb2MuZW5kTGluZSA9IGN0TG9jLnN0YXJ0TGluZTtcbiAgICAgICAgICAgICAgICAgICAgY3RMb2MuZW5kQ29sID0gY3RMb2Muc3RhcnRDb2w7XG4gICAgICAgICAgICAgICAgICAgIGN0TG9jLmVuZE9mZnNldCA9IGN0TG9jLnN0YXJ0T2Zmc2V0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN0TG9jLmVuZExpbmUgPSBteG4ucG9zVHJhY2tlci5saW5lO1xuICAgICAgICAgICAgICAgICAgICBjdExvYy5lbmRDb2wgPSBteG4ucG9zVHJhY2tlci5jb2wgKyAxO1xuICAgICAgICAgICAgICAgICAgICBjdExvYy5lbmRPZmZzZXQgPSBteG4ucG9zVHJhY2tlci5vZmZzZXQgKyAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG9yaWcuX2VtaXRDdXJyZW50VG9rZW4uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIF9lbWl0Q3VycmVudENoYXJhY3RlclRva2VuKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN0TG9jID0gdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4gJiYgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4ubG9jYXRpb247XG5cbiAgICAgICAgICAgICAgICAvL05PVEU6IGlmIHdlIGhhdmUgY2hhcmFjdGVyIHRva2VuIGFuZCBpdCdzIGxvY2F0aW9uIHdhc24ndCBzZXQgaW4gdGhlIF9lbWl0Q3VycmVudFRva2VuKCksXG4gICAgICAgICAgICAgICAgLy90aGVuIHNldCBpdCdzIGxvY2F0aW9uIGF0IHRoZSBjdXJyZW50IHByZXByb2Nlc3NvciBwb3NpdGlvbi5cbiAgICAgICAgICAgICAgICAvL1dlIGRvbid0IG5lZWQgdG8gaW5jcmVtZW50IHByZXByb2Nlc3NvciBwb3NpdGlvbiwgc2luY2UgY2hhcmFjdGVyIHRva2VuXG4gICAgICAgICAgICAgICAgLy9lbWlzc2lvbiBpcyBhbHdheXMgZm9yY2VkIGJ5IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgdG9rZW4gaGVyZS5cbiAgICAgICAgICAgICAgICAvL1NvLCB3ZSBhbHJlYWR5IGhhdmUgYWR2YW5jZWQgcG9zaXRpb24uXG4gICAgICAgICAgICAgICAgaWYgKGN0TG9jICYmIGN0TG9jLmVuZE9mZnNldCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY3RMb2MuZW5kTGluZSA9IG14bi5wb3NUcmFja2VyLmxpbmU7XG4gICAgICAgICAgICAgICAgICAgIGN0TG9jLmVuZENvbCA9IG14bi5wb3NUcmFja2VyLmNvbDtcbiAgICAgICAgICAgICAgICAgICAgY3RMb2MuZW5kT2Zmc2V0ID0gbXhuLnBvc1RyYWNrZXIub2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG9yaWcuX2VtaXRDdXJyZW50Q2hhcmFjdGVyVG9rZW4uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvL05PVEU6IHBhdGNoIGluaXRpYWwgc3RhdGVzIGZvciBlYWNoIG1vZGUgdG8gb2J0YWluIHRva2VuIHN0YXJ0IHBvc2l0aW9uXG4gICAgICAgIE9iamVjdC5rZXlzKFRva2VuaXplci5NT0RFKS5mb3JFYWNoKG1vZGVOYW1lID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gVG9rZW5pemVyLk1PREVbbW9kZU5hbWVdO1xuXG4gICAgICAgICAgICBtZXRob2RzW3N0YXRlXSA9IGZ1bmN0aW9uKGNwKSB7XG4gICAgICAgICAgICAgICAgbXhuLmN0TG9jID0gbXhuLl9nZXRDdXJyZW50TG9jYXRpb24oKTtcbiAgICAgICAgICAgICAgICBvcmlnW3N0YXRlXS5jYWxsKHRoaXMsIGNwKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtZXRob2RzO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMb2NhdGlvbkluZm9Ub2tlbml6ZXJNaXhpbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgTWl4aW4gPSByZXF1aXJlKCcuLi8uLi91dGlscy9taXhpbicpO1xuXG5jbGFzcyBQb3NpdGlvblRyYWNraW5nUHJlcHJvY2Vzc29yTWl4aW4gZXh0ZW5kcyBNaXhpbiB7XG4gICAgY29uc3RydWN0b3IocHJlcHJvY2Vzc29yKSB7XG4gICAgICAgIHN1cGVyKHByZXByb2Nlc3Nvcik7XG5cbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzb3IgPSBwcmVwcm9jZXNzb3I7XG4gICAgICAgIHRoaXMuaXNFb2wgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5saW5lU3RhcnRQb3MgPSAwO1xuICAgICAgICB0aGlzLmRyb3BwZWRCdWZmZXJTaXplID0gMDtcblxuICAgICAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMuY29sID0gMDtcbiAgICAgICAgdGhpcy5saW5lID0gMTtcbiAgICB9XG5cbiAgICBfZ2V0T3ZlcnJpZGRlbk1ldGhvZHMobXhuLCBvcmlnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZHZhbmNlKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zICsgMTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaCA9IHRoaXMuaHRtbFtwb3NdO1xuXG4gICAgICAgICAgICAgICAgLy9OT1RFOiBMRiBzaG91bGQgYmUgaW4gdGhlIGxhc3QgY29sdW1uIG9mIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKG14bi5pc0VvbCkge1xuICAgICAgICAgICAgICAgICAgICBteG4uaXNFb2wgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbXhuLmxpbmUrKztcbiAgICAgICAgICAgICAgICAgICAgbXhuLmxpbmVTdGFydFBvcyA9IHBvcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXG4nIHx8IChjaCA9PT0gJ1xccicgJiYgdGhpcy5odG1sW3BvcyArIDFdICE9PSAnXFxuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgbXhuLmlzRW9sID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBteG4uY29sID0gcG9zIC0gbXhuLmxpbmVTdGFydFBvcyArIDE7XG4gICAgICAgICAgICAgICAgbXhuLm9mZnNldCA9IG14bi5kcm9wcGVkQnVmZmVyU2l6ZSArIHBvcztcblxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnLmFkdmFuY2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJldHJlYXQoKSB7XG4gICAgICAgICAgICAgICAgb3JpZy5yZXRyZWF0LmNhbGwodGhpcyk7XG5cbiAgICAgICAgICAgICAgICBteG4uaXNFb2wgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBteG4uY29sID0gdGhpcy5wb3MgLSBteG4ubGluZVN0YXJ0UG9zICsgMTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGRyb3BQYXJzZWRDaHVuaygpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2UG9zID0gdGhpcy5wb3M7XG5cbiAgICAgICAgICAgICAgICBvcmlnLmRyb3BQYXJzZWRDaHVuay5jYWxsKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVkdWN0aW9uID0gcHJldlBvcyAtIHRoaXMucG9zO1xuXG4gICAgICAgICAgICAgICAgbXhuLmxpbmVTdGFydFBvcyAtPSByZWR1Y3Rpb247XG4gICAgICAgICAgICAgICAgbXhuLmRyb3BwZWRCdWZmZXJTaXplICs9IHJlZHVjdGlvbjtcbiAgICAgICAgICAgICAgICBteG4ub2Zmc2V0ID0gbXhuLmRyb3BwZWRCdWZmZXJTaXplICsgdGhpcy5wb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBvc2l0aW9uVHJhY2tpbmdQcmVwcm9jZXNzb3JNaXhpbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgUGFyc2VyID0gcmVxdWlyZSgnLi9wYXJzZXInKTtcbmNvbnN0IFNlcmlhbGl6ZXIgPSByZXF1aXJlKCcuL3NlcmlhbGl6ZXInKTtcblxuLy8gU2hvcnRoYW5kc1xuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKGh0bWwsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZShodG1sKTtcbn07XG5cbmV4cG9ydHMucGFyc2VGcmFnbWVudCA9IGZ1bmN0aW9uIHBhcnNlRnJhZ21lbnQoZnJhZ21lbnRDb250ZXh0LCBodG1sLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBmcmFnbWVudENvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG9wdGlvbnMgPSBodG1sO1xuICAgICAgICBodG1sID0gZnJhZ21lbnRDb250ZXh0O1xuICAgICAgICBmcmFnbWVudENvbnRleHQgPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIob3B0aW9ucyk7XG5cbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJhZ21lbnQoaHRtbCwgZnJhZ21lbnRDb250ZXh0KTtcbn07XG5cbmV4cG9ydHMuc2VyaWFsaXplID0gZnVuY3Rpb24obm9kZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplcihub2RlLCBvcHRpb25zKTtcblxuICAgIHJldHVybiBzZXJpYWxpemVyLnNlcmlhbGl6ZSgpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy9Db25zdFxuY29uc3QgTk9BSF9BUktfQ0FQQUNJVFkgPSAzO1xuXG4vL0xpc3Qgb2YgZm9ybWF0dGluZyBlbGVtZW50c1xuY2xhc3MgRm9ybWF0dGluZ0VsZW1lbnRMaXN0IHtcbiAgICBjb25zdHJ1Y3Rvcih0cmVlQWRhcHRlcikge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IFtdO1xuICAgICAgICB0aGlzLnRyZWVBZGFwdGVyID0gdHJlZUFkYXB0ZXI7XG4gICAgICAgIHRoaXMuYm9va21hcmsgPSBudWxsO1xuICAgIH1cblxuICAgIC8vTm9haCBBcmsncyBjb25kaXRpb25cbiAgICAvL09QVElNSVpBVElPTjogYXQgZmlyc3Qgd2UgdHJ5IHRvIGZpbmQgcG9zc2libGUgY2FuZGlkYXRlcyBmb3IgZXhjbHVzaW9uIHVzaW5nXG4gICAgLy9saWdodHdlaWdodCBoZXVyaXN0aWNzIHdpdGhvdXQgdGhvcm91Z2ggYXR0cmlidXRlcyBjaGVjay5cbiAgICBfZ2V0Tm9haEFya0NvbmRpdGlvbkNhbmRpZGF0ZXMobmV3RWxlbWVudCkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID49IE5PQUhfQVJLX0NBUEFDSVRZKSB7XG4gICAgICAgICAgICBjb25zdCBuZUF0dHJzTGVuZ3RoID0gdGhpcy50cmVlQWRhcHRlci5nZXRBdHRyTGlzdChuZXdFbGVtZW50KS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBuZVRhZ05hbWUgPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUobmV3RWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBuZU5hbWVzcGFjZVVSSSA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKG5ld0VsZW1lbnQpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09IEZvcm1hdHRpbmdFbGVtZW50TGlzdC5NQVJLRVJfRU5UUlkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGVudHJ5LmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudEF0dHJzID0gdGhpcy50cmVlQWRhcHRlci5nZXRBdHRyTGlzdChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ2FuZGlkYXRlID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKGVsZW1lbnQpID09PSBuZVRhZ05hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkoZWxlbWVudCkgPT09IG5lTmFtZXNwYWNlVVJJICYmXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRBdHRycy5sZW5ndGggPT09IG5lQXR0cnNMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNDYW5kaWRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHsgaWR4OiBpLCBhdHRyczogZWxlbWVudEF0dHJzIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYW5kaWRhdGVzLmxlbmd0aCA8IE5PQUhfQVJLX0NBUEFDSVRZID8gW10gOiBjYW5kaWRhdGVzO1xuICAgIH1cblxuICAgIF9lbnN1cmVOb2FoQXJrQ29uZGl0aW9uKG5ld0VsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHRoaXMuX2dldE5vYWhBcmtDb25kaXRpb25DYW5kaWRhdGVzKG5ld0VsZW1lbnQpO1xuICAgICAgICBsZXQgY0xlbmd0aCA9IGNhbmRpZGF0ZXMubGVuZ3RoO1xuXG4gICAgICAgIGlmIChjTGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBuZUF0dHJzID0gdGhpcy50cmVlQWRhcHRlci5nZXRBdHRyTGlzdChuZXdFbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IG5lQXR0cnNMZW5ndGggPSBuZUF0dHJzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG5lQXR0cnNNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgICAgICAvL05PVEU6IGJ1aWxkIGF0dHJzIG1hcCBmb3IgdGhlIG5ldyBlbGVtZW50IHNvIHdlIGNhbiBwZXJmb3JtIGZhc3QgbG9va3Vwc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZUF0dHJzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZUF0dHIgPSBuZUF0dHJzW2ldO1xuXG4gICAgICAgICAgICAgICAgbmVBdHRyc01hcFtuZUF0dHIubmFtZV0gPSBuZUF0dHIudmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmVBdHRyc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY0F0dHIgPSBjYW5kaWRhdGVzW2pdLmF0dHJzW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZUF0dHJzTWFwW2NBdHRyLm5hbWVdICE9PSBjQXR0ci52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5zcGxpY2UoaiwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjTGVuZ3RoLS07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPCBOT0FIX0FSS19DQVBBQ0lUWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL05PVEU6IHJlbW92ZSBib3R0b21tb3N0IGNhbmRpZGF0ZXMgdW50aWwgTm9haCdzIEFyayBjb25kaXRpb24gd2lsbCBub3QgYmUgbWV0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gY0xlbmd0aCAtIDE7IGkgPj0gTk9BSF9BUktfQ0FQQUNJVFkgLSAxOyBpLS0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGNhbmRpZGF0ZXNbaV0uaWR4LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxlbmd0aC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9NdXRhdGlvbnNcbiAgICBpbnNlcnRNYXJrZXIoKSB7XG4gICAgICAgIHRoaXMuZW50cmllcy5wdXNoKHsgdHlwZTogRm9ybWF0dGluZ0VsZW1lbnRMaXN0Lk1BUktFUl9FTlRSWSB9KTtcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG5cbiAgICBwdXNoRWxlbWVudChlbGVtZW50LCB0b2tlbikge1xuICAgICAgICB0aGlzLl9lbnN1cmVOb2FoQXJrQ29uZGl0aW9uKGVsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMuZW50cmllcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IEZvcm1hdHRpbmdFbGVtZW50TGlzdC5FTEVNRU5UX0VOVFJZLFxuICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgICAgIHRva2VuOiB0b2tlblxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgIH1cblxuICAgIGluc2VydEVsZW1lbnRBZnRlckJvb2ttYXJrKGVsZW1lbnQsIHRva2VuKSB7XG4gICAgICAgIGxldCBib29rbWFya0lkeCA9IHRoaXMubGVuZ3RoIC0gMTtcblxuICAgICAgICBmb3IgKDsgYm9va21hcmtJZHggPj0gMDsgYm9va21hcmtJZHgtLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZW50cmllc1tib29rbWFya0lkeF0gPT09IHRoaXMuYm9va21hcmspIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zcGxpY2UoYm9va21hcmtJZHggKyAxLCAwLCB7XG4gICAgICAgICAgICB0eXBlOiBGb3JtYXR0aW5nRWxlbWVudExpc3QuRUxFTUVOVF9FTlRSWSxcbiAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgICAgICB0b2tlbjogdG9rZW5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG5cbiAgICByZW1vdmVFbnRyeShlbnRyeSkge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZW50cmllc1tpXSA9PT0gZW50cnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoLS07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhclRvTGFzdE1hcmtlcigpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5wb3AoKTtcblxuICAgICAgICAgICAgdGhpcy5sZW5ndGgtLTtcblxuICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09IEZvcm1hdHRpbmdFbGVtZW50TGlzdC5NQVJLRVJfRU5UUlkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vU2VhcmNoXG4gICAgZ2V0RWxlbWVudEVudHJ5SW5TY29wZVdpdGhUYWdOYW1lKHRhZ05hbWUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzW2ldO1xuXG4gICAgICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gRm9ybWF0dGluZ0VsZW1lbnRMaXN0Lk1BUktFUl9FTlRSWSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKGVudHJ5LmVsZW1lbnQpID09PSB0YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0RWxlbWVudEVudHJ5KGVsZW1lbnQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzW2ldO1xuXG4gICAgICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gRm9ybWF0dGluZ0VsZW1lbnRMaXN0LkVMRU1FTlRfRU5UUlkgJiYgZW50cnkuZWxlbWVudCA9PT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuLy9FbnRyeSB0eXBlc1xuRm9ybWF0dGluZ0VsZW1lbnRMaXN0Lk1BUktFUl9FTlRSWSA9ICdNQVJLRVJfRU5UUlknO1xuRm9ybWF0dGluZ0VsZW1lbnRMaXN0LkVMRU1FTlRfRU5UUlkgPSAnRUxFTUVOVF9FTlRSWSc7XG5cbm1vZHVsZS5leHBvcnRzID0gRm9ybWF0dGluZ0VsZW1lbnRMaXN0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBUb2tlbml6ZXIgPSByZXF1aXJlKCcuLi90b2tlbml6ZXInKTtcbmNvbnN0IE9wZW5FbGVtZW50U3RhY2sgPSByZXF1aXJlKCcuL29wZW4tZWxlbWVudC1zdGFjaycpO1xuY29uc3QgRm9ybWF0dGluZ0VsZW1lbnRMaXN0ID0gcmVxdWlyZSgnLi9mb3JtYXR0aW5nLWVsZW1lbnQtbGlzdCcpO1xuY29uc3QgTG9jYXRpb25JbmZvUGFyc2VyTWl4aW4gPSByZXF1aXJlKCcuLi9leHRlbnNpb25zL2xvY2F0aW9uLWluZm8vcGFyc2VyLW1peGluJyk7XG5jb25zdCBFcnJvclJlcG9ydGluZ1BhcnNlck1peGluID0gcmVxdWlyZSgnLi4vZXh0ZW5zaW9ucy9lcnJvci1yZXBvcnRpbmcvcGFyc2VyLW1peGluJyk7XG5jb25zdCBNaXhpbiA9IHJlcXVpcmUoJy4uL3V0aWxzL21peGluJyk7XG5jb25zdCBkZWZhdWx0VHJlZUFkYXB0ZXIgPSByZXF1aXJlKCcuLi90cmVlLWFkYXB0ZXJzL2RlZmF1bHQnKTtcbmNvbnN0IG1lcmdlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL3V0aWxzL21lcmdlLW9wdGlvbnMnKTtcbmNvbnN0IGRvY3R5cGUgPSByZXF1aXJlKCcuLi9jb21tb24vZG9jdHlwZScpO1xuY29uc3QgZm9yZWlnbkNvbnRlbnQgPSByZXF1aXJlKCcuLi9jb21tb24vZm9yZWlnbi1jb250ZW50Jyk7XG5jb25zdCBFUlIgPSByZXF1aXJlKCcuLi9jb21tb24vZXJyb3ItY29kZXMnKTtcbmNvbnN0IHVuaWNvZGUgPSByZXF1aXJlKCcuLi9jb21tb24vdW5pY29kZScpO1xuY29uc3QgSFRNTCA9IHJlcXVpcmUoJy4uL2NvbW1vbi9odG1sJyk7XG5cbi8vQWxpYXNlc1xuY29uc3QgJCA9IEhUTUwuVEFHX05BTUVTO1xuY29uc3QgTlMgPSBIVE1MLk5BTUVTUEFDRVM7XG5jb25zdCBBVFRSUyA9IEhUTUwuQVRUUlM7XG5cbmNvbnN0IERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgICBzY3JpcHRpbmdFbmFibGVkOiB0cnVlLFxuICAgIHNvdXJjZUNvZGVMb2NhdGlvbkluZm86IGZhbHNlLFxuICAgIG9uUGFyc2VFcnJvcjogbnVsbCxcbiAgICB0cmVlQWRhcHRlcjogZGVmYXVsdFRyZWVBZGFwdGVyXG59O1xuXG4vL01pc2MgY29uc3RhbnRzXG5jb25zdCBISURERU5fSU5QVVRfVFlQRSA9ICdoaWRkZW4nO1xuXG4vL0Fkb3B0aW9uIGFnZW5jeSBsb29wcyBpdGVyYXRpb24gY291bnRcbmNvbnN0IEFBX09VVEVSX0xPT1BfSVRFUiA9IDg7XG5jb25zdCBBQV9JTk5FUl9MT09QX0lURVIgPSAzO1xuXG4vL0luc2VydGlvbiBtb2Rlc1xuY29uc3QgSU5JVElBTF9NT0RFID0gJ0lOSVRJQUxfTU9ERSc7XG5jb25zdCBCRUZPUkVfSFRNTF9NT0RFID0gJ0JFRk9SRV9IVE1MX01PREUnO1xuY29uc3QgQkVGT1JFX0hFQURfTU9ERSA9ICdCRUZPUkVfSEVBRF9NT0RFJztcbmNvbnN0IElOX0hFQURfTU9ERSA9ICdJTl9IRUFEX01PREUnO1xuY29uc3QgSU5fSEVBRF9OT19TQ1JJUFRfTU9ERSA9ICdJTl9IRUFEX05PX1NDUklQVF9NT0RFJztcbmNvbnN0IEFGVEVSX0hFQURfTU9ERSA9ICdBRlRFUl9IRUFEX01PREUnO1xuY29uc3QgSU5fQk9EWV9NT0RFID0gJ0lOX0JPRFlfTU9ERSc7XG5jb25zdCBURVhUX01PREUgPSAnVEVYVF9NT0RFJztcbmNvbnN0IElOX1RBQkxFX01PREUgPSAnSU5fVEFCTEVfTU9ERSc7XG5jb25zdCBJTl9UQUJMRV9URVhUX01PREUgPSAnSU5fVEFCTEVfVEVYVF9NT0RFJztcbmNvbnN0IElOX0NBUFRJT05fTU9ERSA9ICdJTl9DQVBUSU9OX01PREUnO1xuY29uc3QgSU5fQ09MVU1OX0dST1VQX01PREUgPSAnSU5fQ09MVU1OX0dST1VQX01PREUnO1xuY29uc3QgSU5fVEFCTEVfQk9EWV9NT0RFID0gJ0lOX1RBQkxFX0JPRFlfTU9ERSc7XG5jb25zdCBJTl9ST1dfTU9ERSA9ICdJTl9ST1dfTU9ERSc7XG5jb25zdCBJTl9DRUxMX01PREUgPSAnSU5fQ0VMTF9NT0RFJztcbmNvbnN0IElOX1NFTEVDVF9NT0RFID0gJ0lOX1NFTEVDVF9NT0RFJztcbmNvbnN0IElOX1NFTEVDVF9JTl9UQUJMRV9NT0RFID0gJ0lOX1NFTEVDVF9JTl9UQUJMRV9NT0RFJztcbmNvbnN0IElOX1RFTVBMQVRFX01PREUgPSAnSU5fVEVNUExBVEVfTU9ERSc7XG5jb25zdCBBRlRFUl9CT0RZX01PREUgPSAnQUZURVJfQk9EWV9NT0RFJztcbmNvbnN0IElOX0ZSQU1FU0VUX01PREUgPSAnSU5fRlJBTUVTRVRfTU9ERSc7XG5jb25zdCBBRlRFUl9GUkFNRVNFVF9NT0RFID0gJ0FGVEVSX0ZSQU1FU0VUX01PREUnO1xuY29uc3QgQUZURVJfQUZURVJfQk9EWV9NT0RFID0gJ0FGVEVSX0FGVEVSX0JPRFlfTU9ERSc7XG5jb25zdCBBRlRFUl9BRlRFUl9GUkFNRVNFVF9NT0RFID0gJ0FGVEVSX0FGVEVSX0ZSQU1FU0VUX01PREUnO1xuXG4vL0luc2VydGlvbiBtb2RlIHJlc2V0IG1hcFxuY29uc3QgSU5TRVJUSU9OX01PREVfUkVTRVRfTUFQID0ge1xuICAgIFskLlRSXTogSU5fUk9XX01PREUsXG4gICAgWyQuVEJPRFldOiBJTl9UQUJMRV9CT0RZX01PREUsXG4gICAgWyQuVEhFQURdOiBJTl9UQUJMRV9CT0RZX01PREUsXG4gICAgWyQuVEZPT1RdOiBJTl9UQUJMRV9CT0RZX01PREUsXG4gICAgWyQuQ0FQVElPTl06IElOX0NBUFRJT05fTU9ERSxcbiAgICBbJC5DT0xHUk9VUF06IElOX0NPTFVNTl9HUk9VUF9NT0RFLFxuICAgIFskLlRBQkxFXTogSU5fVEFCTEVfTU9ERSxcbiAgICBbJC5CT0RZXTogSU5fQk9EWV9NT0RFLFxuICAgIFskLkZSQU1FU0VUXTogSU5fRlJBTUVTRVRfTU9ERVxufTtcblxuLy9UZW1wbGF0ZSBpbnNlcnRpb24gbW9kZSBzd2l0Y2ggbWFwXG5jb25zdCBURU1QTEFURV9JTlNFUlRJT05fTU9ERV9TV0lUQ0hfTUFQID0ge1xuICAgIFskLkNBUFRJT05dOiBJTl9UQUJMRV9NT0RFLFxuICAgIFskLkNPTEdST1VQXTogSU5fVEFCTEVfTU9ERSxcbiAgICBbJC5UQk9EWV06IElOX1RBQkxFX01PREUsXG4gICAgWyQuVEZPT1RdOiBJTl9UQUJMRV9NT0RFLFxuICAgIFskLlRIRUFEXTogSU5fVEFCTEVfTU9ERSxcbiAgICBbJC5DT0xdOiBJTl9DT0xVTU5fR1JPVVBfTU9ERSxcbiAgICBbJC5UUl06IElOX1RBQkxFX0JPRFlfTU9ERSxcbiAgICBbJC5URF06IElOX1JPV19NT0RFLFxuICAgIFskLlRIXTogSU5fUk9XX01PREVcbn07XG5cbi8vVG9rZW4gaGFuZGxlcnMgbWFwIGZvciBpbnNlcnRpb24gbW9kZXNcbmNvbnN0IFRPS0VOX0hBTkRMRVJTID0ge1xuICAgIFtJTklUSUFMX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogdG9rZW5JbkluaXRpYWxNb2RlLFxuICAgICAgICBbVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXTogdG9rZW5JbkluaXRpYWxNb2RlLFxuICAgICAgICBbVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXTogaWdub3JlVG9rZW4sXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnQsXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IGRvY3R5cGVJbkluaXRpYWxNb2RlLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IHRva2VuSW5Jbml0aWFsTW9kZSxcbiAgICAgICAgW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXTogdG9rZW5JbkluaXRpYWxNb2RlLFxuICAgICAgICBbVG9rZW5pemVyLkVPRl9UT0tFTl06IHRva2VuSW5Jbml0aWFsTW9kZVxuICAgIH0sXG4gICAgW0JFRk9SRV9IVE1MX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogdG9rZW5CZWZvcmVIdG1sLFxuICAgICAgICBbVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXTogdG9rZW5CZWZvcmVIdG1sLFxuICAgICAgICBbVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXTogaWdub3JlVG9rZW4sXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnQsXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IHN0YXJ0VGFnQmVmb3JlSHRtbCxcbiAgICAgICAgW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXTogZW5kVGFnQmVmb3JlSHRtbCxcbiAgICAgICAgW1Rva2VuaXplci5FT0ZfVE9LRU5dOiB0b2tlbkJlZm9yZUh0bWxcbiAgICB9LFxuICAgIFtCRUZPUkVfSEVBRF9NT0RFXToge1xuICAgICAgICBbVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTl06IHRva2VuQmVmb3JlSGVhZCxcbiAgICAgICAgW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl06IHRva2VuQmVmb3JlSGVhZCxcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLkNPTU1FTlRfVE9LRU5dOiBhcHBlbmRDb21tZW50LFxuICAgICAgICBbVG9rZW5pemVyLkRPQ1RZUEVfVE9LRU5dOiBtaXNwbGFjZWREb2N0eXBlLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IHN0YXJ0VGFnQmVmb3JlSGVhZCxcbiAgICAgICAgW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXTogZW5kVGFnQmVmb3JlSGVhZCxcbiAgICAgICAgW1Rva2VuaXplci5FT0ZfVE9LRU5dOiB0b2tlbkJlZm9yZUhlYWRcbiAgICB9LFxuICAgIFtJTl9IRUFEX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogdG9rZW5JbkhlYWQsXG4gICAgICAgIFtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dOiB0b2tlbkluSGVhZCxcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IGluc2VydENoYXJhY3RlcnMsXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnQsXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IG1pc3BsYWNlZERvY3R5cGUsXG4gICAgICAgIFtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXTogc3RhcnRUYWdJbkhlYWQsXG4gICAgICAgIFtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl06IGVuZFRhZ0luSGVhZCxcbiAgICAgICAgW1Rva2VuaXplci5FT0ZfVE9LRU5dOiB0b2tlbkluSGVhZFxuICAgIH0sXG4gICAgW0lOX0hFQURfTk9fU0NSSVBUX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogdG9rZW5JbkhlYWROb1NjcmlwdCxcbiAgICAgICAgW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl06IHRva2VuSW5IZWFkTm9TY3JpcHQsXG4gICAgICAgIFtUb2tlbml6ZXIuV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU5dOiBpbnNlcnRDaGFyYWN0ZXJzLFxuICAgICAgICBbVG9rZW5pemVyLkNPTU1FTlRfVE9LRU5dOiBhcHBlbmRDb21tZW50LFxuICAgICAgICBbVG9rZW5pemVyLkRPQ1RZUEVfVE9LRU5dOiBtaXNwbGFjZWREb2N0eXBlLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IHN0YXJ0VGFnSW5IZWFkTm9TY3JpcHQsXG4gICAgICAgIFtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl06IGVuZFRhZ0luSGVhZE5vU2NyaXB0LFxuICAgICAgICBbVG9rZW5pemVyLkVPRl9UT0tFTl06IHRva2VuSW5IZWFkTm9TY3JpcHRcbiAgICB9LFxuICAgIFtBRlRFUl9IRUFEX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogdG9rZW5BZnRlckhlYWQsXG4gICAgICAgIFtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dOiB0b2tlbkFmdGVySGVhZCxcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IGluc2VydENoYXJhY3RlcnMsXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnQsXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IG1pc3BsYWNlZERvY3R5cGUsXG4gICAgICAgIFtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXTogc3RhcnRUYWdBZnRlckhlYWQsXG4gICAgICAgIFtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl06IGVuZFRhZ0FmdGVySGVhZCxcbiAgICAgICAgW1Rva2VuaXplci5FT0ZfVE9LRU5dOiB0b2tlbkFmdGVySGVhZFxuICAgIH0sXG4gICAgW0lOX0JPRFlfTU9ERV06IHtcbiAgICAgICAgW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dOiBjaGFyYWN0ZXJJbkJvZHksXG4gICAgICAgIFtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dOiBpZ25vcmVUb2tlbixcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IHdoaXRlc3BhY2VDaGFyYWN0ZXJJbkJvZHksXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnQsXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IHN0YXJ0VGFnSW5Cb2R5LFxuICAgICAgICBbVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dOiBlbmRUYWdJbkJvZHksXG4gICAgICAgIFtUb2tlbml6ZXIuRU9GX1RPS0VOXTogZW9mSW5Cb2R5XG4gICAgfSxcbiAgICBbVEVYVF9NT0RFXToge1xuICAgICAgICBbVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTl06IGluc2VydENoYXJhY3RlcnMsXG4gICAgICAgIFtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dOiBpbnNlcnRDaGFyYWN0ZXJzLFxuICAgICAgICBbVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXTogaW5zZXJ0Q2hhcmFjdGVycyxcbiAgICAgICAgW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXTogaWdub3JlVG9rZW4sXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dOiBlbmRUYWdJblRleHQsXG4gICAgICAgIFtUb2tlbml6ZXIuRU9GX1RPS0VOXTogZW9mSW5UZXh0XG4gICAgfSxcbiAgICBbSU5fVEFCTEVfTU9ERV06IHtcbiAgICAgICAgW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dOiBjaGFyYWN0ZXJJblRhYmxlLFxuICAgICAgICBbVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXTogY2hhcmFjdGVySW5UYWJsZSxcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IGNoYXJhY3RlckluVGFibGUsXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnQsXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IHN0YXJ0VGFnSW5UYWJsZSxcbiAgICAgICAgW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXTogZW5kVGFnSW5UYWJsZSxcbiAgICAgICAgW1Rva2VuaXplci5FT0ZfVE9LRU5dOiBlb2ZJbkJvZHlcbiAgICB9LFxuICAgIFtJTl9UQUJMRV9URVhUX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogY2hhcmFjdGVySW5UYWJsZVRleHQsXG4gICAgICAgIFtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dOiBpZ25vcmVUb2tlbixcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IHdoaXRlc3BhY2VDaGFyYWN0ZXJJblRhYmxlVGV4dCxcbiAgICAgICAgW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXTogdG9rZW5JblRhYmxlVGV4dCxcbiAgICAgICAgW1Rva2VuaXplci5ET0NUWVBFX1RPS0VOXTogdG9rZW5JblRhYmxlVGV4dCxcbiAgICAgICAgW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dOiB0b2tlbkluVGFibGVUZXh0LFxuICAgICAgICBbVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dOiB0b2tlbkluVGFibGVUZXh0LFxuICAgICAgICBbVG9rZW5pemVyLkVPRl9UT0tFTl06IHRva2VuSW5UYWJsZVRleHRcbiAgICB9LFxuICAgIFtJTl9DQVBUSU9OX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogY2hhcmFjdGVySW5Cb2R5LFxuICAgICAgICBbVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXTogaWdub3JlVG9rZW4sXG4gICAgICAgIFtUb2tlbml6ZXIuV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU5dOiB3aGl0ZXNwYWNlQ2hhcmFjdGVySW5Cb2R5LFxuICAgICAgICBbVG9rZW5pemVyLkNPTU1FTlRfVE9LRU5dOiBhcHBlbmRDb21tZW50LFxuICAgICAgICBbVG9rZW5pemVyLkRPQ1RZUEVfVE9LRU5dOiBpZ25vcmVUb2tlbixcbiAgICAgICAgW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dOiBzdGFydFRhZ0luQ2FwdGlvbixcbiAgICAgICAgW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXTogZW5kVGFnSW5DYXB0aW9uLFxuICAgICAgICBbVG9rZW5pemVyLkVPRl9UT0tFTl06IGVvZkluQm9keVxuICAgIH0sXG4gICAgW0lOX0NPTFVNTl9HUk9VUF9NT0RFXToge1xuICAgICAgICBbVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTl06IHRva2VuSW5Db2x1bW5Hcm91cCxcbiAgICAgICAgW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl06IHRva2VuSW5Db2x1bW5Hcm91cCxcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IGluc2VydENoYXJhY3RlcnMsXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnQsXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IHN0YXJ0VGFnSW5Db2x1bW5Hcm91cCxcbiAgICAgICAgW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXTogZW5kVGFnSW5Db2x1bW5Hcm91cCxcbiAgICAgICAgW1Rva2VuaXplci5FT0ZfVE9LRU5dOiBlb2ZJbkJvZHlcbiAgICB9LFxuICAgIFtJTl9UQUJMRV9CT0RZX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogY2hhcmFjdGVySW5UYWJsZSxcbiAgICAgICAgW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl06IGNoYXJhY3RlckluVGFibGUsXG4gICAgICAgIFtUb2tlbml6ZXIuV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU5dOiBjaGFyYWN0ZXJJblRhYmxlLFxuICAgICAgICBbVG9rZW5pemVyLkNPTU1FTlRfVE9LRU5dOiBhcHBlbmRDb21tZW50LFxuICAgICAgICBbVG9rZW5pemVyLkRPQ1RZUEVfVE9LRU5dOiBpZ25vcmVUb2tlbixcbiAgICAgICAgW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dOiBzdGFydFRhZ0luVGFibGVCb2R5LFxuICAgICAgICBbVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dOiBlbmRUYWdJblRhYmxlQm9keSxcbiAgICAgICAgW1Rva2VuaXplci5FT0ZfVE9LRU5dOiBlb2ZJbkJvZHlcbiAgICB9LFxuICAgIFtJTl9ST1dfTU9ERV06IHtcbiAgICAgICAgW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dOiBjaGFyYWN0ZXJJblRhYmxlLFxuICAgICAgICBbVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXTogY2hhcmFjdGVySW5UYWJsZSxcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IGNoYXJhY3RlckluVGFibGUsXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnQsXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IHN0YXJ0VGFnSW5Sb3csXG4gICAgICAgIFtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl06IGVuZFRhZ0luUm93LFxuICAgICAgICBbVG9rZW5pemVyLkVPRl9UT0tFTl06IGVvZkluQm9keVxuICAgIH0sXG4gICAgW0lOX0NFTExfTU9ERV06IHtcbiAgICAgICAgW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dOiBjaGFyYWN0ZXJJbkJvZHksXG4gICAgICAgIFtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dOiBpZ25vcmVUb2tlbixcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IHdoaXRlc3BhY2VDaGFyYWN0ZXJJbkJvZHksXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnQsXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IHN0YXJ0VGFnSW5DZWxsLFxuICAgICAgICBbVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dOiBlbmRUYWdJbkNlbGwsXG4gICAgICAgIFtUb2tlbml6ZXIuRU9GX1RPS0VOXTogZW9mSW5Cb2R5XG4gICAgfSxcbiAgICBbSU5fU0VMRUNUX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogaW5zZXJ0Q2hhcmFjdGVycyxcbiAgICAgICAgW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXTogaW5zZXJ0Q2hhcmFjdGVycyxcbiAgICAgICAgW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXTogYXBwZW5kQ29tbWVudCxcbiAgICAgICAgW1Rva2VuaXplci5ET0NUWVBFX1RPS0VOXTogaWdub3JlVG9rZW4sXG4gICAgICAgIFtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXTogc3RhcnRUYWdJblNlbGVjdCxcbiAgICAgICAgW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXTogZW5kVGFnSW5TZWxlY3QsXG4gICAgICAgIFtUb2tlbml6ZXIuRU9GX1RPS0VOXTogZW9mSW5Cb2R5XG4gICAgfSxcbiAgICBbSU5fU0VMRUNUX0lOX1RBQkxFX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogaW5zZXJ0Q2hhcmFjdGVycyxcbiAgICAgICAgW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXTogaW5zZXJ0Q2hhcmFjdGVycyxcbiAgICAgICAgW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXTogYXBwZW5kQ29tbWVudCxcbiAgICAgICAgW1Rva2VuaXplci5ET0NUWVBFX1RPS0VOXTogaWdub3JlVG9rZW4sXG4gICAgICAgIFtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXTogc3RhcnRUYWdJblNlbGVjdEluVGFibGUsXG4gICAgICAgIFtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl06IGVuZFRhZ0luU2VsZWN0SW5UYWJsZSxcbiAgICAgICAgW1Rva2VuaXplci5FT0ZfVE9LRU5dOiBlb2ZJbkJvZHlcbiAgICB9LFxuICAgIFtJTl9URU1QTEFURV9NT0RFXToge1xuICAgICAgICBbVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTl06IGNoYXJhY3RlckluQm9keSxcbiAgICAgICAgW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXTogd2hpdGVzcGFjZUNoYXJhY3RlckluQm9keSxcbiAgICAgICAgW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXTogYXBwZW5kQ29tbWVudCxcbiAgICAgICAgW1Rva2VuaXplci5ET0NUWVBFX1RPS0VOXTogaWdub3JlVG9rZW4sXG4gICAgICAgIFtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXTogc3RhcnRUYWdJblRlbXBsYXRlLFxuICAgICAgICBbVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dOiBlbmRUYWdJblRlbXBsYXRlLFxuICAgICAgICBbVG9rZW5pemVyLkVPRl9UT0tFTl06IGVvZkluVGVtcGxhdGVcbiAgICB9LFxuICAgIFtBRlRFUl9CT0RZX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogdG9rZW5BZnRlckJvZHksXG4gICAgICAgIFtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dOiB0b2tlbkFmdGVyQm9keSxcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IHdoaXRlc3BhY2VDaGFyYWN0ZXJJbkJvZHksXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnRUb1Jvb3RIdG1sRWxlbWVudCxcbiAgICAgICAgW1Rva2VuaXplci5ET0NUWVBFX1RPS0VOXTogaWdub3JlVG9rZW4sXG4gICAgICAgIFtUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOXTogc3RhcnRUYWdBZnRlckJvZHksXG4gICAgICAgIFtUb2tlbml6ZXIuRU5EX1RBR19UT0tFTl06IGVuZFRhZ0FmdGVyQm9keSxcbiAgICAgICAgW1Rva2VuaXplci5FT0ZfVE9LRU5dOiBzdG9wUGFyc2luZ1xuICAgIH0sXG4gICAgW0lOX0ZSQU1FU0VUX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogaWdub3JlVG9rZW4sXG4gICAgICAgIFtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dOiBpZ25vcmVUb2tlbixcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IGluc2VydENoYXJhY3RlcnMsXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnQsXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IHN0YXJ0VGFnSW5GcmFtZXNldCxcbiAgICAgICAgW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXTogZW5kVGFnSW5GcmFtZXNldCxcbiAgICAgICAgW1Rva2VuaXplci5FT0ZfVE9LRU5dOiBzdG9wUGFyc2luZ1xuICAgIH0sXG4gICAgW0FGVEVSX0ZSQU1FU0VUX01PREVdOiB7XG4gICAgICAgIFtUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOXTogaWdub3JlVG9rZW4sXG4gICAgICAgIFtUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU5dOiBpZ25vcmVUb2tlbixcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IGluc2VydENoYXJhY3RlcnMsXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnQsXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IHN0YXJ0VGFnQWZ0ZXJGcmFtZXNldCxcbiAgICAgICAgW1Rva2VuaXplci5FTkRfVEFHX1RPS0VOXTogZW5kVGFnQWZ0ZXJGcmFtZXNldCxcbiAgICAgICAgW1Rva2VuaXplci5FT0ZfVE9LRU5dOiBzdG9wUGFyc2luZ1xuICAgIH0sXG4gICAgW0FGVEVSX0FGVEVSX0JPRFlfTU9ERV06IHtcbiAgICAgICAgW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dOiB0b2tlbkFmdGVyQWZ0ZXJCb2R5LFxuICAgICAgICBbVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOXTogdG9rZW5BZnRlckFmdGVyQm9keSxcbiAgICAgICAgW1Rva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTl06IHdoaXRlc3BhY2VDaGFyYWN0ZXJJbkJvZHksXG4gICAgICAgIFtUb2tlbml6ZXIuQ09NTUVOVF9UT0tFTl06IGFwcGVuZENvbW1lbnRUb0RvY3VtZW50LFxuICAgICAgICBbVG9rZW5pemVyLkRPQ1RZUEVfVE9LRU5dOiBpZ25vcmVUb2tlbixcbiAgICAgICAgW1Rva2VuaXplci5TVEFSVF9UQUdfVE9LRU5dOiBzdGFydFRhZ0FmdGVyQWZ0ZXJCb2R5LFxuICAgICAgICBbVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dOiB0b2tlbkFmdGVyQWZ0ZXJCb2R5LFxuICAgICAgICBbVG9rZW5pemVyLkVPRl9UT0tFTl06IHN0b3BQYXJzaW5nXG4gICAgfSxcbiAgICBbQUZURVJfQUZURVJfRlJBTUVTRVRfTU9ERV06IHtcbiAgICAgICAgW1Rva2VuaXplci5DSEFSQUNURVJfVE9LRU5dOiBpZ25vcmVUb2tlbixcbiAgICAgICAgW1Rva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOXTogd2hpdGVzcGFjZUNoYXJhY3RlckluQm9keSxcbiAgICAgICAgW1Rva2VuaXplci5DT01NRU5UX1RPS0VOXTogYXBwZW5kQ29tbWVudFRvRG9jdW1lbnQsXG4gICAgICAgIFtUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTl06IGlnbm9yZVRva2VuLFxuICAgICAgICBbVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTl06IHN0YXJ0VGFnQWZ0ZXJBZnRlckZyYW1lc2V0LFxuICAgICAgICBbVG9rZW5pemVyLkVORF9UQUdfVE9LRU5dOiBpZ25vcmVUb2tlbixcbiAgICAgICAgW1Rva2VuaXplci5FT0ZfVE9LRU5dOiBzdG9wUGFyc2luZ1xuICAgIH1cbn07XG5cbi8vUGFyc2VyXG5jbGFzcyBQYXJzZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gbWVyZ2VPcHRpb25zKERFRkFVTFRfT1BUSU9OUywgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy50cmVlQWRhcHRlciA9IHRoaXMub3B0aW9ucy50cmVlQWRhcHRlcjtcbiAgICAgICAgdGhpcy5wZW5kaW5nU2NyaXB0ID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNvdXJjZUNvZGVMb2NhdGlvbkluZm8pIHtcbiAgICAgICAgICAgIE1peGluLmluc3RhbGwodGhpcywgTG9jYXRpb25JbmZvUGFyc2VyTWl4aW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vblBhcnNlRXJyb3IpIHtcbiAgICAgICAgICAgIE1peGluLmluc3RhbGwodGhpcywgRXJyb3JSZXBvcnRpbmdQYXJzZXJNaXhpbiwgeyBvblBhcnNlRXJyb3I6IHRoaXMub3B0aW9ucy5vblBhcnNlRXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBUElcbiAgICBwYXJzZShodG1sKSB7XG4gICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy50cmVlQWRhcHRlci5jcmVhdGVEb2N1bWVudCgpO1xuXG4gICAgICAgIHRoaXMuX2Jvb3RzdHJhcChkb2N1bWVudCwgbnVsbCk7XG4gICAgICAgIHRoaXMudG9rZW5pemVyLndyaXRlKGh0bWwsIHRydWUpO1xuICAgICAgICB0aGlzLl9ydW5QYXJzaW5nTG9vcChudWxsKTtcblxuICAgICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgcGFyc2VGcmFnbWVudChodG1sLCBmcmFnbWVudENvbnRleHQpIHtcbiAgICAgICAgLy9OT1RFOiB1c2UgPHRlbXBsYXRlPiBlbGVtZW50IGFzIGEgZnJhZ21lbnQgY29udGV4dCBpZiBjb250ZXh0IGVsZW1lbnQgd2FzIG5vdCBwcm92aWRlZCxcbiAgICAgICAgLy9zbyB3ZSB3aWxsIHBhcnNlIGluIFwiZm9yZ2l2aW5nXCIgbWFubmVyXG4gICAgICAgIGlmICghZnJhZ21lbnRDb250ZXh0KSB7XG4gICAgICAgICAgICBmcmFnbWVudENvbnRleHQgPSB0aGlzLnRyZWVBZGFwdGVyLmNyZWF0ZUVsZW1lbnQoJC5URU1QTEFURSwgTlMuSFRNTCwgW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9OT1RFOiBjcmVhdGUgZmFrZSBlbGVtZW50IHdoaWNoIHdpbGwgYmUgdXNlZCBhcyAnZG9jdW1lbnQnIGZvciBmcmFnbWVudCBwYXJzaW5nLlxuICAgICAgICAvL1RoaXMgaXMgaW1wb3J0YW50IGZvciBqc2RvbSB0aGVyZSAnZG9jdW1lbnQnIGNhbid0IGJlIHJlY3JlYXRlZCwgdGhlcmVmb3JlXG4gICAgICAgIC8vZnJhZ21lbnQgcGFyc2luZyBjYXVzZXMgbWVzc2luZyBvZiB0aGUgbWFpbiBgZG9jdW1lbnRgLlxuICAgICAgICBjb25zdCBkb2N1bWVudE1vY2sgPSB0aGlzLnRyZWVBZGFwdGVyLmNyZWF0ZUVsZW1lbnQoJ2RvY3VtZW50bW9jaycsIE5TLkhUTUwsIFtdKTtcblxuICAgICAgICB0aGlzLl9ib290c3RyYXAoZG9jdW1lbnRNb2NrLCBmcmFnbWVudENvbnRleHQpO1xuXG4gICAgICAgIGlmICh0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUoZnJhZ21lbnRDb250ZXh0KSA9PT0gJC5URU1QTEFURSkge1xuICAgICAgICAgICAgdGhpcy5fcHVzaFRtcGxJbnNlcnRpb25Nb2RlKElOX1RFTVBMQVRFX01PREUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faW5pdFRva2VuaXplckZvckZyYWdtZW50UGFyc2luZygpO1xuICAgICAgICB0aGlzLl9pbnNlcnRGYWtlUm9vdEVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5fcmVzZXRJbnNlcnRpb25Nb2RlKCk7XG4gICAgICAgIHRoaXMuX2ZpbmRGb3JtSW5GcmFnbWVudENvbnRleHQoKTtcbiAgICAgICAgdGhpcy50b2tlbml6ZXIud3JpdGUoaHRtbCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX3J1blBhcnNpbmdMb29wKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gdGhpcy50cmVlQWRhcHRlci5nZXRGaXJzdENoaWxkKGRvY3VtZW50TW9jayk7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gdGhpcy50cmVlQWRhcHRlci5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cbiAgICAgICAgdGhpcy5fYWRvcHROb2Rlcyhyb290RWxlbWVudCwgZnJhZ21lbnQpO1xuXG4gICAgICAgIHJldHVybiBmcmFnbWVudDtcbiAgICB9XG5cbiAgICAvL0Jvb3RzdHJhcCBwYXJzZXJcbiAgICBfYm9vdHN0cmFwKGRvY3VtZW50LCBmcmFnbWVudENvbnRleHQpIHtcbiAgICAgICAgdGhpcy50b2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5zdG9wcGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSU5JVElBTF9NT0RFO1xuICAgICAgICB0aGlzLm9yaWdpbmFsSW5zZXJ0aW9uTW9kZSA9ICcnO1xuXG4gICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICAgICAgdGhpcy5mcmFnbWVudENvbnRleHQgPSBmcmFnbWVudENvbnRleHQ7XG5cbiAgICAgICAgdGhpcy5oZWFkRWxlbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9ybUVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMub3BlbkVsZW1lbnRzID0gbmV3IE9wZW5FbGVtZW50U3RhY2sodGhpcy5kb2N1bWVudCwgdGhpcy50cmVlQWRhcHRlcik7XG4gICAgICAgIHRoaXMuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzID0gbmV3IEZvcm1hdHRpbmdFbGVtZW50TGlzdCh0aGlzLnRyZWVBZGFwdGVyKTtcblxuICAgICAgICB0aGlzLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2sgPSBbXTtcbiAgICAgICAgdGhpcy50bXBsSW5zZXJ0aW9uTW9kZVN0YWNrVG9wID0gLTE7XG4gICAgICAgIHRoaXMuY3VycmVudFRtcGxJbnNlcnRpb25Nb2RlID0gbnVsbDtcblxuICAgICAgICB0aGlzLnBlbmRpbmdDaGFyYWN0ZXJUb2tlbnMgPSBbXTtcbiAgICAgICAgdGhpcy5oYXNOb25XaGl0ZXNwYWNlUGVuZGluZ0NoYXJhY3RlclRva2VuID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5mcmFtZXNldE9rID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5za2lwTmV4dE5ld0xpbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3N0ZXJQYXJlbnRpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9FcnJvcnNcbiAgICBfZXJyKCkge1xuICAgICAgICAvLyBOT1RFOiBlcnIgcmVwb3J0aW5nIGlzIG5vb3AgYnkgZGVmYXVsdC4gRW5hYmxlZCBieSBtaXhpbi5cbiAgICB9XG5cbiAgICAvL1BhcnNpbmcgbG9vcFxuICAgIF9ydW5QYXJzaW5nTG9vcChzY3JpcHRIYW5kbGVyKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5zdG9wcGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR1cFRva2VuaXplckNEQVRBTW9kZSgpO1xuXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5pemVyLmdldE5leHRUb2tlbigpO1xuXG4gICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLkhJQkVSTkFUSU9OX1RPS0VOKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNraXBOZXh0TmV3TGluZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcE5leHROZXdMaW5lID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOICYmIHRva2VuLmNoYXJzWzBdID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4uY2hhcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRva2VuLmNoYXJzID0gdG9rZW4uY2hhcnMuc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0lucHV0VG9rZW4odG9rZW4pO1xuXG4gICAgICAgICAgICBpZiAoc2NyaXB0SGFuZGxlciAmJiB0aGlzLnBlbmRpbmdTY3JpcHQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJ1blBhcnNpbmdMb29wRm9yQ3VycmVudENodW5rKHdyaXRlQ2FsbGJhY2ssIHNjcmlwdEhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fcnVuUGFyc2luZ0xvb3Aoc2NyaXB0SGFuZGxlcik7XG5cbiAgICAgICAgaWYgKHNjcmlwdEhhbmRsZXIgJiYgdGhpcy5wZW5kaW5nU2NyaXB0KSB7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHQgPSB0aGlzLnBlbmRpbmdTY3JpcHQ7XG5cbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1NjcmlwdCA9IG51bGw7XG5cbiAgICAgICAgICAgIHNjcmlwdEhhbmRsZXIoc2NyaXB0KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdyaXRlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHdyaXRlQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vVGV4dCBwYXJzaW5nXG4gICAgX3NldHVwVG9rZW5pemVyQ0RBVEFNb2RlKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fZ2V0QWRqdXN0ZWRDdXJyZW50RWxlbWVudCgpO1xuXG4gICAgICAgIHRoaXMudG9rZW5pemVyLmFsbG93Q0RBVEEgPVxuICAgICAgICAgICAgY3VycmVudCAmJlxuICAgICAgICAgICAgY3VycmVudCAhPT0gdGhpcy5kb2N1bWVudCAmJlxuICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkoY3VycmVudCkgIT09IE5TLkhUTUwgJiZcbiAgICAgICAgICAgICF0aGlzLl9pc0ludGVncmF0aW9uUG9pbnQoY3VycmVudCk7XG4gICAgfVxuXG4gICAgX3N3aXRjaFRvVGV4dFBhcnNpbmcoY3VycmVudFRva2VuLCBuZXh0VG9rZW5pemVyU3RhdGUpIHtcbiAgICAgICAgdGhpcy5faW5zZXJ0RWxlbWVudChjdXJyZW50VG9rZW4sIE5TLkhUTUwpO1xuICAgICAgICB0aGlzLnRva2VuaXplci5zdGF0ZSA9IG5leHRUb2tlbml6ZXJTdGF0ZTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbEluc2VydGlvbk1vZGUgPSB0aGlzLmluc2VydGlvbk1vZGU7XG4gICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IFRFWFRfTU9ERTtcbiAgICB9XG5cbiAgICBzd2l0Y2hUb1BsYWludGV4dFBhcnNpbmcoKSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IFRFWFRfTU9ERTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbEluc2VydGlvbk1vZGUgPSBJTl9CT0RZX01PREU7XG4gICAgICAgIHRoaXMudG9rZW5pemVyLnN0YXRlID0gVG9rZW5pemVyLk1PREUuUExBSU5URVhUO1xuICAgIH1cblxuICAgIC8vRnJhZ21lbnQgcGFyc2luZ1xuICAgIF9nZXRBZGp1c3RlZEN1cnJlbnRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVuRWxlbWVudHMuc3RhY2tUb3AgPT09IDAgJiYgdGhpcy5mcmFnbWVudENvbnRleHRcbiAgICAgICAgICAgID8gdGhpcy5mcmFnbWVudENvbnRleHRcbiAgICAgICAgICAgIDogdGhpcy5vcGVuRWxlbWVudHMuY3VycmVudDtcbiAgICB9XG5cbiAgICBfZmluZEZvcm1JbkZyYWdtZW50Q29udGV4dCgpIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmZyYWdtZW50Q29udGV4dDtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKG5vZGUpID09PSAkLkZPUk0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1FbGVtZW50ID0gbm9kZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbm9kZSA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0UGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfSB3aGlsZSAobm9kZSk7XG4gICAgfVxuXG4gICAgX2luaXRUb2tlbml6ZXJGb3JGcmFnbWVudFBhcnNpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLmZyYWdtZW50Q29udGV4dCkgPT09IE5TLkhUTUwpIHtcbiAgICAgICAgICAgIGNvbnN0IHRuID0gdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKHRoaXMuZnJhZ21lbnRDb250ZXh0KTtcblxuICAgICAgICAgICAgaWYgKHRuID09PSAkLlRJVExFIHx8IHRuID09PSAkLlRFWFRBUkVBKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbml6ZXIuc3RhdGUgPSBUb2tlbml6ZXIuTU9ERS5SQ0RBVEE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRuID09PSAkLlNUWUxFIHx8XG4gICAgICAgICAgICAgICAgdG4gPT09ICQuWE1QIHx8XG4gICAgICAgICAgICAgICAgdG4gPT09ICQuSUZSQU1FIHx8XG4gICAgICAgICAgICAgICAgdG4gPT09ICQuTk9FTUJFRCB8fFxuICAgICAgICAgICAgICAgIHRuID09PSAkLk5PRlJBTUVTIHx8XG4gICAgICAgICAgICAgICAgdG4gPT09ICQuTk9TQ1JJUFRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9rZW5pemVyLnN0YXRlID0gVG9rZW5pemVyLk1PREUuUkFXVEVYVDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuU0NSSVBUKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbml6ZXIuc3RhdGUgPSBUb2tlbml6ZXIuTU9ERS5TQ1JJUFRfREFUQTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuUExBSU5URVhUKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbml6ZXIuc3RhdGUgPSBUb2tlbml6ZXIuTU9ERS5QTEFJTlRFWFQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL1RyZWUgbXV0YXRpb25cbiAgICBfc2V0RG9jdW1lbnRUeXBlKHRva2VuKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0b2tlbi5uYW1lIHx8ICcnO1xuICAgICAgICBjb25zdCBwdWJsaWNJZCA9IHRva2VuLnB1YmxpY0lkIHx8ICcnO1xuICAgICAgICBjb25zdCBzeXN0ZW1JZCA9IHRva2VuLnN5c3RlbUlkIHx8ICcnO1xuXG4gICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuc2V0RG9jdW1lbnRUeXBlKHRoaXMuZG9jdW1lbnQsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7XG4gICAgfVxuXG4gICAgX2F0dGFjaEVsZW1lbnRUb1RyZWUoZWxlbWVudCkge1xuICAgICAgICBpZiAodGhpcy5fc2hvdWxkRm9zdGVyUGFyZW50T25JbnNlcnRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5fZm9zdGVyUGFyZW50RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnRUbXBsQ29udGVudCB8fCB0aGlzLm9wZW5FbGVtZW50cy5jdXJyZW50O1xuXG4gICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmFwcGVuZENoaWxkKHBhcmVudCwgZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYXBwZW5kRWxlbWVudCh0b2tlbiwgbmFtZXNwYWNlVVJJKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRyZWVBZGFwdGVyLmNyZWF0ZUVsZW1lbnQodG9rZW4udGFnTmFtZSwgbmFtZXNwYWNlVVJJLCB0b2tlbi5hdHRycyk7XG5cbiAgICAgICAgdGhpcy5fYXR0YWNoRWxlbWVudFRvVHJlZShlbGVtZW50KTtcbiAgICB9XG5cbiAgICBfaW5zZXJ0RWxlbWVudCh0b2tlbiwgbmFtZXNwYWNlVVJJKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRyZWVBZGFwdGVyLmNyZWF0ZUVsZW1lbnQodG9rZW4udGFnTmFtZSwgbmFtZXNwYWNlVVJJLCB0b2tlbi5hdHRycyk7XG5cbiAgICAgICAgdGhpcy5fYXR0YWNoRWxlbWVudFRvVHJlZShlbGVtZW50KTtcbiAgICAgICAgdGhpcy5vcGVuRWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB9XG5cbiAgICBfaW5zZXJ0RmFrZUVsZW1lbnQodGFnTmFtZSkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy50cmVlQWRhcHRlci5jcmVhdGVFbGVtZW50KHRhZ05hbWUsIE5TLkhUTUwsIFtdKTtcblxuICAgICAgICB0aGlzLl9hdHRhY2hFbGVtZW50VG9UcmVlKGVsZW1lbnQpO1xuICAgICAgICB0aGlzLm9wZW5FbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIF9pbnNlcnRUZW1wbGF0ZSh0b2tlbikge1xuICAgICAgICBjb25zdCB0bXBsID0gdGhpcy50cmVlQWRhcHRlci5jcmVhdGVFbGVtZW50KHRva2VuLnRhZ05hbWUsIE5TLkhUTUwsIHRva2VuLmF0dHJzKTtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMudHJlZUFkYXB0ZXIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuc2V0VGVtcGxhdGVDb250ZW50KHRtcGwsIGNvbnRlbnQpO1xuICAgICAgICB0aGlzLl9hdHRhY2hFbGVtZW50VG9UcmVlKHRtcGwpO1xuICAgICAgICB0aGlzLm9wZW5FbGVtZW50cy5wdXNoKHRtcGwpO1xuICAgIH1cblxuICAgIF9pbnNlcnRGYWtlUm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRyZWVBZGFwdGVyLmNyZWF0ZUVsZW1lbnQoJC5IVE1MLCBOUy5IVE1MLCBbXSk7XG5cbiAgICAgICAgdGhpcy50cmVlQWRhcHRlci5hcHBlbmRDaGlsZCh0aGlzLm9wZW5FbGVtZW50cy5jdXJyZW50LCBlbGVtZW50KTtcbiAgICAgICAgdGhpcy5vcGVuRWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB9XG5cbiAgICBfYXBwZW5kQ29tbWVudE5vZGUodG9rZW4sIHBhcmVudCkge1xuICAgICAgICBjb25zdCBjb21tZW50Tm9kZSA9IHRoaXMudHJlZUFkYXB0ZXIuY3JlYXRlQ29tbWVudE5vZGUodG9rZW4uZGF0YSk7XG5cbiAgICAgICAgdGhpcy50cmVlQWRhcHRlci5hcHBlbmRDaGlsZChwYXJlbnQsIGNvbW1lbnROb2RlKTtcbiAgICB9XG5cbiAgICBfaW5zZXJ0Q2hhcmFjdGVycyh0b2tlbikge1xuICAgICAgICBpZiAodGhpcy5fc2hvdWxkRm9zdGVyUGFyZW50T25JbnNlcnRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5fZm9zdGVyUGFyZW50VGV4dCh0b2tlbi5jaGFycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLm9wZW5FbGVtZW50cy5jdXJyZW50VG1wbENvbnRlbnQgfHwgdGhpcy5vcGVuRWxlbWVudHMuY3VycmVudDtcblxuICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5pbnNlcnRUZXh0KHBhcmVudCwgdG9rZW4uY2hhcnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2Fkb3B0Tm9kZXMoZG9ub3IsIHJlY2lwaWVudCkge1xuICAgICAgICBmb3IgKGxldCBjaGlsZCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0Rmlyc3RDaGlsZChkb25vcik7IGNoaWxkOyBjaGlsZCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0Rmlyc3RDaGlsZChkb25vcikpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuZGV0YWNoTm9kZShjaGlsZCk7XG4gICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmFwcGVuZENoaWxkKHJlY2lwaWVudCwgY2hpbGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9Ub2tlbiBwcm9jZXNzaW5nXG4gICAgX3Nob3VsZFByb2Nlc3NUb2tlbkluRm9yZWlnbkNvbnRlbnQodG9rZW4pIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2dldEFkanVzdGVkQ3VycmVudEVsZW1lbnQoKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnQgfHwgY3VycmVudCA9PT0gdGhpcy5kb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShjdXJyZW50KTtcblxuICAgICAgICBpZiAobnMgPT09IE5TLkhUTUwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShjdXJyZW50KSA9PT0gJC5BTk5PVEFUSU9OX1hNTCAmJlxuICAgICAgICAgICAgbnMgPT09IE5TLk1BVEhNTCAmJlxuICAgICAgICAgICAgdG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLlNUQVJUX1RBR19UT0tFTiAmJlxuICAgICAgICAgICAgdG9rZW4udGFnTmFtZSA9PT0gJC5TVkdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NoYXJhY3RlclRva2VuID1cbiAgICAgICAgICAgIHRva2VuLnR5cGUgPT09IFRva2VuaXplci5DSEFSQUNURVJfVE9LRU4gfHxcbiAgICAgICAgICAgIHRva2VuLnR5cGUgPT09IFRva2VuaXplci5OVUxMX0NIQVJBQ1RFUl9UT0tFTiB8fFxuICAgICAgICAgICAgdG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOO1xuXG4gICAgICAgIGNvbnN0IGlzTWF0aE1MVGV4dFN0YXJ0VGFnID1cbiAgICAgICAgICAgIHRva2VuLnR5cGUgPT09IFRva2VuaXplci5TVEFSVF9UQUdfVE9LRU4gJiYgdG9rZW4udGFnTmFtZSAhPT0gJC5NR0xZUEggJiYgdG9rZW4udGFnTmFtZSAhPT0gJC5NQUxJR05NQVJLO1xuXG4gICAgICAgIGlmICgoaXNNYXRoTUxUZXh0U3RhcnRUYWcgfHwgaXNDaGFyYWN0ZXJUb2tlbikgJiYgdGhpcy5faXNJbnRlZ3JhdGlvblBvaW50KGN1cnJlbnQsIE5TLk1BVEhNTCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOIHx8IGlzQ2hhcmFjdGVyVG9rZW4pICYmXG4gICAgICAgICAgICB0aGlzLl9pc0ludGVncmF0aW9uUG9pbnQoY3VycmVudCwgTlMuSFRNTClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG9rZW4udHlwZSAhPT0gVG9rZW5pemVyLkVPRl9UT0tFTjtcbiAgICB9XG5cbiAgICBfcHJvY2Vzc1Rva2VuKHRva2VuKSB7XG4gICAgICAgIFRPS0VOX0hBTkRMRVJTW3RoaXMuaW5zZXJ0aW9uTW9kZV1bdG9rZW4udHlwZV0odGhpcywgdG9rZW4pO1xuICAgIH1cblxuICAgIF9wcm9jZXNzVG9rZW5JbkJvZHlNb2RlKHRva2VuKSB7XG4gICAgICAgIFRPS0VOX0hBTkRMRVJTW0lOX0JPRFlfTU9ERV1bdG9rZW4udHlwZV0odGhpcywgdG9rZW4pO1xuICAgIH1cblxuICAgIF9wcm9jZXNzVG9rZW5JbkZvcmVpZ25Db250ZW50KHRva2VuKSB7XG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXJJbkZvcmVpZ25Db250ZW50KHRoaXMsIHRva2VuKTtcbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU4pIHtcbiAgICAgICAgICAgIG51bGxDaGFyYWN0ZXJJbkZvcmVpZ25Db250ZW50KHRoaXMsIHRva2VuKTtcbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuV0hJVEVTUEFDRV9DSEFSQUNURVJfVE9LRU4pIHtcbiAgICAgICAgICAgIGluc2VydENoYXJhY3RlcnModGhpcywgdG9rZW4pO1xuICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IFRva2VuaXplci5DT01NRU5UX1RPS0VOKSB7XG4gICAgICAgICAgICBhcHBlbmRDb21tZW50KHRoaXMsIHRva2VuKTtcbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOKSB7XG4gICAgICAgICAgICBzdGFydFRhZ0luRm9yZWlnbkNvbnRlbnQodGhpcywgdG9rZW4pO1xuICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IFRva2VuaXplci5FTkRfVEFHX1RPS0VOKSB7XG4gICAgICAgICAgICBlbmRUYWdJbkZvcmVpZ25Db250ZW50KHRoaXMsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9wcm9jZXNzSW5wdXRUb2tlbih0b2tlbikge1xuICAgICAgICBpZiAodGhpcy5fc2hvdWxkUHJvY2Vzc1Rva2VuSW5Gb3JlaWduQ29udGVudCh0b2tlbikpIHtcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NUb2tlbkluRm9yZWlnbkNvbnRlbnQodG9rZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSBUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOICYmIHRva2VuLnNlbGZDbG9zaW5nICYmICF0b2tlbi5hY2tTZWxmQ2xvc2luZykge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5ub25Wb2lkSHRtbEVsZW1lbnRTdGFydFRhZ1dpdGhUcmFpbGluZ1NvbGlkdXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9JbnRlZ3JhdGlvbiBwb2ludHNcbiAgICBfaXNJbnRlZ3JhdGlvblBvaW50KGVsZW1lbnQsIGZvcmVpZ25OUykge1xuICAgICAgICBjb25zdCB0biA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgYXR0cnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldEF0dHJMaXN0KGVsZW1lbnQpO1xuXG4gICAgICAgIHJldHVybiBmb3JlaWduQ29udGVudC5pc0ludGVncmF0aW9uUG9pbnQodG4sIG5zLCBhdHRycywgZm9yZWlnbk5TKTtcbiAgICB9XG5cbiAgICAvL0FjdGl2ZSBmb3JtYXR0aW5nIGVsZW1lbnRzIHJlY29uc3RydWN0aW9uXG4gICAgX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkge1xuICAgICAgICBjb25zdCBsaXN0TGVuZ3RoID0gdGhpcy5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMubGVuZ3RoO1xuXG4gICAgICAgIGlmIChsaXN0TGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgdW5vcGVuSWR4ID0gbGlzdExlbmd0aDtcbiAgICAgICAgICAgIGxldCBlbnRyeSA9IG51bGw7XG5cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB1bm9wZW5JZHgtLTtcbiAgICAgICAgICAgICAgICBlbnRyeSA9IHRoaXMuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmVudHJpZXNbdW5vcGVuSWR4XTtcblxuICAgICAgICAgICAgICAgIGlmIChlbnRyeS50eXBlID09PSBGb3JtYXR0aW5nRWxlbWVudExpc3QuTUFSS0VSX0VOVFJZIHx8IHRoaXMub3BlbkVsZW1lbnRzLmNvbnRhaW5zKGVudHJ5LmVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVub3BlbklkeCsrO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlICh1bm9wZW5JZHggPiAwKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHVub3BlbklkeDsgaSA8IGxpc3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuZW50cmllc1tpXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnNlcnRFbGVtZW50KGVudHJ5LnRva2VuLCB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShlbnRyeS5lbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgZW50cnkuZWxlbWVudCA9IHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL0Nsb3NlIGVsZW1lbnRzXG4gICAgX2Nsb3NlVGFibGVDZWxsKCkge1xuICAgICAgICB0aGlzLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XG4gICAgICAgIHRoaXMub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFibGVDZWxsUG9wcGVkKCk7XG4gICAgICAgIHRoaXMuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmNsZWFyVG9MYXN0TWFya2VyKCk7XG4gICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IElOX1JPV19NT0RFO1xuICAgIH1cblxuICAgIF9jbG9zZVBFbGVtZW50KCkge1xuICAgICAgICB0aGlzLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzV2l0aEV4Y2x1c2lvbigkLlApO1xuICAgICAgICB0aGlzLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoJC5QKTtcbiAgICB9XG5cbiAgICAvL0luc2VydGlvbiBtb2Rlc1xuICAgIF9yZXNldEluc2VydGlvbk1vZGUoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm9wZW5FbGVtZW50cy5zdGFja1RvcCwgbGFzdCA9IGZhbHNlOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLm9wZW5FbGVtZW50cy5pdGVtc1tpXTtcblxuICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBsYXN0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZyYWdtZW50Q29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5mcmFnbWVudENvbnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0biA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0luc2VydGlvbk1vZGUgPSBJTlNFUlRJT05fTU9ERV9SRVNFVF9NQVBbdG5dO1xuXG4gICAgICAgICAgICBpZiAobmV3SW5zZXJ0aW9uTW9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IG5ld0luc2VydGlvbk1vZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFsYXN0ICYmICh0biA9PT0gJC5URCB8fCB0biA9PT0gJC5USCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc2VydGlvbk1vZGUgPSBJTl9DRUxMX01PREU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFsYXN0ICYmIHRuID09PSAkLkhFQUQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc2VydGlvbk1vZGUgPSBJTl9IRUFEX01PREU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLlNFTEVDVCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2V0SW5zZXJ0aW9uTW9kZUZvclNlbGVjdChpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuVEVNUExBVEUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc2VydGlvbk1vZGUgPSB0aGlzLmN1cnJlbnRUbXBsSW5zZXJ0aW9uTW9kZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuSFRNTCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IHRoaXMuaGVhZEVsZW1lbnQgPyBBRlRFUl9IRUFEX01PREUgOiBCRUZPUkVfSEVBRF9NT0RFO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSU5fQk9EWV9NT0RFO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3Jlc2V0SW5zZXJ0aW9uTW9kZUZvclNlbGVjdChzZWxlY3RJZHgpIHtcbiAgICAgICAgaWYgKHNlbGVjdElkeCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzZWxlY3RJZHggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3IgPSB0aGlzLm9wZW5FbGVtZW50cy5pdGVtc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0biA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShhbmNlc3Rvcik7XG5cbiAgICAgICAgICAgICAgICBpZiAodG4gPT09ICQuVEVNUExBVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5UQUJMRSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluc2VydGlvbk1vZGUgPSBJTl9TRUxFQ1RfSU5fVEFCTEVfTU9ERTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IElOX1NFTEVDVF9NT0RFO1xuICAgIH1cblxuICAgIF9wdXNoVG1wbEluc2VydGlvbk1vZGUobW9kZSkge1xuICAgICAgICB0aGlzLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2sucHVzaChtb2RlKTtcbiAgICAgICAgdGhpcy50bXBsSW5zZXJ0aW9uTW9kZVN0YWNrVG9wKys7XG4gICAgICAgIHRoaXMuY3VycmVudFRtcGxJbnNlcnRpb25Nb2RlID0gbW9kZTtcbiAgICB9XG5cbiAgICBfcG9wVG1wbEluc2VydGlvbk1vZGUoKSB7XG4gICAgICAgIHRoaXMudG1wbEluc2VydGlvbk1vZGVTdGFjay5wb3AoKTtcbiAgICAgICAgdGhpcy50bXBsSW5zZXJ0aW9uTW9kZVN0YWNrVG9wLS07XG4gICAgICAgIHRoaXMuY3VycmVudFRtcGxJbnNlcnRpb25Nb2RlID0gdGhpcy50bXBsSW5zZXJ0aW9uTW9kZVN0YWNrW3RoaXMudG1wbEluc2VydGlvbk1vZGVTdGFja1RvcF07XG4gICAgfVxuXG4gICAgLy9Gb3N0ZXIgcGFyZW50aW5nXG4gICAgX2lzRWxlbWVudENhdXNlc0Zvc3RlclBhcmVudGluZyhlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHRuID0gdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKGVsZW1lbnQpO1xuXG4gICAgICAgIHJldHVybiB0biA9PT0gJC5UQUJMRSB8fCB0biA9PT0gJC5UQk9EWSB8fCB0biA9PT0gJC5URk9PVCB8fCB0biA9PT0gJC5USEVBRCB8fCB0biA9PT0gJC5UUjtcbiAgICB9XG5cbiAgICBfc2hvdWxkRm9zdGVyUGFyZW50T25JbnNlcnRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvc3RlclBhcmVudGluZ0VuYWJsZWQgJiYgdGhpcy5faXNFbGVtZW50Q2F1c2VzRm9zdGVyUGFyZW50aW5nKHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnQpO1xuICAgIH1cblxuICAgIF9maW5kRm9zdGVyUGFyZW50aW5nTG9jYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0ge1xuICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgYmVmb3JlRWxlbWVudDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm9wZW5FbGVtZW50cy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IG9wZW5FbGVtZW50ID0gdGhpcy5vcGVuRWxlbWVudHMuaXRlbXNbaV07XG4gICAgICAgICAgICBjb25zdCB0biA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShvcGVuRWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKG9wZW5FbGVtZW50KTtcblxuICAgICAgICAgICAgaWYgKHRuID09PSAkLlRFTVBMQVRFICYmIG5zID09PSBOUy5IVE1MKSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb24ucGFyZW50ID0gdGhpcy50cmVlQWRhcHRlci5nZXRUZW1wbGF0ZUNvbnRlbnQob3BlbkVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5UQUJMRSkge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnBhcmVudCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0UGFyZW50Tm9kZShvcGVuRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24ucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmJlZm9yZUVsZW1lbnQgPSBvcGVuRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5wYXJlbnQgPSB0aGlzLm9wZW5FbGVtZW50cy5pdGVtc1tpIC0gMV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWxvY2F0aW9uLnBhcmVudCkge1xuICAgICAgICAgICAgbG9jYXRpb24ucGFyZW50ID0gdGhpcy5vcGVuRWxlbWVudHMuaXRlbXNbMF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgfVxuXG4gICAgX2Zvc3RlclBhcmVudEVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuX2ZpbmRGb3N0ZXJQYXJlbnRpbmdMb2NhdGlvbigpO1xuXG4gICAgICAgIGlmIChsb2NhdGlvbi5iZWZvcmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmluc2VydEJlZm9yZShsb2NhdGlvbi5wYXJlbnQsIGVsZW1lbnQsIGxvY2F0aW9uLmJlZm9yZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5hcHBlbmRDaGlsZChsb2NhdGlvbi5wYXJlbnQsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2Zvc3RlclBhcmVudFRleHQoY2hhcnMpIHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLl9maW5kRm9zdGVyUGFyZW50aW5nTG9jYXRpb24oKTtcblxuICAgICAgICBpZiAobG9jYXRpb24uYmVmb3JlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5pbnNlcnRUZXh0QmVmb3JlKGxvY2F0aW9uLnBhcmVudCwgY2hhcnMsIGxvY2F0aW9uLmJlZm9yZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5pbnNlcnRUZXh0KGxvY2F0aW9uLnBhcmVudCwgY2hhcnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9TcGVjaWFsIGVsZW1lbnRzXG4gICAgX2lzU3BlY2lhbEVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCB0biA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShlbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gSFRNTC5TUEVDSUFMX0VMRU1FTlRTW25zXVt0bl07XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBhcnNlcjtcblxuLy9BZG9wdGlvbiBhZ2VuY3kgYWxnb3JpdGhtXG4vLyhzZWU6IGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3RyZWUtY29uc3RydWN0aW9uLmh0bWwjYWRvcHRpb25BZ2VuY3kpXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vL1N0ZXBzIDUtOCBvZiB0aGUgYWxnb3JpdGhtXG5mdW5jdGlvbiBhYU9idGFpbkZvcm1hdHRpbmdFbGVtZW50RW50cnkocCwgdG9rZW4pIHtcbiAgICBsZXQgZm9ybWF0dGluZ0VsZW1lbnRFbnRyeSA9IHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmdldEVsZW1lbnRFbnRyeUluU2NvcGVXaXRoVGFnTmFtZSh0b2tlbi50YWdOYW1lKTtcblxuICAgIGlmIChmb3JtYXR0aW5nRWxlbWVudEVudHJ5KSB7XG4gICAgICAgIGlmICghcC5vcGVuRWxlbWVudHMuY29udGFpbnMoZm9ybWF0dGluZ0VsZW1lbnRFbnRyeS5lbGVtZW50KSkge1xuICAgICAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlRW50cnkoZm9ybWF0dGluZ0VsZW1lbnRFbnRyeSk7XG4gICAgICAgICAgICBmb3JtYXR0aW5nRWxlbWVudEVudHJ5ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcC5vcGVuRWxlbWVudHMuaGFzSW5TY29wZSh0b2tlbi50YWdOYW1lKSkge1xuICAgICAgICAgICAgZm9ybWF0dGluZ0VsZW1lbnRFbnRyeSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmljRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0dGluZ0VsZW1lbnRFbnRyeTtcbn1cblxuLy9TdGVwcyA5IGFuZCAxMCBvZiB0aGUgYWxnb3JpdGhtXG5mdW5jdGlvbiBhYU9idGFpbkZ1cnRoZXN0QmxvY2socCwgZm9ybWF0dGluZ0VsZW1lbnRFbnRyeSkge1xuICAgIGxldCBmdXJ0aGVzdEJsb2NrID0gbnVsbDtcblxuICAgIGZvciAobGV0IGkgPSBwLm9wZW5FbGVtZW50cy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHAub3BlbkVsZW1lbnRzLml0ZW1zW2ldO1xuXG4gICAgICAgIGlmIChlbGVtZW50ID09PSBmb3JtYXR0aW5nRWxlbWVudEVudHJ5LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHAuX2lzU3BlY2lhbEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGZ1cnRoZXN0QmxvY2sgPSBlbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFmdXJ0aGVzdEJsb2NrKSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsRWxlbWVudFBvcHBlZChmb3JtYXR0aW5nRWxlbWVudEVudHJ5LmVsZW1lbnQpO1xuICAgICAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmVFbnRyeShmb3JtYXR0aW5nRWxlbWVudEVudHJ5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVydGhlc3RCbG9jaztcbn1cblxuLy9TdGVwIDEzIG9mIHRoZSBhbGdvcml0aG1cbmZ1bmN0aW9uIGFhSW5uZXJMb29wKHAsIGZ1cnRoZXN0QmxvY2ssIGZvcm1hdHRpbmdFbGVtZW50KSB7XG4gICAgbGV0IGxhc3RFbGVtZW50ID0gZnVydGhlc3RCbG9jaztcbiAgICBsZXQgbmV4dEVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy5nZXRDb21tb25BbmNlc3RvcihmdXJ0aGVzdEJsb2NrKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBlbGVtZW50ID0gbmV4dEVsZW1lbnQ7IGVsZW1lbnQgIT09IGZvcm1hdHRpbmdFbGVtZW50OyBpKyssIGVsZW1lbnQgPSBuZXh0RWxlbWVudCkge1xuICAgICAgICAvL05PVEU6IHN0b3JlIG5leHQgZWxlbWVudCBmb3IgdGhlIG5leHQgbG9vcCBpdGVyYXRpb24gKGl0IG1heSBiZSBkZWxldGVkIGZyb20gdGhlIHN0YWNrIGJ5IHN0ZXAgOS41KVxuICAgICAgICBuZXh0RWxlbWVudCA9IHAub3BlbkVsZW1lbnRzLmdldENvbW1vbkFuY2VzdG9yKGVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnRFbnRyeSA9IHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmdldEVsZW1lbnRFbnRyeShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgY291bnRlck92ZXJmbG93ID0gZWxlbWVudEVudHJ5ICYmIGkgPj0gQUFfSU5ORVJfTE9PUF9JVEVSO1xuICAgICAgICBjb25zdCBzaG91bGRSZW1vdmVGcm9tT3BlbkVsZW1lbnRzID0gIWVsZW1lbnRFbnRyeSB8fCBjb3VudGVyT3ZlcmZsb3c7XG5cbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUZyb21PcGVuRWxlbWVudHMpIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyT3ZlcmZsb3cpIHtcbiAgICAgICAgICAgICAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmVFbnRyeShlbGVtZW50RW50cnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gYWFSZWNyZWF0ZUVsZW1lbnRGcm9tRW50cnkocCwgZWxlbWVudEVudHJ5KTtcblxuICAgICAgICAgICAgaWYgKGxhc3RFbGVtZW50ID09PSBmdXJ0aGVzdEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuYm9va21hcmsgPSBlbGVtZW50RW50cnk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHAudHJlZUFkYXB0ZXIuZGV0YWNoTm9kZShsYXN0RWxlbWVudCk7XG4gICAgICAgICAgICBwLnRyZWVBZGFwdGVyLmFwcGVuZENoaWxkKGVsZW1lbnQsIGxhc3RFbGVtZW50KTtcbiAgICAgICAgICAgIGxhc3RFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXN0RWxlbWVudDtcbn1cblxuLy9TdGVwIDEzLjcgb2YgdGhlIGFsZ29yaXRobVxuZnVuY3Rpb24gYWFSZWNyZWF0ZUVsZW1lbnRGcm9tRW50cnkocCwgZWxlbWVudEVudHJ5KSB7XG4gICAgY29uc3QgbnMgPSBwLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShlbGVtZW50RW50cnkuZWxlbWVudCk7XG4gICAgY29uc3QgbmV3RWxlbWVudCA9IHAudHJlZUFkYXB0ZXIuY3JlYXRlRWxlbWVudChlbGVtZW50RW50cnkudG9rZW4udGFnTmFtZSwgbnMsIGVsZW1lbnRFbnRyeS50b2tlbi5hdHRycyk7XG5cbiAgICBwLm9wZW5FbGVtZW50cy5yZXBsYWNlKGVsZW1lbnRFbnRyeS5lbGVtZW50LCBuZXdFbGVtZW50KTtcbiAgICBlbGVtZW50RW50cnkuZWxlbWVudCA9IG5ld0VsZW1lbnQ7XG5cbiAgICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuLy9TdGVwIDE0IG9mIHRoZSBhbGdvcml0aG1cbmZ1bmN0aW9uIGFhSW5zZXJ0TGFzdE5vZGVJbkNvbW1vbkFuY2VzdG9yKHAsIGNvbW1vbkFuY2VzdG9yLCBsYXN0RWxlbWVudCkge1xuICAgIGlmIChwLl9pc0VsZW1lbnRDYXVzZXNGb3N0ZXJQYXJlbnRpbmcoY29tbW9uQW5jZXN0b3IpKSB7XG4gICAgICAgIHAuX2Zvc3RlclBhcmVudEVsZW1lbnQobGFzdEVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRuID0gcC50cmVlQWRhcHRlci5nZXRUYWdOYW1lKGNvbW1vbkFuY2VzdG9yKTtcbiAgICAgICAgY29uc3QgbnMgPSBwLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShjb21tb25BbmNlc3Rvcik7XG5cbiAgICAgICAgaWYgKHRuID09PSAkLlRFTVBMQVRFICYmIG5zID09PSBOUy5IVE1MKSB7XG4gICAgICAgICAgICBjb21tb25BbmNlc3RvciA9IHAudHJlZUFkYXB0ZXIuZ2V0VGVtcGxhdGVDb250ZW50KGNvbW1vbkFuY2VzdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHAudHJlZUFkYXB0ZXIuYXBwZW5kQ2hpbGQoY29tbW9uQW5jZXN0b3IsIGxhc3RFbGVtZW50KTtcbiAgICB9XG59XG5cbi8vU3RlcHMgMTUtMTkgb2YgdGhlIGFsZ29yaXRobVxuZnVuY3Rpb24gYWFSZXBsYWNlRm9ybWF0dGluZ0VsZW1lbnQocCwgZnVydGhlc3RCbG9jaywgZm9ybWF0dGluZ0VsZW1lbnRFbnRyeSkge1xuICAgIGNvbnN0IG5zID0gcC50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkoZm9ybWF0dGluZ0VsZW1lbnRFbnRyeS5lbGVtZW50KTtcbiAgICBjb25zdCB0b2tlbiA9IGZvcm1hdHRpbmdFbGVtZW50RW50cnkudG9rZW47XG4gICAgY29uc3QgbmV3RWxlbWVudCA9IHAudHJlZUFkYXB0ZXIuY3JlYXRlRWxlbWVudCh0b2tlbi50YWdOYW1lLCBucywgdG9rZW4uYXR0cnMpO1xuXG4gICAgcC5fYWRvcHROb2RlcyhmdXJ0aGVzdEJsb2NrLCBuZXdFbGVtZW50KTtcbiAgICBwLnRyZWVBZGFwdGVyLmFwcGVuZENoaWxkKGZ1cnRoZXN0QmxvY2ssIG5ld0VsZW1lbnQpO1xuXG4gICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5zZXJ0RWxlbWVudEFmdGVyQm9va21hcmsobmV3RWxlbWVudCwgZm9ybWF0dGluZ0VsZW1lbnRFbnRyeS50b2tlbik7XG4gICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlRW50cnkoZm9ybWF0dGluZ0VsZW1lbnRFbnRyeSk7XG5cbiAgICBwLm9wZW5FbGVtZW50cy5yZW1vdmUoZm9ybWF0dGluZ0VsZW1lbnRFbnRyeS5lbGVtZW50KTtcbiAgICBwLm9wZW5FbGVtZW50cy5pbnNlcnRBZnRlcihmdXJ0aGVzdEJsb2NrLCBuZXdFbGVtZW50KTtcbn1cblxuLy9BbGdvcml0aG0gZW50cnkgcG9pbnRcbmZ1bmN0aW9uIGNhbGxBZG9wdGlvbkFnZW5jeShwLCB0b2tlbikge1xuICAgIGxldCBmb3JtYXR0aW5nRWxlbWVudEVudHJ5O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBBQV9PVVRFUl9MT09QX0lURVI7IGkrKykge1xuICAgICAgICBmb3JtYXR0aW5nRWxlbWVudEVudHJ5ID0gYWFPYnRhaW5Gb3JtYXR0aW5nRWxlbWVudEVudHJ5KHAsIHRva2VuLCBmb3JtYXR0aW5nRWxlbWVudEVudHJ5KTtcblxuICAgICAgICBpZiAoIWZvcm1hdHRpbmdFbGVtZW50RW50cnkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVydGhlc3RCbG9jayA9IGFhT2J0YWluRnVydGhlc3RCbG9jayhwLCBmb3JtYXR0aW5nRWxlbWVudEVudHJ5KTtcblxuICAgICAgICBpZiAoIWZ1cnRoZXN0QmxvY2spIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuYm9va21hcmsgPSBmb3JtYXR0aW5nRWxlbWVudEVudHJ5O1xuXG4gICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gYWFJbm5lckxvb3AocCwgZnVydGhlc3RCbG9jaywgZm9ybWF0dGluZ0VsZW1lbnRFbnRyeS5lbGVtZW50KTtcbiAgICAgICAgY29uc3QgY29tbW9uQW5jZXN0b3IgPSBwLm9wZW5FbGVtZW50cy5nZXRDb21tb25BbmNlc3Rvcihmb3JtYXR0aW5nRWxlbWVudEVudHJ5LmVsZW1lbnQpO1xuXG4gICAgICAgIHAudHJlZUFkYXB0ZXIuZGV0YWNoTm9kZShsYXN0RWxlbWVudCk7XG4gICAgICAgIGFhSW5zZXJ0TGFzdE5vZGVJbkNvbW1vbkFuY2VzdG9yKHAsIGNvbW1vbkFuY2VzdG9yLCBsYXN0RWxlbWVudCk7XG4gICAgICAgIGFhUmVwbGFjZUZvcm1hdHRpbmdFbGVtZW50KHAsIGZ1cnRoZXN0QmxvY2ssIGZvcm1hdHRpbmdFbGVtZW50RW50cnkpO1xuICAgIH1cbn1cblxuLy9HZW5lcmljIHRva2VuIGhhbmRsZXJzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gaWdub3JlVG9rZW4oKSB7XG4gICAgLy9OT1RFOiBkbyBub3RoaW5nID0pXG59XG5cbmZ1bmN0aW9uIG1pc3BsYWNlZERvY3R5cGUocCkge1xuICAgIHAuX2VycihFUlIubWlzcGxhY2VkRG9jdHlwZSk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZENvbW1lbnQocCwgdG9rZW4pIHtcbiAgICBwLl9hcHBlbmRDb21tZW50Tm9kZSh0b2tlbiwgcC5vcGVuRWxlbWVudHMuY3VycmVudFRtcGxDb250ZW50IHx8IHAub3BlbkVsZW1lbnRzLmN1cnJlbnQpO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRDb21tZW50VG9Sb290SHRtbEVsZW1lbnQocCwgdG9rZW4pIHtcbiAgICBwLl9hcHBlbmRDb21tZW50Tm9kZSh0b2tlbiwgcC5vcGVuRWxlbWVudHMuaXRlbXNbMF0pO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRDb21tZW50VG9Eb2N1bWVudChwLCB0b2tlbikge1xuICAgIHAuX2FwcGVuZENvbW1lbnROb2RlKHRva2VuLCBwLmRvY3VtZW50KTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0Q2hhcmFjdGVycyhwLCB0b2tlbikge1xuICAgIHAuX2luc2VydENoYXJhY3RlcnModG9rZW4pO1xufVxuXG5mdW5jdGlvbiBzdG9wUGFyc2luZyhwKSB7XG4gICAgcC5zdG9wcGVkID0gdHJ1ZTtcbn1cblxuLy8gVGhlIFwiaW5pdGlhbFwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gZG9jdHlwZUluSW5pdGlhbE1vZGUocCwgdG9rZW4pIHtcbiAgICBwLl9zZXREb2N1bWVudFR5cGUodG9rZW4pO1xuXG4gICAgY29uc3QgbW9kZSA9IHRva2VuLmZvcmNlUXVpcmtzID8gSFRNTC5ET0NVTUVOVF9NT0RFLlFVSVJLUyA6IGRvY3R5cGUuZ2V0RG9jdW1lbnRNb2RlKHRva2VuKTtcblxuICAgIGlmICghZG9jdHlwZS5pc0NvbmZvcm1pbmcodG9rZW4pKSB7XG4gICAgICAgIHAuX2VycihFUlIubm9uQ29uZm9ybWluZ0RvY3R5cGUpO1xuICAgIH1cblxuICAgIHAudHJlZUFkYXB0ZXIuc2V0RG9jdW1lbnRNb2RlKHAuZG9jdW1lbnQsIG1vZGUpO1xuXG4gICAgcC5pbnNlcnRpb25Nb2RlID0gQkVGT1JFX0hUTUxfTU9ERTtcbn1cblxuZnVuY3Rpb24gdG9rZW5JbkluaXRpYWxNb2RlKHAsIHRva2VuKSB7XG4gICAgcC5fZXJyKEVSUi5taXNzaW5nRG9jdHlwZSwgeyBiZWZvcmVUb2tlbjogdHJ1ZSB9KTtcbiAgICBwLnRyZWVBZGFwdGVyLnNldERvY3VtZW50TW9kZShwLmRvY3VtZW50LCBIVE1MLkRPQ1VNRU5UX01PREUuUVVJUktTKTtcbiAgICBwLmluc2VydGlvbk1vZGUgPSBCRUZPUkVfSFRNTF9NT0RFO1xuICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG59XG5cbi8vIFRoZSBcImJlZm9yZSBodG1sXCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0JlZm9yZUh0bWwocCwgdG9rZW4pIHtcbiAgICBpZiAodG9rZW4udGFnTmFtZSA9PT0gJC5IVE1MKSB7XG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBCRUZPUkVfSEVBRF9NT0RFO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRva2VuQmVmb3JlSHRtbChwLCB0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlbmRUYWdCZWZvcmVIdG1sKHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdOYW1lO1xuXG4gICAgaWYgKHRuID09PSAkLkhUTUwgfHwgdG4gPT09ICQuSEVBRCB8fCB0biA9PT0gJC5CT0RZIHx8IHRuID09PSAkLkJSKSB7XG4gICAgICAgIHRva2VuQmVmb3JlSHRtbChwLCB0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbkJlZm9yZUh0bWwocCwgdG9rZW4pIHtcbiAgICBwLl9pbnNlcnRGYWtlUm9vdEVsZW1lbnQoKTtcbiAgICBwLmluc2VydGlvbk1vZGUgPSBCRUZPUkVfSEVBRF9NT0RFO1xuICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG59XG5cbi8vIFRoZSBcImJlZm9yZSBoZWFkXCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0JlZm9yZUhlYWQocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ05hbWU7XG5cbiAgICBpZiAodG4gPT09ICQuSFRNTCkge1xuICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5IRUFEKSB7XG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xuICAgICAgICBwLmhlYWRFbGVtZW50ID0gcC5vcGVuRWxlbWVudHMuY3VycmVudDtcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fSEVBRF9NT0RFO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRva2VuQmVmb3JlSGVhZChwLCB0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlbmRUYWdCZWZvcmVIZWFkKHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdOYW1lO1xuXG4gICAgaWYgKHRuID09PSAkLkhFQUQgfHwgdG4gPT09ICQuQk9EWSB8fCB0biA9PT0gJC5IVE1MIHx8IHRuID09PSAkLkJSKSB7XG4gICAgICAgIHRva2VuQmVmb3JlSGVhZChwLCB0b2tlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcC5fZXJyKEVSUi5lbmRUYWdXaXRob3V0TWF0Y2hpbmdPcGVuRWxlbWVudCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbkJlZm9yZUhlYWQocCwgdG9rZW4pIHtcbiAgICBwLl9pbnNlcnRGYWtlRWxlbWVudCgkLkhFQUQpO1xuICAgIHAuaGVhZEVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy5jdXJyZW50O1xuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX0hFQURfTU9ERTtcbiAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xufVxuXG4vLyBUaGUgXCJpbiBoZWFkXCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0luSGVhZChwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGlmICh0biA9PT0gJC5IVE1MKSB7XG4gICAgICAgIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLkJBU0UgfHwgdG4gPT09ICQuQkFTRUZPTlQgfHwgdG4gPT09ICQuQkdTT1VORCB8fCB0biA9PT0gJC5MSU5LIHx8IHRuID09PSAkLk1FVEEpIHtcbiAgICAgICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgICAgIHRva2VuLmFja1NlbGZDbG9zaW5nID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLlRJVExFKSB7XG4gICAgICAgIHAuX3N3aXRjaFRvVGV4dFBhcnNpbmcodG9rZW4sIFRva2VuaXplci5NT0RFLlJDREFUQSk7XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5OT1NDUklQVCkge1xuICAgICAgICBpZiAocC5vcHRpb25zLnNjcmlwdGluZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHAuX3N3aXRjaFRvVGV4dFBhcnNpbmcodG9rZW4sIFRva2VuaXplci5NT0RFLlJBV1RFWFQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9IRUFEX05PX1NDUklQVF9NT0RFO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5OT0ZSQU1FUyB8fCB0biA9PT0gJC5TVFlMRSkge1xuICAgICAgICBwLl9zd2l0Y2hUb1RleHRQYXJzaW5nKHRva2VuLCBUb2tlbml6ZXIuTU9ERS5SQVdURVhUKTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLlNDUklQVCkge1xuICAgICAgICBwLl9zd2l0Y2hUb1RleHRQYXJzaW5nKHRva2VuLCBUb2tlbml6ZXIuTU9ERS5TQ1JJUFRfREFUQSk7XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5URU1QTEFURSkge1xuICAgICAgICBwLl9pbnNlcnRUZW1wbGF0ZSh0b2tlbiwgTlMuSFRNTCk7XG4gICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmluc2VydE1hcmtlcigpO1xuICAgICAgICBwLmZyYW1lc2V0T2sgPSBmYWxzZTtcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fVEVNUExBVEVfTU9ERTtcbiAgICAgICAgcC5fcHVzaFRtcGxJbnNlcnRpb25Nb2RlKElOX1RFTVBMQVRFX01PREUpO1xuICAgIH0gZWxzZSBpZiAodG4gPT09ICQuSEVBRCkge1xuICAgICAgICBwLl9lcnIoRVJSLm1pc3BsYWNlZFN0YXJ0VGFnRm9ySGVhZEVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRva2VuSW5IZWFkKHAsIHRva2VuKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVuZFRhZ0luSGVhZChwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGlmICh0biA9PT0gJC5IRUFEKSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBBRlRFUl9IRUFEX01PREU7XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5CT0RZIHx8IHRuID09PSAkLkJSIHx8IHRuID09PSAkLkhUTUwpIHtcbiAgICAgICAgdG9rZW5JbkhlYWQocCwgdG9rZW4pO1xuICAgIH0gZWxzZSBpZiAodG4gPT09ICQuVEVNUExBVEUpIHtcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLnRtcGxDb3VudCA+IDApIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3NUaG9yb3VnaGx5KCk7XG5cbiAgICAgICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnTmFtZSAhPT0gJC5URU1QTEFURSkge1xuICAgICAgICAgICAgICAgIHAuX2VycihFUlIuY2xvc2luZ09mRWxlbWVudFdpdGhPcGVuQ2hpbGRFbGVtZW50cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZCgkLlRFTVBMQVRFKTtcbiAgICAgICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmNsZWFyVG9MYXN0TWFya2VyKCk7XG4gICAgICAgICAgICBwLl9wb3BUbXBsSW5zZXJ0aW9uTW9kZSgpO1xuICAgICAgICAgICAgcC5fcmVzZXRJbnNlcnRpb25Nb2RlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwLl9lcnIoRVJSLmVuZFRhZ1dpdGhvdXRNYXRjaGluZ09wZW5FbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHAuX2VycihFUlIuZW5kVGFnV2l0aG91dE1hdGNoaW5nT3BlbkVsZW1lbnQpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5JbkhlYWQocCwgdG9rZW4pIHtcbiAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICBwLmluc2VydGlvbk1vZGUgPSBBRlRFUl9IRUFEX01PREU7XG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbn1cblxuLy8gVGhlIFwiaW4gaGVhZCBubyBzY3JpcHRcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHN0YXJ0VGFnSW5IZWFkTm9TY3JpcHQocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ05hbWU7XG5cbiAgICBpZiAodG4gPT09ICQuSFRNTCkge1xuICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgdG4gPT09ICQuQkFTRUZPTlQgfHxcbiAgICAgICAgdG4gPT09ICQuQkdTT1VORCB8fFxuICAgICAgICB0biA9PT0gJC5IRUFEIHx8XG4gICAgICAgIHRuID09PSAkLkxJTksgfHxcbiAgICAgICAgdG4gPT09ICQuTUVUQSB8fFxuICAgICAgICB0biA9PT0gJC5OT0ZSQU1FUyB8fFxuICAgICAgICB0biA9PT0gJC5TVFlMRVxuICAgICkge1xuICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5OT1NDUklQVCkge1xuICAgICAgICBwLl9lcnIoRVJSLm5lc3RlZE5vc2NyaXB0SW5IZWFkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0b2tlbkluSGVhZE5vU2NyaXB0KHAsIHRva2VuKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVuZFRhZ0luSGVhZE5vU2NyaXB0KHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdOYW1lO1xuXG4gICAgaWYgKHRuID09PSAkLk5PU0NSSVBUKSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9IRUFEX01PREU7XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5CUikge1xuICAgICAgICB0b2tlbkluSGVhZE5vU2NyaXB0KHAsIHRva2VuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwLl9lcnIoRVJSLmVuZFRhZ1dpdGhvdXRNYXRjaGluZ09wZW5FbGVtZW50KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuSW5IZWFkTm9TY3JpcHQocCwgdG9rZW4pIHtcbiAgICBjb25zdCBlcnJDb2RlID1cbiAgICAgICAgdG9rZW4udHlwZSA9PT0gVG9rZW5pemVyLkVPRl9UT0tFTiA/IEVSUi5vcGVuRWxlbWVudHNMZWZ0QWZ0ZXJFb2YgOiBFUlIuZGlzYWxsb3dlZENvbnRlbnRJbk5vc2NyaXB0SW5IZWFkO1xuXG4gICAgcC5fZXJyKGVyckNvZGUpO1xuICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX0hFQURfTU9ERTtcbiAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xufVxuXG4vLyBUaGUgXCJhZnRlciBoZWFkXCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0FmdGVySGVhZChwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGlmICh0biA9PT0gJC5IVE1MKSB7XG4gICAgICAgIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLkJPRFkpIHtcbiAgICAgICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9CT0RZX01PREU7XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5GUkFNRVNFVCkge1xuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fRlJBTUVTRVRfTU9ERTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0biA9PT0gJC5CQVNFIHx8XG4gICAgICAgIHRuID09PSAkLkJBU0VGT05UIHx8XG4gICAgICAgIHRuID09PSAkLkJHU09VTkQgfHxcbiAgICAgICAgdG4gPT09ICQuTElOSyB8fFxuICAgICAgICB0biA9PT0gJC5NRVRBIHx8XG4gICAgICAgIHRuID09PSAkLk5PRlJBTUVTIHx8XG4gICAgICAgIHRuID09PSAkLlNDUklQVCB8fFxuICAgICAgICB0biA9PT0gJC5TVFlMRSB8fFxuICAgICAgICB0biA9PT0gJC5URU1QTEFURSB8fFxuICAgICAgICB0biA9PT0gJC5USVRMRVxuICAgICkge1xuICAgICAgICBwLl9lcnIoRVJSLmFiYW5kb25lZEhlYWRFbGVtZW50Q2hpbGQpO1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5wdXNoKHAuaGVhZEVsZW1lbnQpO1xuICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnJlbW92ZShwLmhlYWRFbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLkhFQUQpIHtcbiAgICAgICAgcC5fZXJyKEVSUi5taXNwbGFjZWRTdGFydFRhZ0ZvckhlYWRFbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0b2tlbkFmdGVySGVhZChwLCB0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlbmRUYWdBZnRlckhlYWQocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ05hbWU7XG5cbiAgICBpZiAodG4gPT09ICQuQk9EWSB8fCB0biA9PT0gJC5IVE1MIHx8IHRuID09PSAkLkJSKSB7XG4gICAgICAgIHRva2VuQWZ0ZXJIZWFkKHAsIHRva2VuKTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLlRFTVBMQVRFKSB7XG4gICAgICAgIGVuZFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcC5fZXJyKEVSUi5lbmRUYWdXaXRob3V0TWF0Y2hpbmdPcGVuRWxlbWVudCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbkFmdGVySGVhZChwLCB0b2tlbikge1xuICAgIHAuX2luc2VydEZha2VFbGVtZW50KCQuQk9EWSk7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fQk9EWV9NT0RFO1xuICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG59XG5cbi8vIFRoZSBcImluIGJvZHlcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHdoaXRlc3BhY2VDaGFyYWN0ZXJJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIHAuX2luc2VydENoYXJhY3RlcnModG9rZW4pO1xufVxuXG5mdW5jdGlvbiBjaGFyYWN0ZXJJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIHAuX2luc2VydENoYXJhY3RlcnModG9rZW4pO1xuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBodG1sU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMudG1wbENvdW50ID09PSAwKSB7XG4gICAgICAgIHAudHJlZUFkYXB0ZXIuYWRvcHRBdHRyaWJ1dGVzKHAub3BlbkVsZW1lbnRzLml0ZW1zWzBdLCB0b2tlbi5hdHRycyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBib2R5U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBjb25zdCBib2R5RWxlbWVudCA9IHAub3BlbkVsZW1lbnRzLnRyeVBlZWtQcm9wZXJseU5lc3RlZEJvZHlFbGVtZW50KCk7XG5cbiAgICBpZiAoYm9keUVsZW1lbnQgJiYgcC5vcGVuRWxlbWVudHMudG1wbENvdW50ID09PSAwKSB7XG4gICAgICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xuICAgICAgICBwLnRyZWVBZGFwdGVyLmFkb3B0QXR0cmlidXRlcyhib2R5RWxlbWVudCwgdG9rZW4uYXR0cnMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZnJhbWVzZXRTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIGNvbnN0IGJvZHlFbGVtZW50ID0gcC5vcGVuRWxlbWVudHMudHJ5UGVla1Byb3Blcmx5TmVzdGVkQm9keUVsZW1lbnQoKTtcblxuICAgIGlmIChwLmZyYW1lc2V0T2sgJiYgYm9keUVsZW1lbnQpIHtcbiAgICAgICAgcC50cmVlQWRhcHRlci5kZXRhY2hOb2RlKGJvZHlFbGVtZW50KTtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wQWxsVXBUb0h0bWxFbGVtZW50KCk7XG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9GUkFNRVNFVF9NT0RFO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkcmVzc1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luQnV0dG9uU2NvcGUoJC5QKSkge1xuICAgICAgICBwLl9jbG9zZVBFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG59XG5cbmZ1bmN0aW9uIG51bWJlcmVkSGVhZGVyU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5CdXR0b25TY29wZSgkLlApKSB7XG4gICAgICAgIHAuX2Nsb3NlUEVsZW1lbnQoKTtcbiAgICB9XG5cbiAgICBjb25zdCB0biA9IHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdOYW1lO1xuXG4gICAgaWYgKHRuID09PSAkLkgxIHx8IHRuID09PSAkLkgyIHx8IHRuID09PSAkLkgzIHx8IHRuID09PSAkLkg0IHx8IHRuID09PSAkLkg1IHx8IHRuID09PSAkLkg2KSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgIH1cblxuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xufVxuXG5mdW5jdGlvbiBwcmVTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJbkJ1dHRvblNjb3BlKCQuUCkpIHtcbiAgICAgICAgcC5fY2xvc2VQRWxlbWVudCgpO1xuICAgIH1cblxuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xuICAgIC8vTk9URTogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBVKzAwMEEgTElORSBGRUVEIChMRikgY2hhcmFjdGVyIHRva2VuLCB0aGVuIGlnbm9yZSB0aGF0IHRva2VuIGFuZCBtb3ZlXG4gICAgLy9vbiB0byB0aGUgbmV4dCBvbmUuIChOZXdsaW5lcyBhdCB0aGUgc3RhcnQgb2YgcHJlIGJsb2NrcyBhcmUgaWdub3JlZCBhcyBhbiBhdXRob3JpbmcgY29udmVuaWVuY2UuKVxuICAgIHAuc2tpcE5leHROZXdMaW5lID0gdHJ1ZTtcbiAgICBwLmZyYW1lc2V0T2sgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZm9ybVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgY29uc3QgaW5UZW1wbGF0ZSA9IHAub3BlbkVsZW1lbnRzLnRtcGxDb3VudCA+IDA7XG5cbiAgICBpZiAoIXAuZm9ybUVsZW1lbnQgfHwgaW5UZW1wbGF0ZSkge1xuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5CdXR0b25TY29wZSgkLlApKSB7XG4gICAgICAgICAgICBwLl9jbG9zZVBFbGVtZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcblxuICAgICAgICBpZiAoIWluVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHAuZm9ybUVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy5jdXJyZW50O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsaXN0SXRlbVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG5cbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ05hbWU7XG5cbiAgICBmb3IgKGxldCBpID0gcC5vcGVuRWxlbWVudHMuc3RhY2tUb3A7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy5pdGVtc1tpXTtcbiAgICAgICAgY29uc3QgZWxlbWVudFRuID0gcC50cmVlQWRhcHRlci5nZXRUYWdOYW1lKGVsZW1lbnQpO1xuICAgICAgICBsZXQgY2xvc2VUbiA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRuID09PSAkLkxJICYmIGVsZW1lbnRUbiA9PT0gJC5MSSkge1xuICAgICAgICAgICAgY2xvc2VUbiA9ICQuTEk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHRuID09PSAkLkREIHx8IHRuID09PSAkLkRUKSAmJiAoZWxlbWVudFRuID09PSAkLkREIHx8IGVsZW1lbnRUbiA9PT0gJC5EVCkpIHtcbiAgICAgICAgICAgIGNsb3NlVG4gPSBlbGVtZW50VG47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xvc2VUbikge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMuZ2VuZXJhdGVJbXBsaWVkRW5kVGFnc1dpdGhFeGNsdXNpb24oY2xvc2VUbik7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoY2xvc2VUbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50VG4gIT09ICQuQUREUkVTUyAmJiBlbGVtZW50VG4gIT09ICQuRElWICYmIGVsZW1lbnRUbiAhPT0gJC5QICYmIHAuX2lzU3BlY2lhbEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luQnV0dG9uU2NvcGUoJC5QKSkge1xuICAgICAgICBwLl9jbG9zZVBFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG59XG5cbmZ1bmN0aW9uIHBsYWludGV4dFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luQnV0dG9uU2NvcGUoJC5QKSkge1xuICAgICAgICBwLl9jbG9zZVBFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgcC50b2tlbml6ZXIuc3RhdGUgPSBUb2tlbml6ZXIuTU9ERS5QTEFJTlRFWFQ7XG59XG5cbmZ1bmN0aW9uIGJ1dHRvblN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2NvcGUoJC5CVVRUT04pKSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKTtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKCQuQlVUVE9OKTtcbiAgICB9XG5cbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50RW50cnkgPSBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5nZXRFbGVtZW50RW50cnlJblNjb3BlV2l0aFRhZ05hbWUoJC5BKTtcblxuICAgIGlmIChhY3RpdmVFbGVtZW50RW50cnkpIHtcbiAgICAgICAgY2FsbEFkb3B0aW9uQWdlbmN5KHAsIHRva2VuKTtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucmVtb3ZlKGFjdGl2ZUVsZW1lbnRFbnRyeS5lbGVtZW50KTtcbiAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlRW50cnkoYWN0aXZlRWxlbWVudEVudHJ5KTtcbiAgICB9XG5cbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xuICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnB1c2hFbGVtZW50KHAub3BlbkVsZW1lbnRzLmN1cnJlbnQsIHRva2VuKTtcbn1cblxuZnVuY3Rpb24gYlN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcbiAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5wdXNoRWxlbWVudChwLm9wZW5FbGVtZW50cy5jdXJyZW50LCB0b2tlbik7XG59XG5cbmZ1bmN0aW9uIG5vYnJTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XG5cbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5TY29wZSgkLk5PQlIpKSB7XG4gICAgICAgIGNhbGxBZG9wdGlvbkFnZW5jeShwLCB0b2tlbik7XG4gICAgICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucHVzaEVsZW1lbnQocC5vcGVuRWxlbWVudHMuY3VycmVudCwgdG9rZW4pO1xufVxuXG5mdW5jdGlvbiBhcHBsZXRTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5zZXJ0TWFya2VyKCk7XG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHRhYmxlU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAoXG4gICAgICAgIHAudHJlZUFkYXB0ZXIuZ2V0RG9jdW1lbnRNb2RlKHAuZG9jdW1lbnQpICE9PSBIVE1MLkRPQ1VNRU5UX01PREUuUVVJUktTICYmXG4gICAgICAgIHAub3BlbkVsZW1lbnRzLmhhc0luQnV0dG9uU2NvcGUoJC5QKVxuICAgICkge1xuICAgICAgICBwLl9jbG9zZVBFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fVEFCTEVfTU9ERTtcbn1cblxuZnVuY3Rpb24gYXJlYVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcbiAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcbiAgICBwLmZyYW1lc2V0T2sgPSBmYWxzZTtcbiAgICB0b2tlbi5hY2tTZWxmQ2xvc2luZyA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGlucHV0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIHAuX2FwcGVuZEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xuXG4gICAgY29uc3QgaW5wdXRUeXBlID0gVG9rZW5pemVyLmdldFRva2VuQXR0cih0b2tlbiwgQVRUUlMuVFlQRSk7XG5cbiAgICBpZiAoIWlucHV0VHlwZSB8fCBpbnB1dFR5cGUudG9Mb3dlckNhc2UoKSAhPT0gSElEREVOX0lOUFVUX1RZUEUpIHtcbiAgICAgICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdG9rZW4uYWNrU2VsZkNsb3NpbmcgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBwYXJhbVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgdG9rZW4uYWNrU2VsZkNsb3NpbmcgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBoclN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luQnV0dG9uU2NvcGUoJC5QKSkge1xuICAgICAgICBwLl9jbG9zZVBFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG4gICAgdG9rZW4uYWNrU2VsZkNsb3NpbmcgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBpbWFnZVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgdG9rZW4udGFnTmFtZSA9ICQuSU1HO1xuICAgIGFyZWFTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG59XG5cbmZ1bmN0aW9uIHRleHRhcmVhU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcbiAgICAvL05PVEU6IElmIHRoZSBuZXh0IHRva2VuIGlzIGEgVSswMDBBIExJTkUgRkVFRCAoTEYpIGNoYXJhY3RlciB0b2tlbiwgdGhlbiBpZ25vcmUgdGhhdCB0b2tlbiBhbmQgbW92ZVxuICAgIC8vb24gdG8gdGhlIG5leHQgb25lLiAoTmV3bGluZXMgYXQgdGhlIHN0YXJ0IG9mIHRleHRhcmVhIGVsZW1lbnRzIGFyZSBpZ25vcmVkIGFzIGFuIGF1dGhvcmluZyBjb252ZW5pZW5jZS4pXG4gICAgcC5za2lwTmV4dE5ld0xpbmUgPSB0cnVlO1xuICAgIHAudG9rZW5pemVyLnN0YXRlID0gVG9rZW5pemVyLk1PREUuUkNEQVRBO1xuICAgIHAub3JpZ2luYWxJbnNlcnRpb25Nb2RlID0gcC5pbnNlcnRpb25Nb2RlO1xuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IFRFWFRfTU9ERTtcbn1cblxuZnVuY3Rpb24geG1wU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5CdXR0b25TY29wZSgkLlApKSB7XG4gICAgICAgIHAuX2Nsb3NlUEVsZW1lbnQoKTtcbiAgICB9XG5cbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xuICAgIHAuX3N3aXRjaFRvVGV4dFBhcnNpbmcodG9rZW4sIFRva2VuaXplci5NT0RFLlJBV1RFWFQpO1xufVxuXG5mdW5jdGlvbiBpZnJhbWVTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xuICAgIHAuX3N3aXRjaFRvVGV4dFBhcnNpbmcodG9rZW4sIFRva2VuaXplci5NT0RFLlJBV1RFWFQpO1xufVxuXG4vL05PVEU6IGhlcmUgd2UgYXNzdW1lIHRoYXQgd2UgYWx3YXlzIGFjdCBhcyBhbiB1c2VyIGFnZW50IHdpdGggZW5hYmxlZCBwbHVnaW5zLCBzbyB3ZSBwYXJzZVxuLy88bm9lbWJlZD4gYXMgYSByYXd0ZXh0LlxuZnVuY3Rpb24gbm9lbWJlZFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgcC5fc3dpdGNoVG9UZXh0UGFyc2luZyh0b2tlbiwgVG9rZW5pemVyLk1PREUuUkFXVEVYVCk7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcbiAgICBwLmZyYW1lc2V0T2sgPSBmYWxzZTtcblxuICAgIGlmIChcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID09PSBJTl9UQUJMRV9NT0RFIHx8XG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9PT0gSU5fQ0FQVElPTl9NT0RFIHx8XG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9PT0gSU5fVEFCTEVfQk9EWV9NT0RFIHx8XG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9PT0gSU5fUk9XX01PREUgfHxcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID09PSBJTl9DRUxMX01PREVcbiAgICApIHtcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fU0VMRUNUX0lOX1RBQkxFX01PREU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fU0VMRUNUX01PREU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBvcHRncm91cFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdOYW1lID09PSAkLk9QVElPTikge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICB9XG5cbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xufVxuXG5mdW5jdGlvbiByYlN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2NvcGUoJC5SVUJZKSkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XG4gICAgfVxuXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG59XG5cbmZ1bmN0aW9uIHJ0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5TY29wZSgkLlJVQlkpKSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3NXaXRoRXhjbHVzaW9uKCQuUlRDKTtcbiAgICB9XG5cbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcbn1cblxuZnVuY3Rpb24gbWVudVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luQnV0dG9uU2NvcGUoJC5QKSkge1xuICAgICAgICBwLl9jbG9zZVBFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG59XG5cbmZ1bmN0aW9uIG1hdGhTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XG5cbiAgICBmb3JlaWduQ29udGVudC5hZGp1c3RUb2tlbk1hdGhNTEF0dHJzKHRva2VuKTtcbiAgICBmb3JlaWduQ29udGVudC5hZGp1c3RUb2tlblhNTEF0dHJzKHRva2VuKTtcblxuICAgIGlmICh0b2tlbi5zZWxmQ2xvc2luZykge1xuICAgICAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBOUy5NQVRITUwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLk1BVEhNTCk7XG4gICAgfVxuXG4gICAgdG9rZW4uYWNrU2VsZkNsb3NpbmcgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBzdmdTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XG5cbiAgICBmb3JlaWduQ29udGVudC5hZGp1c3RUb2tlblNWR0F0dHJzKHRva2VuKTtcbiAgICBmb3JlaWduQ29udGVudC5hZGp1c3RUb2tlblhNTEF0dHJzKHRva2VuKTtcblxuICAgIGlmICh0b2tlbi5zZWxmQ2xvc2luZykge1xuICAgICAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBOUy5TVkcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLlNWRyk7XG4gICAgfVxuXG4gICAgdG9rZW4uYWNrU2VsZkNsb3NpbmcgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBnZW5lcmljU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xufVxuXG4vL09QVElNSVpBVElPTjogSW50ZWdlciBjb21wYXJpc29ucyBhcmUgbG93LWNvc3QsIHNvIHdlIGNhbiB1c2UgdmVyeSBmYXN0IHRhZyBuYW1lIGxlbmd0aCBmaWx0ZXJzIGhlcmUuXG4vL0l0J3MgZmFzdGVyIHRoYW4gdXNpbmcgZGljdGlvbmFyeS5cbmZ1bmN0aW9uIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdOYW1lO1xuXG4gICAgc3dpdGNoICh0bi5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkkgfHwgdG4gPT09ICQuUyB8fCB0biA9PT0gJC5CIHx8IHRuID09PSAkLlUpIHtcbiAgICAgICAgICAgICAgICBiU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5QKSB7XG4gICAgICAgICAgICAgICAgYWRkcmVzc1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuQSkge1xuICAgICAgICAgICAgICAgIGFTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdlbmVyaWNTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5ETCB8fCB0biA9PT0gJC5PTCB8fCB0biA9PT0gJC5VTCkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3NTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLkgxIHx8IHRuID09PSAkLkgyIHx8IHRuID09PSAkLkgzIHx8IHRuID09PSAkLkg0IHx8IHRuID09PSAkLkg1IHx8IHRuID09PSAkLkg2KSB7XG4gICAgICAgICAgICAgICAgbnVtYmVyZWRIZWFkZXJTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLkxJIHx8IHRuID09PSAkLkREIHx8IHRuID09PSAkLkRUKSB7XG4gICAgICAgICAgICAgICAgbGlzdEl0ZW1TdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLkVNIHx8IHRuID09PSAkLlRUKSB7XG4gICAgICAgICAgICAgICAgYlN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuQlIpIHtcbiAgICAgICAgICAgICAgICBhcmVhU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5IUikge1xuICAgICAgICAgICAgICAgIGhyU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5SQikge1xuICAgICAgICAgICAgICAgIHJiU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5SVCB8fCB0biA9PT0gJC5SUCkge1xuICAgICAgICAgICAgICAgIHJ0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biAhPT0gJC5USCAmJiB0biAhPT0gJC5URCAmJiB0biAhPT0gJC5UUikge1xuICAgICAgICAgICAgICAgIGdlbmVyaWNTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5ESVYgfHwgdG4gPT09ICQuRElSIHx8IHRuID09PSAkLk5BVikge1xuICAgICAgICAgICAgICAgIGFkZHJlc3NTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLlBSRSkge1xuICAgICAgICAgICAgICAgIHByZVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuQklHKSB7XG4gICAgICAgICAgICAgICAgYlN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuSU1HIHx8IHRuID09PSAkLldCUikge1xuICAgICAgICAgICAgICAgIGFyZWFTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLlhNUCkge1xuICAgICAgICAgICAgICAgIHhtcFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuU1ZHKSB7XG4gICAgICAgICAgICAgICAgc3ZnU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5SVEMpIHtcbiAgICAgICAgICAgICAgICByYlN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gIT09ICQuQ09MKSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJpY1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkhUTUwpIHtcbiAgICAgICAgICAgICAgICBodG1sU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5CQVNFIHx8IHRuID09PSAkLkxJTksgfHwgdG4gPT09ICQuTUVUQSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0VGFnSW5IZWFkKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuQk9EWSkge1xuICAgICAgICAgICAgICAgIGJvZHlTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLk1BSU4gfHwgdG4gPT09ICQuTUVOVSkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3NTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLkZPUk0pIHtcbiAgICAgICAgICAgICAgICBmb3JtU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5DT0RFIHx8IHRuID09PSAkLkZPTlQpIHtcbiAgICAgICAgICAgICAgICBiU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5OT0JSKSB7XG4gICAgICAgICAgICAgICAgbm9iclN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuQVJFQSkge1xuICAgICAgICAgICAgICAgIGFyZWFTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLk1BVEgpIHtcbiAgICAgICAgICAgICAgICBtYXRoU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5NRU5VKSB7XG4gICAgICAgICAgICAgICAgbWVudVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gIT09ICQuSEVBRCkge1xuICAgICAgICAgICAgICAgIGdlbmVyaWNTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5TVFlMRSB8fCB0biA9PT0gJC5USVRMRSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0VGFnSW5IZWFkKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuQVNJREUpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5TTUFMTCkge1xuICAgICAgICAgICAgICAgIGJTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLlRBQkxFKSB7XG4gICAgICAgICAgICAgICAgdGFibGVTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLkVNQkVEKSB7XG4gICAgICAgICAgICAgICAgYXJlYVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuSU5QVVQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuUEFSQU0gfHwgdG4gPT09ICQuVFJBQ0spIHtcbiAgICAgICAgICAgICAgICBwYXJhbVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuSU1BR0UpIHtcbiAgICAgICAgICAgICAgICBpbWFnZVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gIT09ICQuRlJBTUUgJiYgdG4gIT09ICQuVEJPRFkgJiYgdG4gIT09ICQuVEZPT1QgJiYgdG4gIT09ICQuVEhFQUQpIHtcbiAgICAgICAgICAgICAgICBnZW5lcmljU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBpZiAodG4gPT09ICQuU0NSSVBUKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5DRU5URVIgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5GSUdVUkUgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5GT09URVIgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5IRUFERVIgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5IR1JPVVAgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5ESUFMT0dcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3NTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLkJVVFRPTikge1xuICAgICAgICAgICAgICAgIGJ1dHRvblN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuU1RSSUtFIHx8IHRuID09PSAkLlNUUk9ORykge1xuICAgICAgICAgICAgICAgIGJTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLkFQUExFVCB8fCB0biA9PT0gJC5PQkpFQ1QpIHtcbiAgICAgICAgICAgICAgICBhcHBsZXRTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLktFWUdFTikge1xuICAgICAgICAgICAgICAgIGFyZWFTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLlNPVVJDRSkge1xuICAgICAgICAgICAgICAgIHBhcmFtU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5JRlJBTUUpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWVTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLlNFTEVDVCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuT1BUSU9OKSB7XG4gICAgICAgICAgICAgICAgb3B0Z3JvdXBTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdlbmVyaWNTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5CR1NPVU5EKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5ERVRBSUxTIHx8XG4gICAgICAgICAgICAgICAgdG4gPT09ICQuQUREUkVTUyB8fFxuICAgICAgICAgICAgICAgIHRuID09PSAkLkFSVElDTEUgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5TRUNUSU9OIHx8XG4gICAgICAgICAgICAgICAgdG4gPT09ICQuU1VNTUFSWVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYWRkcmVzc1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuTElTVElORykge1xuICAgICAgICAgICAgICAgIHByZVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuTUFSUVVFRSkge1xuICAgICAgICAgICAgICAgIGFwcGxldFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuTk9FTUJFRCkge1xuICAgICAgICAgICAgICAgIG5vZW1iZWRTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuICE9PSAkLkNBUFRJT04pIHtcbiAgICAgICAgICAgICAgICBnZW5lcmljU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICBpZiAodG4gPT09ICQuQkFTRUZPTlQpIHtcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLkZSQU1FU0VUKSB7XG4gICAgICAgICAgICAgICAgZnJhbWVzZXRTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLkZJRUxEU0VUKSB7XG4gICAgICAgICAgICAgICAgYWRkcmVzc1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuVEVYVEFSRUEpIHtcbiAgICAgICAgICAgICAgICB0ZXh0YXJlYVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuVEVNUExBVEUpIHtcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLk5PU0NSSVBUKSB7XG4gICAgICAgICAgICAgICAgaWYgKHAub3B0aW9ucy5zY3JpcHRpbmdFbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZW1iZWRTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLk9QVEdST1VQKSB7XG4gICAgICAgICAgICAgICAgb3B0Z3JvdXBTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuICE9PSAkLkNPTEdST1VQKSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJpY1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgaWYgKHRuID09PSAkLlBMQUlOVEVYVCkge1xuICAgICAgICAgICAgICAgIHBsYWludGV4dFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJpY1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5CTE9DS1FVT1RFIHx8IHRuID09PSAkLkZJR0NBUFRJT04pIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBnZW5lcmljU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZ2VuZXJpY1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJvZHlFbmRUYWdJbkJvZHkocCkge1xuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblNjb3BlKCQuQk9EWSkpIHtcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gQUZURVJfQk9EWV9NT0RFO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaHRtbEVuZFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblNjb3BlKCQuQk9EWSkpIHtcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gQUZURVJfQk9EWV9NT0RFO1xuICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkcmVzc0VuZFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblNjb3BlKHRuKSkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZCh0bik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmb3JtRW5kVGFnSW5Cb2R5KHApIHtcbiAgICBjb25zdCBpblRlbXBsYXRlID0gcC5vcGVuRWxlbWVudHMudG1wbENvdW50ID4gMDtcbiAgICBjb25zdCBmb3JtRWxlbWVudCA9IHAuZm9ybUVsZW1lbnQ7XG5cbiAgICBpZiAoIWluVGVtcGxhdGUpIHtcbiAgICAgICAgcC5mb3JtRWxlbWVudCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKChmb3JtRWxlbWVudCB8fCBpblRlbXBsYXRlKSAmJiBwLm9wZW5FbGVtZW50cy5oYXNJblNjb3BlKCQuRk9STSkpIHtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpO1xuXG4gICAgICAgIGlmIChpblRlbXBsYXRlKSB7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoJC5GT1JNKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnJlbW92ZShmb3JtRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBFbmRUYWdJbkJvZHkocCkge1xuICAgIGlmICghcC5vcGVuRWxlbWVudHMuaGFzSW5CdXR0b25TY29wZSgkLlApKSB7XG4gICAgICAgIHAuX2luc2VydEZha2VFbGVtZW50KCQuUCk7XG4gICAgfVxuXG4gICAgcC5fY2xvc2VQRWxlbWVudCgpO1xufVxuXG5mdW5jdGlvbiBsaUVuZFRhZ0luQm9keShwKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luTGlzdEl0ZW1TY29wZSgkLkxJKSkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzV2l0aEV4Y2x1c2lvbigkLkxJKTtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKCQuTEkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGRFbmRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ05hbWU7XG5cbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5TY29wZSh0bikpIHtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMuZ2VuZXJhdGVJbXBsaWVkRW5kVGFnc1dpdGhFeGNsdXNpb24odG4pO1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQodG4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbnVtYmVyZWRIZWFkZXJFbmRUYWdJbkJvZHkocCkge1xuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNOdW1iZXJlZEhlYWRlckluU2NvcGUoKSkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsTnVtYmVyZWRIZWFkZXJQb3BwZWQoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFwcGxldEVuZFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblNjb3BlKHRuKSkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZCh0bik7XG4gICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmNsZWFyVG9MYXN0TWFya2VyKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBickVuZFRhZ0luQm9keShwKSB7XG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcbiAgICBwLl9pbnNlcnRGYWtlRWxlbWVudCgkLkJSKTtcbiAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICBwLmZyYW1lc2V0T2sgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJpY0VuZFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGZvciAobGV0IGkgPSBwLm9wZW5FbGVtZW50cy5zdGFja1RvcDsgaSA+IDA7IGktLSkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcC5vcGVuRWxlbWVudHMuaXRlbXNbaV07XG5cbiAgICAgICAgaWYgKHAudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KSA9PT0gdG4pIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3NXaXRoRXhjbHVzaW9uKHRuKTtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsRWxlbWVudFBvcHBlZChlbGVtZW50KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHAuX2lzU3BlY2lhbEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vL09QVElNSVpBVElPTjogSW50ZWdlciBjb21wYXJpc29ucyBhcmUgbG93LWNvc3QsIHNvIHdlIGNhbiB1c2UgdmVyeSBmYXN0IHRhZyBuYW1lIGxlbmd0aCBmaWx0ZXJzIGhlcmUuXG4vL0l0J3MgZmFzdGVyIHRoYW4gdXNpbmcgZGljdGlvbmFyeS5cbmZ1bmN0aW9uIGVuZFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIHN3aXRjaCAodG4ubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5BIHx8IHRuID09PSAkLkIgfHwgdG4gPT09ICQuSSB8fCB0biA9PT0gJC5TIHx8IHRuID09PSAkLlUpIHtcbiAgICAgICAgICAgICAgICBjYWxsQWRvcHRpb25BZ2VuY3kocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5QKSB7XG4gICAgICAgICAgICAgICAgcEVuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdlbmVyaWNFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBpZiAodG4gPT09ICQuREwgfHwgdG4gPT09ICQuVUwgfHwgdG4gPT09ICQuT0wpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuTEkpIHtcbiAgICAgICAgICAgICAgICBsaUVuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLkREIHx8IHRuID09PSAkLkRUKSB7XG4gICAgICAgICAgICAgICAgZGRFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5IMSB8fCB0biA9PT0gJC5IMiB8fCB0biA9PT0gJC5IMyB8fCB0biA9PT0gJC5INCB8fCB0biA9PT0gJC5INSB8fCB0biA9PT0gJC5INikge1xuICAgICAgICAgICAgICAgIG51bWJlcmVkSGVhZGVyRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuQlIpIHtcbiAgICAgICAgICAgICAgICBickVuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLkVNIHx8IHRuID09PSAkLlRUKSB7XG4gICAgICAgICAgICAgICAgY2FsbEFkb3B0aW9uQWdlbmN5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJpY0VuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5CSUcpIHtcbiAgICAgICAgICAgICAgICBjYWxsQWRvcHRpb25BZ2VuY3kocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5ESVIgfHwgdG4gPT09ICQuRElWIHx8IHRuID09PSAkLk5BViB8fCB0biA9PT0gJC5QUkUpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJpY0VuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5CT0RZKSB7XG4gICAgICAgICAgICAgICAgYm9keUVuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLkhUTUwpIHtcbiAgICAgICAgICAgICAgICBodG1sRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuRk9STSkge1xuICAgICAgICAgICAgICAgIGZvcm1FbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5DT0RFIHx8IHRuID09PSAkLkZPTlQgfHwgdG4gPT09ICQuTk9CUikge1xuICAgICAgICAgICAgICAgIGNhbGxBZG9wdGlvbkFnZW5jeShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLk1BSU4gfHwgdG4gPT09ICQuTUVOVSkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3NFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBnZW5lcmljRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkFTSURFKSB7XG4gICAgICAgICAgICAgICAgYWRkcmVzc0VuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLlNNQUxMKSB7XG4gICAgICAgICAgICAgICAgY2FsbEFkb3B0aW9uQWdlbmN5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJpY0VuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5DRU5URVIgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5GSUdVUkUgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5GT09URVIgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5IRUFERVIgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5IR1JPVVAgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5ESUFMT0dcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3NFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5BUFBMRVQgfHwgdG4gPT09ICQuT0JKRUNUKSB7XG4gICAgICAgICAgICAgICAgYXBwbGV0RW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuU1RSSUtFIHx8IHRuID09PSAkLlNUUk9ORykge1xuICAgICAgICAgICAgICAgIGNhbGxBZG9wdGlvbkFnZW5jeShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdlbmVyaWNFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdG4gPT09ICQuQUREUkVTUyB8fFxuICAgICAgICAgICAgICAgIHRuID09PSAkLkFSVElDTEUgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5ERVRBSUxTIHx8XG4gICAgICAgICAgICAgICAgdG4gPT09ICQuU0VDVElPTiB8fFxuICAgICAgICAgICAgICAgIHRuID09PSAkLlNVTU1BUlkgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5MSVNUSU5HXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuTUFSUVVFRSkge1xuICAgICAgICAgICAgICAgIGFwcGxldEVuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdlbmVyaWNFbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICBpZiAodG4gPT09ICQuRklFTERTRVQpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuVEVNUExBVEUpIHtcbiAgICAgICAgICAgICAgICBlbmRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBnZW5lcmljRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5CTE9DS1FVT1RFIHx8IHRuID09PSAkLkZJR0NBUFRJT04pIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJpY0VuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBnZW5lcmljRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVvZkluQm9keShwLCB0b2tlbikge1xuICAgIGlmIChwLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2tUb3AgPiAtMSkge1xuICAgICAgICBlb2ZJblRlbXBsYXRlKHAsIHRva2VuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwLnN0b3BwZWQgPSB0cnVlO1xuICAgIH1cbn1cblxuLy8gVGhlIFwidGV4dFwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gZW5kVGFnSW5UZXh0KHAsIHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnRhZ05hbWUgPT09ICQuU0NSSVBUKSB7XG4gICAgICAgIHAucGVuZGluZ1NjcmlwdCA9IHAub3BlbkVsZW1lbnRzLmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gcC5vcmlnaW5hbEluc2VydGlvbk1vZGU7XG59XG5cbmZ1bmN0aW9uIGVvZkluVGV4dChwLCB0b2tlbikge1xuICAgIHAuX2VycihFUlIuZW9mSW5FbGVtZW50VGhhdENhbkNvbnRhaW5Pbmx5VGV4dCk7XG4gICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gcC5vcmlnaW5hbEluc2VydGlvbk1vZGU7XG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbn1cblxuLy8gVGhlIFwiaW4gdGFibGVcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNoYXJhY3RlckluVGFibGUocCwgdG9rZW4pIHtcbiAgICBjb25zdCBjdXJUbiA9IHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdOYW1lO1xuXG4gICAgaWYgKGN1clRuID09PSAkLlRBQkxFIHx8IGN1clRuID09PSAkLlRCT0RZIHx8IGN1clRuID09PSAkLlRGT09UIHx8IGN1clRuID09PSAkLlRIRUFEIHx8IGN1clRuID09PSAkLlRSKSB7XG4gICAgICAgIHAucGVuZGluZ0NoYXJhY3RlclRva2VucyA9IFtdO1xuICAgICAgICBwLmhhc05vbldoaXRlc3BhY2VQZW5kaW5nQ2hhcmFjdGVyVG9rZW4gPSBmYWxzZTtcbiAgICAgICAgcC5vcmlnaW5hbEluc2VydGlvbk1vZGUgPSBwLmluc2VydGlvbk1vZGU7XG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1RBQkxFX1RFWFRfTU9ERTtcbiAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0b2tlbkluVGFibGUocCwgdG9rZW4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FwdGlvblN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xuICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVDb250ZXh0KCk7XG4gICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5zZXJ0TWFya2VyKCk7XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fQ0FQVElPTl9NT0RFO1xufVxuXG5mdW5jdGlvbiBjb2xncm91cFN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xuICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVDb250ZXh0KCk7XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fQ09MVU1OX0dST1VQX01PREU7XG59XG5cbmZ1bmN0aW9uIGNvbFN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xuICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVDb250ZXh0KCk7XG4gICAgcC5faW5zZXJ0RmFrZUVsZW1lbnQoJC5DT0xHUk9VUCk7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fQ09MVU1OX0dST1VQX01PREU7XG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbn1cblxuZnVuY3Rpb24gdGJvZHlTdGFydFRhZ0luVGFibGUocCwgdG9rZW4pIHtcbiAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlQ29udGV4dCgpO1xuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1RBQkxFX0JPRFlfTU9ERTtcbn1cblxuZnVuY3Rpb24gdGRTdGFydFRhZ0luVGFibGUocCwgdG9rZW4pIHtcbiAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlQ29udGV4dCgpO1xuICAgIHAuX2luc2VydEZha2VFbGVtZW50KCQuVEJPRFkpO1xuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1RBQkxFX0JPRFlfTU9ERTtcbiAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xufVxuXG5mdW5jdGlvbiB0YWJsZVN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUoJC5UQUJMRSkpIHtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKCQuVEFCTEUpO1xuICAgICAgICBwLl9yZXNldEluc2VydGlvbk1vZGUoKTtcbiAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlucHV0U3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKSB7XG4gICAgY29uc3QgaW5wdXRUeXBlID0gVG9rZW5pemVyLmdldFRva2VuQXR0cih0b2tlbiwgQVRUUlMuVFlQRSk7XG5cbiAgICBpZiAoaW5wdXRUeXBlICYmIGlucHV0VHlwZS50b0xvd2VyQ2FzZSgpID09PSBISURERU5fSU5QVVRfVFlQRSkge1xuICAgICAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0b2tlbkluVGFibGUocCwgdG9rZW4pO1xuICAgIH1cblxuICAgIHRva2VuLmFja1NlbGZDbG9zaW5nID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZm9ybVN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xuICAgIGlmICghcC5mb3JtRWxlbWVudCAmJiBwLm9wZW5FbGVtZW50cy50bXBsQ291bnQgPT09IDApIHtcbiAgICAgICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgICAgIHAuZm9ybUVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy5jdXJyZW50O1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIHN3aXRjaCAodG4ubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5URCB8fCB0biA9PT0gJC5USCB8fCB0biA9PT0gJC5UUikge1xuICAgICAgICAgICAgICAgIHRkU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9rZW5JblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkNPTCkge1xuICAgICAgICAgICAgICAgIGNvbFN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRva2VuSW5UYWJsZShwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5GT1JNKSB7XG4gICAgICAgICAgICAgICAgZm9ybVN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRva2VuSW5UYWJsZShwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5UQUJMRSkge1xuICAgICAgICAgICAgICAgIHRhYmxlU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuU1RZTEUpIHtcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLlRCT0RZIHx8IHRuID09PSAkLlRGT09UIHx8IHRuID09PSAkLlRIRUFEKSB7XG4gICAgICAgICAgICAgICAgdGJvZHlTdGFydFRhZ0luVGFibGUocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5JTlBVVCkge1xuICAgICAgICAgICAgICAgIGlucHV0U3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9rZW5JblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgaWYgKHRuID09PSAkLlNDUklQVCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0VGFnSW5IZWFkKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9rZW5JblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkNBUFRJT04pIHtcbiAgICAgICAgICAgICAgICBjYXB0aW9uU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9rZW5JblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgaWYgKHRuID09PSAkLkNPTEdST1VQKSB7XG4gICAgICAgICAgICAgICAgY29sZ3JvdXBTdGFydFRhZ0luVGFibGUocCwgdG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5URU1QTEFURSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0VGFnSW5IZWFkKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9rZW5JblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRva2VuSW5UYWJsZShwLCB0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlbmRUYWdJblRhYmxlKHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdOYW1lO1xuXG4gICAgaWYgKHRuID09PSAkLlRBQkxFKSB7XG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUoJC5UQUJMRSkpIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZCgkLlRBQkxFKTtcbiAgICAgICAgICAgIHAuX3Jlc2V0SW5zZXJ0aW9uTW9kZSgpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5URU1QTEFURSkge1xuICAgICAgICBlbmRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRuICE9PSAkLkJPRFkgJiZcbiAgICAgICAgdG4gIT09ICQuQ0FQVElPTiAmJlxuICAgICAgICB0biAhPT0gJC5DT0wgJiZcbiAgICAgICAgdG4gIT09ICQuQ09MR1JPVVAgJiZcbiAgICAgICAgdG4gIT09ICQuSFRNTCAmJlxuICAgICAgICB0biAhPT0gJC5UQk9EWSAmJlxuICAgICAgICB0biAhPT0gJC5URCAmJlxuICAgICAgICB0biAhPT0gJC5URk9PVCAmJlxuICAgICAgICB0biAhPT0gJC5USCAmJlxuICAgICAgICB0biAhPT0gJC5USEVBRCAmJlxuICAgICAgICB0biAhPT0gJC5UUlxuICAgICkge1xuICAgICAgICB0b2tlbkluVGFibGUocCwgdG9rZW4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5JblRhYmxlKHAsIHRva2VuKSB7XG4gICAgY29uc3Qgc2F2ZWRGb3N0ZXJQYXJlbnRpbmdTdGF0ZSA9IHAuZm9zdGVyUGFyZW50aW5nRW5hYmxlZDtcblxuICAgIHAuZm9zdGVyUGFyZW50aW5nRW5hYmxlZCA9IHRydWU7XG4gICAgcC5fcHJvY2Vzc1Rva2VuSW5Cb2R5TW9kZSh0b2tlbik7XG4gICAgcC5mb3N0ZXJQYXJlbnRpbmdFbmFibGVkID0gc2F2ZWRGb3N0ZXJQYXJlbnRpbmdTdGF0ZTtcbn1cblxuLy8gVGhlIFwiaW4gdGFibGUgdGV4dFwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gd2hpdGVzcGFjZUNoYXJhY3RlckluVGFibGVUZXh0KHAsIHRva2VuKSB7XG4gICAgcC5wZW5kaW5nQ2hhcmFjdGVyVG9rZW5zLnB1c2godG9rZW4pO1xufVxuXG5mdW5jdGlvbiBjaGFyYWN0ZXJJblRhYmxlVGV4dChwLCB0b2tlbikge1xuICAgIHAucGVuZGluZ0NoYXJhY3RlclRva2Vucy5wdXNoKHRva2VuKTtcbiAgICBwLmhhc05vbldoaXRlc3BhY2VQZW5kaW5nQ2hhcmFjdGVyVG9rZW4gPSB0cnVlO1xufVxuXG5mdW5jdGlvbiB0b2tlbkluVGFibGVUZXh0KHAsIHRva2VuKSB7XG4gICAgbGV0IGkgPSAwO1xuXG4gICAgaWYgKHAuaGFzTm9uV2hpdGVzcGFjZVBlbmRpbmdDaGFyYWN0ZXJUb2tlbikge1xuICAgICAgICBmb3IgKDsgaSA8IHAucGVuZGluZ0NoYXJhY3RlclRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG9rZW5JblRhYmxlKHAsIHAucGVuZGluZ0NoYXJhY3RlclRva2Vuc1tpXSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKDsgaSA8IHAucGVuZGluZ0NoYXJhY3RlclRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcC5faW5zZXJ0Q2hhcmFjdGVycyhwLnBlbmRpbmdDaGFyYWN0ZXJUb2tlbnNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcC5pbnNlcnRpb25Nb2RlID0gcC5vcmlnaW5hbEluc2VydGlvbk1vZGU7XG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbn1cblxuLy8gVGhlIFwiaW4gY2FwdGlvblwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gc3RhcnRUYWdJbkNhcHRpb24ocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ05hbWU7XG5cbiAgICBpZiAoXG4gICAgICAgIHRuID09PSAkLkNBUFRJT04gfHxcbiAgICAgICAgdG4gPT09ICQuQ09MIHx8XG4gICAgICAgIHRuID09PSAkLkNPTEdST1VQIHx8XG4gICAgICAgIHRuID09PSAkLlRCT0RZIHx8XG4gICAgICAgIHRuID09PSAkLlREIHx8XG4gICAgICAgIHRuID09PSAkLlRGT09UIHx8XG4gICAgICAgIHRuID09PSAkLlRIIHx8XG4gICAgICAgIHRuID09PSAkLlRIRUFEIHx8XG4gICAgICAgIHRuID09PSAkLlRSXG4gICAgKSB7XG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUoJC5DQVBUSU9OKSkge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpO1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKCQuQ0FQVElPTik7XG4gICAgICAgICAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5jbGVhclRvTGFzdE1hcmtlcigpO1xuICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fVEFCTEVfTU9ERTtcbiAgICAgICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlbmRUYWdJbkNhcHRpb24ocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ05hbWU7XG5cbiAgICBpZiAodG4gPT09ICQuQ0FQVElPTiB8fCB0biA9PT0gJC5UQUJMRSkge1xuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5UYWJsZVNjb3BlKCQuQ0FQVElPTikpIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKTtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZCgkLkNBUFRJT04pO1xuICAgICAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuY2xlYXJUb0xhc3RNYXJrZXIoKTtcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1RBQkxFX01PREU7XG5cbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5UQUJMRSkge1xuICAgICAgICAgICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0biAhPT0gJC5CT0RZICYmXG4gICAgICAgIHRuICE9PSAkLkNPTCAmJlxuICAgICAgICB0biAhPT0gJC5DT0xHUk9VUCAmJlxuICAgICAgICB0biAhPT0gJC5IVE1MICYmXG4gICAgICAgIHRuICE9PSAkLlRCT0RZICYmXG4gICAgICAgIHRuICE9PSAkLlREICYmXG4gICAgICAgIHRuICE9PSAkLlRGT09UICYmXG4gICAgICAgIHRuICE9PSAkLlRIICYmXG4gICAgICAgIHRuICE9PSAkLlRIRUFEICYmXG4gICAgICAgIHRuICE9PSAkLlRSXG4gICAgKSB7XG4gICAgICAgIGVuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgfVxufVxuXG4vLyBUaGUgXCJpbiBjb2x1bW4gZ3JvdXBcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHN0YXJ0VGFnSW5Db2x1bW5Hcm91cChwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGlmICh0biA9PT0gJC5IVE1MKSB7XG4gICAgICAgIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLkNPTCkge1xuICAgICAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcbiAgICAgICAgdG9rZW4uYWNrU2VsZkNsb3NpbmcgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodG4gPT09ICQuVEVNUExBVEUpIHtcbiAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRva2VuSW5Db2x1bW5Hcm91cChwLCB0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlbmRUYWdJbkNvbHVtbkdyb3VwKHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdOYW1lO1xuXG4gICAgaWYgKHRuID09PSAkLkNPTEdST1VQKSB7XG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnTmFtZSA9PT0gJC5DT0xHUk9VUCkge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9UQUJMRV9NT0RFO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5URU1QTEFURSkge1xuICAgICAgICBlbmRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgIH0gZWxzZSBpZiAodG4gIT09ICQuQ09MKSB7XG4gICAgICAgIHRva2VuSW5Db2x1bW5Hcm91cChwLCB0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbkluQ29sdW1uR3JvdXAocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuY3VycmVudFRhZ05hbWUgPT09ICQuQ09MR1JPVVApIHtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1RBQkxFX01PREU7XG4gICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG4gICAgfVxufVxuXG4vLyBUaGUgXCJpbiB0YWJsZSBib2R5XCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0luVGFibGVCb2R5KHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdOYW1lO1xuXG4gICAgaWYgKHRuID09PSAkLlRSKSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVCb2R5Q29udGV4dCgpO1xuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fUk9XX01PREU7XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5USCB8fCB0biA9PT0gJC5URCkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlQm9keUNvbnRleHQoKTtcbiAgICAgICAgcC5faW5zZXJ0RmFrZUVsZW1lbnQoJC5UUik7XG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1JPV19NT0RFO1xuICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRuID09PSAkLkNBUFRJT04gfHxcbiAgICAgICAgdG4gPT09ICQuQ09MIHx8XG4gICAgICAgIHRuID09PSAkLkNPTEdST1VQIHx8XG4gICAgICAgIHRuID09PSAkLlRCT0RZIHx8XG4gICAgICAgIHRuID09PSAkLlRGT09UIHx8XG4gICAgICAgIHRuID09PSAkLlRIRUFEXG4gICAgKSB7XG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNUYWJsZUJvZHlDb250ZXh0SW5UYWJsZVNjb3BlKCkpIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVCb2R5Q29udGV4dCgpO1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9UQUJMRV9NT0RFO1xuICAgICAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlbmRUYWdJblRhYmxlQm9keShwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGlmICh0biA9PT0gJC5UQk9EWSB8fCB0biA9PT0gJC5URk9PVCB8fCB0biA9PT0gJC5USEVBRCkge1xuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5UYWJsZVNjb3BlKHRuKSkge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMuY2xlYXJCYWNrVG9UYWJsZUJvZHlDb250ZXh0KCk7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1RBQkxFX01PREU7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLlRBQkxFKSB7XG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNUYWJsZUJvZHlDb250ZXh0SW5UYWJsZVNjb3BlKCkpIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVCb2R5Q29udGV4dCgpO1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9UQUJMRV9NT0RFO1xuICAgICAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICh0biAhPT0gJC5CT0RZICYmIHRuICE9PSAkLkNBUFRJT04gJiYgdG4gIT09ICQuQ09MICYmIHRuICE9PSAkLkNPTEdST1VQKSB8fFxuICAgICAgICAodG4gIT09ICQuSFRNTCAmJiB0biAhPT0gJC5URCAmJiB0biAhPT0gJC5USCAmJiB0biAhPT0gJC5UUilcbiAgICApIHtcbiAgICAgICAgZW5kVGFnSW5UYWJsZShwLCB0b2tlbik7XG4gICAgfVxufVxuXG4vLyBUaGUgXCJpbiByb3dcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHN0YXJ0VGFnSW5Sb3cocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ05hbWU7XG5cbiAgICBpZiAodG4gPT09ICQuVEggfHwgdG4gPT09ICQuVEQpIHtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMuY2xlYXJCYWNrVG9UYWJsZVJvd0NvbnRleHQoKTtcbiAgICAgICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX0NFTExfTU9ERTtcbiAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5zZXJ0TWFya2VyKCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgdG4gPT09ICQuQ0FQVElPTiB8fFxuICAgICAgICB0biA9PT0gJC5DT0wgfHxcbiAgICAgICAgdG4gPT09ICQuQ09MR1JPVVAgfHxcbiAgICAgICAgdG4gPT09ICQuVEJPRFkgfHxcbiAgICAgICAgdG4gPT09ICQuVEZPT1QgfHxcbiAgICAgICAgdG4gPT09ICQuVEhFQUQgfHxcbiAgICAgICAgdG4gPT09ICQuVFJcbiAgICApIHtcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZSgkLlRSKSkge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMuY2xlYXJCYWNrVG9UYWJsZVJvd0NvbnRleHQoKTtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fVEFCTEVfQk9EWV9NT0RFO1xuICAgICAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlbmRUYWdJblJvdyhwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGlmICh0biA9PT0gJC5UUikge1xuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5UYWJsZVNjb3BlKCQuVFIpKSB7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlUm93Q29udGV4dCgpO1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9UQUJMRV9CT0RZX01PREU7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLlRBQkxFKSB7XG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUoJC5UUikpIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVSb3dDb250ZXh0KCk7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1RBQkxFX0JPRFlfTU9ERTtcbiAgICAgICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLlRCT0RZIHx8IHRuID09PSAkLlRGT09UIHx8IHRuID09PSAkLlRIRUFEKSB7XG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUodG4pIHx8IHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZSgkLlRSKSkge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMuY2xlYXJCYWNrVG9UYWJsZVJvd0NvbnRleHQoKTtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fVEFCTEVfQk9EWV9NT0RFO1xuICAgICAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICh0biAhPT0gJC5CT0RZICYmIHRuICE9PSAkLkNBUFRJT04gJiYgdG4gIT09ICQuQ09MICYmIHRuICE9PSAkLkNPTEdST1VQKSB8fFxuICAgICAgICAodG4gIT09ICQuSFRNTCAmJiB0biAhPT0gJC5URCAmJiB0biAhPT0gJC5USClcbiAgICApIHtcbiAgICAgICAgZW5kVGFnSW5UYWJsZShwLCB0b2tlbik7XG4gICAgfVxufVxuXG4vLyBUaGUgXCJpbiBjZWxsXCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0luQ2VsbChwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGlmIChcbiAgICAgICAgdG4gPT09ICQuQ0FQVElPTiB8fFxuICAgICAgICB0biA9PT0gJC5DT0wgfHxcbiAgICAgICAgdG4gPT09ICQuQ09MR1JPVVAgfHxcbiAgICAgICAgdG4gPT09ICQuVEJPRFkgfHxcbiAgICAgICAgdG4gPT09ICQuVEQgfHxcbiAgICAgICAgdG4gPT09ICQuVEZPT1QgfHxcbiAgICAgICAgdG4gPT09ICQuVEggfHxcbiAgICAgICAgdG4gPT09ICQuVEhFQUQgfHxcbiAgICAgICAgdG4gPT09ICQuVFJcbiAgICApIHtcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZSgkLlREKSB8fCBwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUoJC5USCkpIHtcbiAgICAgICAgICAgIHAuX2Nsb3NlVGFibGVDZWxsKCk7XG4gICAgICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZW5kVGFnSW5DZWxsKHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdOYW1lO1xuXG4gICAgaWYgKHRuID09PSAkLlREIHx8IHRuID09PSAkLlRIKSB7XG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUodG4pKSB7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQodG4pO1xuICAgICAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuY2xlYXJUb0xhc3RNYXJrZXIoKTtcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IElOX1JPV19NT0RFO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5UQUJMRSB8fCB0biA9PT0gJC5UQk9EWSB8fCB0biA9PT0gJC5URk9PVCB8fCB0biA9PT0gJC5USEVBRCB8fCB0biA9PT0gJC5UUikge1xuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5UYWJsZVNjb3BlKHRuKSkge1xuICAgICAgICAgICAgcC5fY2xvc2VUYWJsZUNlbGwoKTtcbiAgICAgICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRuICE9PSAkLkJPRFkgJiYgdG4gIT09ICQuQ0FQVElPTiAmJiB0biAhPT0gJC5DT0wgJiYgdG4gIT09ICQuQ09MR1JPVVAgJiYgdG4gIT09ICQuSFRNTCkge1xuICAgICAgICBlbmRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgIH1cbn1cblxuLy8gVGhlIFwiaW4gc2VsZWN0XCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0luU2VsZWN0KHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdOYW1lO1xuXG4gICAgaWYgKHRuID09PSAkLkhUTUwpIHtcbiAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgIH0gZWxzZSBpZiAodG4gPT09ICQuT1BUSU9OKSB7XG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnTmFtZSA9PT0gJC5PUFRJT04pIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5PUFRHUk9VUCkge1xuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuY3VycmVudFRhZ05hbWUgPT09ICQuT1BUSU9OKSB7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnTmFtZSA9PT0gJC5PUFRHUk9VUCkge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBOUy5IVE1MKTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLklOUFVUIHx8IHRuID09PSAkLktFWUdFTiB8fCB0biA9PT0gJC5URVhUQVJFQSB8fCB0biA9PT0gJC5TRUxFQ1QpIHtcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2VsZWN0U2NvcGUoJC5TRUxFQ1QpKSB7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoJC5TRUxFQ1QpO1xuICAgICAgICAgICAgcC5fcmVzZXRJbnNlcnRpb25Nb2RlKCk7XG5cbiAgICAgICAgICAgIGlmICh0biAhPT0gJC5TRUxFQ1QpIHtcbiAgICAgICAgICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5TQ1JJUFQgfHwgdG4gPT09ICQuVEVNUExBVEUpIHtcbiAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZW5kVGFnSW5TZWxlY3QocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ05hbWU7XG5cbiAgICBpZiAodG4gPT09ICQuT1BUR1JPVVApIHtcbiAgICAgICAgY29uc3QgcHJldk9wZW5FbGVtZW50ID0gcC5vcGVuRWxlbWVudHMuaXRlbXNbcC5vcGVuRWxlbWVudHMuc3RhY2tUb3AgLSAxXTtcbiAgICAgICAgY29uc3QgcHJldk9wZW5FbGVtZW50VG4gPSBwcmV2T3BlbkVsZW1lbnQgJiYgcC50cmVlQWRhcHRlci5nZXRUYWdOYW1lKHByZXZPcGVuRWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdOYW1lID09PSAkLk9QVElPTiAmJiBwcmV2T3BlbkVsZW1lbnRUbiA9PT0gJC5PUFRHUk9VUCkge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuY3VycmVudFRhZ05hbWUgPT09ICQuT1BUR1JPVVApIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0biA9PT0gJC5PUFRJT04pIHtcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdOYW1lID09PSAkLk9QVElPTikge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLlNFTEVDVCAmJiBwLm9wZW5FbGVtZW50cy5oYXNJblNlbGVjdFNjb3BlKCQuU0VMRUNUKSkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoJC5TRUxFQ1QpO1xuICAgICAgICBwLl9yZXNldEluc2VydGlvbk1vZGUoKTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLlRFTVBMQVRFKSB7XG4gICAgICAgIGVuZFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgfVxufVxuXG4vLzEyLjIuNS40LjE3IFRoZSBcImluIHNlbGVjdCBpbiB0YWJsZVwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gc3RhcnRUYWdJblNlbGVjdEluVGFibGUocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ05hbWU7XG5cbiAgICBpZiAoXG4gICAgICAgIHRuID09PSAkLkNBUFRJT04gfHxcbiAgICAgICAgdG4gPT09ICQuVEFCTEUgfHxcbiAgICAgICAgdG4gPT09ICQuVEJPRFkgfHxcbiAgICAgICAgdG4gPT09ICQuVEZPT1QgfHxcbiAgICAgICAgdG4gPT09ICQuVEhFQUQgfHxcbiAgICAgICAgdG4gPT09ICQuVFIgfHxcbiAgICAgICAgdG4gPT09ICQuVEQgfHxcbiAgICAgICAgdG4gPT09ICQuVEhcbiAgICApIHtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKCQuU0VMRUNUKTtcbiAgICAgICAgcC5fcmVzZXRJbnNlcnRpb25Nb2RlKCk7XG4gICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRUYWdJblNlbGVjdChwLCB0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlbmRUYWdJblNlbGVjdEluVGFibGUocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ05hbWU7XG5cbiAgICBpZiAoXG4gICAgICAgIHRuID09PSAkLkNBUFRJT04gfHxcbiAgICAgICAgdG4gPT09ICQuVEFCTEUgfHxcbiAgICAgICAgdG4gPT09ICQuVEJPRFkgfHxcbiAgICAgICAgdG4gPT09ICQuVEZPT1QgfHxcbiAgICAgICAgdG4gPT09ICQuVEhFQUQgfHxcbiAgICAgICAgdG4gPT09ICQuVFIgfHxcbiAgICAgICAgdG4gPT09ICQuVEQgfHxcbiAgICAgICAgdG4gPT09ICQuVEhcbiAgICApIHtcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZSh0bikpIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZCgkLlNFTEVDVCk7XG4gICAgICAgICAgICBwLl9yZXNldEluc2VydGlvbk1vZGUoKTtcbiAgICAgICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBlbmRUYWdJblNlbGVjdChwLCB0b2tlbik7XG4gICAgfVxufVxuXG4vLyBUaGUgXCJpbiB0ZW1wbGF0ZVwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gc3RhcnRUYWdJblRlbXBsYXRlKHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdOYW1lO1xuXG4gICAgaWYgKFxuICAgICAgICB0biA9PT0gJC5CQVNFIHx8XG4gICAgICAgIHRuID09PSAkLkJBU0VGT05UIHx8XG4gICAgICAgIHRuID09PSAkLkJHU09VTkQgfHxcbiAgICAgICAgdG4gPT09ICQuTElOSyB8fFxuICAgICAgICB0biA9PT0gJC5NRVRBIHx8XG4gICAgICAgIHRuID09PSAkLk5PRlJBTUVTIHx8XG4gICAgICAgIHRuID09PSAkLlNDUklQVCB8fFxuICAgICAgICB0biA9PT0gJC5TVFlMRSB8fFxuICAgICAgICB0biA9PT0gJC5URU1QTEFURSB8fFxuICAgICAgICB0biA9PT0gJC5USVRMRVxuICAgICkge1xuICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3SW5zZXJ0aW9uTW9kZSA9IFRFTVBMQVRFX0lOU0VSVElPTl9NT0RFX1NXSVRDSF9NQVBbdG5dIHx8IElOX0JPRFlfTU9ERTtcblxuICAgICAgICBwLl9wb3BUbXBsSW5zZXJ0aW9uTW9kZSgpO1xuICAgICAgICBwLl9wdXNoVG1wbEluc2VydGlvbk1vZGUobmV3SW5zZXJ0aW9uTW9kZSk7XG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IG5ld0luc2VydGlvbk1vZGU7XG4gICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlbmRUYWdJblRlbXBsYXRlKHAsIHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnRhZ05hbWUgPT09ICQuVEVNUExBVEUpIHtcbiAgICAgICAgZW5kVGFnSW5IZWFkKHAsIHRva2VuKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVvZkluVGVtcGxhdGUocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMudG1wbENvdW50ID4gMCkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoJC5URU1QTEFURSk7XG4gICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmNsZWFyVG9MYXN0TWFya2VyKCk7XG4gICAgICAgIHAuX3BvcFRtcGxJbnNlcnRpb25Nb2RlKCk7XG4gICAgICAgIHAuX3Jlc2V0SW5zZXJ0aW9uTW9kZSgpO1xuICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHAuc3RvcHBlZCA9IHRydWU7XG4gICAgfVxufVxuXG4vLyBUaGUgXCJhZnRlciBib2R5XCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0FmdGVyQm9keShwLCB0b2tlbikge1xuICAgIGlmICh0b2tlbi50YWdOYW1lID09PSAkLkhUTUwpIHtcbiAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRva2VuQWZ0ZXJCb2R5KHAsIHRva2VuKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVuZFRhZ0FmdGVyQm9keShwLCB0b2tlbikge1xuICAgIGlmICh0b2tlbi50YWdOYW1lID09PSAkLkhUTUwpIHtcbiAgICAgICAgaWYgKCFwLmZyYWdtZW50Q29udGV4dCkge1xuICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gQUZURVJfQUZURVJfQk9EWV9NT0RFO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdG9rZW5BZnRlckJvZHkocCwgdG9rZW4pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdG9rZW5BZnRlckJvZHkocCwgdG9rZW4pIHtcbiAgICBwLmluc2VydGlvbk1vZGUgPSBJTl9CT0RZX01PREU7XG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbn1cblxuLy8gVGhlIFwiaW4gZnJhbWVzZXRcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHN0YXJ0VGFnSW5GcmFtZXNldChwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGlmICh0biA9PT0gJC5IVE1MKSB7XG4gICAgICAgIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLkZSQU1FU0VUKSB7XG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIE5TLkhUTUwpO1xuICAgIH0gZWxzZSBpZiAodG4gPT09ICQuRlJBTUUpIHtcbiAgICAgICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgTlMuSFRNTCk7XG4gICAgICAgIHRva2VuLmFja1NlbGZDbG9zaW5nID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLk5PRlJBTUVTKSB7XG4gICAgICAgIHN0YXJ0VGFnSW5IZWFkKHAsIHRva2VuKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVuZFRhZ0luRnJhbWVzZXQocCwgdG9rZW4pIHtcbiAgICBpZiAodG9rZW4udGFnTmFtZSA9PT0gJC5GUkFNRVNFVCAmJiAhcC5vcGVuRWxlbWVudHMuaXNSb290SHRtbEVsZW1lbnRDdXJyZW50KCkpIHtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG5cbiAgICAgICAgaWYgKCFwLmZyYWdtZW50Q29udGV4dCAmJiBwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnTmFtZSAhPT0gJC5GUkFNRVNFVCkge1xuICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gQUZURVJfRlJBTUVTRVRfTU9ERTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gVGhlIFwiYWZ0ZXIgZnJhbWVzZXRcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHN0YXJ0VGFnQWZ0ZXJGcmFtZXNldChwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGlmICh0biA9PT0gJC5IVE1MKSB7XG4gICAgICAgIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLk5PRlJBTUVTKSB7XG4gICAgICAgIHN0YXJ0VGFnSW5IZWFkKHAsIHRva2VuKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVuZFRhZ0FmdGVyRnJhbWVzZXQocCwgdG9rZW4pIHtcbiAgICBpZiAodG9rZW4udGFnTmFtZSA9PT0gJC5IVE1MKSB7XG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEFGVEVSX0FGVEVSX0ZSQU1FU0VUX01PREU7XG4gICAgfVxufVxuXG4vLyBUaGUgXCJhZnRlciBhZnRlciBib2R5XCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0FmdGVyQWZ0ZXJCb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnRhZ05hbWUgPT09ICQuSFRNTCkge1xuICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdG9rZW5BZnRlckFmdGVyQm9keShwLCB0b2tlbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbkFmdGVyQWZ0ZXJCb2R5KHAsIHRva2VuKSB7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSU5fQk9EWV9NT0RFO1xuICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG59XG5cbi8vIFRoZSBcImFmdGVyIGFmdGVyIGZyYW1lc2V0XCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0FmdGVyQWZ0ZXJGcmFtZXNldChwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnTmFtZTtcblxuICAgIGlmICh0biA9PT0gJC5IVE1MKSB7XG4gICAgICAgIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICB9IGVsc2UgaWYgKHRuID09PSAkLk5PRlJBTUVTKSB7XG4gICAgICAgIHN0YXJ0VGFnSW5IZWFkKHAsIHRva2VuKTtcbiAgICB9XG59XG5cbi8vIFRoZSBydWxlcyBmb3IgcGFyc2luZyB0b2tlbnMgaW4gZm9yZWlnbiBjb250ZW50XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gbnVsbENoYXJhY3RlckluRm9yZWlnbkNvbnRlbnQocCwgdG9rZW4pIHtcbiAgICB0b2tlbi5jaGFycyA9IHVuaWNvZGUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xuICAgIHAuX2luc2VydENoYXJhY3RlcnModG9rZW4pO1xufVxuXG5mdW5jdGlvbiBjaGFyYWN0ZXJJbkZvcmVpZ25Db250ZW50KHAsIHRva2VuKSB7XG4gICAgcC5faW5zZXJ0Q2hhcmFjdGVycyh0b2tlbik7XG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VGFnSW5Gb3JlaWduQ29udGVudChwLCB0b2tlbikge1xuICAgIGlmIChmb3JlaWduQ29udGVudC5jYXVzZXNFeGl0KHRva2VuKSAmJiAhcC5mcmFnbWVudENvbnRleHQpIHtcbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgcC50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkocC5vcGVuRWxlbWVudHMuY3VycmVudCkgIT09IE5TLkhUTUwgJiZcbiAgICAgICAgICAgICFwLl9pc0ludGVncmF0aW9uUG9pbnQocC5vcGVuRWxlbWVudHMuY3VycmVudClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHAuX3Byb2Nlc3NUb2tlbih0b2tlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHAuX2dldEFkanVzdGVkQ3VycmVudEVsZW1lbnQoKTtcbiAgICAgICAgY29uc3QgY3VycmVudE5zID0gcC50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkoY3VycmVudCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnROcyA9PT0gTlMuTUFUSE1MKSB7XG4gICAgICAgICAgICBmb3JlaWduQ29udGVudC5hZGp1c3RUb2tlbk1hdGhNTEF0dHJzKHRva2VuKTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TnMgPT09IE5TLlNWRykge1xuICAgICAgICAgICAgZm9yZWlnbkNvbnRlbnQuYWRqdXN0VG9rZW5TVkdUYWdOYW1lKHRva2VuKTtcbiAgICAgICAgICAgIGZvcmVpZ25Db250ZW50LmFkanVzdFRva2VuU1ZHQXR0cnModG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yZWlnbkNvbnRlbnQuYWRqdXN0VG9rZW5YTUxBdHRycyh0b2tlbik7XG5cbiAgICAgICAgaWYgKHRva2VuLnNlbGZDbG9zaW5nKSB7XG4gICAgICAgICAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBjdXJyZW50TnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgY3VycmVudE5zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRva2VuLmFja1NlbGZDbG9zaW5nID0gdHJ1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVuZFRhZ0luRm9yZWlnbkNvbnRlbnQocCwgdG9rZW4pIHtcbiAgICBmb3IgKGxldCBpID0gcC5vcGVuRWxlbWVudHMuc3RhY2tUb3A7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHAub3BlbkVsZW1lbnRzLml0ZW1zW2ldO1xuXG4gICAgICAgIGlmIChwLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShlbGVtZW50KSA9PT0gTlMuSFRNTCkge1xuICAgICAgICAgICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHAudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KS50b0xvd2VyQ2FzZSgpID09PSB0b2tlbi50YWdOYW1lKSB7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbEVsZW1lbnRQb3BwZWQoZWxlbWVudCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgSFRNTCA9IHJlcXVpcmUoJy4uL2NvbW1vbi9odG1sJyk7XG5cbi8vQWxpYXNlc1xuY29uc3QgJCA9IEhUTUwuVEFHX05BTUVTO1xuY29uc3QgTlMgPSBIVE1MLk5BTUVTUEFDRVM7XG5cbi8vRWxlbWVudCB1dGlsc1xuXG4vL09QVElNSVpBVElPTjogSW50ZWdlciBjb21wYXJpc29ucyBhcmUgbG93LWNvc3QsIHNvIHdlIGNhbiB1c2UgdmVyeSBmYXN0IHRhZyBuYW1lIGxlbmd0aCBmaWx0ZXJzIGhlcmUuXG4vL0l0J3MgZmFzdGVyIHRoYW4gdXNpbmcgZGljdGlvbmFyeS5cbmZ1bmN0aW9uIGlzSW1wbGllZEVuZFRhZ1JlcXVpcmVkKHRuKSB7XG4gICAgc3dpdGNoICh0bi5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIHRuID09PSAkLlA7XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIHRuID09PSAkLlJCIHx8IHRuID09PSAkLlJQIHx8IHRuID09PSAkLlJUIHx8IHRuID09PSAkLkREIHx8IHRuID09PSAkLkRUIHx8IHRuID09PSAkLkxJO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiB0biA9PT0gJC5SVEM7XG5cbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcmV0dXJuIHRuID09PSAkLk9QVElPTjtcblxuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICByZXR1cm4gdG4gPT09ICQuT1BUR1JPVVA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0ltcGxpZWRFbmRUYWdSZXF1aXJlZFRob3JvdWdobHkodG4pIHtcbiAgICBzd2l0Y2ggKHRuLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gdG4gPT09ICQuUDtcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRuID09PSAkLlJCIHx8XG4gICAgICAgICAgICAgICAgdG4gPT09ICQuUlAgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5SVCB8fFxuICAgICAgICAgICAgICAgIHRuID09PSAkLkREIHx8XG4gICAgICAgICAgICAgICAgdG4gPT09ICQuRFQgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5MSSB8fFxuICAgICAgICAgICAgICAgIHRuID09PSAkLlREIHx8XG4gICAgICAgICAgICAgICAgdG4gPT09ICQuVEggfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5UUlxuICAgICAgICAgICAgKTtcblxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gdG4gPT09ICQuUlRDO1xuXG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHJldHVybiB0biA9PT0gJC5UQk9EWSB8fCB0biA9PT0gJC5URk9PVCB8fCB0biA9PT0gJC5USEVBRDtcblxuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICByZXR1cm4gdG4gPT09ICQuT1BUSU9OO1xuXG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIHJldHVybiB0biA9PT0gJC5DQVBUSU9OO1xuXG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiB0biA9PT0gJC5PUFRHUk9VUCB8fCB0biA9PT0gJC5DT0xHUk9VUDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2NvcGluZ0VsZW1lbnQodG4sIG5zKSB7XG4gICAgc3dpdGNoICh0bi5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgaWYgKHRuID09PSAkLlREIHx8IHRuID09PSAkLlRIKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5zID09PSBOUy5IVE1MO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0biA9PT0gJC5NSSB8fCB0biA9PT0gJC5NTyB8fCB0biA9PT0gJC5NTiB8fCB0biA9PT0gJC5NUykge1xuICAgICAgICAgICAgICAgIHJldHVybiBucyA9PT0gTlMuTUFUSE1MO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBpZiAodG4gPT09ICQuSFRNTCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBucyA9PT0gTlMuSFRNTDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG4gPT09ICQuREVTQykge1xuICAgICAgICAgICAgICAgIHJldHVybiBucyA9PT0gTlMuU1ZHO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBpZiAodG4gPT09ICQuVEFCTEUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnMgPT09IE5TLkhUTUw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLk1URVhUKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5zID09PSBOUy5NQVRITUw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRuID09PSAkLlRJVExFKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5zID09PSBOUy5TVkc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIHJldHVybiAodG4gPT09ICQuQVBQTEVUIHx8IHRuID09PSAkLk9CSkVDVCkgJiYgbnMgPT09IE5TLkhUTUw7XG5cbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgcmV0dXJuICh0biA9PT0gJC5DQVBUSU9OIHx8IHRuID09PSAkLk1BUlFVRUUpICYmIG5zID09PSBOUy5IVE1MO1xuXG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiB0biA9PT0gJC5URU1QTEFURSAmJiBucyA9PT0gTlMuSFRNTDtcblxuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgcmV0dXJuIHRuID09PSAkLkZPUkVJR05fT0JKRUNUICYmIG5zID09PSBOUy5TVkc7XG5cbiAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIHJldHVybiB0biA9PT0gJC5BTk5PVEFUSU9OX1hNTCAmJiBucyA9PT0gTlMuTUFUSE1MO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy9TdGFjayBvZiBvcGVuIGVsZW1lbnRzXG5jbGFzcyBPcGVuRWxlbWVudFN0YWNrIHtcbiAgICBjb25zdHJ1Y3Rvcihkb2N1bWVudCwgdHJlZUFkYXB0ZXIpIHtcbiAgICAgICAgdGhpcy5zdGFja1RvcCA9IC0xO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgICAgIHRoaXMuY3VycmVudCA9IGRvY3VtZW50O1xuICAgICAgICB0aGlzLmN1cnJlbnRUYWdOYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdXJyZW50VG1wbENvbnRlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLnRtcGxDb3VudCA9IDA7XG4gICAgICAgIHRoaXMudHJlZUFkYXB0ZXIgPSB0cmVlQWRhcHRlcjtcbiAgICB9XG5cbiAgICAvL0luZGV4IG9mIGVsZW1lbnRcbiAgICBfaW5kZXhPZihlbGVtZW50KSB7XG4gICAgICAgIGxldCBpZHggPSAtMTtcblxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zW2ldID09PSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWR4ID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWR4O1xuICAgIH1cblxuICAgIC8vVXBkYXRlIGN1cnJlbnQgZWxlbWVudFxuICAgIF9pc0luVGVtcGxhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUYWdOYW1lID09PSAkLlRFTVBMQVRFICYmIHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuY3VycmVudCkgPT09IE5TLkhUTUw7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUN1cnJlbnRFbGVtZW50KCkge1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLml0ZW1zW3RoaXMuc3RhY2tUb3BdO1xuICAgICAgICB0aGlzLmN1cnJlbnRUYWdOYW1lID0gdGhpcy5jdXJyZW50ICYmIHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZSh0aGlzLmN1cnJlbnQpO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFRtcGxDb250ZW50ID0gdGhpcy5faXNJblRlbXBsYXRlKCkgPyB0aGlzLnRyZWVBZGFwdGVyLmdldFRlbXBsYXRlQ29udGVudCh0aGlzLmN1cnJlbnQpIDogbnVsbDtcbiAgICB9XG5cbiAgICAvL011dGF0aW9uc1xuICAgIHB1c2goZWxlbWVudCkge1xuICAgICAgICB0aGlzLml0ZW1zWysrdGhpcy5zdGFja1RvcF0gPSBlbGVtZW50O1xuICAgICAgICB0aGlzLl91cGRhdGVDdXJyZW50RWxlbWVudCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9pc0luVGVtcGxhdGUoKSkge1xuICAgICAgICAgICAgdGhpcy50bXBsQ291bnQrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBvcCgpIHtcbiAgICAgICAgdGhpcy5zdGFja1RvcC0tO1xuXG4gICAgICAgIGlmICh0aGlzLnRtcGxDb3VudCA+IDAgJiYgdGhpcy5faXNJblRlbXBsYXRlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudG1wbENvdW50LS07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVDdXJyZW50RWxlbWVudCgpO1xuICAgIH1cblxuICAgIHJlcGxhY2Uob2xkRWxlbWVudCwgbmV3RWxlbWVudCkge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLl9pbmRleE9mKG9sZEVsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMuaXRlbXNbaWR4XSA9IG5ld0VsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGlkeCA9PT0gdGhpcy5zdGFja1RvcCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ3VycmVudEVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluc2VydEFmdGVyKHJlZmVyZW5jZUVsZW1lbnQsIG5ld0VsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0aW9uSWR4ID0gdGhpcy5faW5kZXhPZihyZWZlcmVuY2VFbGVtZW50KSArIDE7XG5cbiAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaW5zZXJ0aW9uSWR4LCAwLCBuZXdFbGVtZW50KTtcblxuICAgICAgICBpZiAoaW5zZXJ0aW9uSWR4ID09PSArK3RoaXMuc3RhY2tUb3ApIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUN1cnJlbnRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3BVbnRpbFRhZ05hbWVQb3BwZWQodGFnTmFtZSkge1xuICAgICAgICB3aGlsZSAodGhpcy5zdGFja1RvcCA+IC0xKSB7XG4gICAgICAgICAgICBjb25zdCB0biA9IHRoaXMuY3VycmVudFRhZ05hbWU7XG4gICAgICAgICAgICBjb25zdCBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuY3VycmVudCk7XG5cbiAgICAgICAgICAgIHRoaXMucG9wKCk7XG5cbiAgICAgICAgICAgIGlmICh0biA9PT0gdGFnTmFtZSAmJiBucyA9PT0gTlMuSFRNTCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcG9wVW50aWxFbGVtZW50UG9wcGVkKGVsZW1lbnQpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhY2tUb3AgPiAtMSkge1xuICAgICAgICAgICAgY29uc3QgcG9wcGVkRWxlbWVudCA9IHRoaXMuY3VycmVudDtcblxuICAgICAgICAgICAgdGhpcy5wb3AoKTtcblxuICAgICAgICAgICAgaWYgKHBvcHBlZEVsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBvcFVudGlsTnVtYmVyZWRIZWFkZXJQb3BwZWQoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnN0YWNrVG9wID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRuID0gdGhpcy5jdXJyZW50VGFnTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IG5zID0gdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkodGhpcy5jdXJyZW50KTtcblxuICAgICAgICAgICAgdGhpcy5wb3AoKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRuID09PSAkLkgxIHx8XG4gICAgICAgICAgICAgICAgdG4gPT09ICQuSDIgfHxcbiAgICAgICAgICAgICAgICB0biA9PT0gJC5IMyB8fFxuICAgICAgICAgICAgICAgIHRuID09PSAkLkg0IHx8XG4gICAgICAgICAgICAgICAgdG4gPT09ICQuSDUgfHxcbiAgICAgICAgICAgICAgICAodG4gPT09ICQuSDYgJiYgbnMgPT09IE5TLkhUTUwpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBvcFVudGlsVGFibGVDZWxsUG9wcGVkKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5zdGFja1RvcCA+IC0xKSB7XG4gICAgICAgICAgICBjb25zdCB0biA9IHRoaXMuY3VycmVudFRhZ05hbWU7XG4gICAgICAgICAgICBjb25zdCBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuY3VycmVudCk7XG5cbiAgICAgICAgICAgIHRoaXMucG9wKCk7XG5cbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5URCB8fCAodG4gPT09ICQuVEggJiYgbnMgPT09IE5TLkhUTUwpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3BBbGxVcFRvSHRtbEVsZW1lbnQoKSB7XG4gICAgICAgIC8vTk9URTogaGVyZSB3ZSBhc3N1bWUgdGhhdCByb290IDxodG1sPiBlbGVtZW50IGlzIGFsd2F5cyBmaXJzdCBpbiB0aGUgb3BlbiBlbGVtZW50IHN0YWNrLCBzb1xuICAgICAgICAvL3dlIHBlcmZvcm0gdGhpcyBmYXN0IHN0YWNrIGNsZWFuIHVwLlxuICAgICAgICB0aGlzLnN0YWNrVG9wID0gMDtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ3VycmVudEVsZW1lbnQoKTtcbiAgICB9XG5cbiAgICBjbGVhckJhY2tUb1RhYmxlQ29udGV4dCgpIHtcbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMuY3VycmVudFRhZ05hbWUgIT09ICQuVEFCTEUgJiYgdGhpcy5jdXJyZW50VGFnTmFtZSAhPT0gJC5URU1QTEFURSAmJiB0aGlzLmN1cnJlbnRUYWdOYW1lICE9PSAkLkhUTUwpIHx8XG4gICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLmN1cnJlbnQpICE9PSBOUy5IVE1MXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyQmFja1RvVGFibGVCb2R5Q29udGV4dCgpIHtcbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMuY3VycmVudFRhZ05hbWUgIT09ICQuVEJPRFkgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWdOYW1lICE9PSAkLlRGT09UICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFnTmFtZSAhPT0gJC5USEVBRCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRhZ05hbWUgIT09ICQuVEVNUExBVEUgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWdOYW1lICE9PSAkLkhUTUwpIHx8XG4gICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLmN1cnJlbnQpICE9PSBOUy5IVE1MXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyQmFja1RvVGFibGVSb3dDb250ZXh0KCkge1xuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5jdXJyZW50VGFnTmFtZSAhPT0gJC5UUiAmJiB0aGlzLmN1cnJlbnRUYWdOYW1lICE9PSAkLlRFTVBMQVRFICYmIHRoaXMuY3VycmVudFRhZ05hbWUgIT09ICQuSFRNTCkgfHxcbiAgICAgICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuY3VycmVudCkgIT09IE5TLkhUTUxcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlKGVsZW1lbnQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhY2tUb3A7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtc1tpXSA9PT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2tUb3AtLTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDdXJyZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy9TZWFyY2hcbiAgICB0cnlQZWVrUHJvcGVybHlOZXN0ZWRCb2R5RWxlbWVudCgpIHtcbiAgICAgICAgLy9Qcm9wZXJseSBuZXN0ZWQgPGJvZHk+IGVsZW1lbnQgKHNob3VsZCBiZSBzZWNvbmQgZWxlbWVudCBpbiBzdGFjaykuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLml0ZW1zWzFdO1xuXG4gICAgICAgIHJldHVybiBlbGVtZW50ICYmIHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbGVtZW50KSA9PT0gJC5CT0RZID8gZWxlbWVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgY29udGFpbnMoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXhPZihlbGVtZW50KSA+IC0xO1xuICAgIH1cblxuICAgIGdldENvbW1vbkFuY2VzdG9yKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGVsZW1lbnRJZHggPSB0aGlzLl9pbmRleE9mKGVsZW1lbnQpO1xuXG4gICAgICAgIHJldHVybiAtLWVsZW1lbnRJZHggPj0gMCA/IHRoaXMuaXRlbXNbZWxlbWVudElkeF0gOiBudWxsO1xuICAgIH1cblxuICAgIGlzUm9vdEh0bWxFbGVtZW50Q3VycmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhY2tUb3AgPT09IDAgJiYgdGhpcy5jdXJyZW50VGFnTmFtZSA9PT0gJC5IVE1MO1xuICAgIH1cblxuICAgIC8vRWxlbWVudCBpbiBzY29wZVxuICAgIGhhc0luU2NvcGUodGFnTmFtZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IHRuID0gdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKHRoaXMuaXRlbXNbaV0pO1xuICAgICAgICAgICAgY29uc3QgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLml0ZW1zW2ldKTtcblxuICAgICAgICAgICAgaWYgKHRuID09PSB0YWdOYW1lICYmIG5zID09PSBOUy5IVE1MKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc1Njb3BpbmdFbGVtZW50KHRuLCBucykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBoYXNOdW1iZXJlZEhlYWRlckluU2NvcGUoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnN0YWNrVG9wOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgdG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUodGhpcy5pdGVtc1tpXSk7XG4gICAgICAgICAgICBjb25zdCBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuaXRlbXNbaV0pO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKHRuID09PSAkLkgxIHx8IHRuID09PSAkLkgyIHx8IHRuID09PSAkLkgzIHx8IHRuID09PSAkLkg0IHx8IHRuID09PSAkLkg1IHx8IHRuID09PSAkLkg2KSAmJlxuICAgICAgICAgICAgICAgIG5zID09PSBOUy5IVE1MXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzU2NvcGluZ0VsZW1lbnQodG4sIG5zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGhhc0luTGlzdEl0ZW1TY29wZSh0YWdOYW1lKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnN0YWNrVG9wOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgdG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUodGhpcy5pdGVtc1tpXSk7XG4gICAgICAgICAgICBjb25zdCBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuaXRlbXNbaV0pO1xuXG4gICAgICAgICAgICBpZiAodG4gPT09IHRhZ05hbWUgJiYgbnMgPT09IE5TLkhUTUwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCgodG4gPT09ICQuVUwgfHwgdG4gPT09ICQuT0wpICYmIG5zID09PSBOUy5IVE1MKSB8fCBpc1Njb3BpbmdFbGVtZW50KHRuLCBucykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBoYXNJbkJ1dHRvblNjb3BlKHRhZ05hbWUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhY2tUb3A7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCB0biA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZSh0aGlzLml0ZW1zW2ldKTtcbiAgICAgICAgICAgIGNvbnN0IG5zID0gdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkodGhpcy5pdGVtc1tpXSk7XG5cbiAgICAgICAgICAgIGlmICh0biA9PT0gdGFnTmFtZSAmJiBucyA9PT0gTlMuSFRNTCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoKHRuID09PSAkLkJVVFRPTiAmJiBucyA9PT0gTlMuSFRNTCkgfHwgaXNTY29waW5nRWxlbWVudCh0biwgbnMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaGFzSW5UYWJsZVNjb3BlKHRhZ05hbWUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhY2tUb3A7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCB0biA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZSh0aGlzLml0ZW1zW2ldKTtcbiAgICAgICAgICAgIGNvbnN0IG5zID0gdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkodGhpcy5pdGVtc1tpXSk7XG5cbiAgICAgICAgICAgIGlmIChucyAhPT0gTlMuSFRNTCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodG4gPT09IHRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRuID09PSAkLlRBQkxFIHx8IHRuID09PSAkLlRFTVBMQVRFIHx8IHRuID09PSAkLkhUTUwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBoYXNUYWJsZUJvZHlDb250ZXh0SW5UYWJsZVNjb3BlKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IHRuID0gdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKHRoaXMuaXRlbXNbaV0pO1xuICAgICAgICAgICAgY29uc3QgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLml0ZW1zW2ldKTtcblxuICAgICAgICAgICAgaWYgKG5zICE9PSBOUy5IVE1MKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0biA9PT0gJC5UQk9EWSB8fCB0biA9PT0gJC5USEVBRCB8fCB0biA9PT0gJC5URk9PVCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodG4gPT09ICQuVEFCTEUgfHwgdG4gPT09ICQuSFRNTCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGhhc0luU2VsZWN0U2NvcGUodGFnTmFtZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IHRuID0gdGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKHRoaXMuaXRlbXNbaV0pO1xuICAgICAgICAgICAgY29uc3QgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLml0ZW1zW2ldKTtcblxuICAgICAgICAgICAgaWYgKG5zICE9PSBOUy5IVE1MKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0biA9PT0gdGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodG4gIT09ICQuT1BUSU9OICYmIHRuICE9PSAkLk9QVEdST1VQKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy9JbXBsaWVkIGVuZCB0YWdzXG4gICAgZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpIHtcbiAgICAgICAgd2hpbGUgKGlzSW1wbGllZEVuZFRhZ1JlcXVpcmVkKHRoaXMuY3VycmVudFRhZ05hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVJbXBsaWVkRW5kVGFnc1Rob3JvdWdobHkoKSB7XG4gICAgICAgIHdoaWxlIChpc0ltcGxpZWRFbmRUYWdSZXF1aXJlZFRob3JvdWdobHkodGhpcy5jdXJyZW50VGFnTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZW5lcmF0ZUltcGxpZWRFbmRUYWdzV2l0aEV4Y2x1c2lvbihleGNsdXNpb25UYWdOYW1lKSB7XG4gICAgICAgIHdoaWxlIChpc0ltcGxpZWRFbmRUYWdSZXF1aXJlZCh0aGlzLmN1cnJlbnRUYWdOYW1lKSAmJiB0aGlzLmN1cnJlbnRUYWdOYW1lICE9PSBleGNsdXNpb25UYWdOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE9wZW5FbGVtZW50U3RhY2s7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGRlZmF1bHRUcmVlQWRhcHRlciA9IHJlcXVpcmUoJy4uL3RyZWUtYWRhcHRlcnMvZGVmYXVsdCcpO1xuY29uc3QgbWVyZ2VPcHRpb25zID0gcmVxdWlyZSgnLi4vdXRpbHMvbWVyZ2Utb3B0aW9ucycpO1xuY29uc3QgZG9jdHlwZSA9IHJlcXVpcmUoJy4uL2NvbW1vbi9kb2N0eXBlJyk7XG5jb25zdCBIVE1MID0gcmVxdWlyZSgnLi4vY29tbW9uL2h0bWwnKTtcblxuLy9BbGlhc2VzXG5jb25zdCAkID0gSFRNTC5UQUdfTkFNRVM7XG5jb25zdCBOUyA9IEhUTUwuTkFNRVNQQUNFUztcblxuLy9EZWZhdWx0IHNlcmlhbGl6ZXIgb3B0aW9uc1xuY29uc3QgREVGQVVMVF9PUFRJT05TID0ge1xuICAgIHRyZWVBZGFwdGVyOiBkZWZhdWx0VHJlZUFkYXB0ZXJcbn07XG5cbi8vRXNjYXBpbmcgcmVnZXhlc1xuY29uc3QgQU1QX1JFR0VYID0gLyYvZztcbmNvbnN0IE5CU1BfUkVHRVggPSAvXFx1MDBhMC9nO1xuY29uc3QgRE9VQkxFX1FVT1RFX1JFR0VYID0gL1wiL2c7XG5jb25zdCBMVF9SRUdFWCA9IC88L2c7XG5jb25zdCBHVF9SRUdFWCA9IC8+L2c7XG5cbi8vU2VyaWFsaXplclxuY2xhc3MgU2VyaWFsaXplciB7XG4gICAgY29uc3RydWN0b3Iobm9kZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoREVGQVVMVF9PUFRJT05TLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50cmVlQWRhcHRlciA9IHRoaXMub3B0aW9ucy50cmVlQWRhcHRlcjtcblxuICAgICAgICB0aGlzLmh0bWwgPSAnJztcbiAgICAgICAgdGhpcy5zdGFydE5vZGUgPSBub2RlO1xuICAgIH1cblxuICAgIC8vQVBJXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICB0aGlzLl9zZXJpYWxpemVDaGlsZE5vZGVzKHRoaXMuc3RhcnROb2RlKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odG1sO1xuICAgIH1cblxuICAgIC8vSW50ZXJuYWxzXG4gICAgX3NlcmlhbGl6ZUNoaWxkTm9kZXMocGFyZW50Tm9kZSkge1xuICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gdGhpcy50cmVlQWRhcHRlci5nZXRDaGlsZE5vZGVzKHBhcmVudE5vZGUpO1xuXG4gICAgICAgIGlmIChjaGlsZE5vZGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgY25MZW5ndGggPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGNuTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IGNoaWxkTm9kZXNbaV07XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy50cmVlQWRhcHRlci5pc0VsZW1lbnROb2RlKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXJpYWxpemVFbGVtZW50KGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHJlZUFkYXB0ZXIuaXNUZXh0Tm9kZShjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VyaWFsaXplVGV4dE5vZGUoY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50cmVlQWRhcHRlci5pc0NvbW1lbnROb2RlKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXJpYWxpemVDb21tZW50Tm9kZShjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRyZWVBZGFwdGVyLmlzRG9jdW1lbnRUeXBlTm9kZShjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VyaWFsaXplRG9jdW1lbnRUeXBlTm9kZShjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3NlcmlhbGl6ZUVsZW1lbnQobm9kZSkge1xuICAgICAgICBjb25zdCB0biA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShub2RlKTtcbiAgICAgICAgY29uc3QgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShub2RlKTtcblxuICAgICAgICB0aGlzLmh0bWwgKz0gJzwnICsgdG47XG4gICAgICAgIHRoaXMuX3NlcmlhbGl6ZUF0dHJpYnV0ZXMobm9kZSk7XG4gICAgICAgIHRoaXMuaHRtbCArPSAnPic7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdG4gIT09ICQuQVJFQSAmJlxuICAgICAgICAgICAgdG4gIT09ICQuQkFTRSAmJlxuICAgICAgICAgICAgdG4gIT09ICQuQkFTRUZPTlQgJiZcbiAgICAgICAgICAgIHRuICE9PSAkLkJHU09VTkQgJiZcbiAgICAgICAgICAgIHRuICE9PSAkLkJSICYmXG4gICAgICAgICAgICB0biAhPT0gJC5DT0wgJiZcbiAgICAgICAgICAgIHRuICE9PSAkLkVNQkVEICYmXG4gICAgICAgICAgICB0biAhPT0gJC5GUkFNRSAmJlxuICAgICAgICAgICAgdG4gIT09ICQuSFIgJiZcbiAgICAgICAgICAgIHRuICE9PSAkLklNRyAmJlxuICAgICAgICAgICAgdG4gIT09ICQuSU5QVVQgJiZcbiAgICAgICAgICAgIHRuICE9PSAkLktFWUdFTiAmJlxuICAgICAgICAgICAgdG4gIT09ICQuTElOSyAmJlxuICAgICAgICAgICAgdG4gIT09ICQuTUVUQSAmJlxuICAgICAgICAgICAgdG4gIT09ICQuUEFSQU0gJiZcbiAgICAgICAgICAgIHRuICE9PSAkLlNPVVJDRSAmJlxuICAgICAgICAgICAgdG4gIT09ICQuVFJBQ0sgJiZcbiAgICAgICAgICAgIHRuICE9PSAkLldCUlxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZXNIb2xkZXIgPVxuICAgICAgICAgICAgICAgIHRuID09PSAkLlRFTVBMQVRFICYmIG5zID09PSBOUy5IVE1MID8gdGhpcy50cmVlQWRhcHRlci5nZXRUZW1wbGF0ZUNvbnRlbnQobm9kZSkgOiBub2RlO1xuXG4gICAgICAgICAgICB0aGlzLl9zZXJpYWxpemVDaGlsZE5vZGVzKGNoaWxkTm9kZXNIb2xkZXIpO1xuICAgICAgICAgICAgdGhpcy5odG1sICs9ICc8LycgKyB0biArICc+JztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zZXJpYWxpemVBdHRyaWJ1dGVzKG5vZGUpIHtcbiAgICAgICAgY29uc3QgYXR0cnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldEF0dHJMaXN0KG5vZGUpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBhdHRyc0xlbmd0aCA9IGF0dHJzLmxlbmd0aDsgaSA8IGF0dHJzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHIgPSBhdHRyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gU2VyaWFsaXplci5lc2NhcGVTdHJpbmcoYXR0ci52YWx1ZSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuaHRtbCArPSAnICc7XG5cbiAgICAgICAgICAgIGlmICghYXR0ci5uYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmh0bWwgKz0gYXR0ci5uYW1lO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyLm5hbWVzcGFjZSA9PT0gTlMuWE1MKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5odG1sICs9ICd4bWw6JyArIGF0dHIubmFtZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0ci5uYW1lc3BhY2UgPT09IE5TLlhNTE5TKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHIubmFtZSAhPT0gJ3htbG5zJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmh0bWwgKz0gJ3htbG5zOic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5odG1sICs9IGF0dHIubmFtZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0ci5uYW1lc3BhY2UgPT09IE5TLlhMSU5LKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5odG1sICs9ICd4bGluazonICsgYXR0ci5uYW1lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmh0bWwgKz0gYXR0ci5wcmVmaXggKyAnOicgKyBhdHRyLm5hbWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaHRtbCArPSAnPVwiJyArIHZhbHVlICsgJ1wiJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zZXJpYWxpemVUZXh0Tm9kZShub2RlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRleHROb2RlQ29udGVudChub2RlKTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy50cmVlQWRhcHRlci5nZXRQYXJlbnROb2RlKG5vZGUpO1xuICAgICAgICBsZXQgcGFyZW50VG4gPSB2b2lkIDA7XG5cbiAgICAgICAgaWYgKHBhcmVudCAmJiB0aGlzLnRyZWVBZGFwdGVyLmlzRWxlbWVudE5vZGUocGFyZW50KSkge1xuICAgICAgICAgICAgcGFyZW50VG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUocGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcmVudFRuID09PSAkLlNUWUxFIHx8XG4gICAgICAgICAgICBwYXJlbnRUbiA9PT0gJC5TQ1JJUFQgfHxcbiAgICAgICAgICAgIHBhcmVudFRuID09PSAkLlhNUCB8fFxuICAgICAgICAgICAgcGFyZW50VG4gPT09ICQuSUZSQU1FIHx8XG4gICAgICAgICAgICBwYXJlbnRUbiA9PT0gJC5OT0VNQkVEIHx8XG4gICAgICAgICAgICBwYXJlbnRUbiA9PT0gJC5OT0ZSQU1FUyB8fFxuICAgICAgICAgICAgcGFyZW50VG4gPT09ICQuUExBSU5URVhUIHx8XG4gICAgICAgICAgICBwYXJlbnRUbiA9PT0gJC5OT1NDUklQVFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuaHRtbCArPSBjb250ZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5odG1sICs9IFNlcmlhbGl6ZXIuZXNjYXBlU3RyaW5nKGNvbnRlbnQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zZXJpYWxpemVDb21tZW50Tm9kZShub2RlKSB7XG4gICAgICAgIHRoaXMuaHRtbCArPSAnPCEtLScgKyB0aGlzLnRyZWVBZGFwdGVyLmdldENvbW1lbnROb2RlQ29udGVudChub2RlKSArICctLT4nO1xuICAgIH1cblxuICAgIF9zZXJpYWxpemVEb2N1bWVudFR5cGVOb2RlKG5vZGUpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0RG9jdW1lbnRUeXBlTm9kZU5hbWUobm9kZSk7XG5cbiAgICAgICAgdGhpcy5odG1sICs9ICc8JyArIGRvY3R5cGUuc2VyaWFsaXplQ29udGVudChuYW1lLCBudWxsLCBudWxsKSArICc+JztcbiAgICB9XG59XG5cbi8vIE5PVEU6IHVzZWQgaW4gdGVzdHMgYW5kIGJ5IHJld3JpdGluZyBzdHJlYW1cblNlcmlhbGl6ZXIuZXNjYXBlU3RyaW5nID0gZnVuY3Rpb24oc3RyLCBhdHRyTW9kZSkge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKEFNUF9SRUdFWCwgJyZhbXA7JykucmVwbGFjZShOQlNQX1JFR0VYLCAnJm5ic3A7Jyk7XG5cbiAgICBpZiAoYXR0ck1vZGUpIHtcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoRE9VQkxFX1FVT1RFX1JFR0VYLCAnJnF1b3Q7Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoTFRfUkVHRVgsICcmbHQ7JykucmVwbGFjZShHVF9SRUdFWCwgJyZndDsnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZXJpYWxpemVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBQcmVwcm9jZXNzb3IgPSByZXF1aXJlKCcuL3ByZXByb2Nlc3NvcicpO1xuY29uc3QgdW5pY29kZSA9IHJlcXVpcmUoJy4uL2NvbW1vbi91bmljb2RlJyk7XG5jb25zdCBuZVRyZWUgPSByZXF1aXJlKCcuL25hbWVkLWVudGl0eS1kYXRhJyk7XG5jb25zdCBFUlIgPSByZXF1aXJlKCcuLi9jb21tb24vZXJyb3ItY29kZXMnKTtcblxuLy9BbGlhc2VzXG5jb25zdCAkID0gdW5pY29kZS5DT0RFX1BPSU5UUztcbmNvbnN0ICQkID0gdW5pY29kZS5DT0RFX1BPSU5UX1NFUVVFTkNFUztcblxuLy9DMSBVbmljb2RlIGNvbnRyb2wgY2hhcmFjdGVyIHJlZmVyZW5jZSByZXBsYWNlbWVudHNcbmNvbnN0IEMxX0NPTlRST0xTX1JFRkVSRU5DRV9SRVBMQUNFTUVOVFMgPSB7XG4gICAgMHg4MDogMHgyMGFjLFxuICAgIDB4ODI6IDB4MjAxYSxcbiAgICAweDgzOiAweDAxOTIsXG4gICAgMHg4NDogMHgyMDFlLFxuICAgIDB4ODU6IDB4MjAyNixcbiAgICAweDg2OiAweDIwMjAsXG4gICAgMHg4NzogMHgyMDIxLFxuICAgIDB4ODg6IDB4MDJjNixcbiAgICAweDg5OiAweDIwMzAsXG4gICAgMHg4YTogMHgwMTYwLFxuICAgIDB4OGI6IDB4MjAzOSxcbiAgICAweDhjOiAweDAxNTIsXG4gICAgMHg4ZTogMHgwMTdkLFxuICAgIDB4OTE6IDB4MjAxOCxcbiAgICAweDkyOiAweDIwMTksXG4gICAgMHg5MzogMHgyMDFjLFxuICAgIDB4OTQ6IDB4MjAxZCxcbiAgICAweDk1OiAweDIwMjIsXG4gICAgMHg5NjogMHgyMDEzLFxuICAgIDB4OTc6IDB4MjAxNCxcbiAgICAweDk4OiAweDAyZGMsXG4gICAgMHg5OTogMHgyMTIyLFxuICAgIDB4OWE6IDB4MDE2MSxcbiAgICAweDliOiAweDIwM2EsXG4gICAgMHg5YzogMHgwMTUzLFxuICAgIDB4OWU6IDB4MDE3ZSxcbiAgICAweDlmOiAweDAxNzhcbn07XG5cbi8vIE5hbWVkIGVudGl0eSB0cmVlIGZsYWdzXG5jb25zdCBIQVNfREFUQV9GTEFHID0gMSA8PCAwO1xuY29uc3QgREFUQV9EVVBMRVRfRkxBRyA9IDEgPDwgMTtcbmNvbnN0IEhBU19CUkFOQ0hFU19GTEFHID0gMSA8PCAyO1xuY29uc3QgTUFYX0JSQU5DSF9NQVJLRVJfVkFMVUUgPSBIQVNfREFUQV9GTEFHIHwgREFUQV9EVVBMRVRfRkxBRyB8IEhBU19CUkFOQ0hFU19GTEFHO1xuXG4vL1N0YXRlc1xuY29uc3QgREFUQV9TVEFURSA9ICdEQVRBX1NUQVRFJztcbmNvbnN0IFJDREFUQV9TVEFURSA9ICdSQ0RBVEFfU1RBVEUnO1xuY29uc3QgUkFXVEVYVF9TVEFURSA9ICdSQVdURVhUX1NUQVRFJztcbmNvbnN0IFNDUklQVF9EQVRBX1NUQVRFID0gJ1NDUklQVF9EQVRBX1NUQVRFJztcbmNvbnN0IFBMQUlOVEVYVF9TVEFURSA9ICdQTEFJTlRFWFRfU1RBVEUnO1xuY29uc3QgVEFHX09QRU5fU1RBVEUgPSAnVEFHX09QRU5fU1RBVEUnO1xuY29uc3QgRU5EX1RBR19PUEVOX1NUQVRFID0gJ0VORF9UQUdfT1BFTl9TVEFURSc7XG5jb25zdCBUQUdfTkFNRV9TVEFURSA9ICdUQUdfTkFNRV9TVEFURSc7XG5jb25zdCBSQ0RBVEFfTEVTU19USEFOX1NJR05fU1RBVEUgPSAnUkNEQVRBX0xFU1NfVEhBTl9TSUdOX1NUQVRFJztcbmNvbnN0IFJDREFUQV9FTkRfVEFHX09QRU5fU1RBVEUgPSAnUkNEQVRBX0VORF9UQUdfT1BFTl9TVEFURSc7XG5jb25zdCBSQ0RBVEFfRU5EX1RBR19OQU1FX1NUQVRFID0gJ1JDREFUQV9FTkRfVEFHX05BTUVfU1RBVEUnO1xuY29uc3QgUkFXVEVYVF9MRVNTX1RIQU5fU0lHTl9TVEFURSA9ICdSQVdURVhUX0xFU1NfVEhBTl9TSUdOX1NUQVRFJztcbmNvbnN0IFJBV1RFWFRfRU5EX1RBR19PUEVOX1NUQVRFID0gJ1JBV1RFWFRfRU5EX1RBR19PUEVOX1NUQVRFJztcbmNvbnN0IFJBV1RFWFRfRU5EX1RBR19OQU1FX1NUQVRFID0gJ1JBV1RFWFRfRU5EX1RBR19OQU1FX1NUQVRFJztcbmNvbnN0IFNDUklQVF9EQVRBX0xFU1NfVEhBTl9TSUdOX1NUQVRFID0gJ1NDUklQVF9EQVRBX0xFU1NfVEhBTl9TSUdOX1NUQVRFJztcbmNvbnN0IFNDUklQVF9EQVRBX0VORF9UQUdfT1BFTl9TVEFURSA9ICdTQ1JJUFRfREFUQV9FTkRfVEFHX09QRU5fU1RBVEUnO1xuY29uc3QgU0NSSVBUX0RBVEFfRU5EX1RBR19OQU1FX1NUQVRFID0gJ1NDUklQVF9EQVRBX0VORF9UQUdfTkFNRV9TVEFURSc7XG5jb25zdCBTQ1JJUFRfREFUQV9FU0NBUEVfU1RBUlRfU1RBVEUgPSAnU0NSSVBUX0RBVEFfRVNDQVBFX1NUQVJUX1NUQVRFJztcbmNvbnN0IFNDUklQVF9EQVRBX0VTQ0FQRV9TVEFSVF9EQVNIX1NUQVRFID0gJ1NDUklQVF9EQVRBX0VTQ0FQRV9TVEFSVF9EQVNIX1NUQVRFJztcbmNvbnN0IFNDUklQVF9EQVRBX0VTQ0FQRURfU1RBVEUgPSAnU0NSSVBUX0RBVEFfRVNDQVBFRF9TVEFURSc7XG5jb25zdCBTQ1JJUFRfREFUQV9FU0NBUEVEX0RBU0hfU1RBVEUgPSAnU0NSSVBUX0RBVEFfRVNDQVBFRF9EQVNIX1NUQVRFJztcbmNvbnN0IFNDUklQVF9EQVRBX0VTQ0FQRURfREFTSF9EQVNIX1NUQVRFID0gJ1NDUklQVF9EQVRBX0VTQ0FQRURfREFTSF9EQVNIX1NUQVRFJztcbmNvbnN0IFNDUklQVF9EQVRBX0VTQ0FQRURfTEVTU19USEFOX1NJR05fU1RBVEUgPSAnU0NSSVBUX0RBVEFfRVNDQVBFRF9MRVNTX1RIQU5fU0lHTl9TVEFURSc7XG5jb25zdCBTQ1JJUFRfREFUQV9FU0NBUEVEX0VORF9UQUdfT1BFTl9TVEFURSA9ICdTQ1JJUFRfREFUQV9FU0NBUEVEX0VORF9UQUdfT1BFTl9TVEFURSc7XG5jb25zdCBTQ1JJUFRfREFUQV9FU0NBUEVEX0VORF9UQUdfTkFNRV9TVEFURSA9ICdTQ1JJUFRfREFUQV9FU0NBUEVEX0VORF9UQUdfTkFNRV9TVEFURSc7XG5jb25zdCBTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFX1NUQVJUX1NUQVRFID0gJ1NDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVfU1RBUlRfU1RBVEUnO1xuY29uc3QgU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfU1RBVEUgPSAnU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfU1RBVEUnO1xuY29uc3QgU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfREFTSF9TVEFURSA9ICdTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9EQVNIX1NUQVRFJztcbmNvbnN0IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0RBU0hfREFTSF9TVEFURSA9ICdTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9EQVNIX0RBU0hfU1RBVEUnO1xuY29uc3QgU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfTEVTU19USEFOX1NJR05fU1RBVEUgPSAnU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfTEVTU19USEFOX1NJR05fU1RBVEUnO1xuY29uc3QgU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRV9FTkRfU1RBVEUgPSAnU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRV9FTkRfU1RBVEUnO1xuY29uc3QgQkVGT1JFX0FUVFJJQlVURV9OQU1FX1NUQVRFID0gJ0JFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURSc7XG5jb25zdCBBVFRSSUJVVEVfTkFNRV9TVEFURSA9ICdBVFRSSUJVVEVfTkFNRV9TVEFURSc7XG5jb25zdCBBRlRFUl9BVFRSSUJVVEVfTkFNRV9TVEFURSA9ICdBRlRFUl9BVFRSSUJVVEVfTkFNRV9TVEFURSc7XG5jb25zdCBCRUZPUkVfQVRUUklCVVRFX1ZBTFVFX1NUQVRFID0gJ0JFRk9SRV9BVFRSSUJVVEVfVkFMVUVfU1RBVEUnO1xuY29uc3QgQVRUUklCVVRFX1ZBTFVFX0RPVUJMRV9RVU9URURfU1RBVEUgPSAnQVRUUklCVVRFX1ZBTFVFX0RPVUJMRV9RVU9URURfU1RBVEUnO1xuY29uc3QgQVRUUklCVVRFX1ZBTFVFX1NJTkdMRV9RVU9URURfU1RBVEUgPSAnQVRUUklCVVRFX1ZBTFVFX1NJTkdMRV9RVU9URURfU1RBVEUnO1xuY29uc3QgQVRUUklCVVRFX1ZBTFVFX1VOUVVPVEVEX1NUQVRFID0gJ0FUVFJJQlVURV9WQUxVRV9VTlFVT1RFRF9TVEFURSc7XG5jb25zdCBBRlRFUl9BVFRSSUJVVEVfVkFMVUVfUVVPVEVEX1NUQVRFID0gJ0FGVEVSX0FUVFJJQlVURV9WQUxVRV9RVU9URURfU1RBVEUnO1xuY29uc3QgU0VMRl9DTE9TSU5HX1NUQVJUX1RBR19TVEFURSA9ICdTRUxGX0NMT1NJTkdfU1RBUlRfVEFHX1NUQVRFJztcbmNvbnN0IEJPR1VTX0NPTU1FTlRfU1RBVEUgPSAnQk9HVVNfQ09NTUVOVF9TVEFURSc7XG5jb25zdCBNQVJLVVBfREVDTEFSQVRJT05fT1BFTl9TVEFURSA9ICdNQVJLVVBfREVDTEFSQVRJT05fT1BFTl9TVEFURSc7XG5jb25zdCBDT01NRU5UX1NUQVJUX1NUQVRFID0gJ0NPTU1FTlRfU1RBUlRfU1RBVEUnO1xuY29uc3QgQ09NTUVOVF9TVEFSVF9EQVNIX1NUQVRFID0gJ0NPTU1FTlRfU1RBUlRfREFTSF9TVEFURSc7XG5jb25zdCBDT01NRU5UX1NUQVRFID0gJ0NPTU1FTlRfU1RBVEUnO1xuY29uc3QgQ09NTUVOVF9MRVNTX1RIQU5fU0lHTl9TVEFURSA9ICdDT01NRU5UX0xFU1NfVEhBTl9TSUdOX1NUQVRFJztcbmNvbnN0IENPTU1FTlRfTEVTU19USEFOX1NJR05fQkFOR19TVEFURSA9ICdDT01NRU5UX0xFU1NfVEhBTl9TSUdOX0JBTkdfU1RBVEUnO1xuY29uc3QgQ09NTUVOVF9MRVNTX1RIQU5fU0lHTl9CQU5HX0RBU0hfU1RBVEUgPSAnQ09NTUVOVF9MRVNTX1RIQU5fU0lHTl9CQU5HX0RBU0hfU1RBVEUnO1xuY29uc3QgQ09NTUVOVF9MRVNTX1RIQU5fU0lHTl9CQU5HX0RBU0hfREFTSF9TVEFURSA9ICdDT01NRU5UX0xFU1NfVEhBTl9TSUdOX0JBTkdfREFTSF9EQVNIX1NUQVRFJztcbmNvbnN0IENPTU1FTlRfRU5EX0RBU0hfU1RBVEUgPSAnQ09NTUVOVF9FTkRfREFTSF9TVEFURSc7XG5jb25zdCBDT01NRU5UX0VORF9TVEFURSA9ICdDT01NRU5UX0VORF9TVEFURSc7XG5jb25zdCBDT01NRU5UX0VORF9CQU5HX1NUQVRFID0gJ0NPTU1FTlRfRU5EX0JBTkdfU1RBVEUnO1xuY29uc3QgRE9DVFlQRV9TVEFURSA9ICdET0NUWVBFX1NUQVRFJztcbmNvbnN0IEJFRk9SRV9ET0NUWVBFX05BTUVfU1RBVEUgPSAnQkVGT1JFX0RPQ1RZUEVfTkFNRV9TVEFURSc7XG5jb25zdCBET0NUWVBFX05BTUVfU1RBVEUgPSAnRE9DVFlQRV9OQU1FX1NUQVRFJztcbmNvbnN0IEFGVEVSX0RPQ1RZUEVfTkFNRV9TVEFURSA9ICdBRlRFUl9ET0NUWVBFX05BTUVfU1RBVEUnO1xuY29uc3QgQUZURVJfRE9DVFlQRV9QVUJMSUNfS0VZV09SRF9TVEFURSA9ICdBRlRFUl9ET0NUWVBFX1BVQkxJQ19LRVlXT1JEX1NUQVRFJztcbmNvbnN0IEJFRk9SRV9ET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX1NUQVRFID0gJ0JFRk9SRV9ET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX1NUQVRFJztcbmNvbnN0IERPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfRE9VQkxFX1FVT1RFRF9TVEFURSA9ICdET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX0RPVUJMRV9RVU9URURfU1RBVEUnO1xuY29uc3QgRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9TSU5HTEVfUVVPVEVEX1NUQVRFID0gJ0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU0lOR0xFX1FVT1RFRF9TVEFURSc7XG5jb25zdCBBRlRFUl9ET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX1NUQVRFID0gJ0FGVEVSX0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU1RBVEUnO1xuY29uc3QgQkVUV0VFTl9ET0NUWVBFX1BVQkxJQ19BTkRfU1lTVEVNX0lERU5USUZJRVJTX1NUQVRFID0gJ0JFVFdFRU5fRE9DVFlQRV9QVUJMSUNfQU5EX1NZU1RFTV9JREVOVElGSUVSU19TVEFURSc7XG5jb25zdCBBRlRFUl9ET0NUWVBFX1NZU1RFTV9LRVlXT1JEX1NUQVRFID0gJ0FGVEVSX0RPQ1RZUEVfU1lTVEVNX0tFWVdPUkRfU1RBVEUnO1xuY29uc3QgQkVGT1JFX0RPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfU1RBVEUgPSAnQkVGT1JFX0RPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfU1RBVEUnO1xuY29uc3QgRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9ET1VCTEVfUVVPVEVEX1NUQVRFID0gJ0RPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfRE9VQkxFX1FVT1RFRF9TVEFURSc7XG5jb25zdCBET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NJTkdMRV9RVU9URURfU1RBVEUgPSAnRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TSU5HTEVfUVVPVEVEX1NUQVRFJztcbmNvbnN0IEFGVEVSX0RPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfU1RBVEUgPSAnQUZURVJfRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TVEFURSc7XG5jb25zdCBCT0dVU19ET0NUWVBFX1NUQVRFID0gJ0JPR1VTX0RPQ1RZUEVfU1RBVEUnO1xuY29uc3QgQ0RBVEFfU0VDVElPTl9TVEFURSA9ICdDREFUQV9TRUNUSU9OX1NUQVRFJztcbmNvbnN0IENEQVRBX1NFQ1RJT05fQlJBQ0tFVF9TVEFURSA9ICdDREFUQV9TRUNUSU9OX0JSQUNLRVRfU1RBVEUnO1xuY29uc3QgQ0RBVEFfU0VDVElPTl9FTkRfU1RBVEUgPSAnQ0RBVEFfU0VDVElPTl9FTkRfU1RBVEUnO1xuY29uc3QgQ0hBUkFDVEVSX1JFRkVSRU5DRV9TVEFURSA9ICdDSEFSQUNURVJfUkVGRVJFTkNFX1NUQVRFJztcbmNvbnN0IE5BTUVEX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBVEUgPSAnTkFNRURfQ0hBUkFDVEVSX1JFRkVSRU5DRV9TVEFURSc7XG5jb25zdCBBTUJJR1VPVVNfQU1QRVJTQU5EX1NUQVRFID0gJ0FNQklHVU9TX0FNUEVSU0FORF9TVEFURSc7XG5jb25zdCBOVU1FUklDX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBVEUgPSAnTlVNRVJJQ19DSEFSQUNURVJfUkVGRVJFTkNFX1NUQVRFJztcbmNvbnN0IEhFWEFERU1JQ0FMX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBUlRfU1RBVEUgPSAnSEVYQURFTUlDQUxfQ0hBUkFDVEVSX1JFRkVSRU5DRV9TVEFSVF9TVEFURSc7XG5jb25zdCBERUNJTUFMX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBUlRfU1RBVEUgPSAnREVDSU1BTF9DSEFSQUNURVJfUkVGRVJFTkNFX1NUQVJUX1NUQVRFJztcbmNvbnN0IEhFWEFERU1JQ0FMX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBVEUgPSAnSEVYQURFTUlDQUxfQ0hBUkFDVEVSX1JFRkVSRU5DRV9TVEFURSc7XG5jb25zdCBERUNJTUFMX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBVEUgPSAnREVDSU1BTF9DSEFSQUNURVJfUkVGRVJFTkNFX1NUQVRFJztcbmNvbnN0IE5VTUVSSUNfQ0hBUkFDVEVSX1JFRkVSRU5DRV9FTkRfU1RBVEUgPSAnTlVNRVJJQ19DSEFSQUNURVJfUkVGRVJFTkNFX0VORF9TVEFURSc7XG5cbi8vVXRpbHNcblxuLy9PUFRJTUlaQVRJT046IHRoZXNlIHV0aWxpdHkgZnVuY3Rpb25zIHNob3VsZCBub3QgYmUgbW92ZWQgb3V0IG9mIHRoaXMgbW9kdWxlLiBWOCBDcmFua3NoYWZ0IHdpbGwgbm90IGlubGluZVxuLy90aGlzIGZ1bmN0aW9ucyBpZiB0aGV5IHdpbGwgYmUgc2l0dWF0ZWQgaW4gYW5vdGhlciBtb2R1bGUgZHVlIHRvIGNvbnRleHQgc3dpdGNoLlxuLy9BbHdheXMgcGVyZm9ybSBpbmxpbmluZyBjaGVjayBiZWZvcmUgbW9kaWZ5aW5nIHRoaXMgZnVuY3Rpb25zICgnbm9kZSAtLXRyYWNlLWlubGluaW5nJykuXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UoY3ApIHtcbiAgICByZXR1cm4gY3AgPT09ICQuU1BBQ0UgfHwgY3AgPT09ICQuTElORV9GRUVEIHx8IGNwID09PSAkLlRBQlVMQVRJT04gfHwgY3AgPT09ICQuRk9STV9GRUVEO1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpRGlnaXQoY3ApIHtcbiAgICByZXR1cm4gY3AgPj0gJC5ESUdJVF8wICYmIGNwIDw9ICQuRElHSVRfOTtcbn1cblxuZnVuY3Rpb24gaXNBc2NpaVVwcGVyKGNwKSB7XG4gICAgcmV0dXJuIGNwID49ICQuTEFUSU5fQ0FQSVRBTF9BICYmIGNwIDw9ICQuTEFUSU5fQ0FQSVRBTF9aO1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpTG93ZXIoY3ApIHtcbiAgICByZXR1cm4gY3AgPj0gJC5MQVRJTl9TTUFMTF9BICYmIGNwIDw9ICQuTEFUSU5fU01BTExfWjtcbn1cblxuZnVuY3Rpb24gaXNBc2NpaUxldHRlcihjcCkge1xuICAgIHJldHVybiBpc0FzY2lpTG93ZXIoY3ApIHx8IGlzQXNjaWlVcHBlcihjcCk7XG59XG5cbmZ1bmN0aW9uIGlzQXNjaWlBbHBoYU51bWVyaWMoY3ApIHtcbiAgICByZXR1cm4gaXNBc2NpaUxldHRlcihjcCkgfHwgaXNBc2NpaURpZ2l0KGNwKTtcbn1cblxuZnVuY3Rpb24gaXNBc2NpaVVwcGVySGV4RGlnaXQoY3ApIHtcbiAgICByZXR1cm4gY3AgPj0gJC5MQVRJTl9DQVBJVEFMX0EgJiYgY3AgPD0gJC5MQVRJTl9DQVBJVEFMX0Y7XG59XG5cbmZ1bmN0aW9uIGlzQXNjaWlMb3dlckhleERpZ2l0KGNwKSB7XG4gICAgcmV0dXJuIGNwID49ICQuTEFUSU5fU01BTExfQSAmJiBjcCA8PSAkLkxBVElOX1NNQUxMX0Y7XG59XG5cbmZ1bmN0aW9uIGlzQXNjaWlIZXhEaWdpdChjcCkge1xuICAgIHJldHVybiBpc0FzY2lpRGlnaXQoY3ApIHx8IGlzQXNjaWlVcHBlckhleERpZ2l0KGNwKSB8fCBpc0FzY2lpTG93ZXJIZXhEaWdpdChjcCk7XG59XG5cbmZ1bmN0aW9uIHRvQXNjaWlMb3dlckNvZGVQb2ludChjcCkge1xuICAgIHJldHVybiBjcCArIDB4MDAyMDtcbn1cblxuLy9OT1RFOiBTdHJpbmcuZnJvbUNoYXJDb2RlKCkgZnVuY3Rpb24gY2FuIGhhbmRsZSBvbmx5IGNoYXJhY3RlcnMgZnJvbSBCTVAgc3Vic2V0LlxuLy9Tbywgd2UgbmVlZCB0byB3b3JrYXJvdW5kIHRoaXMgbWFudWFsbHkuXG4vLyhzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL2Zyb21DaGFyQ29kZSNHZXR0aW5nX2l0X3RvX3dvcmtfd2l0aF9oaWdoZXJfdmFsdWVzKVxuZnVuY3Rpb24gdG9DaGFyKGNwKSB7XG4gICAgaWYgKGNwIDw9IDB4ZmZmZikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjcCk7XG4gICAgfVxuXG4gICAgY3AgLT0gMHgxMDAwMDtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGNwID4+PiAxMCkgJiAweDNmZikgfCAweGQ4MDApICsgU3RyaW5nLmZyb21DaGFyQ29kZSgweGRjMDAgfCAoY3AgJiAweDNmZikpO1xufVxuXG5mdW5jdGlvbiB0b0FzY2lpTG93ZXJDaGFyKGNwKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodG9Bc2NpaUxvd2VyQ29kZVBvaW50KGNwKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmROYW1lZEVudGl0eVRyZWVCcmFuY2gobm9kZUl4LCBjcCkge1xuICAgIGNvbnN0IGJyYW5jaENvdW50ID0gbmVUcmVlWysrbm9kZUl4XTtcbiAgICBsZXQgbG8gPSArK25vZGVJeDtcbiAgICBsZXQgaGkgPSBsbyArIGJyYW5jaENvdW50IC0gMTtcblxuICAgIHdoaWxlIChsbyA8PSBoaSkge1xuICAgICAgICBjb25zdCBtaWQgPSAobG8gKyBoaSkgPj4+IDE7XG4gICAgICAgIGNvbnN0IG1pZENwID0gbmVUcmVlW21pZF07XG5cbiAgICAgICAgaWYgKG1pZENwIDwgY3ApIHtcbiAgICAgICAgICAgIGxvID0gbWlkICsgMTtcbiAgICAgICAgfSBlbHNlIGlmIChtaWRDcCA+IGNwKSB7XG4gICAgICAgICAgICBoaSA9IG1pZCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmVUcmVlW21pZCArIGJyYW5jaENvdW50XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbn1cblxuLy9Ub2tlbml6ZXJcbmNsYXNzIFRva2VuaXplciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucHJlcHJvY2Vzc29yID0gbmV3IFByZXByb2Nlc3NvcigpO1xuXG4gICAgICAgIHRoaXMudG9rZW5RdWV1ZSA9IFtdO1xuXG4gICAgICAgIHRoaXMuYWxsb3dDREFUQSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICB0aGlzLnJldHVyblN0YXRlID0gJyc7XG5cbiAgICAgICAgdGhpcy5jaGFyUmVmQ29kZSA9IC0xO1xuICAgICAgICB0aGlzLnRlbXBCdWZmID0gW107XG4gICAgICAgIHRoaXMubGFzdFN0YXJ0VGFnTmFtZSA9ICcnO1xuXG4gICAgICAgIHRoaXMuY29uc3VtZWRBZnRlclNuYXBzaG90ID0gLTE7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4gPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VycmVudEF0dHIgPSBudWxsO1xuICAgIH1cblxuICAgIC8vRXJyb3JzXG4gICAgX2VycigpIHtcbiAgICAgICAgLy8gTk9URTogZXJyIHJlcG9ydGluZyBpcyBub29wIGJ5IGRlZmF1bHQuIEVuYWJsZWQgYnkgbWl4aW4uXG4gICAgfVxuXG4gICAgX2Vyck9uTmV4dENvZGVQb2ludChlcnIpIHtcbiAgICAgICAgdGhpcy5fY29uc3VtZSgpO1xuICAgICAgICB0aGlzLl9lcnIoZXJyKTtcbiAgICAgICAgdGhpcy5fdW5jb25zdW1lKCk7XG4gICAgfVxuXG4gICAgLy9BUElcbiAgICBnZXROZXh0VG9rZW4oKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy50b2tlblF1ZXVlLmxlbmd0aCAmJiB0aGlzLmFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5jb25zdW1lZEFmdGVyU25hcHNob3QgPSAwO1xuXG4gICAgICAgICAgICBjb25zdCBjcCA9IHRoaXMuX2NvbnN1bWUoKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9lbnN1cmVIaWJlcm5hdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpc1t0aGlzLnN0YXRlXShjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy50b2tlblF1ZXVlLnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgd3JpdGUoY2h1bmssIGlzTGFzdENodW5rKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzb3Iud3JpdGUoY2h1bmssIGlzTGFzdENodW5rKTtcbiAgICB9XG5cbiAgICBpbnNlcnRIdG1sQXRDdXJyZW50UG9zKGNodW5rKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzb3IuaW5zZXJ0SHRtbEF0Q3VycmVudFBvcyhjaHVuayk7XG4gICAgfVxuXG4gICAgLy9IaWJlcm5hdGlvblxuICAgIF9lbnN1cmVIaWJlcm5hdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzc29yLmVuZE9mQ2h1bmtIaXQpIHtcbiAgICAgICAgICAgIGZvciAoOyB0aGlzLmNvbnN1bWVkQWZ0ZXJTbmFwc2hvdCA+IDA7IHRoaXMuY29uc3VtZWRBZnRlclNuYXBzaG90LS0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXByb2Nlc3Nvci5yZXRyZWF0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnRva2VuUXVldWUucHVzaCh7IHR5cGU6IFRva2VuaXplci5ISUJFUk5BVElPTl9UT0tFTiB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9Db25zdW1wdGlvblxuICAgIF9jb25zdW1lKCkge1xuICAgICAgICB0aGlzLmNvbnN1bWVkQWZ0ZXJTbmFwc2hvdCsrO1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVwcm9jZXNzb3IuYWR2YW5jZSgpO1xuICAgIH1cblxuICAgIF91bmNvbnN1bWUoKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZWRBZnRlclNuYXBzaG90LS07XG4gICAgICAgIHRoaXMucHJlcHJvY2Vzc29yLnJldHJlYXQoKTtcbiAgICB9XG5cbiAgICBfcmVjb25zdW1lSW5TdGF0ZShzdGF0ZSkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMuX3VuY29uc3VtZSgpO1xuICAgIH1cblxuICAgIF9jb25zdW1lU2VxdWVuY2VJZk1hdGNoKHBhdHRlcm4sIHN0YXJ0Q3AsIGNhc2VTZW5zaXRpdmUpIHtcbiAgICAgICAgbGV0IGNvbnN1bWVkQ291bnQgPSAwO1xuICAgICAgICBsZXQgaXNNYXRjaCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5MZW5ndGggPSBwYXR0ZXJuLmxlbmd0aDtcbiAgICAgICAgbGV0IHBhdHRlcm5Qb3MgPSAwO1xuICAgICAgICBsZXQgY3AgPSBzdGFydENwO1xuICAgICAgICBsZXQgcGF0dGVybkNwID0gdm9pZCAwO1xuXG4gICAgICAgIGZvciAoOyBwYXR0ZXJuUG9zIDwgcGF0dGVybkxlbmd0aDsgcGF0dGVyblBvcysrKSB7XG4gICAgICAgICAgICBpZiAocGF0dGVyblBvcyA+IDApIHtcbiAgICAgICAgICAgICAgICBjcCA9IHRoaXMuX2NvbnN1bWUoKTtcbiAgICAgICAgICAgICAgICBjb25zdW1lZENvdW50Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjcCA9PT0gJC5FT0YpIHtcbiAgICAgICAgICAgICAgICBpc01hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhdHRlcm5DcCA9IHBhdHRlcm5bcGF0dGVyblBvc107XG5cbiAgICAgICAgICAgIGlmIChjcCAhPT0gcGF0dGVybkNwICYmIChjYXNlU2Vuc2l0aXZlIHx8IGNwICE9PSB0b0FzY2lpTG93ZXJDb2RlUG9pbnQocGF0dGVybkNwKSkpIHtcbiAgICAgICAgICAgICAgICBpc01hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTWF0Y2gpIHtcbiAgICAgICAgICAgIHdoaWxlIChjb25zdW1lZENvdW50LS0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91bmNvbnN1bWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc01hdGNoO1xuICAgIH1cblxuICAgIC8vVGVtcCBidWZmZXJcbiAgICBfaXNUZW1wQnVmZmVyRXF1YWxUb1NjcmlwdFN0cmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMudGVtcEJ1ZmYubGVuZ3RoICE9PSAkJC5TQ1JJUFRfU1RSSU5HLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRlbXBCdWZmLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50ZW1wQnVmZltpXSAhPT0gJCQuU0NSSVBUX1NUUklOR1tpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vVG9rZW4gY3JlYXRpb25cbiAgICBfY3JlYXRlU3RhcnRUYWdUb2tlbigpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4gPSB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlbml6ZXIuU1RBUlRfVEFHX1RPS0VOLFxuICAgICAgICAgICAgdGFnTmFtZTogJycsXG4gICAgICAgICAgICBzZWxmQ2xvc2luZzogZmFsc2UsXG4gICAgICAgICAgICBhY2tTZWxmQ2xvc2luZzogZmFsc2UsXG4gICAgICAgICAgICBhdHRyczogW11cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfY3JlYXRlRW5kVGFnVG9rZW4oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuID0ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5pemVyLkVORF9UQUdfVE9LRU4sXG4gICAgICAgICAgICB0YWdOYW1lOiAnJyxcbiAgICAgICAgICAgIHNlbGZDbG9zaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGF0dHJzOiBbXVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9jcmVhdGVDb21tZW50VG9rZW4oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuID0ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5pemVyLkNPTU1FTlRfVE9LRU4sXG4gICAgICAgICAgICBkYXRhOiAnJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9jcmVhdGVEb2N0eXBlVG9rZW4oaW5pdGlhbE5hbWUpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4gPSB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlbml6ZXIuRE9DVFlQRV9UT0tFTixcbiAgICAgICAgICAgIG5hbWU6IGluaXRpYWxOYW1lLFxuICAgICAgICAgICAgZm9yY2VRdWlya3M6IGZhbHNlLFxuICAgICAgICAgICAgcHVibGljSWQ6IG51bGwsXG4gICAgICAgICAgICBzeXN0ZW1JZDogbnVsbFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9jcmVhdGVDaGFyYWN0ZXJUb2tlbih0eXBlLCBjaCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbiA9IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBjaGFyczogY2hcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfY3JlYXRlRU9GVG9rZW4oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuID0geyB0eXBlOiBUb2tlbml6ZXIuRU9GX1RPS0VOIH07XG4gICAgfVxuXG4gICAgLy9UYWcgYXR0cmlidXRlc1xuICAgIF9jcmVhdGVBdHRyKGF0dHJOYW1lRmlyc3RDaCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRBdHRyID0ge1xuICAgICAgICAgICAgbmFtZTogYXR0ck5hbWVGaXJzdENoLFxuICAgICAgICAgICAgdmFsdWU6ICcnXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgX2xlYXZlQXR0ck5hbWUodG9TdGF0ZSkge1xuICAgICAgICBpZiAoVG9rZW5pemVyLmdldFRva2VuQXR0cih0aGlzLmN1cnJlbnRUb2tlbiwgdGhpcy5jdXJyZW50QXR0ci5uYW1lKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uYXR0cnMucHVzaCh0aGlzLmN1cnJlbnRBdHRyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuZHVwbGljYXRlQXR0cmlidXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB0b1N0YXRlO1xuICAgIH1cblxuICAgIF9sZWF2ZUF0dHJWYWx1ZSh0b1N0YXRlKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB0b1N0YXRlO1xuICAgIH1cblxuICAgIC8vVG9rZW4gZW1pc3Npb25cbiAgICBfZW1pdEN1cnJlbnRUb2tlbigpIHtcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRDaGFyYWN0ZXJUb2tlbigpO1xuXG4gICAgICAgIGNvbnN0IGN0ID0gdGhpcy5jdXJyZW50VG9rZW47XG5cbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4gPSBudWxsO1xuXG4gICAgICAgIC8vTk9URTogc3RvcmUgZW1pdGVkIHN0YXJ0IHRhZydzIHRhZ05hbWUgdG8gZGV0ZXJtaW5lIGlzIHRoZSBmb2xsb3dpbmcgZW5kIHRhZyB0b2tlbiBpcyBhcHByb3ByaWF0ZS5cbiAgICAgICAgaWYgKGN0LnR5cGUgPT09IFRva2VuaXplci5TVEFSVF9UQUdfVE9LRU4pIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFN0YXJ0VGFnTmFtZSA9IGN0LnRhZ05hbWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3QudHlwZSA9PT0gVG9rZW5pemVyLkVORF9UQUdfVE9LRU4pIHtcbiAgICAgICAgICAgIGlmIChjdC5hdHRycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lbmRUYWdXaXRoQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdC5zZWxmQ2xvc2luZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihFUlIuZW5kVGFnV2l0aFRyYWlsaW5nU29saWR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRva2VuUXVldWUucHVzaChjdCk7XG4gICAgfVxuXG4gICAgX2VtaXRDdXJyZW50Q2hhcmFjdGVyVG9rZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbikge1xuICAgICAgICAgICAgdGhpcy50b2tlblF1ZXVlLnB1c2godGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4pO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2VtaXRFT0ZUb2tlbigpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlRU9GVG9rZW4oKTtcbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgIH1cblxuICAgIC8vQ2hhcmFjdGVycyBlbWlzc2lvblxuXG4gICAgLy9PUFRJTUlaQVRJT046IHNwZWNpZmljYXRpb24gdXNlcyBvbmx5IG9uZSB0eXBlIG9mIGNoYXJhY3RlciB0b2tlbnMgKG9uZSB0b2tlbiBwZXIgY2hhcmFjdGVyKS5cbiAgICAvL1RoaXMgY2F1c2VzIGEgaHVnZSBtZW1vcnkgb3ZlcmhlYWQgYW5kIGEgbG90IG9mIHVubmVjZXNzYXJ5IHBhcnNlciBsb29wcy4gcGFyc2U1IHVzZXMgMyBncm91cHMgb2YgY2hhcmFjdGVycy5cbiAgICAvL0lmIHdlIGhhdmUgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYmVsb25nIHRvIHRoZSBzYW1lIGdyb3VwLCBwYXJzZXIgY2FuIHByb2Nlc3MgaXRcbiAgICAvL2FzIGEgc2luZ2xlIHNvbGlkIGNoYXJhY3RlciB0b2tlbi5cbiAgICAvL1NvLCB0aGVyZSBhcmUgMyB0eXBlcyBvZiBjaGFyYWN0ZXIgdG9rZW5zIGluIHBhcnNlNTpcbiAgICAvLzEpTlVMTF9DSEFSQUNURVJfVE9LRU4gLSBcXHUwMDAwLWNoYXJhY3RlciBzZXF1ZW5jZXMgKGUuZy4gJ1xcdTAwMDBcXHUwMDAwXFx1MDAwMCcpXG4gICAgLy8yKVdISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOIC0gYW55IHdoaXRlc3BhY2UvbmV3LWxpbmUgY2hhcmFjdGVyIHNlcXVlbmNlcyAoZS5nLiAnXFxuICBcXHJcXHQgICBcXGYnKVxuICAgIC8vMylDSEFSQUNURVJfVE9LRU4gLSBhbnkgY2hhcmFjdGVyIHNlcXVlbmNlIHdoaWNoIGRvbid0IGJlbG9uZyB0byBncm91cHMgMSBhbmQgMiAoZS5nLiAnYWJjZGVmMTIzNEBAIyQlXicpXG4gICAgX2FwcGVuZENoYXJUb0N1cnJlbnRDaGFyYWN0ZXJUb2tlbih0eXBlLCBjaCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4gJiYgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4udHlwZSAhPT0gdHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRDaGFyYWN0ZXJUb2tlbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENoYXJhY3RlclRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbi5jaGFycyArPSBjaDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUNoYXJhY3RlclRva2VuKHR5cGUsIGNoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9lbWl0Q29kZVBvaW50KGNwKSB7XG4gICAgICAgIGxldCB0eXBlID0gVG9rZW5pemVyLkNIQVJBQ1RFUl9UT0tFTjtcblxuICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSkge1xuICAgICAgICAgICAgdHlwZSA9IFRva2VuaXplci5XSElURVNQQUNFX0NIQVJBQ1RFUl9UT0tFTjtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XG4gICAgICAgICAgICB0eXBlID0gVG9rZW5pemVyLk5VTExfQ0hBUkFDVEVSX1RPS0VOO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYXBwZW5kQ2hhclRvQ3VycmVudENoYXJhY3RlclRva2VuKHR5cGUsIHRvQ2hhcihjcCkpO1xuICAgIH1cblxuICAgIF9lbWl0U2V2ZXJhbENvZGVQb2ludHMoY29kZVBvaW50cykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY29kZVBvaW50c1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL05PVEU6IHVzZWQgdGhlbiB3ZSBlbWl0IGNoYXJhY3RlciBleHBsaWNpdGx5LiBUaGlzIGlzIGFsd2F5cyBhIG5vbi13aGl0ZXNwYWNlIGFuZCBhIG5vbi1udWxsIGNoYXJhY3Rlci5cbiAgICAvL1NvIHdlIGNhbiBhdm9pZCBhZGRpdGlvbmFsIGNoZWNrcyBoZXJlLlxuICAgIF9lbWl0Q2hhcnMoY2gpIHtcbiAgICAgICAgdGhpcy5fYXBwZW5kQ2hhclRvQ3VycmVudENoYXJhY3RlclRva2VuKFRva2VuaXplci5DSEFSQUNURVJfVE9LRU4sIGNoKTtcbiAgICB9XG5cbiAgICAvLyBDaGFyYWN0ZXIgcmVmZXJlbmNlIGhlbHBlcnNcbiAgICBfbWF0Y2hOYW1lZENoYXJhY3RlclJlZmVyZW5jZShzdGFydENwKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBsZXQgZXhjZXNzID0gMTtcbiAgICAgICAgbGV0IGkgPSBmaW5kTmFtZWRFbnRpdHlUcmVlQnJhbmNoKDAsIHN0YXJ0Q3ApO1xuXG4gICAgICAgIHRoaXMudGVtcEJ1ZmYucHVzaChzdGFydENwKTtcblxuICAgICAgICB3aGlsZSAoaSA+IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gbmVUcmVlW2ldO1xuICAgICAgICAgICAgY29uc3QgaW5Ob2RlID0gY3VycmVudCA8IE1BWF9CUkFOQ0hfTUFSS0VSX1ZBTFVFO1xuICAgICAgICAgICAgY29uc3Qgbm9kZVdpdGhEYXRhID0gaW5Ob2RlICYmIGN1cnJlbnQgJiBIQVNfREFUQV9GTEFHO1xuXG4gICAgICAgICAgICBpZiAobm9kZVdpdGhEYXRhKSB7XG4gICAgICAgICAgICAgICAgLy9OT1RFOiB3ZSB1c2UgZ3JlZWR5IHNlYXJjaCwgc28gd2UgY29udGludWUgbG9va3VwIGF0IHRoaXMgcG9pbnRcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50ICYgREFUQV9EVVBMRVRfRkxBRyA/IFtuZVRyZWVbKytpXSwgbmVUcmVlWysraV1dIDogW25lVHJlZVsrK2ldXTtcbiAgICAgICAgICAgICAgICBleGNlc3MgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjcCA9IHRoaXMuX2NvbnN1bWUoKTtcblxuICAgICAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcbiAgICAgICAgICAgIGV4Y2VzcysrO1xuXG4gICAgICAgICAgICBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbk5vZGUpIHtcbiAgICAgICAgICAgICAgICBpID0gY3VycmVudCAmIEhBU19CUkFOQ0hFU19GTEFHID8gZmluZE5hbWVkRW50aXR5VHJlZUJyYW5jaChpLCBjcCkgOiAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSA9IGNwID09PSBjdXJyZW50ID8gKytpIDogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoZXhjZXNzLS0pIHtcbiAgICAgICAgICAgIHRoaXMudGVtcEJ1ZmYucG9wKCk7XG4gICAgICAgICAgICB0aGlzLl91bmNvbnN1bWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgX2lzQ2hhcmFjdGVyUmVmZXJlbmNlSW5BdHRyaWJ1dGUoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnJldHVyblN0YXRlID09PSBBVFRSSUJVVEVfVkFMVUVfRE9VQkxFX1FVT1RFRF9TVEFURSB8fFxuICAgICAgICAgICAgdGhpcy5yZXR1cm5TdGF0ZSA9PT0gQVRUUklCVVRFX1ZBTFVFX1NJTkdMRV9RVU9URURfU1RBVEUgfHxcbiAgICAgICAgICAgIHRoaXMucmV0dXJuU3RhdGUgPT09IEFUVFJJQlVURV9WQUxVRV9VTlFVT1RFRF9TVEFURVxuICAgICAgICApO1xuICAgIH1cblxuICAgIF9pc0NoYXJhY3RlclJlZmVyZW5jZUF0dHJpYnV0ZVF1aXJrKHdpdGhTZW1pY29sb24pIHtcbiAgICAgICAgaWYgKCF3aXRoU2VtaWNvbG9uICYmIHRoaXMuX2lzQ2hhcmFjdGVyUmVmZXJlbmNlSW5BdHRyaWJ1dGUoKSkge1xuICAgICAgICAgICAgY29uc3QgbmV4dENwID0gdGhpcy5fY29uc3VtZSgpO1xuXG4gICAgICAgICAgICB0aGlzLl91bmNvbnN1bWUoKTtcblxuICAgICAgICAgICAgcmV0dXJuIG5leHRDcCA9PT0gJC5FUVVBTFNfU0lHTiB8fCBpc0FzY2lpQWxwaGFOdW1lcmljKG5leHRDcCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX2ZsdXNoQ29kZVBvaW50c0NvbnN1bWVkQXNDaGFyYWN0ZXJSZWZlcmVuY2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0NoYXJhY3RlclJlZmVyZW5jZUluQXR0cmlidXRlKCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50ZW1wQnVmZi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEF0dHIudmFsdWUgKz0gdG9DaGFyKHRoaXMudGVtcEJ1ZmZbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdFNldmVyYWxDb2RlUG9pbnRzKHRoaXMudGVtcEJ1ZmYpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZW1wQnVmZiA9IFtdO1xuICAgIH1cblxuICAgIC8vIFN0YXRlIG1hY2hpbmVcblxuICAgIC8vIERhdGEgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtEQVRBX1NUQVRFXShjcCkge1xuICAgICAgICB0aGlzLnByZXByb2Nlc3Nvci5kcm9wUGFyc2VkQ2h1bmsoKTtcblxuICAgICAgICBpZiAoY3AgPT09ICQuTEVTU19USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBUQUdfT1BFTl9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5BTVBFUlNBTkQpIHtcbiAgICAgICAgICAgIHRoaXMucmV0dXJuU3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuTlVMTCkge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAgUkNEQVRBIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbUkNEQVRBX1NUQVRFXShjcCkge1xuICAgICAgICB0aGlzLnByZXByb2Nlc3Nvci5kcm9wUGFyc2VkQ2h1bmsoKTtcblxuICAgICAgICBpZiAoY3AgPT09ICQuQU1QRVJTQU5EKSB7XG4gICAgICAgICAgICB0aGlzLnJldHVyblN0YXRlID0gUkNEQVRBX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuTEVTU19USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBSQ0RBVEFfTEVTU19USEFOX1NJR05fU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuTlVMTCkge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnModW5pY29kZS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJBV1RFWFQgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtSQVdURVhUX1NUQVRFXShjcCkge1xuICAgICAgICB0aGlzLnByZXByb2Nlc3Nvci5kcm9wUGFyc2VkQ2h1bmsoKTtcblxuICAgICAgICBpZiAoY3AgPT09ICQuTEVTU19USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBSQVdURVhUX0xFU1NfVEhBTl9TSUdOX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKHVuaWNvZGUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTY3JpcHQgZGF0YSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW1NDUklQVF9EQVRBX1NUQVRFXShjcCkge1xuICAgICAgICB0aGlzLnByZXByb2Nlc3Nvci5kcm9wUGFyc2VkQ2h1bmsoKTtcblxuICAgICAgICBpZiAoY3AgPT09ICQuTEVTU19USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9MRVNTX1RIQU5fU0lHTl9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycyh1bmljb2RlLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUik7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUExBSU5URVhUIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbUExBSU5URVhUX1NUQVRFXShjcCkge1xuICAgICAgICB0aGlzLnByZXByb2Nlc3Nvci5kcm9wUGFyc2VkQ2h1bmsoKTtcblxuICAgICAgICBpZiAoY3AgPT09ICQuTlVMTCkge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnModW5pY29kZS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRhZyBvcGVuIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbVEFHX09QRU5fU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChjcCA9PT0gJC5FWENMQU1BVElPTl9NQVJLKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gTUFSS1VQX0RFQ0xBUkFUSU9OX09QRU5fU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuU09MSURVUykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEVORF9UQUdfT1BFTl9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FzY2lpTGV0dGVyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlU3RhcnRUYWdUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShUQUdfTkFNRV9TVEFURSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuUVVFU1RJT05fTUFSSykge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi51bmV4cGVjdGVkUXVlc3Rpb25NYXJrSW5zdGVhZE9mVGFnTmFtZSk7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVDb21tZW50VG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoQk9HVVNfQ09NTUVOVF9TVEFURSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkJlZm9yZVRhZ05hbWUpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8Jyk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuaW52YWxpZEZpcnN0Q2hhcmFjdGVyT2ZUYWdOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPCcpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShEQVRBX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVuZCB0YWcgb3BlbiBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0VORF9UQUdfT1BFTl9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzQXNjaWlMZXR0ZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVFbmRUYWdUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShUQUdfTkFNRV9TVEFURSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubWlzc2luZ0VuZFRhZ05hbWUpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkJlZm9yZVRhZ05hbWUpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8LycpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmludmFsaWRGaXJzdENoYXJhY3Rlck9mVGFnTmFtZSk7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVDb21tZW50VG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoQk9HVVNfQ09NTUVOVF9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUYWcgbmFtZSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW1RBR19OQU1FX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEJFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5TT0xJRFVTKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU0VMRl9DTE9TSU5HX1NUQVJUX1RBR19TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4udGFnTmFtZSArPSB0b0FzY2lpTG93ZXJDaGFyKGNwKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLnRhZ05hbWUgKz0gdW5pY29kZS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluVGFnKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4udGFnTmFtZSArPSB0b0NoYXIoY3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUkNEQVRBIGxlc3MtdGhhbiBzaWduIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbUkNEQVRBX0xFU1NfVEhBTl9TSUdOX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoY3AgPT09ICQuU09MSURVUykge1xuICAgICAgICAgICAgdGhpcy50ZW1wQnVmZiA9IFtdO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFJDREFUQV9FTkRfVEFHX09QRU5fU1RBVEU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwnKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoUkNEQVRBX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJDREFUQSBlbmQgdGFnIG9wZW4gc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtSQ0RBVEFfRU5EX1RBR19PUEVOX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoaXNBc2NpaUxldHRlcihjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUVuZFRhZ1Rva2VuKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKFJDREFUQV9FTkRfVEFHX05BTUVfU1RBVEUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8LycpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShSQ0RBVEFfU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUkNEQVRBIGVuZCB0YWcgbmFtZSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW1JDREFUQV9FTkRfVEFHX05BTUVfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpVXBwZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi50YWdOYW1lICs9IHRvQXNjaWlMb3dlckNoYXIoY3ApO1xuICAgICAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FzY2lpTG93ZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi50YWdOYW1lICs9IHRvQ2hhcihjcCk7XG4gICAgICAgICAgICB0aGlzLnRlbXBCdWZmLnB1c2goY3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMubGFzdFN0YXJ0VGFnTmFtZSA9PT0gdGhpcy5jdXJyZW50VG9rZW4udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBCRUZPUkVfQVRUUklCVVRFX05BTUVfU1RBVEU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3AgPT09ICQuU09MSURVUykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU0VMRl9DTE9TSU5HX1NUQVJUX1RBR19TVEFURTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwvJyk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0U2V2ZXJhbENvZGVQb2ludHModGhpcy50ZW1wQnVmZik7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKFJDREFUQV9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSQVdURVhUIGxlc3MtdGhhbiBzaWduIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbUkFXVEVYVF9MRVNTX1RIQU5fU0lHTl9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLlNPTElEVVMpIHtcbiAgICAgICAgICAgIHRoaXMudGVtcEJ1ZmYgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBSQVdURVhUX0VORF9UQUdfT1BFTl9TVEFURTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPCcpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShSQVdURVhUX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJBV1RFWFQgZW5kIHRhZyBvcGVuIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbUkFXVEVYVF9FTkRfVEFHX09QRU5fU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpTGV0dGVyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlRW5kVGFnVG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoUkFXVEVYVF9FTkRfVEFHX05BTUVfU1RBVEUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8LycpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShSQVdURVhUX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJBV1RFWFQgZW5kIHRhZyBuYW1lIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbUkFXVEVYVF9FTkRfVEFHX05BTUVfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpVXBwZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi50YWdOYW1lICs9IHRvQXNjaWlMb3dlckNoYXIoY3ApO1xuICAgICAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FzY2lpTG93ZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi50YWdOYW1lICs9IHRvQ2hhcihjcCk7XG4gICAgICAgICAgICB0aGlzLnRlbXBCdWZmLnB1c2goY3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMubGFzdFN0YXJ0VGFnTmFtZSA9PT0gdGhpcy5jdXJyZW50VG9rZW4udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBCRUZPUkVfQVRUUklCVVRFX05BTUVfU1RBVEU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3AgPT09ICQuU09MSURVUykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU0VMRl9DTE9TSU5HX1NUQVJUX1RBR19TVEFURTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwvJyk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0U2V2ZXJhbENvZGVQb2ludHModGhpcy50ZW1wQnVmZik7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKFJBV1RFWFRfU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2NyaXB0IGRhdGEgbGVzcy10aGFuIHNpZ24gc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtTQ1JJUFRfREFUQV9MRVNTX1RIQU5fU0lHTl9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLlNPTElEVVMpIHtcbiAgICAgICAgICAgIHRoaXMudGVtcEJ1ZmYgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9FTkRfVEFHX09QRU5fU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRVhDTEFNQVRJT05fTUFSSykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0VTQ0FQRV9TVEFSVF9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPCEnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPCcpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShTQ1JJUFRfREFUQV9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTY3JpcHQgZGF0YSBlbmQgdGFnIG9wZW4gc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtTQ1JJUFRfREFUQV9FTkRfVEFHX09QRU5fU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpTGV0dGVyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlRW5kVGFnVG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoU0NSSVBUX0RBVEFfRU5EX1RBR19OQU1FX1NUQVRFKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPC8nKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoU0NSSVBUX0RBVEFfU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2NyaXB0IGRhdGEgZW5kIHRhZyBuYW1lIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbU0NSSVBUX0RBVEFfRU5EX1RBR19OQU1FX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4udGFnTmFtZSArPSB0b0FzY2lpTG93ZXJDaGFyKGNwKTtcbiAgICAgICAgICAgIHRoaXMudGVtcEJ1ZmYucHVzaChjcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBc2NpaUxvd2VyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4udGFnTmFtZSArPSB0b0NoYXIoY3ApO1xuICAgICAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RTdGFydFRhZ05hbWUgPT09IHRoaXMuY3VycmVudFRva2VuLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gQkVGT1JFX0FUVFJJQlVURV9OQU1FX1NUQVRFO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5TT0xJRFVTKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTRUxGX0NMT1NJTkdfU1RBUlRfVEFHX1NUQVRFO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwvJyk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0U2V2ZXJhbENvZGVQb2ludHModGhpcy50ZW1wQnVmZik7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKFNDUklQVF9EQVRBX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNjcmlwdCBkYXRhIGVzY2FwZSBzdGFydCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW1NDUklQVF9EQVRBX0VTQ0FQRV9TVEFSVF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0VTQ0FQRV9TVEFSVF9EQVNIX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCctJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKFNDUklQVF9EQVRBX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNjcmlwdCBkYXRhIGVzY2FwZSBzdGFydCBkYXNoIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbU0NSSVBUX0RBVEFfRVNDQVBFX1NUQVJUX0RBU0hfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChjcCA9PT0gJC5IWVBIRU5fTUlOVVMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9FU0NBUEVEX0RBU0hfREFTSF9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnLScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShTQ1JJUFRfREFUQV9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTY3JpcHQgZGF0YSBlc2NhcGVkIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbU0NSSVBUX0RBVEFfRVNDQVBFRF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0VTQ0FQRURfREFTSF9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnLScpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkxFU1NfVEhBTl9TSUdOKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRVNDQVBFRF9MRVNTX1RIQU5fU0lHTl9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycyh1bmljb2RlLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUik7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluU2NyaXB0SHRtbENvbW1lbnRMaWtlVGV4dCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2NyaXB0IGRhdGEgZXNjYXBlZCBkYXNoIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbU0NSSVBUX0RBVEFfRVNDQVBFRF9EQVNIX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoY3AgPT09ICQuSFlQSEVOX01JTlVTKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRVNDQVBFRF9EQVNIX0RBU0hfU1RBVEU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJy0nKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5MRVNTX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0VTQ0FQRURfTEVTU19USEFOX1NJR05fU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuTlVMTCkge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRVNDQVBFRF9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycyh1bmljb2RlLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUik7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluU2NyaXB0SHRtbENvbW1lbnRMaWtlVGV4dCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9FU0NBUEVEX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTY3JpcHQgZGF0YSBlc2NhcGVkIGRhc2ggZGFzaCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW1NDUklQVF9EQVRBX0VTQ0FQRURfREFTSF9EQVNIX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoY3AgPT09ICQuSFlQSEVOX01JTlVTKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJy0nKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5MRVNTX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0VTQ0FQRURfTEVTU19USEFOX1NJR05fU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPicpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0VTQ0FQRURfU1RBVEU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnModW5pY29kZS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJblNjcmlwdEh0bWxDb21tZW50TGlrZVRleHQpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRVNDQVBFRF9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2NyaXB0IGRhdGEgZXNjYXBlZCBsZXNzLXRoYW4gc2lnbiBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW1NDUklQVF9EQVRBX0VTQ0FQRURfTEVTU19USEFOX1NJR05fU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChjcCA9PT0gJC5TT0xJRFVTKSB7XG4gICAgICAgICAgICB0aGlzLnRlbXBCdWZmID0gW107XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRVNDQVBFRF9FTkRfVEFHX09QRU5fU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBc2NpaUxldHRlcihjcCkpIHtcbiAgICAgICAgICAgIHRoaXMudGVtcEJ1ZmYgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPCcpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFX1NUQVJUX1NUQVRFKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPCcpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShTQ1JJUFRfREFUQV9FU0NBUEVEX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNjcmlwdCBkYXRhIGVzY2FwZWQgZW5kIHRhZyBvcGVuIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbU0NSSVBUX0RBVEFfRVNDQVBFRF9FTkRfVEFHX09QRU5fU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpTGV0dGVyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlRW5kVGFnVG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoU0NSSVBUX0RBVEFfRVNDQVBFRF9FTkRfVEFHX05BTUVfU1RBVEUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8LycpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShTQ1JJUFRfREFUQV9FU0NBUEVEX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNjcmlwdCBkYXRhIGVzY2FwZWQgZW5kIHRhZyBuYW1lIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbU0NSSVBUX0RBVEFfRVNDQVBFRF9FTkRfVEFHX05BTUVfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpVXBwZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi50YWdOYW1lICs9IHRvQXNjaWlMb3dlckNoYXIoY3ApO1xuICAgICAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FzY2lpTG93ZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi50YWdOYW1lICs9IHRvQ2hhcihjcCk7XG4gICAgICAgICAgICB0aGlzLnRlbXBCdWZmLnB1c2goY3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMubGFzdFN0YXJ0VGFnTmFtZSA9PT0gdGhpcy5jdXJyZW50VG9rZW4udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBCRUZPUkVfQVRUUklCVVRFX05BTUVfU1RBVEU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3AgPT09ICQuU09MSURVUykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU0VMRl9DTE9TSU5HX1NUQVJUX1RBR19TVEFURTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwvJyk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0U2V2ZXJhbENvZGVQb2ludHModGhpcy50ZW1wQnVmZik7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKFNDUklQVF9EQVRBX0VTQ0FQRURfU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2NyaXB0IGRhdGEgZG91YmxlIGVzY2FwZSBzdGFydCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW1NDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVfU1RBUlRfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChpc1doaXRlc3BhY2UoY3ApIHx8IGNwID09PSAkLlNPTElEVVMgfHwgY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLl9pc1RlbXBCdWZmZXJFcXVhbFRvU2NyaXB0U3RyaW5nKClcbiAgICAgICAgICAgICAgICA/IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX1NUQVRFXG4gICAgICAgICAgICAgICAgOiBTQ1JJUFRfREFUQV9FU0NBUEVEX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKHRvQXNjaWlMb3dlckNvZGVQb2ludChjcCkpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBc2NpaUxvd2VyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShTQ1JJUFRfREFUQV9FU0NBUEVEX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNjcmlwdCBkYXRhIGRvdWJsZSBlc2NhcGVkIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChjcCA9PT0gJC5IWVBIRU5fTUlOVVMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9EQVNIX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCctJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuTEVTU19USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9MRVNTX1RIQU5fU0lHTl9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPCcpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKHVuaWNvZGUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuZW9mSW5TY3JpcHRIdG1sQ29tbWVudExpa2VUZXh0KTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTY3JpcHQgZGF0YSBkb3VibGUgZXNjYXBlZCBkYXNoIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfREFTSF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0RBU0hfREFTSF9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnLScpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkxFU1NfVEhBTl9TSUdOKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfTEVTU19USEFOX1NJR05fU1RBVEU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwnKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycyh1bmljb2RlLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUik7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluU2NyaXB0SHRtbENvbW1lbnRMaWtlVGV4dCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2NyaXB0IGRhdGEgZG91YmxlIGVzY2FwZWQgZGFzaCBkYXNoIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfREFTSF9EQVNIX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoY3AgPT09ICQuSFlQSEVOX01JTlVTKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJy0nKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5MRVNTX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0xFU1NfVEhBTl9TSUdOX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTQ1JJUFRfREFUQV9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPicpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKHVuaWNvZGUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuZW9mSW5TY3JpcHRIdG1sQ29tbWVudExpa2VUZXh0KTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTY3JpcHQgZGF0YSBkb3VibGUgZXNjYXBlZCBsZXNzLXRoYW4gc2lnbiBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW1NDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0xFU1NfVEhBTl9TSUdOX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoY3AgPT09ICQuU09MSURVUykge1xuICAgICAgICAgICAgdGhpcy50ZW1wQnVmZiA9IFtdO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVfRU5EX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCcvJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNjcmlwdCBkYXRhIGRvdWJsZSBlc2NhcGUgZW5kIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRV9FTkRfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChpc1doaXRlc3BhY2UoY3ApIHx8IGNwID09PSAkLlNPTElEVVMgfHwgY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLl9pc1RlbXBCdWZmZXJFcXVhbFRvU2NyaXB0U3RyaW5nKClcbiAgICAgICAgICAgICAgICA/IFNDUklQVF9EQVRBX0VTQ0FQRURfU1RBVEVcbiAgICAgICAgICAgICAgICA6IFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX1NUQVRFO1xuXG4gICAgICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FzY2lpVXBwZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLnRlbXBCdWZmLnB1c2godG9Bc2NpaUxvd2VyQ29kZVBvaW50KGNwKSk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FzY2lpTG93ZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLnRlbXBCdWZmLnB1c2goY3ApO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKFNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJlZm9yZSBhdHRyaWJ1dGUgbmFtZSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0JFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjcCA9PT0gJC5TT0xJRFVTIHx8IGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOIHx8IGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShBRlRFUl9BVFRSSUJVVEVfTkFNRV9TVEFURSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRVFVQUxTX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZEVxdWFsc1NpZ25CZWZvcmVBdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUF0dHIoJz0nKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBBVFRSSUJVVEVfTkFNRV9TVEFURTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUF0dHIoJycpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShBVFRSSUJVVEVfTkFNRV9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBdHRyaWJ1dGUgbmFtZSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0FUVFJJQlVURV9OQU1FX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSB8fCBjcCA9PT0gJC5TT0xJRFVTIHx8IGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOIHx8IGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fbGVhdmVBdHRyTmFtZShBRlRFUl9BVFRSSUJVVEVfTkFNRV9TVEFURSk7XG4gICAgICAgICAgICB0aGlzLl91bmNvbnN1bWUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5FUVVBTFNfU0lHTikge1xuICAgICAgICAgICAgdGhpcy5fbGVhdmVBdHRyTmFtZShCRUZPUkVfQVRUUklCVVRFX1ZBTFVFX1NUQVRFKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FzY2lpVXBwZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLm5hbWUgKz0gdG9Bc2NpaUxvd2VyQ2hhcihjcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuUVVPVEFUSU9OX01BUksgfHwgY3AgPT09ICQuQVBPU1RST1BIRSB8fCBjcCA9PT0gJC5MRVNTX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi51bmV4cGVjdGVkQ2hhcmFjdGVySW5BdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEF0dHIubmFtZSArPSB0b0NoYXIoY3ApO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0ci5uYW1lICs9IHVuaWNvZGUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0ci5uYW1lICs9IHRvQ2hhcihjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZnRlciBhdHRyaWJ1dGUgbmFtZSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0FGVEVSX0FUVFJJQlVURV9OQU1FX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNwID09PSAkLlNPTElEVVMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTRUxGX0NMT1NJTkdfU1RBUlRfVEFHX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVRVUFMU19TSUdOKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQkVGT1JFX0FUVFJJQlVURV9WQUxVRV9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluVGFnKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlQXR0cignJyk7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKEFUVFJJQlVURV9OQU1FX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJlZm9yZSBhdHRyaWJ1dGUgdmFsdWUgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtCRUZPUkVfQVRUUklCVVRFX1ZBTFVFX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNwID09PSAkLlFVT1RBVElPTl9NQVJLKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQVRUUklCVVRFX1ZBTFVFX0RPVUJMRV9RVU9URURfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuQVBPU1RST1BIRSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEFUVFJJQlVURV9WQUxVRV9TSU5HTEVfUVVPVEVEX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLm1pc3NpbmdBdHRyaWJ1dGVWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoQVRUUklCVVRFX1ZBTFVFX1VOUVVPVEVEX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEF0dHJpYnV0ZSB2YWx1ZSAoZG91YmxlLXF1b3RlZCkgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtBVFRSSUJVVEVfVkFMVUVfRE9VQkxFX1FVT1RFRF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLlFVT1RBVElPTl9NQVJLKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQUZURVJfQVRUUklCVVRFX1ZBTFVFX1FVT1RFRF9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5BTVBFUlNBTkQpIHtcbiAgICAgICAgICAgIHRoaXMucmV0dXJuU3RhdGUgPSBBVFRSSUJVVEVfVkFMVUVfRE9VQkxFX1FVT1RFRF9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDSEFSQUNURVJfUkVGRVJFTkNFX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0ci52YWx1ZSArPSB1bmljb2RlLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuZW9mSW5UYWcpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLnZhbHVlICs9IHRvQ2hhcihjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBdHRyaWJ1dGUgdmFsdWUgKHNpbmdsZS1xdW90ZWQpIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQVRUUklCVVRFX1ZBTFVFX1NJTkdMRV9RVU9URURfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChjcCA9PT0gJC5BUE9TVFJPUEhFKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQUZURVJfQVRUUklCVVRFX1ZBTFVFX1FVT1RFRF9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5BTVBFUlNBTkQpIHtcbiAgICAgICAgICAgIHRoaXMucmV0dXJuU3RhdGUgPSBBVFRSSUJVVEVfVkFMVUVfU0lOR0xFX1FVT1RFRF9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDSEFSQUNURVJfUkVGRVJFTkNFX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0ci52YWx1ZSArPSB1bmljb2RlLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuZW9mSW5UYWcpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLnZhbHVlICs9IHRvQ2hhcihjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBdHRyaWJ1dGUgdmFsdWUgKHVucXVvdGVkKSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0FUVFJJQlVURV9WQUxVRV9VTlFVT1RFRF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xlYXZlQXR0clZhbHVlKEJFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuQU1QRVJTQU5EKSB7XG4gICAgICAgICAgICB0aGlzLnJldHVyblN0YXRlID0gQVRUUklCVVRFX1ZBTFVFX1VOUVVPVEVEX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuX2xlYXZlQXR0clZhbHVlKERBVEFfU1RBVEUpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0ci52YWx1ZSArPSB1bmljb2RlLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGNwID09PSAkLlFVT1RBVElPTl9NQVJLIHx8XG4gICAgICAgICAgICBjcCA9PT0gJC5BUE9TVFJPUEhFIHx8XG4gICAgICAgICAgICBjcCA9PT0gJC5MRVNTX1RIQU5fU0lHTiB8fFxuICAgICAgICAgICAgY3AgPT09ICQuRVFVQUxTX1NJR04gfHxcbiAgICAgICAgICAgIGNwID09PSAkLkdSQVZFX0FDQ0VOVFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZENoYXJhY3RlckluVW5xdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLnZhbHVlICs9IHRvQ2hhcihjcCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluVGFnKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0ci52YWx1ZSArPSB0b0NoYXIoY3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWZ0ZXIgYXR0cmlidXRlIHZhbHVlIChxdW90ZWQpIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQUZURVJfQVRUUklCVVRFX1ZBTFVFX1FVT1RFRF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xlYXZlQXR0clZhbHVlKEJFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuU09MSURVUykge1xuICAgICAgICAgICAgdGhpcy5fbGVhdmVBdHRyVmFsdWUoU0VMRl9DTE9TSU5HX1NUQVJUX1RBR19TVEFURSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuX2xlYXZlQXR0clZhbHVlKERBVEFfU1RBVEUpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJblRhZyk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubWlzc2luZ1doaXRlc3BhY2VCZXR3ZWVuQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKEJFRk9SRV9BVFRSSUJVVEVfTkFNRV9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZWxmLWNsb3Npbmcgc3RhcnQgdGFnIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbU0VMRl9DTE9TSU5HX1NUQVJUX1RBR19TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5zZWxmQ2xvc2luZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuZW9mSW5UYWcpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLnVuZXhwZWN0ZWRTb2xpZHVzSW5UYWcpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShCRUZPUkVfQVRUUklCVVRFX05BTUVfU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm9ndXMgY29tbWVudCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0JPR1VTX0NPTU1FTlRfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmRhdGEgKz0gdW5pY29kZS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5kYXRhICs9IHRvQ2hhcihjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNYXJrdXAgZGVjbGFyYXRpb24gb3BlbiBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW01BUktVUF9ERUNMQVJBVElPTl9PUEVOX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAodGhpcy5fY29uc3VtZVNlcXVlbmNlSWZNYXRjaCgkJC5EQVNIX0RBU0hfU1RSSU5HLCBjcCwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUNvbW1lbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENPTU1FTlRfU1RBUlRfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY29uc3VtZVNlcXVlbmNlSWZNYXRjaCgkJC5ET0NUWVBFX1NUUklORywgY3AsIGZhbHNlKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERPQ1RZUEVfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY29uc3VtZVNlcXVlbmNlSWZNYXRjaCgkJC5DREFUQV9TVEFSVF9TVFJJTkcsIGNwLCB0cnVlKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3dDREFUQSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDREFUQV9TRUNUSU9OX1NUQVRFO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmNkYXRhSW5IdG1sQ29udGVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlQ29tbWVudFRva2VuKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSA9ICdbQ0RBVEFbJztcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gQk9HVVNfQ09NTUVOVF9TVEFURTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vTk9URTogc2VxdWVuY2UgbG9va3VwIGNhbiBiZSBhYnJ1cHRlZCBieSBoaWJlcm5hdGlvbi4gSW4gdGhhdCBjYXNlIGxvb2t1cFxuICAgICAgICAvL3Jlc3VsdHMgYXJlIG5vIGxvbmdlciB2YWxpZCBhbmQgd2Ugd2lsbCBuZWVkIHRvIHN0YXJ0IG92ZXIuXG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9lbnN1cmVIaWJlcm5hdGlvbigpKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmluY29ycmVjdGx5T3BlbmVkQ29tbWVudCk7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVDb21tZW50VG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoQk9HVVNfQ09NTUVOVF9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21tZW50IHN0YXJ0IHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQ09NTUVOVF9TVEFSVF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENPTU1FTlRfU1RBUlRfREFTSF9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5hYnJ1cHRDbG9zaW5nT2ZFbXB0eUNvbW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKENPTU1FTlRfU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tbWVudCBzdGFydCBkYXNoIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQ09NTUVOVF9TVEFSVF9EQVNIX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoY3AgPT09ICQuSFlQSEVOX01JTlVTKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ09NTUVOVF9FTkRfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuYWJydXB0Q2xvc2luZ09mRW1wdHlDb21tZW50KTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJbkNvbW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5kYXRhICs9ICctJztcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoQ09NTUVOVF9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21tZW50IHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQ09NTUVOVF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENPTU1FTlRfRU5EX0RBU0hfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuTEVTU19USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmRhdGEgKz0gJzwnO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENPTU1FTlRfTEVTU19USEFOX1NJR05fU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuTlVMTCkge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5kYXRhICs9IHVuaWNvZGUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJbkNvbW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5kYXRhICs9IHRvQ2hhcihjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21tZW50IGxlc3MtdGhhbiBzaWduIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQ09NTUVOVF9MRVNTX1RIQU5fU0lHTl9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLkVYQ0xBTUFUSU9OX01BUkspIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmRhdGEgKz0gJyEnO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENPTU1FTlRfTEVTU19USEFOX1NJR05fQkFOR19TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5MRVNTX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSAnISc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKENPTU1FTlRfU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tbWVudCBsZXNzLXRoYW4gc2lnbiBiYW5nIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQ09NTUVOVF9MRVNTX1RIQU5fU0lHTl9CQU5HX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoY3AgPT09ICQuSFlQSEVOX01JTlVTKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ09NTUVOVF9MRVNTX1RIQU5fU0lHTl9CQU5HX0RBU0hfU1RBVEU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKENPTU1FTlRfU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tbWVudCBsZXNzLXRoYW4gc2lnbiBiYW5nIGRhc2ggc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtDT01NRU5UX0xFU1NfVEhBTl9TSUdOX0JBTkdfREFTSF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENPTU1FTlRfTEVTU19USEFOX1NJR05fQkFOR19EQVNIX0RBU0hfU1RBVEU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKENPTU1FTlRfRU5EX0RBU0hfU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tbWVudCBsZXNzLXRoYW4gc2lnbiBiYW5nIGRhc2ggZGFzaCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0NPTU1FTlRfTEVTU19USEFOX1NJR05fQkFOR19EQVNIX0RBU0hfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChjcCAhPT0gJC5HUkVBVEVSX1RIQU5fU0lHTiAmJiBjcCAhPT0gJC5FT0YpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubmVzdGVkQ29tbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKENPTU1FTlRfRU5EX1NUQVRFKTtcbiAgICB9XG5cbiAgICAvLyBDb21tZW50IGVuZCBkYXNoIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQ09NTUVOVF9FTkRfREFTSF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENPTU1FTlRfRU5EX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJbkNvbW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5kYXRhICs9ICctJztcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoQ09NTUVOVF9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21tZW50IGVuZCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0NPTU1FTlRfRU5EX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVYQ0xBTUFUSU9OX01BUkspIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDT01NRU5UX0VORF9CQU5HX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUykge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSAnLSc7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluQ29tbWVudCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmRhdGEgKz0gJy0tJztcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoQ09NTUVOVF9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21tZW50IGVuZCBiYW5nIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQ09NTUVOVF9FTkRfQkFOR19TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLkhZUEhFTl9NSU5VUykge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSAnLS0hJztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDT01NRU5UX0VORF9EQVNIX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmluY29ycmVjdGx5Q2xvc2VkQ29tbWVudCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuZW9mSW5Db21tZW50KTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZGF0YSArPSAnLS0hJztcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoQ09NTUVOVF9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBET0NUWVBFIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbRE9DVFlQRV9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBCRUZPUkVfRE9DVFlQRV9OQU1FX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKEJFRk9SRV9ET0NUWVBFX05BTUVfU1RBVEUpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJbkRvY3R5cGUpO1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlRG9jdHlwZVRva2VuKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLm1pc3NpbmdXaGl0ZXNwYWNlQmVmb3JlRG9jdHlwZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShCRUZPUkVfRE9DVFlQRV9OQU1FX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJlZm9yZSBET0NUWVBFIG5hbWUgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtCRUZPUkVfRE9DVFlQRV9OQU1FX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXNjaWlVcHBlcihjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZURvY3R5cGVUb2tlbih0b0FzY2lpTG93ZXJDaGFyKGNwKSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gRE9DVFlQRV9OQU1FX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlRG9jdHlwZVRva2VuKHVuaWNvZGUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX05BTUVfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubWlzc2luZ0RvY3R5cGVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZURvY3R5cGVUb2tlbihudWxsKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJbkRvY3R5cGUpO1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlRG9jdHlwZVRva2VuKG51bGwpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVEb2N0eXBlVG9rZW4odG9DaGFyKGNwKSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gRE9DVFlQRV9OQU1FX1NUQVRFO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRE9DVFlQRSBuYW1lIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbRE9DVFlQRV9OQU1FX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEFGVEVSX0RPQ1RZUEVfTkFNRV9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4ubmFtZSArPSB0b0FzY2lpTG93ZXJDaGFyKGNwKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLm5hbWUgKz0gdW5pY29kZS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluRG9jdHlwZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLm5hbWUgKz0gdG9DaGFyKGNwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFmdGVyIERPQ1RZUEUgbmFtZSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0FGVEVSX0RPQ1RZUEVfTkFNRV9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluRG9jdHlwZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jb25zdW1lU2VxdWVuY2VJZk1hdGNoKCQkLlBVQkxJQ19TVFJJTkcsIGNwLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBBRlRFUl9ET0NUWVBFX1BVQkxJQ19LRVlXT1JEX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NvbnN1bWVTZXF1ZW5jZUlmTWF0Y2goJCQuU1lTVEVNX1NUUklORywgY3AsIGZhbHNlKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEFGVEVSX0RPQ1RZUEVfU1lTVEVNX0tFWVdPUkRfU1RBVEU7XG4gICAgICAgIH1cbiAgICAgICAgLy9OT1RFOiBzZXF1ZW5jZSBsb29rdXAgY2FuIGJlIGFicnVwdGVkIGJ5IGhpYmVybmF0aW9uLiBJbiB0aGF0IGNhc2UgbG9va3VwXG4gICAgICAgIC8vcmVzdWx0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkIGFuZCB3ZSB3aWxsIG5lZWQgdG8gc3RhcnQgb3Zlci5cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX2Vuc3VyZUhpYmVybmF0aW9uKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuaW52YWxpZENoYXJhY3RlclNlcXVlbmNlQWZ0ZXJEb2N0eXBlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKEJPR1VTX0RPQ1RZUEVfU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWZ0ZXIgRE9DVFlQRSBwdWJsaWMga2V5d29yZCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0FGVEVSX0RPQ1RZUEVfUFVCTElDX0tFWVdPUkRfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQkVGT1JFX0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuUVVPVEFUSU9OX01BUkspIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubWlzc2luZ1doaXRlc3BhY2VBZnRlckRvY3R5cGVQdWJsaWNLZXl3b3JkKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLnB1YmxpY0lkID0gJyc7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9ET1VCTEVfUVVPVEVEX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkFQT1NUUk9QSEUpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubWlzc2luZ1doaXRlc3BhY2VBZnRlckRvY3R5cGVQdWJsaWNLZXl3b3JkKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLnB1YmxpY0lkID0gJyc7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9TSU5HTEVfUVVPVEVEX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLm1pc3NpbmdEb2N0eXBlUHVibGljSWRlbnRpZmllcik7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5FT0YpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuZW9mSW5Eb2N0eXBlKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5taXNzaW5nUXVvdGVCZWZvcmVEb2N0eXBlUHVibGljSWRlbnRpZmllcik7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKEJPR1VTX0RPQ1RZUEVfU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQmVmb3JlIERPQ1RZUEUgcHVibGljIGlkZW50aWZpZXIgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtCRUZPUkVfRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjcCA9PT0gJC5RVU9UQVRJT05fTUFSSykge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4ucHVibGljSWQgPSAnJztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX0RPVUJMRV9RVU9URURfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuQVBPU1RST1BIRSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4ucHVibGljSWQgPSAnJztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX1NJTkdMRV9RVU9URURfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubWlzc2luZ0RvY3R5cGVQdWJsaWNJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJbkRvY3R5cGUpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLm1pc3NpbmdRdW90ZUJlZm9yZURvY3R5cGVQdWJsaWNJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoQk9HVVNfRE9DVFlQRV9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBET0NUWVBFIHB1YmxpYyBpZGVudGlmaWVyIChkb3VibGUtcXVvdGVkKSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfRE9VQkxFX1FVT1RFRF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLlFVT1RBVElPTl9NQVJLKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQUZURVJfRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLnB1YmxpY0lkICs9IHVuaWNvZGUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmFicnVwdERvY3R5cGVQdWJsaWNJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJbkRvY3R5cGUpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5wdWJsaWNJZCArPSB0b0NoYXIoY3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRE9DVFlQRSBwdWJsaWMgaWRlbnRpZmllciAoc2luZ2xlLXF1b3RlZCkgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX1NJTkdMRV9RVU9URURfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChjcCA9PT0gJC5BUE9TVFJPUEhFKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQUZURVJfRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5OVUxMKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLnB1YmxpY0lkICs9IHVuaWNvZGUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmFicnVwdERvY3R5cGVQdWJsaWNJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJbkRvY3R5cGUpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5wdWJsaWNJZCArPSB0b0NoYXIoY3ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWZ0ZXIgRE9DVFlQRSBwdWJsaWMgaWRlbnRpZmllciBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0FGVEVSX0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQkVUV0VFTl9ET0NUWVBFX1BVQkxJQ19BTkRfU1lTVEVNX0lERU5USUZJRVJTX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5RVU9UQVRJT05fTUFSSykge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5taXNzaW5nV2hpdGVzcGFjZUJldHdlZW5Eb2N0eXBlUHVibGljQW5kU3lzdGVtSWRlbnRpZmllcnMpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uc3lzdGVtSWQgPSAnJztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX0RPVUJMRV9RVU9URURfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuQVBPU1RST1BIRSkge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5taXNzaW5nV2hpdGVzcGFjZUJldHdlZW5Eb2N0eXBlUHVibGljQW5kU3lzdGVtSWRlbnRpZmllcnMpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uc3lzdGVtSWQgPSAnJztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NJTkdMRV9RVU9URURfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluRG9jdHlwZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubWlzc2luZ1F1b3RlQmVmb3JlRG9jdHlwZVN5c3RlbUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShCT0dVU19ET0NUWVBFX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJldHdlZW4gRE9DVFlQRSBwdWJsaWMgYW5kIHN5c3RlbSBpZGVudGlmaWVycyBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0JFVFdFRU5fRE9DVFlQRV9QVUJMSUNfQU5EX1NZU1RFTV9JREVOVElGSUVSU19TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuUVVPVEFUSU9OX01BUkspIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLnN5c3RlbUlkID0gJyc7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9ET1VCTEVfUVVPVEVEX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkFQT1NUUk9QSEUpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLnN5c3RlbUlkID0gJyc7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TSU5HTEVfUVVPVEVEX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJbkRvY3R5cGUpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLm1pc3NpbmdRdW90ZUJlZm9yZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoQk9HVVNfRE9DVFlQRV9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZnRlciBET0NUWVBFIHN5c3RlbSBrZXl3b3JkIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQUZURVJfRE9DVFlQRV9TWVNURU1fS0VZV09SRF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBCRUZPUkVfRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5RVU9UQVRJT05fTUFSSykge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5taXNzaW5nV2hpdGVzcGFjZUFmdGVyRG9jdHlwZVN5c3RlbUtleXdvcmQpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uc3lzdGVtSWQgPSAnJztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX0RPVUJMRV9RVU9URURfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuQVBPU1RST1BIRSkge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5taXNzaW5nV2hpdGVzcGFjZUFmdGVyRG9jdHlwZVN5c3RlbUtleXdvcmQpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uc3lzdGVtSWQgPSAnJztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NJTkdMRV9RVU9URURfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubWlzc2luZ0RvY3R5cGVTeXN0ZW1JZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJbkRvY3R5cGUpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLm1pc3NpbmdRdW90ZUJlZm9yZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoQk9HVVNfRE9DVFlQRV9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCZWZvcmUgRE9DVFlQRSBzeXN0ZW0gaWRlbnRpZmllciBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0JFRk9SRV9ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKGNwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNwID09PSAkLlFVT1RBVElPTl9NQVJLKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5zeXN0ZW1JZCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfRE9VQkxFX1FVT1RFRF9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5BUE9TVFJPUEhFKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5zeXN0ZW1JZCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfU0lOR0xFX1FVT1RFRF9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5taXNzaW5nRG9jdHlwZVN5c3RlbUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluRG9jdHlwZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubWlzc2luZ1F1b3RlQmVmb3JlRG9jdHlwZVN5c3RlbUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShCT0dVU19ET0NUWVBFX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERPQ1RZUEUgc3lzdGVtIGlkZW50aWZpZXIgKGRvdWJsZS1xdW90ZWQpIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9ET1VCTEVfUVVPVEVEX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoY3AgPT09ICQuUVVPVEFUSU9OX01BUkspIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBBRlRFUl9ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uc3lzdGVtSWQgKz0gdW5pY29kZS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuYWJydXB0RG9jdHlwZVN5c3RlbUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluRG9jdHlwZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLnN5c3RlbUlkICs9IHRvQ2hhcihjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBET0NUWVBFIHN5c3RlbSBpZGVudGlmaWVyIChzaW5nbGUtcXVvdGVkKSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0RPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfU0lOR0xFX1FVT1RFRF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLkFQT1NUUk9QSEUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBBRlRFUl9ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uc3lzdGVtSWQgKz0gdW5pY29kZS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuYWJydXB0RG9jdHlwZVN5c3RlbUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluRG9jdHlwZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLnN5c3RlbUlkICs9IHRvQ2hhcihjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZnRlciBET0NUWVBFIHN5c3RlbSBpZGVudGlmaWVyIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQUZURVJfRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjcCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjcCA9PT0gJC5HUkVBVEVSX1RIQU5fU0lHTikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IERBVEFfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmVvZkluRG9jdHlwZSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q3VycmVudFRva2VuKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZENoYXJhY3RlckFmdGVyRG9jdHlwZVN5c3RlbUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShCT0dVU19ET0NUWVBFX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJvZ3VzIERPQ1RZUEUgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtCT0dVU19ET0NUWVBFX1NUQVRFXShjcCkge1xuICAgICAgICBpZiAoY3AgPT09ICQuR1JFQVRFUl9USEFOX1NJR04pIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50VG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBEQVRBX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRUb2tlbigpO1xuICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDREFUQSBzZWN0aW9uIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQ0RBVEFfU0VDVElPTl9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLlJJR0hUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ0RBVEFfU0VDVElPTl9CUkFDS0VUX1NUQVRFO1xuICAgICAgICB9IGVsc2UgaWYgKGNwID09PSAkLkVPRikge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5lb2ZJbkNkYXRhKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDREFUQSBzZWN0aW9uIGJyYWNrZXQgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtDREFUQV9TRUNUSU9OX0JSQUNLRVRfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChjcCA9PT0gJC5SSUdIVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENEQVRBX1NFQ1RJT05fRU5EX1NUQVRFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCddJyk7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKENEQVRBX1NFQ1RJT05fU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ0RBVEEgc2VjdGlvbiBlbmQgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtDREFUQV9TRUNUSU9OX0VORF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSAkLkdSRUFURVJfVEhBTl9TSUdOKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gREFUQV9TVEFURTtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5SSUdIVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCddJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJ11dJyk7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKENEQVRBX1NFQ1RJT05fU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hhcmFjdGVyIHJlZmVyZW5jZSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBVEVdKGNwKSB7XG4gICAgICAgIHRoaXMudGVtcEJ1ZmYgPSBbJC5BTVBFUlNBTkRdO1xuXG4gICAgICAgIGlmIChjcCA9PT0gJC5OVU1CRVJfU0lHTikge1xuICAgICAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBOVU1FUklDX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBVEU7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBc2NpaUFscGhhTnVtZXJpYyhjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoTkFNRURfQ0hBUkFDVEVSX1JFRkVSRU5DRV9TVEFURSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mbHVzaENvZGVQb2ludHNDb25zdW1lZEFzQ2hhcmFjdGVyUmVmZXJlbmNlKCk7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKHRoaXMucmV0dXJuU3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTmFtZWQgY2hhcmFjdGVyIHJlZmVyZW5jZSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW05BTUVEX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBVEVdKGNwKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gdGhpcy5fbWF0Y2hOYW1lZENoYXJhY3RlclJlZmVyZW5jZShjcCk7XG5cbiAgICAgICAgLy9OT1RFOiBtYXRjaGluZyBjYW4gYmUgYWJydXB0ZWQgYnkgaGliZXJuYXRpb24uIEluIHRoYXQgY2FzZSBtYXRjaFxuICAgICAgICAvL3Jlc3VsdHMgYXJlIG5vIGxvbmdlciB2YWxpZCBhbmQgd2Ugd2lsbCBuZWVkIHRvIHN0YXJ0IG92ZXIuXG4gICAgICAgIGlmICh0aGlzLl9lbnN1cmVIaWJlcm5hdGlvbigpKSB7XG4gICAgICAgICAgICB0aGlzLnRlbXBCdWZmID0gWyQuQU1QRVJTQU5EXTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFJlc3VsdCkge1xuICAgICAgICAgICAgY29uc3Qgd2l0aFNlbWljb2xvbiA9IHRoaXMudGVtcEJ1ZmZbdGhpcy50ZW1wQnVmZi5sZW5ndGggLSAxXSA9PT0gJC5TRU1JQ09MT047XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5faXNDaGFyYWN0ZXJSZWZlcmVuY2VBdHRyaWJ1dGVRdWlyayh3aXRoU2VtaWNvbG9uKSkge1xuICAgICAgICAgICAgICAgIGlmICghd2l0aFNlbWljb2xvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lcnJPbk5leHRDb2RlUG9pbnQoRVJSLm1pc3NpbmdTZW1pY29sb25BZnRlckNoYXJhY3RlclJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wQnVmZiA9IG1hdGNoUmVzdWx0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9mbHVzaENvZGVQb2ludHNDb25zdW1lZEFzQ2hhcmFjdGVyUmVmZXJlbmNlKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5yZXR1cm5TdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2ZsdXNoQ29kZVBvaW50c0NvbnN1bWVkQXNDaGFyYWN0ZXJSZWZlcmVuY2UoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBBTUJJR1VPVVNfQU1QRVJTQU5EX1NUQVRFO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQW1iaWd1b3MgYW1wZXJzYW5kIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbQU1CSUdVT1VTX0FNUEVSU0FORF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzQXNjaWlBbHBoYU51bWVyaWMoY3ApKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNDaGFyYWN0ZXJSZWZlcmVuY2VJbkF0dHJpYnV0ZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0ci52YWx1ZSArPSB0b0NoYXIoY3ApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjcCA9PT0gJC5TRU1JQ09MT04pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoRVJSLnVua25vd25OYW1lZENoYXJhY3RlclJlZmVyZW5jZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUodGhpcy5yZXR1cm5TdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOdW1lcmljIGNoYXJhY3RlciByZWZlcmVuY2Ugc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIFtOVU1FUklDX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBVEVdKGNwKSB7XG4gICAgICAgIHRoaXMuY2hhclJlZkNvZGUgPSAwO1xuXG4gICAgICAgIGlmIChjcCA9PT0gJC5MQVRJTl9TTUFMTF9YIHx8IGNwID09PSAkLkxBVElOX0NBUElUQUxfWCkge1xuICAgICAgICAgICAgdGhpcy50ZW1wQnVmZi5wdXNoKGNwKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBIRVhBREVNSUNBTF9DSEFSQUNURVJfUkVGRVJFTkNFX1NUQVJUX1NUQVRFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShERUNJTUFMX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBUlRfU1RBVEUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGV4YWRlbWljYWwgY2hhcmFjdGVyIHJlZmVyZW5jZSBzdGFydCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0hFWEFERU1JQ0FMX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBUlRfU1RBVEVdKGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpSGV4RGlnaXQoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKEhFWEFERU1JQ0FMX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBVEUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5hYnNlbmNlT2ZEaWdpdHNJbk51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2UpO1xuICAgICAgICAgICAgdGhpcy5fZmx1c2hDb2RlUG9pbnRzQ29uc3VtZWRBc0NoYXJhY3RlclJlZmVyZW5jZSgpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZSh0aGlzLnJldHVyblN0YXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlY2ltYWwgY2hhcmFjdGVyIHJlZmVyZW5jZSBzdGFydCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0RFQ0lNQUxfQ0hBUkFDVEVSX1JFRkVSRU5DRV9TVEFSVF9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzQXNjaWlEaWdpdChjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoREVDSU1BTF9DSEFSQUNURVJfUkVGRVJFTkNFX1NUQVRFKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuYWJzZW5jZU9mRGlnaXRzSW5OdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMuX2ZsdXNoQ29kZVBvaW50c0NvbnN1bWVkQXNDaGFyYWN0ZXJSZWZlcmVuY2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUodGhpcy5yZXR1cm5TdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIZXhhZGVtaWNhbCBjaGFyYWN0ZXIgcmVmZXJlbmNlIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbSEVYQURFTUlDQUxfQ0hBUkFDVEVSX1JFRkVSRU5DRV9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzQXNjaWlVcHBlckhleERpZ2l0KGNwKSkge1xuICAgICAgICAgICAgdGhpcy5jaGFyUmVmQ29kZSA9IHRoaXMuY2hhclJlZkNvZGUgKiAxNiArIGNwIC0gMHgzNztcbiAgICAgICAgfSBlbHNlIGlmIChpc0FzY2lpTG93ZXJIZXhEaWdpdChjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhclJlZkNvZGUgPSB0aGlzLmNoYXJSZWZDb2RlICogMTYgKyBjcCAtIDB4NTc7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBc2NpaURpZ2l0KGNwKSkge1xuICAgICAgICAgICAgdGhpcy5jaGFyUmVmQ29kZSA9IHRoaXMuY2hhclJlZkNvZGUgKiAxNiArIGNwIC0gMHgzMDtcbiAgICAgICAgfSBlbHNlIGlmIChjcCA9PT0gJC5TRU1JQ09MT04pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBOVU1FUklDX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfRU5EX1NUQVRFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5taXNzaW5nU2VtaWNvbG9uQWZ0ZXJDaGFyYWN0ZXJSZWZlcmVuY2UpO1xuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZShOVU1FUklDX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfRU5EX1NUQVRFKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlY2ltYWwgY2hhcmFjdGVyIHJlZmVyZW5jZSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgW0RFQ0lNQUxfQ0hBUkFDVEVSX1JFRkVSRU5DRV9TVEFURV0oY3ApIHtcbiAgICAgICAgaWYgKGlzQXNjaWlEaWdpdChjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhclJlZkNvZGUgPSB0aGlzLmNoYXJSZWZDb2RlICogMTAgKyBjcCAtIDB4MzA7XG4gICAgICAgIH0gZWxzZSBpZiAoY3AgPT09ICQuU0VNSUNPTE9OKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gTlVNRVJJQ19DSEFSQUNURVJfUkVGRVJFTkNFX0VORF9TVEFURTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubWlzc2luZ1NlbWljb2xvbkFmdGVyQ2hhcmFjdGVyUmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUoTlVNRVJJQ19DSEFSQUNURVJfUkVGRVJFTkNFX0VORF9TVEFURSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOdW1lcmljIGNoYXJhY3RlciByZWZlcmVuY2UgZW5kIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBbTlVNRVJJQ19DSEFSQUNURVJfUkVGRVJFTkNFX0VORF9TVEFURV0oKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJSZWZDb2RlID09PSAkLk5VTEwpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubnVsbENoYXJhY3RlclJlZmVyZW5jZSk7XG4gICAgICAgICAgICB0aGlzLmNoYXJSZWZDb2RlID0gJC5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGFyUmVmQ29kZSA+IDB4MTBmZmZmKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLmNoYXJhY3RlclJlZmVyZW5jZU91dHNpZGVVbmljb2RlUmFuZ2UpO1xuICAgICAgICAgICAgdGhpcy5jaGFyUmVmQ29kZSA9ICQuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xuICAgICAgICB9IGVsc2UgaWYgKHVuaWNvZGUuaXNTdXJyb2dhdGUodGhpcy5jaGFyUmVmQ29kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuc3Vycm9nYXRlQ2hhcmFjdGVyUmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMuY2hhclJlZkNvZGUgPSAkLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcbiAgICAgICAgfSBlbHNlIGlmICh1bmljb2RlLmlzVW5kZWZpbmVkQ29kZVBvaW50KHRoaXMuY2hhclJlZkNvZGUpKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoRVJSLm5vbmNoYXJhY3RlckNoYXJhY3RlclJlZmVyZW5jZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodW5pY29kZS5pc0NvbnRyb2xDb2RlUG9pbnQodGhpcy5jaGFyUmVmQ29kZSkgfHwgdGhpcy5jaGFyUmVmQ29kZSA9PT0gJC5DQVJSSUFHRV9SRVRVUk4pIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIuY29udHJvbENoYXJhY3RlclJlZmVyZW5jZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gQzFfQ09OVFJPTFNfUkVGRVJFTkNFX1JFUExBQ0VNRU5UU1t0aGlzLmNoYXJSZWZDb2RlXTtcblxuICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFyUmVmQ29kZSA9IHJlcGxhY2VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZW1wQnVmZiA9IFt0aGlzLmNoYXJSZWZDb2RlXTtcblxuICAgICAgICB0aGlzLl9mbHVzaENvZGVQb2ludHNDb25zdW1lZEFzQ2hhcmFjdGVyUmVmZXJlbmNlKCk7XG4gICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUodGhpcy5yZXR1cm5TdGF0ZSk7XG4gICAgfVxufVxuXG4vL1Rva2VuIHR5cGVzXG5Ub2tlbml6ZXIuQ0hBUkFDVEVSX1RPS0VOID0gJ0NIQVJBQ1RFUl9UT0tFTic7XG5Ub2tlbml6ZXIuTlVMTF9DSEFSQUNURVJfVE9LRU4gPSAnTlVMTF9DSEFSQUNURVJfVE9LRU4nO1xuVG9rZW5pemVyLldISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOID0gJ1dISVRFU1BBQ0VfQ0hBUkFDVEVSX1RPS0VOJztcblRva2VuaXplci5TVEFSVF9UQUdfVE9LRU4gPSAnU1RBUlRfVEFHX1RPS0VOJztcblRva2VuaXplci5FTkRfVEFHX1RPS0VOID0gJ0VORF9UQUdfVE9LRU4nO1xuVG9rZW5pemVyLkNPTU1FTlRfVE9LRU4gPSAnQ09NTUVOVF9UT0tFTic7XG5Ub2tlbml6ZXIuRE9DVFlQRV9UT0tFTiA9ICdET0NUWVBFX1RPS0VOJztcblRva2VuaXplci5FT0ZfVE9LRU4gPSAnRU9GX1RPS0VOJztcblRva2VuaXplci5ISUJFUk5BVElPTl9UT0tFTiA9ICdISUJFUk5BVElPTl9UT0tFTic7XG5cbi8vVG9rZW5pemVyIGluaXRpYWwgc3RhdGVzIGZvciBkaWZmZXJlbnQgbW9kZXNcblRva2VuaXplci5NT0RFID0ge1xuICAgIERBVEE6IERBVEFfU1RBVEUsXG4gICAgUkNEQVRBOiBSQ0RBVEFfU1RBVEUsXG4gICAgUkFXVEVYVDogUkFXVEVYVF9TVEFURSxcbiAgICBTQ1JJUFRfREFUQTogU0NSSVBUX0RBVEFfU1RBVEUsXG4gICAgUExBSU5URVhUOiBQTEFJTlRFWFRfU1RBVEVcbn07XG5cbi8vU3RhdGljXG5Ub2tlbml6ZXIuZ2V0VG9rZW5BdHRyID0gZnVuY3Rpb24odG9rZW4sIGF0dHJOYW1lKSB7XG4gICAgZm9yIChsZXQgaSA9IHRva2VuLmF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmICh0b2tlbi5hdHRyc1tpXS5uYW1lID09PSBhdHRyTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuLmF0dHJzW2ldLnZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRva2VuaXplcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy9OT1RFOiB0aGlzIGZpbGUgY29udGFpbnMgYXV0by1nZW5lcmF0ZWQgYXJyYXkgbWFwcGVkIHJhZGl4IHRyZWUgdGhhdCBpcyB1c2VkIGZvciB0aGUgbmFtZWQgZW50aXR5IHJlZmVyZW5jZXMgY29uc3VtcHRpb25cbi8vKGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9pbmlrdWxpbi9wYXJzZTUvdHJlZS9tYXN0ZXIvc2NyaXB0cy9nZW5lcmF0ZS1uYW1lZC1lbnRpdHktZGF0YS9SRUFETUUubWQpXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBVaW50MTZBcnJheShbNCw1Miw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTA3LDEwOCwxMDksMTEwLDExMSwxMTIsMTEzLDExNCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDEwNiwzMDMsNDEyLDgxMCwxNDMyLDE3MDEsMTc5NiwxOTg3LDIxMTQsMjM2MCwyNDIwLDI0ODQsMzE3MCwzMjUxLDQxNDAsNDM5Myw0NTc1LDQ2MTAsNTEwNiw1NTEyLDU3MjgsNjExNyw2Mjc0LDYzMTUsNjM0NSw2NDI3LDY1MTYsNzAwMiw3OTEwLDg3MzMsOTMyMyw5ODcwLDEwMTcwLDEwNjMxLDEwODkzLDExMzE4LDExMzg2LDExNDY3LDEyNzczLDEzMDkyLDE0NDc0LDE0OTIyLDE1NDQ4LDE1NTQyLDE2NDE5LDE3NjY2LDE4MTY2LDE4NjExLDE5MDA0LDE5MDk1LDE5Mjk4LDE5Mzk3LDQsMTYsNjksNzcsOTcsOTgsOTksMTAyLDEwMywxMDgsMTA5LDExMCwxMTEsMTEyLDExNCwxMTUsMTE2LDExNywxNDAsMTUwLDE1OCwxNjksMTc2LDE5NCwxOTksMjEwLDIxNiwyMjIsMjI2LDI0MiwyNTYsMjY2LDI4MywyOTQsMTA4LDEwNSwxMDMsNSwxOTgsMSw1OSwxNDgsMSwxOTgsODAsNSwzOCwxLDU5LDE1NiwxLDM4LDk5LDExNywxMTYsMTAxLDUsMTkzLDEsNTksMTY3LDEsMTkzLDExNCwxMDEsMTE4LDEwMSw1OSwxLDI1OCw0LDIsMTA1LDEyMSwxODIsMTkxLDExNCw5OSw1LDE5NCwxLDU5LDE4OSwxLDE5NCw1OSwxLDEwNDAsMTE0LDU5LDMsNTUzNDksNTY1ODAsMTE0LDk3LDExOCwxMDEsNSwxOTIsMSw1OSwyMDgsMSwxOTIsMTEyLDEwNCw5Nyw1OSwxLDkxMyw5Nyw5OSwxMTQsNTksMSwyNTYsMTAwLDU5LDEsMTA4MzUsNCwyLDEwMywxMTIsMjMyLDIzNywxMTEsMTEwLDU5LDEsMjYwLDEwMiw1OSwzLDU1MzQ5LDU2NjMyLDExMiwxMDgsMTIxLDcwLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDU5LDEsODI4OSwxMDUsMTEwLDEwMyw1LDE5NywxLDU5LDI2NCwxLDE5Nyw0LDIsOTksMTE1LDI3MiwyNzcsMTE0LDU5LDMsNTUzNDksNTY0NzYsMTA1LDEwMywxMTAsNTksMSw4Nzg4LDEwNSwxMDgsMTAwLDEwMSw1LDE5NSwxLDU5LDI5MiwxLDE5NSwxMDksMTA4LDUsMTk2LDEsNTksMzAxLDEsMTk2LDQsOCw5Nyw5OSwxMDEsMTAyLDExMSwxMTQsMTE1LDExNywzMjEsMzUwLDM1NCwzODMsMzg4LDM5NCw0MDAsNDA1LDQsMiw5OSwxMTQsMzI3LDMzNiwxMDcsMTE1LDEwOCw5NywxMTUsMTA0LDU5LDEsODcyNiw0LDIsMTE4LDExOSwzNDIsMzQ1LDU5LDEsMTA5ODMsMTAxLDEwMCw1OSwxLDg5NjYsMTIxLDU5LDEsMTA0MSw0LDMsOTksMTE0LDExNiwzNjIsMzY5LDM3OSw5NywxMTcsMTE1LDEwMSw1OSwxLDg3NTcsMTEwLDExMSwxMTcsMTA4LDEwOCwxMDUsMTE1LDU5LDEsODQ5Miw5Nyw1OSwxLDkxNCwxMTQsNTksMyw1NTM0OSw1NjU4MSwxMTIsMTAyLDU5LDMsNTUzNDksNTY2MzMsMTAxLDExOCwxMDEsNTksMSw3MjgsOTksMTE0LDU5LDEsODQ5MiwxMDksMTEyLDEwMSwxMTMsNTksMSw4NzgyLDQsMTQsNzIsNzksOTcsOTksMTAwLDEwMSwxMDIsMTA0LDEwNSwxMDgsMTExLDExNCwxMTUsMTE3LDQ0Miw0NDcsNDU2LDUwNCw1NDIsNTQ3LDU2OSw1NzMsNTc3LDYxNiw2NzgsNzg0LDc5MCw3OTYsOTksMTIxLDU5LDEsMTA2Myw4MCw4OSw1LDE2OSwxLDU5LDQ1NCwxLDE2OSw0LDMsOTksMTEyLDEyMSw0NjQsNDcwLDQ5NywxMTcsMTE2LDEwMSw1OSwxLDI2Miw0LDIsNTksMTA1LDQ3Niw0NzgsMSw4OTE0LDExNiw5NywxMDgsNjgsMTA1LDEwMiwxMDIsMTAxLDExNCwxMDEsMTEwLDExNiwxMDUsOTcsMTA4LDY4LDU5LDEsODUxNywxMDgsMTAxLDEyMSwxMTUsNTksMSw4NDkzLDQsNCw5NywxMDEsMTA1LDExMSw1MTQsNTIwLDUzMCw1MzUsMTE0LDExMSwxMTAsNTksMSwyNjgsMTAwLDEwNSwxMDgsNSwxOTksMSw1OSw1MjgsMSwxOTksMTE0LDk5LDU5LDEsMjY0LDExMCwxMDUsMTEwLDExNiw1OSwxLDg3NTIsMTExLDExNiw1OSwxLDI2Niw0LDIsMTAwLDExMCw1NTMsNTYwLDEwNSwxMDgsMTA4LDk3LDU5LDEsMTg0LDExNiwxMDEsMTE0LDY4LDExMSwxMTYsNTksMSwxODMsMTE0LDU5LDEsODQ5MywxMDUsNTksMSw5MzUsMTE0LDk5LDEwOCwxMDEsNCw0LDY4LDc3LDgwLDg0LDU5MSw1OTYsNjAzLDYwOSwxMTEsMTE2LDU5LDEsODg1NywxMDUsMTEwLDExNywxMTUsNTksMSw4ODU0LDEwOCwxMTcsMTE1LDU5LDEsODg1MywxMDUsMTA5LDEwMSwxMTUsNTksMSw4ODU1LDExMSw0LDIsOTksMTE1LDYyMyw2NDYsMTA3LDExOSwxMDUsMTE1LDEwMSw2NywxMTEsMTEwLDExNiwxMTEsMTE3LDExNCw3MywxMTAsMTE2LDEwMSwxMDMsMTE0LDk3LDEwOCw1OSwxLDg3NTQsMTAxLDY3LDExNywxMTQsMTA4LDEyMSw0LDIsNjgsODEsNjU4LDY3MSwxMTEsMTE3LDk4LDEwOCwxMDEsODEsMTE3LDExMSwxMTYsMTAxLDU5LDEsODIyMSwxMTcsMTExLDExNiwxMDEsNTksMSw4MjE3LDQsNCwxMDgsMTEwLDExMiwxMTcsNjg4LDcwMSw3MzYsNzUzLDExMSwxMTAsNCwyLDU5LDEwMSw2OTYsNjk4LDEsODc1OSw1OSwxLDEwODY4LDQsMywxMDMsMTA1LDExNiw3MDksNzE3LDcyMiwxMTQsMTE3LDEwMSwxMTAsMTE2LDU5LDEsODgwMSwxMTAsMTE2LDU5LDEsODc1MSwxMTEsMTE3LDExNCw3MywxMTAsMTE2LDEwMSwxMDMsMTE0LDk3LDEwOCw1OSwxLDg3NTAsNCwyLDEwMiwxMTQsNzQyLDc0NSw1OSwxLDg0NTAsMTExLDEwMCwxMTcsOTksMTE2LDU5LDEsODcyMCwxMTAsMTE2LDEwMSwxMTQsNjcsMTA4LDExMSw5OSwxMDcsMTE5LDEwNSwxMTUsMTAxLDY3LDExMSwxMTAsMTE2LDExMSwxMTcsMTE0LDczLDExMCwxMTYsMTAxLDEwMywxMTQsOTcsMTA4LDU5LDEsODc1NSwxMTEsMTE1LDExNSw1OSwxLDEwNzk5LDk5LDExNCw1OSwzLDU1MzQ5LDU2NDc4LDExMiw0LDIsNTksNjcsODAzLDgwNSwxLDg5MTUsOTcsMTEyLDU5LDEsODc4MSw0LDExLDY4LDc0LDgzLDkwLDk3LDk5LDEwMSwxMDIsMTA1LDExMSwxMTUsODM0LDg1MCw4NTUsODYwLDg2NSw4ODgsOTAzLDkxNiw5MjEsMTAxMSwxNDE1LDQsMiw1OSwxMTEsODQwLDg0MiwxLDg1MTcsMTE2LDExNCw5NywxMDQsMTAwLDU5LDEsMTA1MTMsOTksMTIxLDU5LDEsMTAyNiw5OSwxMjEsNTksMSwxMDI5LDk5LDEyMSw1OSwxLDEwMzksNCwzLDEwMywxMTQsMTE1LDg3Myw4NzksODgzLDEwMywxMDEsMTE0LDU5LDEsODIyNSwxMTQsNTksMSw4NjA5LDEwNCwxMTgsNTksMSwxMDk4MCw0LDIsOTcsMTIxLDg5NCw5MDAsMTE0LDExMSwxMTAsNTksMSwyNzAsNTksMSwxMDQ0LDEwOCw0LDIsNTksMTE2LDkxMCw5MTIsMSw4NzExLDk3LDU5LDEsOTE2LDExNCw1OSwzLDU1MzQ5LDU2NTgzLDQsMiw5NywxMDIsOTI3LDk5OCw0LDIsOTksMTA5LDkzMyw5OTIsMTE0LDEwNSwxMTYsMTA1LDk5LDk3LDEwOCw0LDQsNjUsNjgsNzEsODQsOTUwLDk1Nyw5NzgsOTg1LDk5LDExNywxMTYsMTAxLDU5LDEsMTgwLDExMSw0LDIsMTE2LDExNyw5NjQsOTY3LDU5LDEsNzI5LDk4LDEwOCwxMDEsNjUsOTksMTE3LDExNiwxMDEsNTksMSw3MzMsMTE0LDk3LDExOCwxMDEsNTksMSw5NiwxMDUsMTA4LDEwMCwxMDEsNTksMSw3MzIsMTExLDExMCwxMDAsNTksMSw4OTAwLDEwMiwxMDEsMTE0LDEwMSwxMTAsMTE2LDEwNSw5NywxMDgsNjgsNTksMSw4NTE4LDQsNCwxMTIsMTE2LDExNywxMTksMTAyMSwxMDI2LDEwNDgsMTI0OSwxMDIsNTksMyw1NTM0OSw1NjYzNSw0LDMsNTksNjgsNjksMTAzNCwxMDM2LDEwNDEsMSwxNjgsMTExLDExNiw1OSwxLDg0MTIsMTEzLDExNyw5NywxMDgsNTksMSw4Nzg0LDk4LDEwOCwxMDEsNCw2LDY3LDY4LDc2LDgyLDg1LDg2LDEwNjUsMTA4MiwxMTAxLDExODksMTIxMSwxMjM2LDExMSwxMTAsMTE2LDExMSwxMTcsMTE0LDczLDExMCwxMTYsMTAxLDEwMywxMTQsOTcsMTA4LDU5LDEsODc1MSwxMTEsNCwyLDExNiwxMTksMTA4OSwxMDkyLDU5LDEsMTY4LDExMCw2NSwxMTQsMTE0LDExMSwxMTksNTksMSw4NjU5LDQsMiwxMDEsMTExLDExMDcsMTE0MSwxMDIsMTE2LDQsMyw2NSw4Miw4NCwxMTE3LDExMjQsMTEzNiwxMTQsMTE0LDExMSwxMTksNTksMSw4NjU2LDEwNSwxMDMsMTA0LDExNiw2NSwxMTQsMTE0LDExMSwxMTksNTksMSw4NjYwLDEwMSwxMDEsNTksMSwxMDk4MCwxMTAsMTAzLDQsMiw3Niw4MiwxMTQ5LDExNzcsMTAxLDEwMiwxMTYsNCwyLDY1LDgyLDExNTgsMTE2NSwxMTQsMTE0LDExMSwxMTksNTksMSwxMDIzMiwxMDUsMTAzLDEwNCwxMTYsNjUsMTE0LDExNCwxMTEsMTE5LDU5LDEsMTAyMzQsMTA1LDEwMywxMDQsMTE2LDY1LDExNCwxMTQsMTExLDExOSw1OSwxLDEwMjMzLDEwNSwxMDMsMTA0LDExNiw0LDIsNjUsODQsMTE5OSwxMjA2LDExNCwxMTQsMTExLDExOSw1OSwxLDg2NTgsMTAxLDEwMSw1OSwxLDg4NzIsMTEyLDQsMiw2NSw2OCwxMjE4LDEyMjUsMTE0LDExNCwxMTEsMTE5LDU5LDEsODY1NywxMTEsMTE5LDExMCw2NSwxMTQsMTE0LDExMSwxMTksNTksMSw4NjYxLDEwMSwxMTQsMTE2LDEwNSw5OSw5NywxMDgsNjYsOTcsMTE0LDU5LDEsODc0MSwxMTAsNCw2LDY1LDY2LDc2LDgyLDg0LDk3LDEyNjQsMTI5MiwxMjk5LDEzNTIsMTM5MSwxNDA4LDExNCwxMTQsMTExLDExOSw0LDMsNTksNjYsODUsMTI3NiwxMjc4LDEyODMsMSw4NTk1LDk3LDExNCw1OSwxLDEwNTE1LDExMiw2NSwxMTQsMTE0LDExMSwxMTksNTksMSw4NjkzLDExNCwxMDEsMTE4LDEwMSw1OSwxLDc4NSwxMDEsMTAyLDExNiw0LDMsODIsODQsODYsMTMxMCwxMzIzLDEzMzQsMTA1LDEwMywxMDQsMTE2LDg2LDEwMSw5OSwxMTYsMTExLDExNCw1OSwxLDEwNTc2LDEwMSwxMDEsODYsMTAxLDk5LDExNiwxMTEsMTE0LDU5LDEsMTA1OTAsMTAxLDk5LDExNiwxMTEsMTE0LDQsMiw1OSw2NiwxMzQ1LDEzNDcsMSw4NjM3LDk3LDExNCw1OSwxLDEwNTgyLDEwNSwxMDMsMTA0LDExNiw0LDIsODQsODYsMTM2MiwxMzczLDEwMSwxMDEsODYsMTAxLDk5LDExNiwxMTEsMTE0LDU5LDEsMTA1OTEsMTAxLDk5LDExNiwxMTEsMTE0LDQsMiw1OSw2NiwxMzg0LDEzODYsMSw4NjQxLDk3LDExNCw1OSwxLDEwNTgzLDEwMSwxMDEsNCwyLDU5LDY1LDEzOTksMTQwMSwxLDg4NjgsMTE0LDExNCwxMTEsMTE5LDU5LDEsODYxNSwxMTQsMTE0LDExMSwxMTksNTksMSw4NjU5LDQsMiw5OSwxMTYsMTQyMSwxNDI2LDExNCw1OSwzLDU1MzQ5LDU2NDc5LDExNCwxMTEsMTA3LDU5LDEsMjcyLDQsMTYsNzgsODQsOTcsOTksMTAwLDEwMiwxMDMsMTA4LDEwOSwxMTEsMTEyLDExMywxMTUsMTE2LDExNywxMjAsMTQ2NiwxNDcwLDE0NzgsMTQ4OSwxNTE1LDE1MjAsMTUyNSwxNTM2LDE1NDQsMTU5MywxNjA5LDE2MTcsMTY1MCwxNjY0LDE2NjgsMTY3Nyw3MSw1OSwxLDMzMCw3Miw1LDIwOCwxLDU5LDE0NzYsMSwyMDgsOTksMTE3LDExNiwxMDEsNSwyMDEsMSw1OSwxNDg3LDEsMjAxLDQsMyw5NywxMDUsMTIxLDE0OTcsMTUwMywxNTEyLDExNCwxMTEsMTEwLDU5LDEsMjgyLDExNCw5OSw1LDIwMiwxLDU5LDE1MTAsMSwyMDIsNTksMSwxMDY5LDExMSwxMTYsNTksMSwyNzgsMTE0LDU5LDMsNTUzNDksNTY1ODQsMTE0LDk3LDExOCwxMDEsNSwyMDAsMSw1OSwxNTM0LDEsMjAwLDEwMSwxMDksMTAxLDExMCwxMTYsNTksMSw4NzEyLDQsMiw5NywxMTIsMTU1MCwxNTU1LDk5LDExNCw1OSwxLDI3NCwxMTYsMTIxLDQsMiw4Myw4NiwxNTYzLDE1NzYsMTA5LDk3LDEwOCwxMDgsODMsMTEzLDExNyw5NywxMTQsMTAxLDU5LDEsOTcyMywxMDEsMTE0LDEyMSw4MywxMDksOTcsMTA4LDEwOCw4MywxMTMsMTE3LDk3LDExNCwxMDEsNTksMSw5NjQzLDQsMiwxMDMsMTEyLDE1OTksMTYwNCwxMTEsMTEwLDU5LDEsMjgwLDEwMiw1OSwzLDU1MzQ5LDU2NjM2LDExNSwxMDUsMTA4LDExMSwxMTAsNTksMSw5MTcsMTE3LDQsMiw5NywxMDUsMTYyNCwxNjQwLDEwOCw0LDIsNTksODQsMTYzMSwxNjMzLDEsMTA4NjksMTA1LDEwOCwxMDAsMTAxLDU5LDEsODc3MCwxMDgsMTA1LDk4LDExNCwxMDUsMTE3LDEwOSw1OSwxLDg2NTIsNCwyLDk5LDEwNSwxNjU2LDE2NjAsMTE0LDU5LDEsODQ5NiwxMDksNTksMSwxMDg2Nyw5Nyw1OSwxLDkxOSwxMDksMTA4LDUsMjAzLDEsNTksMTY3NSwxLDIwMyw0LDIsMTA1LDExMiwxNjgzLDE2ODksMTE1LDExNiwxMTUsNTksMSw4NzA3LDExMSwxMTAsMTAxLDExMCwxMTYsMTA1LDk3LDEwOCw2OSw1OSwxLDg1MTksNCw1LDk5LDEwMiwxMDUsMTExLDExNSwxNzEzLDE3MTcsMTcyMiwxNzYyLDE3OTEsMTIxLDU5LDEsMTA2MCwxMTQsNTksMyw1NTM0OSw1NjU4NSwxMDgsMTA4LDEwMSwxMDAsNCwyLDgzLDg2LDE3MzIsMTc0NSwxMDksOTcsMTA4LDEwOCw4MywxMTMsMTE3LDk3LDExNCwxMDEsNTksMSw5NzI0LDEwMSwxMTQsMTIxLDgzLDEwOSw5NywxMDgsMTA4LDgzLDExMywxMTcsOTcsMTE0LDEwMSw1OSwxLDk2NDIsNCwzLDExMiwxMTQsMTE3LDE3NzAsMTc3NSwxNzgxLDEwMiw1OSwzLDU1MzQ5LDU2NjM3LDY1LDEwOCwxMDgsNTksMSw4NzA0LDExNCwxMDUsMTAxLDExNCwxMTYsMTE0LDEwMiw1OSwxLDg0OTcsOTksMTE0LDU5LDEsODQ5Nyw0LDEyLDc0LDg0LDk3LDk4LDk5LDEwMCwxMDIsMTAzLDExMSwxMTQsMTE1LDExNiwxODIyLDE4MjcsMTgzNCwxODQ4LDE4NTUsMTg3NywxODgyLDE4ODcsMTg5MCwxODk2LDE5NzgsMTk4NCw5OSwxMjEsNTksMSwxMDI3LDUsNjIsMSw1OSwxODMyLDEsNjIsMTA5LDEwOSw5Nyw0LDIsNTksMTAwLDE4NDMsMTg0NSwxLDkxNSw1OSwxLDk4OCwxMTQsMTAxLDExOCwxMDEsNTksMSwyODYsNCwzLDEwMSwxMDUsMTIxLDE4NjMsMTg2OSwxODc0LDEwMCwxMDUsMTA4LDU5LDEsMjkwLDExNCw5OSw1OSwxLDI4NCw1OSwxLDEwNDMsMTExLDExNiw1OSwxLDI4OCwxMTQsNTksMyw1NTM0OSw1NjU4Niw1OSwxLDg5MjEsMTEyLDEwMiw1OSwzLDU1MzQ5LDU2NjM4LDEwMSw5NywxMTYsMTAxLDExNCw0LDYsNjksNzAsNzEsNzYsODMsODQsMTkxNSwxOTMzLDE5NDQsMTk1MywxOTU5LDE5NzEsMTEzLDExNyw5NywxMDgsNCwyLDU5LDc2LDE5MjUsMTkyNywxLDg4MDUsMTAxLDExNSwxMTUsNTksMSw4OTIzLDExNywxMDgsMTA4LDY5LDExMywxMTcsOTcsMTA4LDU5LDEsODgwNywxMTQsMTAxLDk3LDExNiwxMDEsMTE0LDU5LDEsMTA5MTQsMTAxLDExNSwxMTUsNTksMSw4ODIzLDEwOCw5NywxMTAsMTE2LDY5LDExMywxMTcsOTcsMTA4LDU5LDEsMTA4NzgsMTA1LDEwOCwxMDAsMTAxLDU5LDEsODgxOSw5OSwxMTQsNTksMyw1NTM0OSw1NjQ4Miw1OSwxLDg4MTEsNCw4LDY1LDk3LDk5LDEwMiwxMDUsMTExLDExNSwxMTcsMjAwNSwyMDEyLDIwMjYsMjAzMiwyMDM2LDIwNDksMjA3MywyMDg5LDgyLDY4LDk5LDEyMSw1OSwxLDEwNjYsNCwyLDk5LDExNiwyMDE4LDIwMjMsMTAxLDEwNyw1OSwxLDcxMSw1OSwxLDk0LDEwNSwxMTQsOTksNTksMSwyOTIsMTE0LDU5LDEsODQ2MCwxMDgsOTgsMTAxLDExNCwxMTYsODMsMTEyLDk3LDk5LDEwMSw1OSwxLDg0NTksNCwyLDExMiwxMTQsMjA1NSwyMDU5LDEwMiw1OSwxLDg0NjEsMTA1LDEyMiwxMTEsMTEwLDExNiw5NywxMDgsNzYsMTA1LDExMCwxMDEsNTksMSw5NDcyLDQsMiw5OSwxMTYsMjA3OSwyMDgzLDExNCw1OSwxLDg0NTksMTE0LDExMSwxMDcsNTksMSwyOTQsMTA5LDExMiw0LDIsNjgsNjksMjA5NywyMTA3LDExMSwxMTksMTEwLDcyLDExNywxMDksMTEyLDU5LDEsODc4MiwxMTMsMTE3LDk3LDEwOCw1OSwxLDg3ODMsNCwxNCw2OSw3NCw3OSw5Nyw5OSwxMDAsMTAyLDEwMywxMDksMTEwLDExMSwxMTUsMTE2LDExNywyMTQ0LDIxNDksMjE1NSwyMTYwLDIxNzEsMjE4OSwyMTk0LDIxOTgsMjIwOSwyMjQ1LDIzMDcsMjMyOSwyMzM0LDIzNDEsOTksMTIxLDU5LDEsMTA0NSwxMDgsMTA1LDEwMyw1OSwxLDMwNiw5OSwxMjEsNTksMSwxMDI1LDk5LDExNywxMTYsMTAxLDUsMjA1LDEsNTksMjE2OSwxLDIwNSw0LDIsMTA1LDEyMSwyMTc3LDIxODYsMTE0LDk5LDUsMjA2LDEsNTksMjE4NCwxLDIwNiw1OSwxLDEwNDgsMTExLDExNiw1OSwxLDMwNCwxMTQsNTksMSw4NDY1LDExNCw5NywxMTgsMTAxLDUsMjA0LDEsNTksMjIwNywxLDIwNCw0LDMsNTksOTcsMTEyLDIyMTcsMjIxOSwyMjM4LDEsODQ2NSw0LDIsOTksMTAzLDIyMjUsMjIyOSwxMTQsNTksMSwyOTgsMTA1LDExMCw5NywxMTQsMTIxLDczLDU5LDEsODUyMCwxMDgsMTA1LDEwMSwxMTUsNTksMSw4NjU4LDQsMiwxMTYsMTE4LDIyNTEsMjI4MSw0LDIsNTksMTAxLDIyNTcsMjI1OSwxLDg3NDgsNCwyLDEwMywxMTQsMjI2NSwyMjcxLDExNCw5NywxMDgsNTksMSw4NzQ3LDExNSwxMDEsOTksMTE2LDEwNSwxMTEsMTEwLDU5LDEsODg5OCwxMDUsMTE1LDEwNSw5OCwxMDgsMTAxLDQsMiw2Nyw4NCwyMjkzLDIzMDAsMTExLDEwOSwxMDksOTcsNTksMSw4MjkxLDEwNSwxMDksMTAxLDExNSw1OSwxLDgyOTAsNCwzLDEwMywxMTIsMTE2LDIzMTUsMjMyMCwyMzI1LDExMSwxMTAsNTksMSwzMDIsMTAyLDU5LDMsNTUzNDksNTY2NDAsOTcsNTksMSw5MjEsOTksMTE0LDU5LDEsODQ2NCwxMDUsMTA4LDEwMCwxMDEsNTksMSwyOTYsNCwyLDEwNywxMDksMjM0NywyMzUyLDk5LDEyMSw1OSwxLDEwMzAsMTA4LDUsMjA3LDEsNTksMjM1OCwxLDIwNyw0LDUsOTksMTAyLDExMSwxMTUsMTE3LDIzNzIsMjM4NiwyMzkxLDIzOTcsMjQxNCw0LDIsMTA1LDEyMSwyMzc4LDIzODMsMTE0LDk5LDU5LDEsMzA4LDU5LDEsMTA0OSwxMTQsNTksMyw1NTM0OSw1NjU4OSwxMTIsMTAyLDU5LDMsNTUzNDksNTY2NDEsNCwyLDk5LDEwMSwyNDAzLDI0MDgsMTE0LDU5LDMsNTUzNDksNTY0ODUsMTE0LDk5LDEyMSw1OSwxLDEwMzIsMTA3LDk5LDEyMSw1OSwxLDEwMjgsNCw3LDcyLDc0LDk3LDk5LDEwMiwxMTEsMTE1LDI0MzYsMjQ0MSwyNDQ2LDI0NTIsMjQ2NywyNDcyLDI0NzgsOTksMTIxLDU5LDEsMTA2MSw5OSwxMjEsNTksMSwxMDM2LDExMiwxMTIsOTcsNTksMSw5MjIsNCwyLDEwMSwxMjEsMjQ1OCwyNDY0LDEwMCwxMDUsMTA4LDU5LDEsMzEwLDU5LDEsMTA1MCwxMTQsNTksMyw1NTM0OSw1NjU5MCwxMTIsMTAyLDU5LDMsNTUzNDksNTY2NDIsOTksMTE0LDU5LDMsNTUzNDksNTY0ODYsNCwxMSw3NCw4NCw5Nyw5OSwxMDEsMTAyLDEwOCwxMDksMTExLDExNSwxMTYsMjUwOCwyNTEzLDI1MjAsMjU2MiwyNTg1LDI5ODEsMjk4NiwzMDA0LDMwMTEsMzE0NiwzMTY3LDk5LDEyMSw1OSwxLDEwMzMsNSw2MCwxLDU5LDI1MTgsMSw2MCw0LDUsOTksMTA5LDExMCwxMTIsMTE0LDI1MzIsMjUzOCwyNTQ0LDI1NDgsMjU1OCwxMTcsMTE2LDEwMSw1OSwxLDMxMyw5OCwxMDAsOTcsNTksMSw5MjMsMTAzLDU5LDEsMTAyMTgsMTA4LDk3LDk5LDEwMSwxMTYsMTE0LDEwMiw1OSwxLDg0NjYsMTE0LDU5LDEsODYwNiw0LDMsOTcsMTAxLDEyMSwyNTcwLDI1NzYsMjU4MiwxMTQsMTExLDExMCw1OSwxLDMxNywxMDAsMTA1LDEwOCw1OSwxLDMxNSw1OSwxLDEwNTEsNCwyLDEwMiwxMTUsMjU5MSwyOTA3LDExNiw0LDEwLDY1LDY3LDY4LDcwLDgyLDg0LDg1LDg2LDk3LDExNCwyNjE0LDI2NjMsMjY3MiwyNzI4LDI3MzUsMjc2MCwyODIwLDI4NzAsMjg4OCwyODk1LDQsMiwxMTAsMTE0LDI2MjAsMjYzMywxMDMsMTA4LDEwMSw2NiwxMTQsOTcsOTksMTA3LDEwMSwxMTYsNTksMSwxMDIxNiwxMTQsMTExLDExOSw0LDMsNTksNjYsODIsMjY0NCwyNjQ2LDI2NTEsMSw4NTkyLDk3LDExNCw1OSwxLDg2NzYsMTA1LDEwMywxMDQsMTE2LDY1LDExNCwxMTQsMTExLDExOSw1OSwxLDg2NDYsMTAxLDEwNSwxMDgsMTA1LDExMCwxMDMsNTksMSw4OTY4LDExMSw0LDIsMTE3LDExOSwyNjc5LDI2OTIsOTgsMTA4LDEwMSw2NiwxMTQsOTcsOTksMTA3LDEwMSwxMTYsNTksMSwxMDIxNCwxMTAsNCwyLDg0LDg2LDI2OTksMjcxMCwxMDEsMTAxLDg2LDEwMSw5OSwxMTYsMTExLDExNCw1OSwxLDEwNTkzLDEwMSw5OSwxMTYsMTExLDExNCw0LDIsNTksNjYsMjcyMSwyNzIzLDEsODY0Myw5NywxMTQsNTksMSwxMDU4NSwxMDgsMTExLDExMSwxMTQsNTksMSw4OTcwLDEwNSwxMDMsMTA0LDExNiw0LDIsNjUsODYsMjc0NSwyNzUyLDExNCwxMTQsMTExLDExOSw1OSwxLDg1OTYsMTAxLDk5LDExNiwxMTEsMTE0LDU5LDEsMTA1NzQsNCwyLDEwMSwxMTQsMjc2NiwyNzkyLDEwMSw0LDMsNTksNjUsODYsMjc3NSwyNzc3LDI3ODQsMSw4ODY3LDExNCwxMTQsMTExLDExOSw1OSwxLDg2MTIsMTAxLDk5LDExNiwxMTEsMTE0LDU5LDEsMTA1ODYsMTA1LDk3LDExMCwxMDMsMTA4LDEwMSw0LDMsNTksNjYsNjksMjgwNiwyODA4LDI4MTMsMSw4ODgyLDk3LDExNCw1OSwxLDEwNzAzLDExMywxMTcsOTcsMTA4LDU5LDEsODg4NCwxMTIsNCwzLDY4LDg0LDg2LDI4MjksMjg0MSwyODUyLDExMSwxMTksMTEwLDg2LDEwMSw5OSwxMTYsMTExLDExNCw1OSwxLDEwNTc3LDEwMSwxMDEsODYsMTAxLDk5LDExNiwxMTEsMTE0LDU5LDEsMTA1OTIsMTAxLDk5LDExNiwxMTEsMTE0LDQsMiw1OSw2NiwyODYzLDI4NjUsMSw4NjM5LDk3LDExNCw1OSwxLDEwNTg0LDEwMSw5OSwxMTYsMTExLDExNCw0LDIsNTksNjYsMjg4MSwyODgzLDEsODYzNiw5NywxMTQsNTksMSwxMDU3OCwxMTQsMTE0LDExMSwxMTksNTksMSw4NjU2LDEwNSwxMDMsMTA0LDExNiw5NywxMTQsMTE0LDExMSwxMTksNTksMSw4NjYwLDExNSw0LDYsNjksNzAsNzEsNzYsODMsODQsMjkyMiwyOTM2LDI5NDcsMjk1NiwyOTYyLDI5NzQsMTEzLDExNyw5NywxMDgsNzEsMTE0LDEwMSw5NywxMTYsMTAxLDExNCw1OSwxLDg5MjIsMTE3LDEwOCwxMDgsNjksMTEzLDExNyw5NywxMDgsNTksMSw4ODA2LDExNCwxMDEsOTcsMTE2LDEwMSwxMTQsNTksMSw4ODIyLDEwMSwxMTUsMTE1LDU5LDEsMTA5MTMsMTA4LDk3LDExMCwxMTYsNjksMTEzLDExNyw5NywxMDgsNTksMSwxMDg3NywxMDUsMTA4LDEwMCwxMDEsNTksMSw4ODE4LDExNCw1OSwzLDU1MzQ5LDU2NTkxLDQsMiw1OSwxMDEsMjk5MiwyOTk0LDEsODkyMCwxMDIsMTE2LDk3LDExNCwxMTQsMTExLDExOSw1OSwxLDg2NjYsMTA1LDEwMCwxMTEsMTE2LDU5LDEsMzE5LDQsMywxMTAsMTEyLDExOSwzMDE5LDMxMTAsMzExNSwxMDMsNCw0LDc2LDgyLDEwOCwxMTQsMzAzMCwzMDU4LDMwNzAsMzA5OCwxMDEsMTAyLDExNiw0LDIsNjUsODIsMzAzOSwzMDQ2LDExNCwxMTQsMTExLDExOSw1OSwxLDEwMjI5LDEwNSwxMDMsMTA0LDExNiw2NSwxMTQsMTE0LDExMSwxMTksNTksMSwxMDIzMSwxMDUsMTAzLDEwNCwxMTYsNjUsMTE0LDExNCwxMTEsMTE5LDU5LDEsMTAyMzAsMTAxLDEwMiwxMTYsNCwyLDk3LDExNCwzMDc5LDMwODYsMTE0LDExNCwxMTEsMTE5LDU5LDEsMTAyMzIsMTA1LDEwMywxMDQsMTE2LDk3LDExNCwxMTQsMTExLDExOSw1OSwxLDEwMjM0LDEwNSwxMDMsMTA0LDExNiw5NywxMTQsMTE0LDExMSwxMTksNTksMSwxMDIzMywxMDIsNTksMyw1NTM0OSw1NjY0MywxMDEsMTE0LDQsMiw3Niw4MiwzMTIzLDMxMzQsMTAxLDEwMiwxMTYsNjUsMTE0LDExNCwxMTEsMTE5LDU5LDEsODYwMSwxMDUsMTAzLDEwNCwxMTYsNjUsMTE0LDExNCwxMTEsMTE5LDU5LDEsODYwMCw0LDMsOTksMTA0LDExNiwzMTU0LDMxNTgsMzE2MSwxMTQsNTksMSw4NDY2LDU5LDEsODYyNCwxMTQsMTExLDEwNyw1OSwxLDMyMSw1OSwxLDg4MTAsNCw4LDk3LDk5LDEwMSwxMDIsMTA1LDExMSwxMTUsMTE3LDMxODgsMzE5MiwzMTk2LDMyMjIsMzIyNywzMjM3LDMyNDMsMzI0OCwxMTIsNTksMSwxMDUwMSwxMjEsNTksMSwxMDUyLDQsMiwxMDAsMTA4LDMyMDIsMzIxMywxMDUsMTE3LDEwOSw4MywxMTIsOTcsOTksMTAxLDU5LDEsODI4NywxMDgsMTA1LDExMCwxMTYsMTE0LDEwMiw1OSwxLDg0OTksMTE0LDU5LDMsNTUzNDksNTY1OTIsMTEwLDExNywxMTUsODAsMTA4LDExNywxMTUsNTksMSw4NzIzLDExMiwxMDIsNTksMyw1NTM0OSw1NjY0NCw5OSwxMTQsNTksMSw4NDk5LDU5LDEsOTI0LDQsOSw3NCw5Nyw5OSwxMDEsMTAyLDExMSwxMTUsMTE2LDExNywzMjcxLDMyNzYsMzI4MywzMzA2LDM0MjIsMzQyNyw0MTIwLDQxMjYsNDEzNyw5OSwxMjEsNTksMSwxMDM0LDk5LDExNywxMTYsMTAxLDU5LDEsMzIzLDQsMyw5NywxMDEsMTIxLDMyOTEsMzI5NywzMzAzLDExNCwxMTEsMTEwLDU5LDEsMzI3LDEwMCwxMDUsMTA4LDU5LDEsMzI1LDU5LDEsMTA1Myw0LDMsMTAzLDExNSwxMTksMzMxNCwzMzgwLDM0MTUsOTcsMTE2LDEwNSwxMTgsMTAxLDQsMyw3Nyw4NCw4NiwzMzI3LDMzNDAsMzM2NSwxMDEsMTAwLDEwNSwxMTcsMTA5LDgzLDExMiw5Nyw5OSwxMDEsNTksMSw4MjAzLDEwNCwxMDUsNCwyLDk5LDExMCwzMzQ4LDMzNTcsMTA3LDgzLDExMiw5Nyw5OSwxMDEsNTksMSw4MjAzLDgzLDExMiw5Nyw5OSwxMDEsNTksMSw4MjAzLDEwMSwxMTQsMTIxLDg0LDEwNCwxMDUsMTEwLDgzLDExMiw5Nyw5OSwxMDEsNTksMSw4MjAzLDExNiwxMDEsMTAwLDQsMiw3MSw3NiwzMzg5LDM0MDUsMTE0LDEwMSw5NywxMTYsMTAxLDExNCw3MSwxMTQsMTAxLDk3LDExNiwxMDEsMTE0LDU5LDEsODgxMSwxMDEsMTE1LDExNSw3NiwxMDEsMTE1LDExNSw1OSwxLDg4MTAsNzYsMTA1LDExMCwxMDEsNTksMSwxMCwxMTQsNTksMyw1NTM0OSw1NjU5Myw0LDQsNjYsMTEwLDExMiwxMTYsMzQzNywzNDQ0LDM0NjAsMzQ2NCwxMTQsMTAxLDk3LDEwNyw1OSwxLDgyODgsNjYsMTE0LDEwMSw5NywxMDcsMTA1LDExMCwxMDMsODMsMTEyLDk3LDk5LDEwMSw1OSwxLDE2MCwxMDIsNTksMSw4NDY5LDQsMTMsNTksNjcsNjgsNjksNzEsNzIsNzYsNzgsODAsODIsODMsODQsODYsMzQ5MiwzNDk0LDM1MTcsMzUzNiwzNTc4LDM2NTcsMzY4NSwzNzg0LDM4MjMsMzg2MCwzOTE1LDQwNjYsNDEwNywxLDEwOTg4LDQsMiwxMTEsMTE3LDM1MDAsMzUxMCwxMTAsMTAzLDExNCwxMTcsMTAxLDExMCwxMTYsNTksMSw4ODAyLDExMiw2Nyw5NywxMTIsNTksMSw4ODEzLDExMSwxMTcsOTgsMTA4LDEwMSw4NiwxMDEsMTE0LDExNiwxMDUsOTksOTcsMTA4LDY2LDk3LDExNCw1OSwxLDg3NDIsNCwzLDEwOCwxMTMsMTIwLDM1NDQsMzU1MiwzNTcxLDEwMSwxMDksMTAxLDExMCwxMTYsNTksMSw4NzEzLDExNyw5NywxMDgsNCwyLDU5LDg0LDM1NjEsMzU2MywxLDg4MDAsMTA1LDEwOCwxMDAsMTAxLDU5LDMsODc3MCw4MjQsMTA1LDExNSwxMTYsMTE1LDU5LDEsODcwOCwxMTQsMTAxLDk3LDExNiwxMDEsMTE0LDQsNyw1OSw2OSw3MCw3MSw3Niw4Myw4NCwzNjAwLDM2MDIsMzYwOSwzNjIxLDM2MzEsMzYzNywzNjUwLDEsODgxNSwxMTMsMTE3LDk3LDEwOCw1OSwxLDg4MTcsMTE3LDEwOCwxMDgsNjksMTEzLDExNyw5NywxMDgsNTksMyw4ODA3LDgyNCwxMTQsMTAxLDk3LDExNiwxMDEsMTE0LDU5LDMsODgxMSw4MjQsMTAxLDExNSwxMTUsNTksMSw4ODI1LDEwOCw5NywxMTAsMTE2LDY5LDExMywxMTcsOTcsMTA4LDU5LDMsMTA4NzgsODI0LDEwNSwxMDgsMTAwLDEwMSw1OSwxLDg4MjEsMTE3LDEwOSwxMTIsNCwyLDY4LDY5LDM2NjYsMzY3NywxMTEsMTE5LDExMCw3MiwxMTcsMTA5LDExMiw1OSwzLDg3ODIsODI0LDExMywxMTcsOTcsMTA4LDU5LDMsODc4Myw4MjQsMTAxLDQsMiwxMDIsMTE1LDM2OTIsMzcyNCwxMTYsODQsMTE0LDEwNSw5NywxMTAsMTAzLDEwOCwxMDEsNCwzLDU5LDY2LDY5LDM3MDksMzcxMSwzNzE3LDEsODkzOCw5NywxMTQsNTksMywxMDcwMyw4MjQsMTEzLDExNyw5NywxMDgsNTksMSw4OTQwLDExNSw0LDYsNTksNjksNzEsNzYsODMsODQsMzczOSwzNzQxLDM3NDgsMzc1NywzNzY0LDM3NzcsMSw4ODE0LDExMywxMTcsOTcsMTA4LDU5LDEsODgxNiwxMTQsMTAxLDk3LDExNiwxMDEsMTE0LDU5LDEsODgyNCwxMDEsMTE1LDExNSw1OSwzLDg4MTAsODI0LDEwOCw5NywxMTAsMTE2LDY5LDExMywxMTcsOTcsMTA4LDU5LDMsMTA4NzcsODI0LDEwNSwxMDgsMTAwLDEwMSw1OSwxLDg4MjAsMTAxLDExNSwxMTYsMTAxLDEwMCw0LDIsNzEsNzYsMzc5NSwzODEyLDExNCwxMDEsOTcsMTE2LDEwMSwxMTQsNzEsMTE0LDEwMSw5NywxMTYsMTAxLDExNCw1OSwzLDEwOTE0LDgyNCwxMDEsMTE1LDExNSw3NiwxMDEsMTE1LDExNSw1OSwzLDEwOTEzLDgyNCwxMTQsMTAxLDk5LDEwMSwxMDAsMTAxLDExNSw0LDMsNTksNjksODMsMzgzOCwzODQwLDM4NDgsMSw4ODMyLDExMywxMTcsOTcsMTA4LDU5LDMsMTA5MjcsODI0LDEwOCw5NywxMTAsMTE2LDY5LDExMywxMTcsOTcsMTA4LDU5LDEsODkyOCw0LDIsMTAxLDEwNSwzODY2LDM4ODEsMTE4LDEwMSwxMTQsMTE1LDEwMSw2OSwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw1OSwxLDg3MTYsMTAzLDEwNCwxMTYsODQsMTE0LDEwNSw5NywxMTAsMTAzLDEwOCwxMDEsNCwzLDU5LDY2LDY5LDM5MDAsMzkwMiwzOTA4LDEsODkzOSw5NywxMTQsNTksMywxMDcwNCw4MjQsMTEzLDExNyw5NywxMDgsNTksMSw4OTQxLDQsMiwxMTMsMTE3LDM5MjEsMzk3MywxMTcsOTcsMTE0LDEwMSw4MywxMTcsNCwyLDk4LDExMiwzOTMzLDM5NTIsMTE1LDEwMSwxMTYsNCwyLDU5LDY5LDM5NDIsMzk0NSwzLDg4NDcsODI0LDExMywxMTcsOTcsMTA4LDU5LDEsODkzMCwxMDEsMTE0LDExNSwxMDEsMTE2LDQsMiw1OSw2OSwzOTYzLDM5NjYsMyw4ODQ4LDgyNCwxMTMsMTE3LDk3LDEwOCw1OSwxLDg5MzEsNCwzLDk4LDk5LDExMiwzOTgxLDQwMDAsNDA0NSwxMTUsMTAxLDExNiw0LDIsNTksNjksMzk5MCwzOTkzLDMsODgzNCw4NDAyLDExMywxMTcsOTcsMTA4LDU5LDEsODg0MCw5OSwxMDEsMTAxLDEwMCwxMTUsNCw0LDU5LDY5LDgzLDg0LDQwMTUsNDAxNyw0MDI1LDQwMzcsMSw4ODMzLDExMywxMTcsOTcsMTA4LDU5LDMsMTA5MjgsODI0LDEwOCw5NywxMTAsMTE2LDY5LDExMywxMTcsOTcsMTA4LDU5LDEsODkyOSwxMDUsMTA4LDEwMCwxMDEsNTksMyw4ODMxLDgyNCwxMDEsMTE0LDExNSwxMDEsMTE2LDQsMiw1OSw2OSw0MDU2LDQwNTksMyw4ODM1LDg0MDIsMTEzLDExNyw5NywxMDgsNTksMSw4ODQxLDEwNSwxMDgsMTAwLDEwMSw0LDQsNTksNjksNzAsODQsNDA4MCw0MDgyLDQwODksNDEwMCwxLDg3NjksMTEzLDExNyw5NywxMDgsNTksMSw4NzcyLDExNywxMDgsMTA4LDY5LDExMywxMTcsOTcsMTA4LDU5LDEsODc3NSwxMDUsMTA4LDEwMCwxMDEsNTksMSw4Nzc3LDEwMSwxMTQsMTE2LDEwNSw5OSw5NywxMDgsNjYsOTcsMTE0LDU5LDEsODc0MCw5OSwxMTQsNTksMyw1NTM0OSw1NjQ4OSwxMDUsMTA4LDEwMCwxMDEsNSwyMDksMSw1OSw0MTM1LDEsMjA5LDU5LDEsOTI1LDQsMTQsNjksOTcsOTksMTAwLDEwMiwxMDMsMTA5LDExMSwxMTIsMTE0LDExNSwxMTYsMTE3LDExOCw0MTcwLDQxNzYsNDE4Nyw0MjA1LDQyMTIsNDIxNyw0MjI4LDQyNTMsNDI1OSw0MjkyLDQyOTUsNDMxNiw0MzM3LDQzNDYsMTA4LDEwNSwxMDMsNTksMSwzMzgsOTksMTE3LDExNiwxMDEsNSwyMTEsMSw1OSw0MTg1LDEsMjExLDQsMiwxMDUsMTIxLDQxOTMsNDIwMiwxMTQsOTksNSwyMTIsMSw1OSw0MjAwLDEsMjEyLDU5LDEsMTA1NCw5OCwxMDgsOTcsOTksNTksMSwzMzYsMTE0LDU5LDMsNTUzNDksNTY1OTQsMTE0LDk3LDExOCwxMDEsNSwyMTAsMSw1OSw0MjI2LDEsMjEwLDQsMyw5NywxMDEsMTA1LDQyMzYsNDI0MSw0MjQ2LDk5LDExNCw1OSwxLDMzMiwxMDMsOTcsNTksMSw5MzcsOTksMTE0LDExMSwxMTAsNTksMSw5MjcsMTEyLDEwMiw1OSwzLDU1MzQ5LDU2NjQ2LDEwMSwxMTAsNjcsMTE3LDExNCwxMDgsMTIxLDQsMiw2OCw4MSw0MjcyLDQyODUsMTExLDExNyw5OCwxMDgsMTAxLDgxLDExNywxMTEsMTE2LDEwMSw1OSwxLDgyMjAsMTE3LDExMSwxMTYsMTAxLDU5LDEsODIxNiw1OSwxLDEwODM2LDQsMiw5OSwxMDgsNDMwMSw0MzA2LDExNCw1OSwzLDU1MzQ5LDU2NDkwLDk3LDExNSwxMDQsNSwyMTYsMSw1OSw0MzE0LDEsMjE2LDEwNSw0LDIsMTA4LDEwOSw0MzIzLDQzMzIsMTAwLDEwMSw1LDIxMywxLDU5LDQzMzAsMSwyMTMsMTAxLDExNSw1OSwxLDEwODA3LDEwOSwxMDgsNSwyMTQsMSw1OSw0MzQ0LDEsMjE0LDEwMSwxMTQsNCwyLDY2LDgwLDQzNTQsNDM4MCw0LDIsOTcsMTE0LDQzNjAsNDM2NCwxMTQsNTksMSw4MjU0LDk3LDk5LDQsMiwxMDEsMTA3LDQzNzIsNDM3NSw1OSwxLDkxODIsMTAxLDExNiw1OSwxLDkxNDAsOTcsMTE0LDEwMSwxMTAsMTE2LDEwNCwxMDEsMTE1LDEwNSwxMTUsNTksMSw5MTgwLDQsOSw5Nyw5OSwxMDIsMTA0LDEwNSwxMDgsMTExLDExNCwxMTUsNDQxMyw0NDIyLDQ0MjYsNDQzMSw0NDM1LDQ0MzgsNDQ0OCw0NDcxLDQ1NjEsMTE0LDExNiwxMDUsOTcsMTA4LDY4LDU5LDEsODcwNiwxMjEsNTksMSwxMDU1LDExNCw1OSwzLDU1MzQ5LDU2NTk1LDEwNSw1OSwxLDkzNCw1OSwxLDkyOCwxMTcsMTE1LDc3LDEwNSwxMTAsMTE3LDExNSw1OSwxLDE3Nyw0LDIsMTA1LDExMiw0NDU0LDQ0NjcsMTEwLDk5LDk3LDExNCwxMDEsMTEyLDEwOCw5NywxMTAsMTAxLDU5LDEsODQ2MCwxMDIsNTksMSw4NDczLDQsNCw1OSwxMDEsMTA1LDExMSw0NDgxLDQ0ODMsNDUyNiw0NTMxLDEsMTA5MzksOTksMTAxLDEwMCwxMDEsMTE1LDQsNCw1OSw2OSw4Myw4NCw0NDk4LDQ1MDAsNDUwNyw0NTE5LDEsODgyNiwxMTMsMTE3LDk3LDEwOCw1OSwxLDEwOTI3LDEwOCw5NywxMTAsMTE2LDY5LDExMywxMTcsOTcsMTA4LDU5LDEsODgyOCwxMDUsMTA4LDEwMCwxMDEsNTksMSw4ODMwLDEwOSwxMDEsNTksMSw4MjQzLDQsMiwxMDAsMTEyLDQ1MzcsNDU0MywxMTcsOTksMTE2LDU5LDEsODcxOSwxMTEsMTE0LDExNiwxMDUsMTExLDExMCw0LDIsNTksOTcsNDU1NSw0NTU3LDEsODc1OSwxMDgsNTksMSw4NzMzLDQsMiw5OSwxMDUsNDU2Nyw0NTcyLDExNCw1OSwzLDU1MzQ5LDU2NDkxLDU5LDEsOTM2LDQsNCw4NSwxMDIsMTExLDExNSw0NTg1LDQ1OTQsNDU5OSw0NjA0LDc5LDg0LDUsMzQsMSw1OSw0NTkyLDEsMzQsMTE0LDU5LDMsNTUzNDksNTY1OTYsMTEyLDEwMiw1OSwxLDg0NzQsOTksMTE0LDU5LDMsNTUzNDksNTY0OTIsNCwxMiw2Niw2OSw5Nyw5OSwxMDEsMTAyLDEwNCwxMDUsMTExLDExNCwxMTUsMTE3LDQ2MzYsNDY0Miw0NjUwLDQ2ODEsNDcwNCw0NzYzLDQ3NjcsNDc3MSw1MDQ3LDUwNjksNTA4MSw1MDk0LDk3LDExNCwxMTQsNTksMSwxMDUxMiw3MSw1LDE3NCwxLDU5LDQ2NDgsMSwxNzQsNCwzLDk5LDExMCwxMTQsNDY1OCw0NjY0LDQ2NjgsMTE3LDExNiwxMDEsNTksMSwzNDAsMTAzLDU5LDEsMTAyMTksMTE0LDQsMiw1OSwxMTYsNDY3NSw0Njc3LDEsODYwOCwxMDgsNTksMSwxMDUxOCw0LDMsOTcsMTAxLDEyMSw0Njg5LDQ2OTUsNDcwMSwxMTQsMTExLDExMCw1OSwxLDM0NCwxMDAsMTA1LDEwOCw1OSwxLDM0Miw1OSwxLDEwNTYsNCwyLDU5LDExOCw0NzEwLDQ3MTIsMSw4NDc2LDEwMSwxMTQsMTE1LDEwMSw0LDIsNjksODUsNDcyMiw0NzQ4LDQsMiwxMDgsMTEzLDQ3MjgsNDczNiwxMDEsMTA5LDEwMSwxMTAsMTE2LDU5LDEsODcxNSwxMTcsMTA1LDEwOCwxMDUsOTgsMTE0LDEwNSwxMTcsMTA5LDU5LDEsODY1MSwxMTIsNjksMTEzLDExNywxMDUsMTA4LDEwNSw5OCwxMTQsMTA1LDExNywxMDksNTksMSwxMDYwNywxMTQsNTksMSw4NDc2LDExMSw1OSwxLDkyOSwxMDMsMTA0LDExNiw0LDgsNjUsNjcsNjgsNzAsODQsODUsODYsOTcsNDc5Miw0ODQwLDQ4NDksNDkwNSw0OTEyLDQ5NzIsNTAyMiw1MDQwLDQsMiwxMTAsMTE0LDQ3OTgsNDgxMSwxMDMsMTA4LDEwMSw2NiwxMTQsOTcsOTksMTA3LDEwMSwxMTYsNTksMSwxMDIxNywxMTQsMTExLDExOSw0LDMsNTksNjYsNzYsNDgyMiw0ODI0LDQ4MjksMSw4NTk0LDk3LDExNCw1OSwxLDg2NzcsMTAxLDEwMiwxMTYsNjUsMTE0LDExNCwxMTEsMTE5LDU5LDEsODY0NCwxMDEsMTA1LDEwOCwxMDUsMTEwLDEwMyw1OSwxLDg5NjksMTExLDQsMiwxMTcsMTE5LDQ4NTYsNDg2OSw5OCwxMDgsMTAxLDY2LDExNCw5Nyw5OSwxMDcsMTAxLDExNiw1OSwxLDEwMjE1LDExMCw0LDIsODQsODYsNDg3Niw0ODg3LDEwMSwxMDEsODYsMTAxLDk5LDExNiwxMTEsMTE0LDU5LDEsMTA1ODksMTAxLDk5LDExNiwxMTEsMTE0LDQsMiw1OSw2Niw0ODk4LDQ5MDAsMSw4NjQyLDk3LDExNCw1OSwxLDEwNTgxLDEwOCwxMTEsMTExLDExNCw1OSwxLDg5NzEsNCwyLDEwMSwxMTQsNDkxOCw0OTQ0LDEwMSw0LDMsNTksNjUsODYsNDkyNyw0OTI5LDQ5MzYsMSw4ODY2LDExNCwxMTQsMTExLDExOSw1OSwxLDg2MTQsMTAxLDk5LDExNiwxMTEsMTE0LDU5LDEsMTA1ODcsMTA1LDk3LDExMCwxMDMsMTA4LDEwMSw0LDMsNTksNjYsNjksNDk1OCw0OTYwLDQ5NjUsMSw4ODgzLDk3LDExNCw1OSwxLDEwNzA0LDExMywxMTcsOTcsMTA4LDU5LDEsODg4NSwxMTIsNCwzLDY4LDg0LDg2LDQ5ODEsNDk5Myw1MDA0LDExMSwxMTksMTEwLDg2LDEwMSw5OSwxMTYsMTExLDExNCw1OSwxLDEwNTc1LDEwMSwxMDEsODYsMTAxLDk5LDExNiwxMTEsMTE0LDU5LDEsMTA1ODgsMTAxLDk5LDExNiwxMTEsMTE0LDQsMiw1OSw2Niw1MDE1LDUwMTcsMSw4NjM4LDk3LDExNCw1OSwxLDEwNTgwLDEwMSw5OSwxMTYsMTExLDExNCw0LDIsNTksNjYsNTAzMyw1MDM1LDEsODY0MCw5NywxMTQsNTksMSwxMDU3OSwxMTQsMTE0LDExMSwxMTksNTksMSw4NjU4LDQsMiwxMTIsMTE3LDUwNTMsNTA1NywxMDIsNTksMSw4NDc3LDExMCwxMDAsNzMsMTA5LDExMiwxMDgsMTA1LDEwMSwxMTUsNTksMSwxMDYwOCwxMDUsMTAzLDEwNCwxMTYsOTcsMTE0LDExNCwxMTEsMTE5LDU5LDEsODY2Nyw0LDIsOTksMTA0LDUwODcsNTA5MSwxMTQsNTksMSw4NDc1LDU5LDEsODYyNSwxMDgsMTAxLDY4LDEwMSwxMDgsOTcsMTIxLDEwMSwxMDAsNTksMSwxMDc0MCw0LDEzLDcyLDc5LDk3LDk5LDEwMiwxMDQsMTA1LDEwOSwxMTEsMTEzLDExNSwxMTYsMTE3LDUxMzQsNTE1MCw1MTU3LDUxNjQsNTE5OCw1MjAzLDUyNTksNTI2NSw1Mjc3LDUyODMsNTM3NCw1MzgwLDUzODUsNCwyLDY3LDk5LDUxNDAsNTE0Niw3Miw5OSwxMjEsNTksMSwxMDY1LDEyMSw1OSwxLDEwNjQsNzAsODQsOTksMTIxLDU5LDEsMTA2OCw5OSwxMTcsMTE2LDEwMSw1OSwxLDM0Niw0LDUsNTksOTcsMTAxLDEwNSwxMjEsNTE3Niw1MTc4LDUxODQsNTE5MCw1MTk1LDEsMTA5NDAsMTE0LDExMSwxMTAsNTksMSwzNTIsMTAwLDEwNSwxMDgsNTksMSwzNTAsMTE0LDk5LDU5LDEsMzQ4LDU5LDEsMTA1NywxMTQsNTksMyw1NTM0OSw1NjU5OCwxMTEsMTE0LDExNiw0LDQsNjgsNzYsODIsODUsNTIxNiw1MjI3LDUyMzgsNTI1MCwxMTEsMTE5LDExMCw2NSwxMTQsMTE0LDExMSwxMTksNTksMSw4NTk1LDEwMSwxMDIsMTE2LDY1LDExNCwxMTQsMTExLDExOSw1OSwxLDg1OTIsMTA1LDEwMywxMDQsMTE2LDY1LDExNCwxMTQsMTExLDExOSw1OSwxLDg1OTQsMTEyLDY1LDExNCwxMTQsMTExLDExOSw1OSwxLDg1OTMsMTAzLDEwOSw5Nyw1OSwxLDkzMSw5NywxMDgsMTA4LDY3LDEwNSwxMTQsOTksMTA4LDEwMSw1OSwxLDg3MjgsMTEyLDEwMiw1OSwzLDU1MzQ5LDU2NjUwLDQsMiwxMTQsMTE3LDUyODksNTI5MywxMTYsNTksMSw4NzMwLDk3LDExNCwxMDEsNCw0LDU5LDczLDgzLDg1LDUzMDYsNTMwOCw1MzIyLDUzNjcsMSw5NjMzLDExMCwxMTYsMTAxLDExNCwxMTUsMTAxLDk5LDExNiwxMDUsMTExLDExMCw1OSwxLDg4NTEsMTE3LDQsMiw5OCwxMTIsNTMyOSw1MzQ3LDExNSwxMDEsMTE2LDQsMiw1OSw2OSw1MzM4LDUzNDAsMSw4ODQ3LDExMywxMTcsOTcsMTA4LDU5LDEsODg0OSwxMDEsMTE0LDExNSwxMDEsMTE2LDQsMiw1OSw2OSw1MzU4LDUzNjAsMSw4ODQ4LDExMywxMTcsOTcsMTA4LDU5LDEsODg1MCwxMTAsMTA1LDExMSwxMTAsNTksMSw4ODUyLDk5LDExNCw1OSwzLDU1MzQ5LDU2NDk0LDk3LDExNCw1OSwxLDg5MDIsNCw0LDk4LDk5LDEwOSwxMTIsNTM5NSw1NDIwLDU0NzUsNTQ3OCw0LDIsNTksMTE1LDU0MDEsNTQwMywxLDg5MTIsMTAxLDExNiw0LDIsNTksNjksNTQxMSw1NDEzLDEsODkxMiwxMTMsMTE3LDk3LDEwOCw1OSwxLDg4MzgsNCwyLDk5LDEwNCw1NDI2LDU0NjgsMTAxLDEwMSwxMDAsMTE1LDQsNCw1OSw2OSw4Myw4NCw1NDQwLDU0NDIsNTQ0OSw1NDYxLDEsODgyNywxMTMsMTE3LDk3LDEwOCw1OSwxLDEwOTI4LDEwOCw5NywxMTAsMTE2LDY5LDExMywxMTcsOTcsMTA4LDU5LDEsODgyOSwxMDUsMTA4LDEwMCwxMDEsNTksMSw4ODMxLDg0LDEwNCw5NywxMTYsNTksMSw4NzE1LDU5LDEsODcyMSw0LDMsNTksMTAxLDExNSw1NDg2LDU0ODgsNTUwNywxLDg5MTMsMTE0LDExNSwxMDEsMTE2LDQsMiw1OSw2OSw1NDk4LDU1MDAsMSw4ODM1LDExMywxMTcsOTcsMTA4LDU5LDEsODgzOSwxMDEsMTE2LDU5LDEsODkxMyw0LDExLDcyLDgyLDgzLDk3LDk5LDEwMiwxMDQsMTA1LDExMSwxMTQsMTE1LDU1MzYsNTU0Niw1NTUyLDU1NjcsNTU3OSw1NjAyLDU2MDcsNTY1NSw1Njk1LDU3MDEsNTcxMSw3OSw4Miw3OCw1LDIyMiwxLDU5LDU1NDQsMSwyMjIsNjUsNjgsNjksNTksMSw4NDgyLDQsMiw3Miw5OSw1NTU4LDU1NjMsOTksMTIxLDU5LDEsMTAzNSwxMjEsNTksMSwxMDYyLDQsMiw5OCwxMTcsNTU3Myw1NTc2LDU5LDEsOSw1OSwxLDkzMiw0LDMsOTcsMTAxLDEyMSw1NTg3LDU1OTMsNTU5OSwxMTQsMTExLDExMCw1OSwxLDM1NiwxMDAsMTA1LDEwOCw1OSwxLDM1NCw1OSwxLDEwNTgsMTE0LDU5LDMsNTUzNDksNTY1OTksNCwyLDEwMSwxMDUsNTYxMyw1NjMxLDQsMiwxMTQsMTE2LDU2MTksNTYyNywxMDEsMTAyLDExMSwxMTQsMTAxLDU5LDEsODc1Niw5Nyw1OSwxLDkyMCw0LDIsOTksMTEwLDU2MzcsNTY0NywxMDcsODMsMTEyLDk3LDk5LDEwMSw1OSwzLDgyODcsODIwMiw4MywxMTIsOTcsOTksMTAxLDU5LDEsODIwMSwxMDgsMTAwLDEwMSw0LDQsNTksNjksNzAsODQsNTY2OCw1NjcwLDU2NzcsNTY4OCwxLDg3NjQsMTEzLDExNyw5NywxMDgsNTksMSw4NzcxLDExNywxMDgsMTA4LDY5LDExMywxMTcsOTcsMTA4LDU5LDEsODc3MywxMDUsMTA4LDEwMCwxMDEsNTksMSw4Nzc2LDExMiwxMDIsNTksMyw1NTM0OSw1NjY1MSwxMDUsMTEyLDEwOCwxMDEsNjgsMTExLDExNiw1OSwxLDg0MTEsNCwyLDk5LDExNiw1NzE3LDU3MjIsMTE0LDU5LDMsNTUzNDksNTY0OTUsMTE0LDExMSwxMDcsNTksMSwzNTgsNCwxNCw5Nyw5OCw5OSwxMDAsMTAyLDEwMywxMDksMTEwLDExMSwxMTIsMTE0LDExNSwxMTYsMTE3LDU3NTgsNTc4OSw1ODA1LDU4MjMsNTgzMCw1ODM1LDU4NDYsNTg1Miw1OTIxLDU5MzcsNjA4OSw2MDk1LDYxMDEsNjEwOCw0LDIsOTksMTE0LDU3NjQsNTc3NCwxMTcsMTE2LDEwMSw1LDIxOCwxLDU5LDU3NzIsMSwyMTgsMTE0LDQsMiw1OSwxMTEsNTc4MSw1NzgzLDEsODYwNyw5OSwxMDUsMTE0LDU5LDEsMTA1NjksMTE0LDQsMiw5OSwxMDEsNTc5Niw1ODAwLDEyMSw1OSwxLDEwMzgsMTE4LDEwMSw1OSwxLDM2NCw0LDIsMTA1LDEyMSw1ODExLDU4MjAsMTE0LDk5LDUsMjE5LDEsNTksNTgxOCwxLDIxOSw1OSwxLDEwNTksOTgsMTA4LDk3LDk5LDU5LDEsMzY4LDExNCw1OSwzLDU1MzQ5LDU2NjAwLDExNCw5NywxMTgsMTAxLDUsMjE3LDEsNTksNTg0NCwxLDIxNyw5Nyw5OSwxMTQsNTksMSwzNjIsNCwyLDEwMCwxMDUsNTg1OCw1OTA1LDEwMSwxMTQsNCwyLDY2LDgwLDU4NjYsNTg5Miw0LDIsOTcsMTE0LDU4NzIsNTg3NiwxMTQsNTksMSw5NSw5Nyw5OSw0LDIsMTAxLDEwNyw1ODg0LDU4ODcsNTksMSw5MTgzLDEwMSwxMTYsNTksMSw5MTQxLDk3LDExNCwxMDEsMTEwLDExNiwxMDQsMTAxLDExNSwxMDUsMTE1LDU5LDEsOTE4MSwxMTEsMTEwLDQsMiw1OSw4MCw1OTEzLDU5MTUsMSw4ODk5LDEwOCwxMTcsMTE1LDU5LDEsODg0Niw0LDIsMTAzLDExMiw1OTI3LDU5MzIsMTExLDExMCw1OSwxLDM3MCwxMDIsNTksMyw1NTM0OSw1NjY1Miw0LDgsNjUsNjgsNjksODQsOTcsMTAwLDExMiwxMTUsNTk1NSw1OTg1LDU5OTYsNjAwOSw2MDI2LDYwMzMsNjA0NCw2MDc1LDExNCwxMTQsMTExLDExOSw0LDMsNTksNjYsNjgsNTk2Nyw1OTY5LDU5NzQsMSw4NTkzLDk3LDExNCw1OSwxLDEwNTE0LDExMSwxMTksMTEwLDY1LDExNCwxMTQsMTExLDExOSw1OSwxLDg2NDUsMTExLDExOSwxMTAsNjUsMTE0LDExNCwxMTEsMTE5LDU5LDEsODU5NywxMTMsMTE3LDEwNSwxMDgsMTA1LDk4LDExNCwxMDUsMTE3LDEwOSw1OSwxLDEwNjA2LDEwMSwxMDEsNCwyLDU5LDY1LDYwMTcsNjAxOSwxLDg4NjksMTE0LDExNCwxMTEsMTE5LDU5LDEsODYxMywxMTQsMTE0LDExMSwxMTksNTksMSw4NjU3LDExMSwxMTksMTEwLDk3LDExNCwxMTQsMTExLDExOSw1OSwxLDg2NjEsMTAxLDExNCw0LDIsNzYsODIsNjA1Miw2MDYzLDEwMSwxMDIsMTE2LDY1LDExNCwxMTQsMTExLDExOSw1OSwxLDg1OTgsMTA1LDEwMywxMDQsMTE2LDY1LDExNCwxMTQsMTExLDExOSw1OSwxLDg1OTksMTA1LDQsMiw1OSwxMDgsNjA4Miw2MDg0LDEsOTc4LDExMSwxMTAsNTksMSw5MzMsMTA1LDExMCwxMDMsNTksMSwzNjYsOTksMTE0LDU5LDMsNTUzNDksNTY0OTYsMTA1LDEwOCwxMDAsMTAxLDU5LDEsMzYwLDEwOSwxMDgsNSwyMjAsMSw1OSw2MTE1LDEsMjIwLDQsOSw2OCw5OCw5OSwxMDAsMTAxLDEwMiwxMTEsMTE1LDExOCw2MTM3LDYxNDMsNjE0OCw2MTUyLDYxNjYsNjI1MCw2MjU1LDYyNjEsNjI2Nyw5NywxMTUsMTA0LDU5LDEsODg3NSw5NywxMTQsNTksMSwxMDk4NywxMjEsNTksMSwxMDQyLDk3LDExNSwxMDQsNCwyLDU5LDEwOCw2MTYxLDYxNjMsMSw4ODczLDU5LDEsMTA5ODIsNCwyLDEwMSwxMTQsNjE3Miw2MTc1LDU5LDEsODg5Nyw0LDMsOTgsMTE2LDEyMSw2MTgzLDYxODgsNjIzOCw5NywxMTQsNTksMSw4MjE0LDQsMiw1OSwxMDUsNjE5NCw2MTk2LDEsODIxNCw5OSw5NywxMDgsNCw0LDY2LDc2LDgzLDg0LDYyMDksNjIxNCw2MjIwLDYyMzEsOTcsMTE0LDU5LDEsODczOSwxMDUsMTEwLDEwMSw1OSwxLDEyNCwxMDEsMTEyLDk3LDExNCw5NywxMTYsMTExLDExNCw1OSwxLDEwMDcyLDEwNSwxMDgsMTAwLDEwMSw1OSwxLDg3NjgsODQsMTA0LDEwNSwxMTAsODMsMTEyLDk3LDk5LDEwMSw1OSwxLDgyMDIsMTE0LDU5LDMsNTUzNDksNTY2MDEsMTEyLDEwMiw1OSwzLDU1MzQ5LDU2NjUzLDk5LDExNCw1OSwzLDU1MzQ5LDU2NDk3LDEwMCw5NywxMTUsMTA0LDU5LDEsODg3NCw0LDUsOTksMTAxLDEwMiwxMTEsMTE1LDYyODYsNjI5Miw2Mjk4LDYzMDMsNjMwOSwxMDUsMTE0LDk5LDU5LDEsMzcyLDEwMCwxMDMsMTAxLDU5LDEsODg5NiwxMTQsNTksMyw1NTM0OSw1NjYwMiwxMTIsMTAyLDU5LDMsNTUzNDksNTY2NTQsOTksMTE0LDU5LDMsNTUzNDksNTY0OTgsNCw0LDEwMiwxMDUsMTExLDExNSw2MzI1LDYzMzAsNjMzMyw2MzM5LDExNCw1OSwzLDU1MzQ5LDU2NjAzLDU5LDEsOTI2LDExMiwxMDIsNTksMyw1NTM0OSw1NjY1NSw5OSwxMTQsNTksMyw1NTM0OSw1NjQ5OSw0LDksNjUsNzMsODUsOTcsOTksMTAyLDExMSwxMTUsMTE3LDYzNjUsNjM3MCw2Mzc1LDYzODAsNjM5MSw2NDA1LDY0MTAsNjQxNiw2NDIyLDk5LDEyMSw1OSwxLDEwNzEsOTksMTIxLDU5LDEsMTAzMSw5OSwxMjEsNTksMSwxMDcwLDk5LDExNywxMTYsMTAxLDUsMjIxLDEsNTksNjM4OSwxLDIyMSw0LDIsMTA1LDEyMSw2Mzk3LDY0MDIsMTE0LDk5LDU5LDEsMzc0LDU5LDEsMTA2NywxMTQsNTksMyw1NTM0OSw1NjYwNCwxMTIsMTAyLDU5LDMsNTUzNDksNTY2NTYsOTksMTE0LDU5LDMsNTUzNDksNTY1MDAsMTA5LDEwOCw1OSwxLDM3Niw0LDgsNzIsOTcsOTksMTAwLDEwMSwxMDIsMTExLDExNSw2NDQ1LDY0NTAsNjQ1Nyw2NDcyLDY0NzcsNjUwMSw2NTA1LDY1MTAsOTksMTIxLDU5LDEsMTA0Niw5OSwxMTcsMTE2LDEwMSw1OSwxLDM3Nyw0LDIsOTcsMTIxLDY0NjMsNjQ2OSwxMTQsMTExLDExMCw1OSwxLDM4MSw1OSwxLDEwNDcsMTExLDExNiw1OSwxLDM3OSw0LDIsMTE0LDExNiw2NDgzLDY0OTcsMTExLDg3LDEwNSwxMDAsMTE2LDEwNCw4MywxMTIsOTcsOTksMTAxLDU5LDEsODIwMyw5Nyw1OSwxLDkxOCwxMTQsNTksMSw4NDg4LDExMiwxMDIsNTksMSw4NDg0LDk5LDExNCw1OSwzLDU1MzQ5LDU2NTAxLDQsMTYsOTcsOTgsOTksMTAxLDEwMiwxMDMsMTA4LDEwOSwxMTAsMTExLDExMiwxMTQsMTE1LDExNiwxMTcsMTE5LDY1NTAsNjU2MSw2NTY4LDY2MTIsNjYyMiw2NjM0LDY2NDUsNjY3Miw2Njk5LDY4NTQsNjg3MCw2OTIzLDY5MzMsNjk2Myw2OTc0LDY5ODMsOTksMTE3LDExNiwxMDEsNSwyMjUsMSw1OSw2NTU5LDEsMjI1LDExNCwxMDEsMTE4LDEwMSw1OSwxLDI1OSw0LDYsNTksNjksMTAwLDEwNSwxMTcsMTIxLDY1ODIsNjU4NCw2NTg4LDY1OTEsNjYwMCw2NjA5LDEsODc2Niw1OSwzLDg3NjYsODE5LDU5LDEsODc2NywxMTQsOTksNSwyMjYsMSw1OSw2NTk4LDEsMjI2LDExNiwxMDEsNSwxODAsMSw1OSw2NjA3LDEsMTgwLDU5LDEsMTA3MiwxMDgsMTA1LDEwMyw1LDIzMCwxLDU5LDY2MjAsMSwyMzAsNCwyLDU5LDExNCw2NjI4LDY2MzAsMSw4Mjg5LDU5LDMsNTUzNDksNTY2MDYsMTE0LDk3LDExOCwxMDEsNSwyMjQsMSw1OSw2NjQzLDEsMjI0LDQsMiwxMDEsMTEyLDY2NTEsNjY2Nyw0LDIsMTAyLDExMiw2NjU3LDY2NjMsMTE1LDEyMSwxMDksNTksMSw4NTAxLDEwNCw1OSwxLDg1MDEsMTA0LDk3LDU5LDEsOTQ1LDQsMiw5NywxMTIsNjY3OCw2NjkyLDQsMiw5OSwxMDgsNjY4NCw2Njg4LDExNCw1OSwxLDI1NywxMDMsNTksMSwxMDgxNSw1LDM4LDEsNTksNjY5NywxLDM4LDQsMiwxMDAsMTAzLDY3MDUsNjczNyw0LDUsNTksOTcsMTAwLDExNSwxMTgsNjcxNyw2NzE5LDY3MjQsNjcyNyw2NzM0LDEsODc0MywxMTAsMTAwLDU5LDEsMTA4MzcsNTksMSwxMDg0NCwxMDgsMTExLDExMiwxMDEsNTksMSwxMDg0MCw1OSwxLDEwODQyLDQsNyw1OSwxMDEsMTA4LDEwOSwxMTQsMTE1LDEyMiw2NzUzLDY3NTUsNjc1OCw2NzYyLDY4MTQsNjgzNSw2ODQ4LDEsODczNiw1OSwxLDEwNjYwLDEwMSw1OSwxLDg3MzYsMTE1LDEwMCw0LDIsNTksOTcsNjc3MCw2NzcyLDEsODczNyw0LDgsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCw2NzkwLDY3OTMsNjc5Niw2Nzk5LDY4MDIsNjgwNSw2ODA4LDY4MTEsNTksMSwxMDY2NCw1OSwxLDEwNjY1LDU5LDEsMTA2NjYsNTksMSwxMDY2Nyw1OSwxLDEwNjY4LDU5LDEsMTA2NjksNTksMSwxMDY3MCw1OSwxLDEwNjcxLDExNiw0LDIsNTksMTE4LDY4MjEsNjgyMywxLDg3MzUsOTgsNCwyLDU5LDEwMCw2ODMwLDY4MzIsMSw4ODk0LDU5LDEsMTA2NTMsNCwyLDExMiwxMTYsNjg0MSw2ODQ1LDEwNCw1OSwxLDg3MzgsNTksMSwxOTcsOTcsMTE0LDExNCw1OSwxLDkwODQsNCwyLDEwMywxMTIsNjg2MCw2ODY1LDExMSwxMTAsNTksMSwyNjEsMTAyLDU5LDMsNTUzNDksNTY2NTgsNCw3LDU5LDY5LDk3LDEwMSwxMDUsMTExLDExMiw2ODg2LDY4ODgsNjg5MSw2ODk3LDY5MDAsNjkwNCw2OTA4LDEsODc3Niw1OSwxLDEwODY0LDk5LDEwNSwxMTQsNTksMSwxMDg2Myw1OSwxLDg3NzgsMTAwLDU5LDEsODc3OSwxMTUsNTksMSwzOSwxMTQsMTExLDEyMCw0LDIsNTksMTAxLDY5MTcsNjkxOSwxLDg3NzYsMTEzLDU5LDEsODc3OCwxMDUsMTEwLDEwMyw1LDIyOSwxLDU5LDY5MzEsMSwyMjksNCwzLDk5LDExNiwxMjEsNjk0MSw2OTQ2LDY5NDksMTE0LDU5LDMsNTUzNDksNTY1MDIsNTksMSw0MiwxMDksMTEyLDQsMiw1OSwxMDEsNjk1Nyw2OTU5LDEsODc3NiwxMTMsNTksMSw4NzgxLDEwNSwxMDgsMTAwLDEwMSw1LDIyNywxLDU5LDY5NzIsMSwyMjcsMTA5LDEwOCw1LDIyOCwxLDU5LDY5ODEsMSwyMjgsNCwyLDk5LDEwNSw2OTg5LDY5OTcsMTExLDExMCwxMDUsMTEwLDExNiw1OSwxLDg3NTUsMTEwLDExNiw1OSwxLDEwNzY5LDQsMTYsNzgsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTA1LDEwNywxMDgsMTEwLDExMSwxMTIsMTE0LDExNSwxMTcsNzAzNiw3MDQxLDcxMTksNzEzNSw3MTQ5LDcxNTUsNzIxOSw3MjI0LDczNDcsNzM1NCw3NDYzLDc0ODksNzc4Niw3NzkzLDc4MTQsNzg2NiwxMTEsMTE2LDU5LDEsMTA5ODksNCwyLDk5LDExNCw3MDQ3LDcwOTQsMTA3LDQsNCw5OSwxMDEsMTEyLDExNSw3MDU4LDcwNjQsNzA3Myw3MDgwLDExMSwxMTAsMTAzLDU5LDEsODc4MCwxMTIsMTE1LDEwNSwxMDgsMTExLDExMCw1OSwxLDEwMTQsMTE0LDEwNSwxMDksMTAxLDU5LDEsODI0NSwxMDUsMTA5LDQsMiw1OSwxMDEsNzA4OCw3MDkwLDEsODc2NSwxMTMsNTksMSw4OTA5LDQsMiwxMTgsMTE5LDcxMDAsNzEwNSwxMDEsMTAxLDU5LDEsODg5MywxMDEsMTAwLDQsMiw1OSwxMDMsNzExMyw3MTE1LDEsODk2NSwxMDEsNTksMSw4OTY1LDExNCwxMDcsNCwyLDU5LDExNiw3MTI3LDcxMjksMSw5MTQxLDk4LDExNCwxMDcsNTksMSw5MTQyLDQsMiwxMTEsMTIxLDcxNDEsNzE0NiwxMTAsMTAzLDU5LDEsODc4MCw1OSwxLDEwNzMsMTEzLDExNywxMTEsNTksMSw4MjIyLDQsNSw5OSwxMDksMTEyLDExNCwxMTYsNzE2Nyw3MTgxLDcxODgsNzE5Myw3MTk5LDk3LDExNywxMTUsNCwyLDU5LDEwMSw3MTc2LDcxNzgsMSw4NzU3LDU5LDEsODc1NywxMTIsMTE2LDEyMSwxMTgsNTksMSwxMDY3MiwxMTUsMTA1LDU5LDEsMTAxNCwxMTAsMTExLDExNyw1OSwxLDg0OTIsNCwzLDk3LDEwNCwxMTksNzIwNyw3MjEwLDcyMTMsNTksMSw5NDYsNTksMSw4NTAyLDEwMSwxMDEsMTEwLDU5LDEsODgxMiwxMTQsNTksMyw1NTM0OSw1NjYwNywxMDMsNCw3LDk5LDExMSwxMTUsMTE2LDExNywxMTgsMTE5LDcyNDEsNzI2Miw3Mjg4LDczMDUsNzMyOCw3MzM1LDczNDAsNCwzLDk3LDEwNSwxMTcsNzI0OSw3MjUzLDcyNTgsMTEyLDU5LDEsODg5OCwxMTQsOTksNTksMSw5NzExLDExMiw1OSwxLDg4OTksNCwzLDEwMCwxMTIsMTE2LDcyNzAsNzI3NSw3MjgxLDExMSwxMTYsNTksMSwxMDc1MiwxMDgsMTE3LDExNSw1OSwxLDEwNzUzLDEwNSwxMDksMTAxLDExNSw1OSwxLDEwNzU0LDQsMiwxMTMsMTE2LDcyOTQsNzMwMCw5OSwxMTcsMTEyLDU5LDEsMTA3NTgsOTcsMTE0LDU5LDEsOTczMywxMTQsMTA1LDk3LDExMCwxMDMsMTA4LDEwMSw0LDIsMTAwLDExNyw3MzE4LDczMjQsMTExLDExOSwxMTAsNTksMSw5NjYxLDExMiw1OSwxLDk2NTEsMTEyLDEwOCwxMTcsMTE1LDU5LDEsMTA3NTYsMTAxLDEwMSw1OSwxLDg4OTcsMTAxLDEwMCwxMDMsMTAxLDU5LDEsODg5Niw5NywxMTQsMTExLDExOSw1OSwxLDEwNTA5LDQsMyw5NywxMDcsMTExLDczNjIsNzQzNiw3NDU4LDQsMiw5OSwxMTAsNzM2OCw3NDMyLDEwNyw0LDMsMTA4LDExNSwxMTYsNzM3Nyw3Mzg2LDczOTQsMTExLDEyMiwxMDEsMTEwLDEwMywxMDEsNTksMSwxMDczMSwxMTMsMTE3LDk3LDExNCwxMDEsNTksMSw5NjQyLDExNCwxMDUsOTcsMTEwLDEwMywxMDgsMTAxLDQsNCw1OSwxMDAsMTA4LDExNCw3NDExLDc0MTMsNzQxOSw3NDI1LDEsOTY1MiwxMTEsMTE5LDExMCw1OSwxLDk2NjIsMTAxLDEwMiwxMTYsNTksMSw5NjY2LDEwNSwxMDMsMTA0LDExNiw1OSwxLDk2NTYsMTA3LDU5LDEsOTI1MSw0LDIsNDksNTEsNzQ0Miw3NDU0LDQsMiw1MCw1Miw3NDQ4LDc0NTEsNTksMSw5NjE4LDU5LDEsOTYxNyw1Miw1OSwxLDk2MTksOTksMTA3LDU5LDEsOTYwOCw0LDIsMTAxLDExMSw3NDY5LDc0ODUsNCwyLDU5LDExMyw3NDc1LDc0NzgsMyw2MSw4NDIxLDExNywxMDUsMTE4LDU5LDMsODgwMSw4NDIxLDExNiw1OSwxLDg5NzYsNCw0LDExMiwxMTYsMTE5LDEyMCw3NDk5LDc1MDQsNzUxNyw3NTIzLDEwMiw1OSwzLDU1MzQ5LDU2NjU5LDQsMiw1OSwxMTYsNzUxMCw3NTEyLDEsODg2OSwxMTEsMTA5LDU5LDEsODg2OSwxMTYsMTA1LDEwMSw1OSwxLDg5MDQsNCwxMiw2OCw3Miw4NSw4Niw5OCwxMDAsMTA0LDEwOSwxMTIsMTE2LDExNywxMTgsNzU0OSw3NTcxLDc1OTcsNzYxOSw3NjU1LDc2NjAsNzY4Miw3NzA4LDc3MTUsNzcyMSw3NzI4LDc3NTAsNCw0LDc2LDgyLDEwOCwxMTQsNzU1OSw3NTYyLDc1NjUsNzU2OCw1OSwxLDk1NTksNTksMSw5NTU2LDU5LDEsOTU1OCw1OSwxLDk1NTUsNCw1LDU5LDY4LDg1LDEwMCwxMTcsNzU4Myw3NTg1LDc1ODgsNzU5MSw3NTk0LDEsOTU1Miw1OSwxLDk1NzQsNTksMSw5NTc3LDU5LDEsOTU3Miw1OSwxLDk1NzUsNCw0LDc2LDgyLDEwOCwxMTQsNzYwNyw3NjEwLDc2MTMsNzYxNiw1OSwxLDk1NjUsNTksMSw5NTYyLDU5LDEsOTU2NCw1OSwxLDk1NjEsNCw3LDU5LDcyLDc2LDgyLDEwNCwxMDgsMTE0LDc2MzUsNzYzNyw3NjQwLDc2NDMsNzY0Niw3NjQ5LDc2NTIsMSw5NTUzLDU5LDEsOTU4MCw1OSwxLDk1NzEsNTksMSw5NTY4LDU5LDEsOTU3OSw1OSwxLDk1NzAsNTksMSw5NTY3LDExMSwxMjAsNTksMSwxMDY5Nyw0LDQsNzYsODIsMTA4LDExNCw3NjcwLDc2NzMsNzY3Niw3Njc5LDU5LDEsOTU1Nyw1OSwxLDk1NTQsNTksMSw5NDg4LDU5LDEsOTQ4NCw0LDUsNTksNjgsODUsMTAwLDExNyw3Njk0LDc2OTYsNzY5OSw3NzAyLDc3MDUsMSw5NDcyLDU5LDEsOTU3Myw1OSwxLDk1NzYsNTksMSw5NTE2LDU5LDEsOTUyNCwxMDUsMTEwLDExNywxMTUsNTksMSw4ODYzLDEwOCwxMTcsMTE1LDU5LDEsODg2MiwxMDUsMTA5LDEwMSwxMTUsNTksMSw4ODY0LDQsNCw3Niw4MiwxMDgsMTE0LDc3MzgsNzc0MSw3NzQ0LDc3NDcsNTksMSw5NTYzLDU5LDEsOTU2MCw1OSwxLDk0OTYsNTksMSw5NDkyLDQsNyw1OSw3Miw3Niw4MiwxMDQsMTA4LDExNCw3NzY2LDc3NjgsNzc3MSw3Nzc0LDc3NzcsNzc4MCw3NzgzLDEsOTQ3NCw1OSwxLDk1NzgsNTksMSw5NTY5LDU5LDEsOTU2Niw1OSwxLDk1MzIsNTksMSw5NTA4LDU5LDEsOTUwMCwxMTQsMTA1LDEwOSwxMDEsNTksMSw4MjQ1LDQsMiwxMDEsMTE4LDc3OTksNzgwNCwxMTgsMTAxLDU5LDEsNzI4LDk4LDk3LDExNCw1LDE2NiwxLDU5LDc4MTIsMSwxNjYsNCw0LDk5LDEwMSwxMDUsMTExLDc4MjQsNzgyOSw3ODM0LDc4NDYsMTE0LDU5LDMsNTUzNDksNTY1MDMsMTA5LDEwNSw1OSwxLDgyNzEsMTA5LDQsMiw1OSwxMDEsNzg0MSw3ODQzLDEsODc2NSw1OSwxLDg5MDksMTA4LDQsMyw1OSw5OCwxMDQsNzg1NSw3ODU3LDc4NjAsMSw5Miw1OSwxLDEwNjkzLDExNSwxMTcsOTgsNTksMSwxMDE4NCw0LDIsMTA4LDEwOSw3ODcyLDc4ODUsMTA4LDQsMiw1OSwxMDEsNzg3OSw3ODgxLDEsODIyNiwxMTYsNTksMSw4MjI2LDExMiw0LDMsNTksNjksMTAxLDc4OTQsNzg5Niw3ODk5LDEsODc4Miw1OSwxLDEwOTI2LDQsMiw1OSwxMTMsNzkwNSw3OTA3LDEsODc4Myw1OSwxLDg3ODMsNCwxNSw5Nyw5OSwxMDAsMTAxLDEwMiwxMDQsMTA1LDEwOCwxMTEsMTE0LDExNSwxMTYsMTE3LDExOSwxMjEsNzk0Miw4MDIxLDgwNzUsODA4MCw4MTIxLDgxMjYsODE1Nyw4Mjc5LDgyOTUsODQzMCw4NDQ2LDg0ODUsODQ5MSw4NzA3LDg3MjYsNCwzLDk5LDExMiwxMTQsNzk1MCw3OTU2LDgwMDcsMTE3LDExNiwxMDEsNTksMSwyNjMsNCw2LDU5LDk3LDk4LDk5LDEwMCwxMTUsNzk3MCw3OTcyLDc5NzcsNzk4NCw3OTk4LDgwMDMsMSw4NzQ1LDExMCwxMDAsNTksMSwxMDgyMCwxMTQsOTksMTE3LDExMiw1OSwxLDEwODI1LDQsMiw5NywxMTcsNzk5MCw3OTk0LDExMiw1OSwxLDEwODI3LDExMiw1OSwxLDEwODIzLDExMSwxMTYsNTksMSwxMDgxNiw1OSwzLDg3NDUsNjUwMjQsNCwyLDEwMSwxMTEsODAxMyw4MDE3LDExNiw1OSwxLDgyNTcsMTEwLDU5LDEsNzExLDQsNCw5NywxMDEsMTA1LDExNyw4MDMxLDgwNDYsODA1Niw4MDYxLDQsMiwxMTIsMTE0LDgwMzcsODA0MSwxMTUsNTksMSwxMDgyOSwxMTEsMTEwLDU5LDEsMjY5LDEwMCwxMDUsMTA4LDUsMjMxLDEsNTksODA1NCwxLDIzMSwxMTQsOTksNTksMSwyNjUsMTEyLDExNSw0LDIsNTksMTE1LDgwNjksODA3MSwxLDEwODI4LDEwOSw1OSwxLDEwODMyLDExMSwxMTYsNTksMSwyNjcsNCwzLDEwMCwxMDksMTEwLDgwODgsODA5Nyw4MTA0LDEwNSwxMDgsNSwxODQsMSw1OSw4MDk1LDEsMTg0LDExMiwxMTYsMTIxLDExOCw1OSwxLDEwNjc0LDExNiw1LDE2MiwyLDU5LDEwMSw4MTEyLDgxMTQsMSwxNjIsMTE0LDEwMCwxMTEsMTE2LDU5LDEsMTgzLDExNCw1OSwzLDU1MzQ5LDU2NjA4LDQsMyw5OSwxMDEsMTA1LDgxMzQsODEzOCw4MTU0LDEyMSw1OSwxLDEwOTUsOTksMTA3LDQsMiw1OSwxMDksODE0Niw4MTQ4LDEsMTAwMDMsOTcsMTE0LDEwNyw1OSwxLDEwMDAzLDU5LDEsOTY3LDExNCw0LDcsNTksNjksOTksMTAxLDEwMiwxMDksMTE1LDgxNzQsODE3Niw4MTc5LDgyNTgsODI2MSw4MjY4LDgyNzMsMSw5Njc1LDU5LDEsMTA2OTEsNCwzLDU5LDEwMSwxMDgsODE4Nyw4MTg5LDgxOTMsMSw3MTAsMTEzLDU5LDEsODc5MSwxMDEsNCwyLDk3LDEwMCw4MjAwLDgyMjMsMTE0LDExNCwxMTEsMTE5LDQsMiwxMDgsMTE0LDgyMTAsODIxNiwxMDEsMTAyLDExNiw1OSwxLDg2MzQsMTA1LDEwMywxMDQsMTE2LDU5LDEsODYzNSw0LDUsODIsODMsOTcsOTksMTAwLDgyMzUsODIzOCw4MjQxLDgyNDYsODI1Miw1OSwxLDE3NCw1OSwxLDk0MTYsMTE1LDExNiw1OSwxLDg4NTksMTA1LDExNCw5OSw1OSwxLDg4NTgsOTcsMTE1LDEwNCw1OSwxLDg4NjEsNTksMSw4NzkxLDExMCwxMDUsMTEwLDExNiw1OSwxLDEwNzY4LDEwNSwxMDAsNTksMSwxMDk5MSw5OSwxMDUsMTE0LDU5LDEsMTA2OTAsMTE3LDk4LDExNSw0LDIsNTksMTE3LDgyODgsODI5MCwxLDk4MjcsMTA1LDExNiw1OSwxLDk4MjcsNCw0LDEwOCwxMDksMTEwLDExMiw4MzA1LDgzMjYsODM3Niw4NDAwLDExMSwxMTAsNCwyLDU5LDEwMSw4MzEzLDgzMTUsMSw1OCw0LDIsNTksMTEzLDgzMjEsODMyMywxLDg3ODgsNTksMSw4Nzg4LDQsMiwxMDksMTEyLDgzMzIsODM0NCw5Nyw0LDIsNTksMTE2LDgzMzksODM0MSwxLDQ0LDU5LDEsNjQsNCwzLDU5LDEwMiwxMDgsODM1Miw4MzU0LDgzNTgsMSw4NzA1LDExMCw1OSwxLDg3MjgsMTAxLDQsMiwxMDksMTIwLDgzNjUsODM3MSwxMDEsMTEwLDExNiw1OSwxLDg3MDUsMTAxLDExNSw1OSwxLDg0NTAsNCwyLDEwMywxMDUsODM4Miw4Mzk1LDQsMiw1OSwxMDAsODM4OCw4MzkwLDEsODc3MywxMTEsMTE2LDU5LDEsMTA4NjEsMTEwLDExNiw1OSwxLDg3NTAsNCwzLDEwMiwxMTQsMTIxLDg0MDgsODQxMiw4NDE3LDU5LDMsNTUzNDksNTY2NjAsMTExLDEwMCw1OSwxLDg3MjAsNSwxNjksMiw1OSwxMTUsODQyNCw4NDI2LDEsMTY5LDExNCw1OSwxLDg0NzEsNCwyLDk3LDExMSw4NDM2LDg0NDEsMTE0LDExNCw1OSwxLDg2MjksMTE1LDExNSw1OSwxLDEwMDA3LDQsMiw5OSwxMTcsODQ1Miw4NDU3LDExNCw1OSwzLDU1MzQ5LDU2NTA0LDQsMiw5OCwxMTIsODQ2Myw4NDc0LDQsMiw1OSwxMDEsODQ2OSw4NDcxLDEsMTA5NTksNTksMSwxMDk2MSw0LDIsNTksMTAxLDg0ODAsODQ4MiwxLDEwOTYwLDU5LDEsMTA5NjIsMTAwLDExMSwxMTYsNTksMSw4OTQzLDQsNywxMDAsMTAxLDEwOCwxMTIsMTE0LDExOCwxMTksODUwNyw4NTIyLDg1MzYsODU1MCw4NjAwLDg2OTcsODcwMiw5NywxMTQsMTE0LDQsMiwxMDgsMTE0LDg1MTYsODUxOSw1OSwxLDEwNTUyLDU5LDEsMTA1NDksNCwyLDExMiwxMTUsODUyOCw4NTMyLDExNCw1OSwxLDg5MjYsOTksNTksMSw4OTI3LDk3LDExNCwxMTQsNCwyLDU5LDExMiw4NTQ1LDg1NDcsMSw4NjMwLDU5LDEsMTA1NTcsNCw2LDU5LDk4LDk5LDEwMCwxMTEsMTE1LDg1NjQsODU2Niw4NTczLDg1ODcsODU5Miw4NTk2LDEsODc0NiwxMTQsOTksOTcsMTEyLDU5LDEsMTA4MjQsNCwyLDk3LDExNyw4NTc5LDg1ODMsMTEyLDU5LDEsMTA4MjIsMTEyLDU5LDEsMTA4MjYsMTExLDExNiw1OSwxLDg4NDUsMTE0LDU5LDEsMTA4MjEsNTksMyw4NzQ2LDY1MDI0LDQsNCw5NywxMDgsMTE0LDExOCw4NjEwLDg2MjMsODY2Myw4NjcyLDExNCwxMTQsNCwyLDU5LDEwOSw4NjE4LDg2MjAsMSw4NjMxLDU5LDEsMTA1NTYsMTIxLDQsMywxMDEsMTE4LDExOSw4NjMyLDg2NTEsODY1NiwxMTMsNCwyLDExMiwxMTUsODYzOSw4NjQ1LDExNCwxMDEsOTksNTksMSw4OTI2LDExNyw5OSw5OSw1OSwxLDg5MjcsMTAxLDEwMSw1OSwxLDg5MTAsMTAxLDEwMCwxMDMsMTAxLDU5LDEsODkxMSwxMDEsMTEwLDUsMTY0LDEsNTksODY3MCwxLDE2NCwxMDEsOTcsMTE0LDExNCwxMTEsMTE5LDQsMiwxMDgsMTE0LDg2ODQsODY5MCwxMDEsMTAyLDExNiw1OSwxLDg2MzAsMTA1LDEwMywxMDQsMTE2LDU5LDEsODYzMSwxMDEsMTAxLDU5LDEsODkxMCwxMDEsMTAwLDU5LDEsODkxMSw0LDIsOTksMTA1LDg3MTMsODcyMSwxMTEsMTEwLDEwNSwxMTAsMTE2LDU5LDEsODc1NCwxMTAsMTE2LDU5LDEsODc1MywxMDgsOTksMTE2LDEyMSw1OSwxLDkwMDUsNCwxOSw2NSw3Miw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDQsMTA1LDEwNiwxMDgsMTExLDExNCwxMTUsMTE2LDExNywxMTksMTIyLDg3NzMsODc3OCw4NzgzLDg4MjEsODgzOSw4ODU0LDg4ODcsODkxNCw4OTMwLDg5NDQsOTAzNiw5MDQxLDkwNTgsOTE5Nyw5MjI3LDkyNTgsOTI4MSw5Mjk3LDkzMDUsMTE0LDExNCw1OSwxLDg2NTksOTcsMTE0LDU5LDEsMTA1OTcsNCw0LDEwMywxMDgsMTE0LDExNSw4NzkzLDg3OTksODgwNSw4ODA5LDEwMywxMDEsMTE0LDU5LDEsODIyNCwxMDEsMTE2LDEwNCw1OSwxLDg1MDQsMTE0LDU5LDEsODU5NSwxMDQsNCwyLDU5LDExOCw4ODE2LDg4MTgsMSw4MjA4LDU5LDEsODg2Nyw0LDIsMTA3LDEwOCw4ODI3LDg4MzQsOTcsMTE0LDExMSwxMTksNTksMSwxMDUxMSw5Nyw5OSw1OSwxLDczMyw0LDIsOTcsMTIxLDg4NDUsODg1MSwxMTQsMTExLDExMCw1OSwxLDI3MSw1OSwxLDEwNzYsNCwzLDU5LDk3LDExMSw4ODYyLDg4NjQsODg4MCwxLDg1MTgsNCwyLDEwMywxMTQsODg3MCw4ODc2LDEwMywxMDEsMTE0LDU5LDEsODIyNSwxMTQsNTksMSw4NjUwLDExNiwxMTUsMTAxLDExMyw1OSwxLDEwODcxLDQsMywxMDMsMTA4LDEwOSw4ODk1LDg5MDIsODkwNyw1LDE3NiwxLDU5LDg5MDAsMSwxNzYsMTE2LDk3LDU5LDEsOTQ4LDExMiwxMTYsMTIxLDExOCw1OSwxLDEwNjczLDQsMiwxMDUsMTE0LDg5MjAsODkyNiwxMTUsMTA0LDExNiw1OSwxLDEwNjIzLDU5LDMsNTUzNDksNTY2MDksOTcsMTE0LDQsMiwxMDgsMTE0LDg5MzgsODk0MSw1OSwxLDg2NDMsNTksMSw4NjQyLDQsNSw5NywxMDEsMTAzLDExNSwxMTgsODk1Niw4OTg2LDg5ODksODk5Niw5MDAxLDEwOSw0LDMsNTksMTExLDExNSw4OTY1LDg5NjcsODk4MywxLDg5MDAsMTEwLDEwMCw0LDIsNTksMTE1LDg5NzUsODk3NywxLDg5MDAsMTE3LDEwNSwxMTYsNTksMSw5ODMwLDU5LDEsOTgzMCw1OSwxLDE2OCw5NywxMDksMTA5LDk3LDU5LDEsOTg5LDEwNSwxMTAsNTksMSw4OTQ2LDQsMyw1OSwxMDUsMTExLDkwMDksOTAxMSw5MDMxLDEsMjQ3LDEwMCwxMDEsNSwyNDcsMiw1OSwxMTEsOTAyMCw5MDIyLDEsMjQ3LDExMCwxMTYsMTA1LDEwOSwxMDEsMTE1LDU5LDEsODkwMywxMTAsMTIwLDU5LDEsODkwMyw5OSwxMjEsNTksMSwxMTA2LDk5LDQsMiwxMTEsMTE0LDkwNDgsOTA1MywxMTQsMTEwLDU5LDEsODk5MCwxMTEsMTEyLDU5LDEsODk3Myw0LDUsMTA4LDExMiwxMTYsMTE3LDExOSw5MDcwLDkwNzYsOTA4MSw5MTMwLDkxNDQsMTA4LDk3LDExNCw1OSwxLDM2LDEwMiw1OSwzLDU1MzQ5LDU2NjYxLDQsNSw1OSwxMDEsMTA5LDExMiwxMTUsOTA5Myw5MDk1LDkxMDksOTExNiw5MTIyLDEsNzI5LDExMyw0LDIsNTksMTAwLDkxMDIsOTEwNCwxLDg3ODQsMTExLDExNiw1OSwxLDg3ODUsMTA1LDExMCwxMTcsMTE1LDU5LDEsODc2MCwxMDgsMTE3LDExNSw1OSwxLDg3MjQsMTEzLDExNyw5NywxMTQsMTAxLDU5LDEsODg2NSw5OCwxMDgsMTAxLDk4LDk3LDExNCwxMTksMTAxLDEwMCwxMDMsMTAxLDU5LDEsODk2NiwxMTAsNCwzLDk3LDEwMCwxMDQsOTE1Myw5MTYwLDkxNzIsMTE0LDExNCwxMTEsMTE5LDU5LDEsODU5NSwxMTEsMTE5LDExMCw5NywxMTQsMTE0LDExMSwxMTksMTE1LDU5LDEsODY1MCw5NywxMTQsMTEyLDExMSwxMTEsMTEwLDQsMiwxMDgsMTE0LDkxODQsOTE5MCwxMDEsMTAyLDExNiw1OSwxLDg2NDMsMTA1LDEwMywxMDQsMTE2LDU5LDEsODY0Miw0LDIsOTgsOTksOTIwMyw5MjExLDEwNyw5NywxMTQsMTExLDExOSw1OSwxLDEwNTEyLDQsMiwxMTEsMTE0LDkyMTcsOTIyMiwxMTQsMTEwLDU5LDEsODk5MSwxMTEsMTEyLDU5LDEsODk3Miw0LDMsOTksMTExLDExNiw5MjM1LDkyNDgsOTI1Miw0LDIsMTE0LDEyMSw5MjQxLDkyNDUsNTksMyw1NTM0OSw1NjUwNSw1OSwxLDExMDksMTA4LDU5LDEsMTA3NDIsMTE0LDExMSwxMDcsNTksMSwyNzMsNCwyLDEwMCwxMTQsOTI2NCw5MjY5LDExMSwxMTYsNTksMSw4OTQ1LDEwNSw0LDIsNTksMTAyLDkyNzYsOTI3OCwxLDk2NjMsNTksMSw5NjYyLDQsMiw5NywxMDQsOTI4Nyw5MjkyLDExNCwxMTQsNTksMSw4NjkzLDk3LDExNCw1OSwxLDEwNjA3LDk3LDExMCwxMDMsMTA4LDEwMSw1OSwxLDEwNjYyLDQsMiw5OSwxMDUsOTMxMSw5MzE1LDEyMSw1OSwxLDExMTksMTAzLDExNCw5NywxMTQsMTE0LDU5LDEsMTAyMzksNCwxOCw2OCw5Nyw5OSwxMDAsMTAxLDEwMiwxMDMsMTA4LDEwOSwxMTAsMTExLDExMiwxMTMsMTE0LDExNSwxMTYsMTE3LDEyMCw5MzYxLDkzNzYsOTM5OCw5NDM5LDk0NDQsOTQ0Nyw5NDYyLDk0OTUsOTUzMSw5NTg1LDk1OTgsOTYxNCw5NjU5LDk3NTUsOTc3MSw5NzkyLDk4MDgsOTgyNiw0LDIsNjgsMTExLDkzNjcsOTM3MiwxMTEsMTE2LDU5LDEsMTA4NzEsMTE2LDU5LDEsODc4NSw0LDIsOTksMTE1LDkzODIsOTM5MiwxMTcsMTE2LDEwMSw1LDIzMywxLDU5LDkzOTAsMSwyMzMsMTE2LDEwMSwxMTQsNTksMSwxMDg2Miw0LDQsOTcsMTA1LDExMSwxMjEsOTQwOCw5NDE0LDk0MzAsOTQzNiwxMTQsMTExLDExMCw1OSwxLDI4MywxMTQsNCwyLDU5LDk5LDk0MjEsOTQyMywxLDg3OTAsNSwyMzQsMSw1OSw5NDI4LDEsMjM0LDEwOCwxMTEsMTEwLDU5LDEsODc4OSw1OSwxLDExMDEsMTExLDExNiw1OSwxLDI3OSw1OSwxLDg1MTksNCwyLDY4LDExNCw5NDUzLDk0NTgsMTExLDExNiw1OSwxLDg3ODYsNTksMyw1NTM0OSw1NjYxMCw0LDMsNTksMTE0LDExNSw5NDcwLDk0NzIsOTQ4MiwxLDEwOTA2LDk3LDExOCwxMDEsNSwyMzIsMSw1OSw5NDgwLDEsMjMyLDQsMiw1OSwxMDAsOTQ4OCw5NDkwLDEsMTA5MDIsMTExLDExNiw1OSwxLDEwOTA0LDQsNCw1OSwxMDUsMTA4LDExNSw5NTA1LDk1MDcsOTUxNSw5NTE4LDEsMTA5MDUsMTEwLDExNiwxMDEsMTE0LDExNSw1OSwxLDkxOTEsNTksMSw4NDY3LDQsMiw1OSwxMDAsOTUyNCw5NTI2LDEsMTA5MDEsMTExLDExNiw1OSwxLDEwOTAzLDQsMyw5NywxMTIsMTE1LDk1MzksOTU0NCw5NTY0LDk5LDExNCw1OSwxLDI3NSwxMTYsMTIxLDQsMyw1OSwxMTUsMTE4LDk1NTQsOTU1Niw5NTYxLDEsODcwOSwxMDEsMTE2LDU5LDEsODcwOSw1OSwxLDg3MDksMTEyLDQsMiw0OSw1OSw5NTcxLDk1ODMsNCwyLDUxLDUyLDk1NzcsOTU4MCw1OSwxLDgxOTYsNTksMSw4MTk3LDEsODE5NSw0LDIsMTAzLDExNSw5NTkxLDk1OTQsNTksMSwzMzEsMTEyLDU5LDEsODE5NCw0LDIsMTAzLDExMiw5NjA0LDk2MDksMTExLDExMCw1OSwxLDI4MSwxMDIsNTksMyw1NTM0OSw1NjY2Miw0LDMsOTcsMTA4LDExNSw5NjIyLDk2MzUsOTY0MCwxMTQsNCwyLDU5LDExNSw5NjI5LDk2MzEsMSw4OTE3LDEwOCw1OSwxLDEwNzIzLDExNywxMTUsNTksMSwxMDg2NSwxMDUsNCwzLDU5LDEwOCwxMTgsOTY0OSw5NjUxLDk2NTYsMSw5NDksMTExLDExMCw1OSwxLDk0OSw1OSwxLDEwMTMsNCw0LDk5LDExNSwxMTcsMTE4LDk2NjksOTY4Niw5NzE2LDk3NDcsNCwyLDEwNSwxMTEsOTY3NSw5NjgwLDExNCw5OSw1OSwxLDg3OTAsMTA4LDExMSwxMTAsNTksMSw4Nzg5LDQsMiwxMDUsMTA4LDk2OTIsOTY5NiwxMDksNTksMSw4NzcwLDk3LDExMCwxMTYsNCwyLDEwMywxMDgsOTcwNSw5NzEwLDExNiwxMTQsNTksMSwxMDkwMiwxMDEsMTE1LDExNSw1OSwxLDEwOTAxLDQsMyw5NywxMDEsMTA1LDk3MjQsOTcyOSw5NzM0LDEwOCwxMTUsNTksMSw2MSwxMTUsMTE2LDU5LDEsODc5OSwxMTgsNCwyLDU5LDY4LDk3NDEsOTc0MywxLDg4MDEsNjgsNTksMSwxMDg3MiwxMTIsOTcsMTE0LDExNSwxMDgsNTksMSwxMDcyNSw0LDIsNjgsOTcsOTc2MSw5NzY2LDExMSwxMTYsNTksMSw4Nzg3LDExNCwxMTQsNTksMSwxMDYwOSw0LDMsOTksMTAwLDEwNSw5Nzc5LDk3ODMsOTc4OCwxMTQsNTksMSw4NDk1LDExMSwxMTYsNTksMSw4Nzg0LDEwOSw1OSwxLDg3NzAsNCwyLDk3LDEwNCw5Nzk4LDk4MDEsNTksMSw5NTEsNSwyNDAsMSw1OSw5ODA2LDEsMjQwLDQsMiwxMDksMTE0LDk4MTQsOTgyMiwxMDgsNSwyMzUsMSw1OSw5ODIwLDEsMjM1LDExMSw1OSwxLDgzNjQsNCwzLDk5LDEwNSwxMTIsOTgzNCw5ODM4LDk4NDMsMTA4LDU5LDEsMzMsMTE1LDExNiw1OSwxLDg3MDcsNCwyLDEwMSwxMTEsOTg0OSw5ODU5LDk5LDExNiw5NywxMTYsMTA1LDExMSwxMTAsNTksMSw4NDk2LDExMCwxMDEsMTEwLDExNiwxMDUsOTcsMTA4LDEwMSw1OSwxLDg1MTksNCwxMiw5Nyw5OSwxMDEsMTAyLDEwNSwxMDYsMTA4LDExMCwxMTEsMTEyLDExNCwxMTUsOTg5Niw5OTEwLDk5MTQsOTkyMSw5OTU0LDk5NjAsOTk2Nyw5OTg5LDk5OTQsMTAwMjcsMTAwMzYsMTAxNjQsMTA4LDEwOCwxMDUsMTEwLDEwMywxMDAsMTExLDExNiwxMTUsMTAxLDExMyw1OSwxLDg3ODYsMTIxLDU5LDEsMTA5MiwxMDksOTcsMTA4LDEwMSw1OSwxLDk3OTIsNCwzLDEwNSwxMDgsMTE0LDk5MjksOTkzNSw5OTUwLDEwOCwxMDUsMTAzLDU5LDEsNjQyNTksNCwyLDEwNSwxMDgsOTk0MSw5OTQ1LDEwMyw1OSwxLDY0MjU2LDEwNSwxMDMsNTksMSw2NDI2MCw1OSwzLDU1MzQ5LDU2NjExLDEwOCwxMDUsMTAzLDU5LDEsNjQyNTcsMTA4LDEwNSwxMDMsNTksMywxMDIsMTA2LDQsMyw5NywxMDgsMTE2LDk5NzUsOTk3OSw5OTg0LDExNiw1OSwxLDk4MzcsMTA1LDEwMyw1OSwxLDY0MjU4LDExMCwxMTUsNTksMSw5NjQ5LDExMSwxMDIsNTksMSw0MDIsNCwyLDExMiwxMTQsMTAwMDAsMTAwMDUsMTAyLDU5LDMsNTUzNDksNTY2NjMsNCwyLDk3LDEwNywxMDAxMSwxMDAxNiwxMDgsMTA4LDU5LDEsODcwNCw0LDIsNTksMTE4LDEwMDIyLDEwMDI0LDEsODkxNiw1OSwxLDEwOTY5LDk3LDExNCwxMTYsMTA1LDExMCwxMTYsNTksMSwxMDc2NSw0LDIsOTcsMTExLDEwMDQyLDEwMTU5LDQsMiw5OSwxMTUsMTAwNDgsMTAxNTUsNCw2LDQ5LDUwLDUxLDUyLDUzLDU1LDEwMDYyLDEwMTAyLDEwMTE0LDEwMTM1LDEwMTM5LDEwMTUxLDQsNiw1MCw1MSw1Miw1Myw1NCw1NiwxMDA3NiwxMDA4MywxMDA4NiwxMDA5MywxMDA5NiwxMDA5OSw1LDE4OSwxLDU5LDEwMDgxLDEsMTg5LDU5LDEsODUzMSw1LDE4OCwxLDU5LDEwMDkxLDEsMTg4LDU5LDEsODUzMyw1OSwxLDg1MzcsNTksMSw4NTM5LDQsMiw1MSw1MywxMDEwOCwxMDExMSw1OSwxLDg1MzIsNTksMSw4NTM0LDQsMyw1Miw1Myw1NiwxMDEyMiwxMDEyOSwxMDEzMiw1LDE5MCwxLDU5LDEwMTI3LDEsMTkwLDU5LDEsODUzNSw1OSwxLDg1NDAsNTMsNTksMSw4NTM2LDQsMiw1NCw1NiwxMDE0NSwxMDE0OCw1OSwxLDg1MzgsNTksMSw4NTQxLDU2LDU5LDEsODU0MiwxMDgsNTksMSw4MjYwLDExOSwxMTAsNTksMSw4OTk0LDk5LDExNCw1OSwzLDU1MzQ5LDU2NTA3LDQsMTcsNjksOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNSwxMDYsMTA4LDExMCwxMTEsMTE0LDExNSwxMTYsMTE4LDEwMjA2LDEwMjE3LDEwMjQ3LDEwMjU0LDEwMjY4LDEwMjczLDEwMzU4LDEwMzYzLDEwMzc0LDEwMzgwLDEwMzg1LDEwNDA2LDEwNDU4LDEwNDY0LDEwNDcwLDEwNDk3LDEwNjEwLDQsMiw1OSwxMDgsMTAyMTIsMTAyMTQsMSw4ODA3LDU5LDEsMTA4OTIsNCwzLDk5LDEwOSwxMTIsMTAyMjUsMTAyMzEsMTAyNDQsMTE3LDExNiwxMDEsNTksMSw1MDEsMTA5LDk3LDQsMiw1OSwxMDAsMTAyMzksMTAyNDEsMSw5NDcsNTksMSw5ODksNTksMSwxMDg4NiwxMTQsMTAxLDExOCwxMDEsNTksMSwyODcsNCwyLDEwNSwxMjEsMTAyNjAsMTAyNjUsMTE0LDk5LDU5LDEsMjg1LDU5LDEsMTA3NSwxMTEsMTE2LDU5LDEsMjg5LDQsNCw1OSwxMDgsMTEzLDExNSwxMDI4MywxMDI4NSwxMDI4OCwxMDMwOCwxLDg4MDUsNTksMSw4OTIzLDQsMyw1OSwxMTMsMTE1LDEwMjk2LDEwMjk4LDEwMzAxLDEsODgwNSw1OSwxLDg4MDcsMTA4LDk3LDExMCwxMTYsNTksMSwxMDg3OCw0LDQsNTksOTksMTAwLDEwOCwxMDMxOCwxMDMyMCwxMDMyNCwxMDM0NSwxLDEwODc4LDk5LDU5LDEsMTA5MjEsMTExLDExNiw0LDIsNTksMTExLDEwMzMyLDEwMzM0LDEsMTA4ODAsNCwyLDU5LDEwOCwxMDM0MCwxMDM0MiwxLDEwODgyLDU5LDEsMTA4ODQsNCwyLDU5LDEwMSwxMDM1MSwxMDM1NCwzLDg5MjMsNjUwMjQsMTE1LDU5LDEsMTA5MDAsMTE0LDU5LDMsNTUzNDksNTY2MTIsNCwyLDU5LDEwMywxMDM2OSwxMDM3MSwxLDg4MTEsNTksMSw4OTIxLDEwOSwxMDEsMTA4LDU5LDEsODUwMyw5OSwxMjEsNTksMSwxMTA3LDQsNCw1OSw2OSw5NywxMDYsMTAzOTUsMTAzOTcsMTA0MDAsMTA0MDMsMSw4ODIzLDU5LDEsMTA4OTgsNTksMSwxMDkxNyw1OSwxLDEwOTE2LDQsNCw2OSw5NywxMDEsMTE1LDEwNDE2LDEwNDE5LDEwNDM0LDEwNDUzLDU5LDEsODgwOSwxMTIsNCwyLDU5LDExMiwxMDQyNiwxMDQyOCwxLDEwODkwLDExNCwxMTEsMTIwLDU5LDEsMTA4OTAsNCwyLDU5LDExMywxMDQ0MCwxMDQ0MiwxLDEwODg4LDQsMiw1OSwxMTMsMTA0NDgsMTA0NTAsMSwxMDg4OCw1OSwxLDg4MDksMTA1LDEwOSw1OSwxLDg5MzUsMTEyLDEwMiw1OSwzLDU1MzQ5LDU2NjY0LDk3LDExOCwxMDEsNTksMSw5Niw0LDIsOTksMTA1LDEwNDc2LDEwNDgwLDExNCw1OSwxLDg0NTgsMTA5LDQsMyw1OSwxMDEsMTA4LDEwNDg5LDEwNDkxLDEwNDk0LDEsODgxOSw1OSwxLDEwODk0LDU5LDEsMTA4OTYsNSw2Miw2LDU5LDk5LDEwMCwxMDgsMTEzLDExNCwxMDUxMiwxMDUxNCwxMDUyNywxMDUzMiwxMDUzOCwxMDU0NSwxLDYyLDQsMiw5OSwxMDUsMTA1MjAsMTA1MjMsNTksMSwxMDkxOSwxMTQsNTksMSwxMDg3NCwxMTEsMTE2LDU5LDEsODkxOSw4MCw5NywxMTQsNTksMSwxMDY0NSwxMTcsMTAxLDExNSwxMTYsNTksMSwxMDg3Niw0LDUsOTcsMTAwLDEwMSwxMDgsMTE1LDEwNTU3LDEwNTc0LDEwNTc5LDEwNTk5LDEwNjA1LDQsMiwxMTIsMTE0LDEwNTYzLDEwNTcwLDExMiwxMTQsMTExLDEyMCw1OSwxLDEwODg2LDExNCw1OSwxLDEwNjE2LDExMSwxMTYsNTksMSw4OTE5LDExMyw0LDIsMTA4LDExMywxMDU4NiwxMDU5MiwxMDEsMTE1LDExNSw1OSwxLDg5MjMsMTA4LDEwMSwxMTUsMTE1LDU5LDEsMTA4OTIsMTAxLDExNSwxMTUsNTksMSw4ODIzLDEwNSwxMDksNTksMSw4ODE5LDQsMiwxMDEsMTEwLDEwNjE2LDEwNjI2LDExNCwxMTYsMTEwLDEwMSwxMTMsMTEzLDU5LDMsODgwOSw2NTAyNCw2OSw1OSwzLDg4MDksNjUwMjQsNCwxMCw2NSw5Nyw5OCw5OSwxMDEsMTAyLDEwNywxMTEsMTE1LDEyMSwxMDY1MywxMDY1OCwxMDcxMywxMDcxOCwxMDcyNCwxMDc2MCwxMDc2NSwxMDc4NiwxMDg1MCwxMDg3NSwxMTQsMTE0LDU5LDEsODY2MCw0LDQsMTA1LDEwOCwxMDksMTE0LDEwNjY4LDEwNjc0LDEwNjc4LDEwNjg0LDExNCwxMTUsMTEyLDU5LDEsODIwMiwxMDIsNTksMSwxODksMTA1LDEwOCwxMTYsNTksMSw4NDU5LDQsMiwxMDAsMTE0LDEwNjkwLDEwNjk1LDk5LDEyMSw1OSwxLDEwOTgsNCwzLDU5LDk5LDExOSwxMDcwMywxMDcwNSwxMDcxMCwxLDg1OTYsMTA1LDExNCw1OSwxLDEwNTY4LDU5LDEsODYyMSw5NywxMTQsNTksMSw4NDYzLDEwNSwxMTQsOTksNTksMSwyOTMsNCwzLDk3LDEwOCwxMTQsMTA3MzIsMTA3NDgsMTA3NTQsMTE0LDExNiwxMTUsNCwyLDU5LDExNywxMDc0MSwxMDc0MywxLDk4MjksMTA1LDExNiw1OSwxLDk4MjksMTA4LDEwNSwxMTIsNTksMSw4MjMwLDk5LDExMSwxMTAsNTksMSw4ODg5LDExNCw1OSwzLDU1MzQ5LDU2NjEzLDExNSw0LDIsMTAxLDExOSwxMDc3MiwxMDc3OSw5NywxMTQsMTExLDExOSw1OSwxLDEwNTMzLDk3LDExNCwxMTEsMTE5LDU5LDEsMTA1MzQsNCw1LDk3LDEwOSwxMTEsMTEyLDExNCwxMDc5OCwxMDgwMywxMDgwOSwxMDgzOSwxMDg0NCwxMTQsMTE0LDU5LDEsODcwMywxMTYsMTA0LDExNiw1OSwxLDg3NjMsMTA3LDQsMiwxMDgsMTE0LDEwODE2LDEwODI3LDEwMSwxMDIsMTE2LDk3LDExNCwxMTQsMTExLDExOSw1OSwxLDg2MTcsMTA1LDEwMywxMDQsMTE2LDk3LDExNCwxMTQsMTExLDExOSw1OSwxLDg2MTgsMTAyLDU5LDMsNTUzNDksNTY2NjUsOTgsOTcsMTE0LDU5LDEsODIxMyw0LDMsOTksMTA4LDExNiwxMDg1OCwxMDg2MywxMDg2OSwxMTQsNTksMyw1NTM0OSw1NjUwOSw5NywxMTUsMTA0LDU5LDEsODQ2MywxMTQsMTExLDEwNyw1OSwxLDI5NSw0LDIsOTgsMTEyLDEwODgxLDEwODg3LDExNywxMDgsMTA4LDU5LDEsODI1OSwxMDQsMTAxLDExMCw1OSwxLDgyMDgsNCwxNSw5Nyw5OSwxMDEsMTAyLDEwMywxMDUsMTA2LDEwOSwxMTAsMTExLDExMiwxMTMsMTE1LDExNiwxMTcsMTA5MjUsMTA5MzYsMTA5NTgsMTA5NzcsMTA5OTAsMTEwMDEsMTEwMzksMTEwNDUsMTExMDEsMTExOTIsMTEyMjAsMTEyMjYsMTEyMzcsMTEyODUsMTEyOTksOTksMTE3LDExNiwxMDEsNSwyMzcsMSw1OSwxMDkzNCwxLDIzNyw0LDMsNTksMTA1LDEyMSwxMDk0NCwxMDk0NiwxMDk1NSwxLDgyOTEsMTE0LDk5LDUsMjM4LDEsNTksMTA5NTMsMSwyMzgsNTksMSwxMDgwLDQsMiw5OSwxMjAsMTA5NjQsMTA5NjgsMTIxLDU5LDEsMTA3Nyw5OSwxMDgsNSwxNjEsMSw1OSwxMDk3NSwxLDE2MSw0LDIsMTAyLDExNCwxMDk4MywxMDk4Niw1OSwxLDg2NjAsNTksMyw1NTM0OSw1NjYxNCwxMTQsOTcsMTE4LDEwMSw1LDIzNiwxLDU5LDEwOTk5LDEsMjM2LDQsNCw1OSwxMDUsMTEwLDExMSwxMTAxMSwxMTAxMywxMTAyOCwxMTAzNCwxLDg1MjAsNCwyLDEwNSwxMTAsMTEwMTksMTEwMjQsMTEwLDExNiw1OSwxLDEwNzY0LDExNiw1OSwxLDg3NDksMTAyLDEwNSwxMTAsNTksMSwxMDcxNiwxMTYsOTcsNTksMSw4NDg5LDEwOCwxMDUsMTAzLDU5LDEsMzA3LDQsMyw5NywxMTEsMTEyLDExMDUzLDExMDkyLDExMDk2LDQsMyw5OSwxMDMsMTE2LDExMDYxLDExMDY1LDExMDg4LDExNCw1OSwxLDI5OSw0LDMsMTAxLDEwOCwxMTIsMTEwNzMsMTEwNzYsMTEwODIsNTksMSw4NDY1LDEwNSwxMTAsMTAxLDU5LDEsODQ2NCw5NywxMTQsMTE2LDU5LDEsODQ2NSwxMDQsNTksMSwzMDUsMTAyLDU5LDEsODg4NywxMDEsMTAwLDU5LDEsNDM3LDQsNSw1OSw5OSwxMDIsMTExLDExNiwxMTExMywxMTExNSwxMTEyMSwxMTEzNiwxMTE0MiwxLDg3MTIsOTcsMTE0LDEwMSw1OSwxLDg0NTMsMTA1LDExMCw0LDIsNTksMTE2LDExMTI5LDExMTMxLDEsODczNCwxMDUsMTAxLDU5LDEsMTA3MTcsMTAwLDExMSwxMTYsNTksMSwzMDUsNCw1LDU5LDk5LDEwMSwxMDgsMTEyLDExMTU0LDExMTU2LDExMTYxLDExMTc5LDExMTg2LDEsODc0Nyw5NywxMDgsNTksMSw4ODkwLDQsMiwxMDMsMTE0LDExMTY3LDExMTczLDEwMSwxMTQsMTE1LDU5LDEsODQ4NCw5OSw5NywxMDgsNTksMSw4ODkwLDk3LDExNCwxMDQsMTA3LDU5LDEsMTA3NzUsMTE0LDExMSwxMDAsNTksMSwxMDgxMiw0LDQsOTksMTAzLDExMiwxMTYsMTEyMDIsMTEyMDYsMTEyMTEsMTEyMTYsMTIxLDU5LDEsMTEwNSwxMTEsMTEwLDU5LDEsMzAzLDEwMiw1OSwzLDU1MzQ5LDU2NjY2LDk3LDU5LDEsOTUzLDExNCwxMTEsMTAwLDU5LDEsMTA4MTIsMTE3LDEwMSwxMTUsMTE2LDUsMTkxLDEsNTksMTEyMzUsMSwxOTEsNCwyLDk5LDEwNSwxMTI0MywxMTI0OCwxMTQsNTksMyw1NTM0OSw1NjUxMCwxMTAsNCw1LDU5LDY5LDEwMCwxMTUsMTE4LDExMjYxLDExMjYzLDExMjY2LDExMjcxLDExMjgyLDEsODcxMiw1OSwxLDg5NTMsMTExLDExNiw1OSwxLDg5NDksNCwyLDU5LDExOCwxMTI3NywxMTI3OSwxLDg5NDgsNTksMSw4OTQ3LDU5LDEsODcxMiw0LDIsNTksMTA1LDExMjkxLDExMjkzLDEsODI5MCwxMDgsMTAwLDEwMSw1OSwxLDI5Nyw0LDIsMTA3LDEwOSwxMTMwNSwxMTMxMCw5OSwxMjEsNTksMSwxMTEwLDEwOCw1LDIzOSwxLDU5LDExMzE2LDEsMjM5LDQsNiw5OSwxMDIsMTA5LDExMSwxMTUsMTE3LDExMzMyLDExMzQ2LDExMzUxLDExMzU3LDExMzYzLDExMzgwLDQsMiwxMDUsMTIxLDExMzM4LDExMzQzLDExNCw5OSw1OSwxLDMwOSw1OSwxLDEwODEsMTE0LDU5LDMsNTUzNDksNTY2MTUsOTcsMTE2LDEwNCw1OSwxLDU2NywxMTIsMTAyLDU5LDMsNTUzNDksNTY2NjcsNCwyLDk5LDEwMSwxMTM2OSwxMTM3NCwxMTQsNTksMyw1NTM0OSw1NjUxMSwxMTQsOTksMTIxLDU5LDEsMTExMiwxMDcsOTksMTIxLDU5LDEsMTEwOCw0LDgsOTcsOTksMTAyLDEwMywxMDQsMTA2LDExMSwxMTUsMTE0MDQsMTE0MTgsMTE0MzMsMTE0MzgsMTE0NDUsMTE0NTAsMTE0NTUsMTE0NjEsMTEyLDExMiw5Nyw0LDIsNTksMTE4LDExNDEzLDExNDE1LDEsOTU0LDU5LDEsMTAwOCw0LDIsMTAxLDEyMSwxMTQyNCwxMTQzMCwxMDAsMTA1LDEwOCw1OSwxLDMxMSw1OSwxLDEwODIsMTE0LDU5LDMsNTUzNDksNTY2MTYsMTE0LDEwMSwxMDEsMTEwLDU5LDEsMzEyLDk5LDEyMSw1OSwxLDEwOTMsOTksMTIxLDU5LDEsMTExNiwxMTIsMTAyLDU5LDMsNTUzNDksNTY2NjgsOTksMTE0LDU5LDMsNTUzNDksNTY1MTIsNCwyMyw2NSw2Niw2OSw3Miw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNiwxMDgsMTA5LDExMCwxMTEsMTEyLDExNCwxMTUsMTE2LDExNywxMTgsMTE1MTUsMTE1MzgsMTE1NDQsMTE1NTUsMTE1NjAsMTE3MjEsMTE3ODAsMTE4MTgsMTE4NjgsMTIxMzYsMTIxNjAsMTIxNzEsMTIyMDMsMTIyMDgsMTIyNDYsMTIyNzUsMTIzMjcsMTI1MDksMTI1MjMsMTI1NjksMTI2NDEsMTI3MzIsMTI3NTIsNCwzLDk3LDExNCwxMTYsMTE1MjMsMTE1MjgsMTE1MzIsMTE0LDExNCw1OSwxLDg2NjYsMTE0LDU5LDEsODY1Niw5NywxMDUsMTA4LDU5LDEsMTA1MjMsOTcsMTE0LDExNCw1OSwxLDEwNTEwLDQsMiw1OSwxMDMsMTE1NTAsMTE1NTIsMSw4ODA2LDU5LDEsMTA4OTEsOTcsMTE0LDU5LDEsMTA1OTQsNCw5LDk5LDEwMSwxMDMsMTA5LDExMCwxMTIsMTEzLDExNCwxMTYsMTE1ODAsMTE1ODYsMTE1OTQsMTE2MDAsMTE2MDYsMTE2MjQsMTE2MjcsMTE2MzYsMTE2OTQsMTE3LDExNiwxMDEsNTksMSwzMTQsMTA5LDExMiwxMTYsMTIxLDExOCw1OSwxLDEwNjc2LDExNCw5NywxMTAsNTksMSw4NDY2LDk4LDEwMCw5Nyw1OSwxLDk1NSwxMDMsNCwzLDU5LDEwMCwxMDgsMTE2MTUsMTE2MTcsMTE2MjAsMSwxMDIxNiw1OSwxLDEwNjQxLDEwMSw1OSwxLDEwMjE2LDU5LDEsMTA4ODUsMTE3LDExMSw1LDE3MSwxLDU5LDExNjM0LDEsMTcxLDExNCw0LDgsNTksOTgsMTAyLDEwNCwxMDgsMTEyLDExNSwxMTYsMTE2NTUsMTE2NTcsMTE2NjksMTE2NzMsMTE2NzcsMTE2ODEsMTE2ODUsMTE2OTAsMSw4NTkyLDQsMiw1OSwxMDIsMTE2NjMsMTE2NjUsMSw4Njc2LDExNSw1OSwxLDEwNTI3LDExNSw1OSwxLDEwNTI1LDEwNyw1OSwxLDg2MTcsMTEyLDU5LDEsODYxOSwxMDgsNTksMSwxMDU1MywxMDUsMTA5LDU5LDEsMTA2MTEsMTA4LDU5LDEsODYxMCw0LDMsNTksOTcsMTAxLDExNzAyLDExNzA0LDExNzA5LDEsMTA5MjMsMTA1LDEwOCw1OSwxLDEwNTIxLDQsMiw1OSwxMTUsMTE3MTUsMTE3MTcsMSwxMDkyNSw1OSwzLDEwOTI1LDY1MDI0LDQsMyw5Nyw5OCwxMTQsMTE3MjksMTE3MzQsMTE3MzksMTE0LDExNCw1OSwxLDEwNTA4LDExNCwxMDcsNTksMSwxMDA5OCw0LDIsOTcsMTA3LDExNzQ1LDExNzU4LDk5LDQsMiwxMDEsMTA3LDExNzUyLDExNzU1LDU5LDEsMTIzLDU5LDEsOTEsNCwyLDEwMSwxMTUsMTE3NjQsMTE3NjcsNTksMSwxMDYzNSwxMDgsNCwyLDEwMCwxMTcsMTE3NzQsMTE3NzcsNTksMSwxMDYzOSw1OSwxLDEwNjM3LDQsNCw5NywxMDEsMTE3LDEyMSwxMTc5MCwxMTc5NiwxMTgxMSwxMTgxNSwxMTQsMTExLDExMCw1OSwxLDMxOCw0LDIsMTAwLDEwNSwxMTgwMiwxMTgwNywxMDUsMTA4LDU5LDEsMzE2LDEwOCw1OSwxLDg5NjgsOTgsNTksMSwxMjMsNTksMSwxMDgzLDQsNCw5OSwxMTMsMTE0LDExNSwxMTgyOCwxMTgzMiwxMTg0NSwxMTg2NCw5Nyw1OSwxLDEwNTUwLDExNywxMTEsNCwyLDU5LDExNCwxMTg0MCwxMTg0MiwxLDgyMjAsNTksMSw4MjIyLDQsMiwxMDAsMTE3LDExODUxLDExODU3LDEwNCw5NywxMTQsNTksMSwxMDU5OSwxMTUsMTA0LDk3LDExNCw1OSwxLDEwNTcxLDEwNCw1OSwxLDg2MjYsNCw1LDU5LDEwMiwxMDMsMTEzLDExNSwxMTg4MCwxMTg4MiwxMjAwOCwxMjAxMSwxMjAzMSwxLDg4MDQsMTE2LDQsNSw5NywxMDQsMTA4LDExNCwxMTYsMTE4OTUsMTE5MTMsMTE5MzUsMTE5NDcsMTE5OTYsMTE0LDExNCwxMTEsMTE5LDQsMiw1OSwxMTYsMTE5MDUsMTE5MDcsMSw4NTkyLDk3LDEwNSwxMDgsNTksMSw4NjEwLDk3LDExNCwxMTIsMTExLDExMSwxMTAsNCwyLDEwMCwxMTcsMTE5MjUsMTE5MzEsMTExLDExOSwxMTAsNTksMSw4NjM3LDExMiw1OSwxLDg2MzYsMTAxLDEwMiwxMTYsOTcsMTE0LDExNCwxMTEsMTE5LDExNSw1OSwxLDg2NDcsMTA1LDEwMywxMDQsMTE2LDQsMyw5NywxMDQsMTE1LDExOTU5LDExOTc0LDExOTg0LDExNCwxMTQsMTExLDExOSw0LDIsNTksMTE1LDExOTY5LDExOTcxLDEsODU5Niw1OSwxLDg2NDYsOTcsMTE0LDExMiwxMTEsMTExLDExMCwxMTUsNTksMSw4NjUxLDExMywxMTcsMTA1LDEwMyw5NywxMTQsMTE0LDExMSwxMTksNTksMSw4NjIxLDEwNCwxMTQsMTAxLDEwMSwxMTYsMTA1LDEwOSwxMDEsMTE1LDU5LDEsODkwNyw1OSwxLDg5MjIsNCwzLDU5LDExMywxMTUsMTIwMTksMTIwMjEsMTIwMjQsMSw4ODA0LDU5LDEsODgwNiwxMDgsOTcsMTEwLDExNiw1OSwxLDEwODc3LDQsNSw1OSw5OSwxMDAsMTAzLDExNSwxMjA0MywxMjA0NSwxMjA0OSwxMjA3MCwxMjA4MywxLDEwODc3LDk5LDU5LDEsMTA5MjAsMTExLDExNiw0LDIsNTksMTExLDEyMDU3LDEyMDU5LDEsMTA4NzksNCwyLDU5LDExNCwxMjA2NSwxMjA2NywxLDEwODgxLDU5LDEsMTA4ODMsNCwyLDU5LDEwMSwxMjA3NiwxMjA3OSwzLDg5MjIsNjUwMjQsMTE1LDU5LDEsMTA4OTksNCw1LDk3LDEwMCwxMDEsMTAzLDExNSwxMjA5NSwxMjEwMywxMjEwOCwxMjEyNiwxMjEzMSwxMTIsMTEyLDExNCwxMTEsMTIwLDU5LDEsMTA4ODUsMTExLDExNiw1OSwxLDg5MTgsMTEzLDQsMiwxMDMsMTEzLDEyMTE1LDEyMTIwLDExNiwxMTQsNTksMSw4OTIyLDEwMywxMTYsMTE0LDU5LDEsMTA4OTEsMTE2LDExNCw1OSwxLDg4MjIsMTA1LDEwOSw1OSwxLDg4MTgsNCwzLDEwNSwxMDgsMTE0LDEyMTQ0LDEyMTUwLDEyMTU2LDExNSwxMDQsMTE2LDU5LDEsMTA2MjAsMTExLDExMSwxMTQsNTksMSw4OTcwLDU5LDMsNTUzNDksNTY2MTcsNCwyLDU5LDY5LDEyMTY2LDEyMTY4LDEsODgyMiw1OSwxLDEwODk3LDQsMiw5Nyw5OCwxMjE3NywxMjE5OCwxMTQsNCwyLDEwMCwxMTcsMTIxODQsMTIxODcsNTksMSw4NjM3LDQsMiw1OSwxMDgsMTIxOTMsMTIxOTUsMSw4NjM2LDU5LDEsMTA2MDIsMTA4LDEwNyw1OSwxLDk2MDQsOTksMTIxLDU5LDEsMTExMyw0LDUsNTksOTcsOTksMTA0LDExNiwxMjIyMCwxMjIyMiwxMjIyNywxMjIzNSwxMjI0MSwxLDg4MTAsMTE0LDExNCw1OSwxLDg2NDcsMTExLDExNCwxMTAsMTAxLDExNCw1OSwxLDg5OTAsOTcsMTE0LDEwMCw1OSwxLDEwNjAzLDExNCwxMDUsNTksMSw5NzIyLDQsMiwxMDUsMTExLDEyMjUyLDEyMjU4LDEwMCwxMTEsMTE2LDU5LDEsMzIwLDExNywxMTUsMTE2LDQsMiw1OSw5NywxMjI2NywxMjI2OSwxLDkxMzYsOTksMTA0LDEwMSw1OSwxLDkxMzYsNCw0LDY5LDk3LDEwMSwxMTUsMTIyODUsMTIyODgsMTIzMDMsMTIzMjIsNTksMSw4ODA4LDExMiw0LDIsNTksMTEyLDEyMjk1LDEyMjk3LDEsMTA4ODksMTE0LDExMSwxMjAsNTksMSwxMDg4OSw0LDIsNTksMTEzLDEyMzA5LDEyMzExLDEsMTA4ODcsNCwyLDU5LDExMywxMjMxNywxMjMxOSwxLDEwODg3LDU5LDEsODgwOCwxMDUsMTA5LDU5LDEsODkzNCw0LDgsOTcsOTgsMTEwLDExMSwxMTIsMTE2LDExOSwxMjIsMTIzNDUsMTIzNTksMTIzNjQsMTI0MjEsMTI0NDYsMTI0NjcsMTI0NzQsMTI0OTAsNCwyLDExMCwxMTQsMTIzNTEsMTIzNTUsMTAzLDU5LDEsMTAyMjAsMTE0LDU5LDEsODcwMSwxMTQsMTA3LDU5LDEsMTAyMTQsMTAzLDQsMywxMDgsMTA5LDExNCwxMjM3MywxMjQwMSwxMjQwOSwxMDEsMTAyLDExNiw0LDIsOTcsMTE0LDEyMzgyLDEyMzg5LDExNCwxMTQsMTExLDExOSw1OSwxLDEwMjI5LDEwNSwxMDMsMTA0LDExNiw5NywxMTQsMTE0LDExMSwxMTksNTksMSwxMDIzMSw5NywxMTIsMTE1LDExNiwxMTEsNTksMSwxMDIzNiwxMDUsMTAzLDEwNCwxMTYsOTcsMTE0LDExNCwxMTEsMTE5LDU5LDEsMTAyMzAsMTEyLDk3LDExNCwxMTQsMTExLDExOSw0LDIsMTA4LDExNCwxMjQzMywxMjQzOSwxMDEsMTAyLDExNiw1OSwxLDg2MTksMTA1LDEwMywxMDQsMTE2LDU5LDEsODYyMCw0LDMsOTcsMTAyLDEwOCwxMjQ1NCwxMjQ1OCwxMjQ2MiwxMTQsNTksMSwxMDYyOSw1OSwzLDU1MzQ5LDU2NjY5LDExNywxMTUsNTksMSwxMDc5NywxMDUsMTA5LDEwMSwxMTUsNTksMSwxMDgwNCw0LDIsOTcsOTgsMTI0ODAsMTI0ODUsMTE1LDExNiw1OSwxLDg3MjcsOTcsMTE0LDU5LDEsOTUsNCwzLDU5LDEwMSwxMDIsMTI0OTgsMTI1MDAsMTI1MDYsMSw5Njc0LDExMCwxMDMsMTAxLDU5LDEsOTY3NCw1OSwxLDEwNzMxLDk3LDExNCw0LDIsNTksMTA4LDEyNTE3LDEyNTE5LDEsNDAsMTE2LDU5LDEsMTA2NDMsNCw1LDk3LDk5LDEwNCwxMDksMTE2LDEyNTM1LDEyNTQwLDEyNTQ4LDEyNTYxLDEyNTY0LDExNCwxMTQsNTksMSw4NjQ2LDExMSwxMTQsMTEwLDEwMSwxMTQsNTksMSw4OTkxLDk3LDExNCw0LDIsNTksMTAwLDEyNTU2LDEyNTU4LDEsODY1MSw1OSwxLDEwNjA1LDU5LDEsODIwNiwxMTQsMTA1LDU5LDEsODg5NSw0LDYsOTcsOTksMTA0LDEwNSwxMTMsMTE2LDEyNTgzLDEyNTg5LDEyNTk0LDEyNTk3LDEyNjE0LDEyNjM1LDExMywxMTcsMTExLDU5LDEsODI0OSwxMTQsNTksMyw1NTM0OSw1NjUxMyw1OSwxLDg2MjQsMTA5LDQsMyw1OSwxMDEsMTAzLDEyNjA2LDEyNjA4LDEyNjExLDEsODgxOCw1OSwxLDEwODkzLDU5LDEsMTA4OTUsNCwyLDk4LDExNywxMjYyMCwxMjYyMyw1OSwxLDkxLDExMSw0LDIsNTksMTE0LDEyNjMwLDEyNjMyLDEsODIxNiw1OSwxLDgyMTgsMTE0LDExMSwxMDcsNTksMSwzMjIsNSw2MCw4LDU5LDk5LDEwMCwxMDQsMTA1LDEwOCwxMTMsMTE0LDEyNjYwLDEyNjYyLDEyNjc1LDEyNjgwLDEyNjg2LDEyNjkyLDEyNjk4LDEyNzA1LDEsNjAsNCwyLDk5LDEwNSwxMjY2OCwxMjY3MSw1OSwxLDEwOTE4LDExNCw1OSwxLDEwODczLDExMSwxMTYsNTksMSw4OTE4LDExNCwxMDEsMTAxLDU5LDEsODkwNywxMDksMTAxLDExNSw1OSwxLDg5MDUsOTcsMTE0LDExNCw1OSwxLDEwNjE0LDExNywxMDEsMTE1LDExNiw1OSwxLDEwODc1LDQsMiw4MCwxMDUsMTI3MTEsMTI3MTYsOTcsMTE0LDU5LDEsMTA2NDYsNCwzLDU5LDEwMSwxMDIsMTI3MjQsMTI3MjYsMTI3MjksMSw5NjY3LDU5LDEsODg4NCw1OSwxLDk2NjYsMTE0LDQsMiwxMDAsMTE3LDEyNzM5LDEyNzQ2LDExNSwxMDQsOTcsMTE0LDU5LDEsMTA1NzAsMTA0LDk3LDExNCw1OSwxLDEwNTk4LDQsMiwxMDEsMTEwLDEyNzU4LDEyNzY4LDExNCwxMTYsMTEwLDEwMSwxMTMsMTEzLDU5LDMsODgwOCw2NTAyNCw2OSw1OSwzLDg4MDgsNjUwMjQsNCwxNCw2OCw5Nyw5OSwxMDAsMTAxLDEwMiwxMDQsMTA1LDEwOCwxMTAsMTExLDExMiwxMTUsMTE3LDEyODAzLDEyODA5LDEyODkzLDEyOTA4LDEyOTE0LDEyOTI4LDEyOTMzLDEyOTM3LDEzMDExLDEzMDI1LDEzMDMyLDEzMDQ5LDEzMDUyLDEzMDY5LDY4LDExMSwxMTYsNTksMSw4NzYyLDQsNCw5OSwxMDgsMTEyLDExNCwxMjgxOSwxMjgyNywxMjg0OSwxMjg4NywxMTQsNSwxNzUsMSw1OSwxMjgyNSwxLDE3NSw0LDIsMTAxLDExNiwxMjgzMywxMjgzNiw1OSwxLDk3OTQsNCwyLDU5LDEwMSwxMjg0MiwxMjg0NCwxLDEwMDE2LDExNSwxMDEsNTksMSwxMDAxNiw0LDIsNTksMTE1LDEyODU1LDEyODU3LDEsODYxNCwxMTYsMTExLDQsNCw1OSwxMDAsMTA4LDExNywxMjg2OSwxMjg3MSwxMjg3NywxMjg4MywxLDg2MTQsMTExLDExOSwxMTAsNTksMSw4NjE1LDEwMSwxMDIsMTE2LDU5LDEsODYxMiwxMTIsNTksMSw4NjEzLDEwNywxMDEsMTE0LDU5LDEsOTY0Niw0LDIsMTExLDEyMSwxMjg5OSwxMjkwNSwxMDksMTA5LDk3LDU5LDEsMTA3OTMsNTksMSwxMDg0LDk3LDExNSwxMDQsNTksMSw4MjEyLDk3LDExNSwxMTcsMTE0LDEwMSwxMDAsOTcsMTEwLDEwMywxMDgsMTAxLDU5LDEsODczNywxMTQsNTksMyw1NTM0OSw1NjYxOCwxMTEsNTksMSw4NDg3LDQsMyw5OSwxMDAsMTEwLDEyOTQ1LDEyOTU0LDEyOTg1LDExNCwxMTEsNSwxODEsMSw1OSwxMjk1MiwxLDE4MSw0LDQsNTksOTcsOTksMTAwLDEyOTY0LDEyOTY2LDEyOTcxLDEyOTc2LDEsODczOSwxMTUsMTE2LDU5LDEsNDIsMTA1LDExNCw1OSwxLDEwOTkyLDExMSwxMTYsNSwxODMsMSw1OSwxMjk4MywxLDE4MywxMTcsMTE1LDQsMyw1OSw5OCwxMDAsMTI5OTUsMTI5OTcsMTMwMDAsMSw4NzIyLDU5LDEsODg2Myw0LDIsNTksMTE3LDEzMDA2LDEzMDA4LDEsODc2MCw1OSwxLDEwNzk0LDQsMiw5OSwxMDAsMTMwMTcsMTMwMjEsMTEyLDU5LDEsMTA5NzEsMTE0LDU5LDEsODIzMCwxMTIsMTA4LDExNywxMTUsNTksMSw4NzIzLDQsMiwxMDAsMTEyLDEzMDM4LDEzMDQ0LDEwMSwxMDgsMTE1LDU5LDEsODg3MSwxMDIsNTksMyw1NTM0OSw1NjY3MCw1OSwxLDg3MjMsNCwyLDk5LDExNiwxMzA1OCwxMzA2MywxMTQsNTksMyw1NTM0OSw1NjUxNCwxMTIsMTExLDExNSw1OSwxLDg3NjYsNCwzLDU5LDEwOCwxMDksMTMwNzcsMTMwNzksMTMwODcsMSw5NTYsMTE2LDEwNSwxMDksOTcsMTEyLDU5LDEsODg4OCw5NywxMTIsNTksMSw4ODg4LDQsMjQsNzEsNzYsODIsODYsOTcsOTgsOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwOCwxMDksMTExLDExMiwxMTQsMTE1LDExNiwxMTcsMTE4LDExOSwxMzE0MiwxMzE2NSwxMzIxNywxMzIyOSwxMzI0NywxMzMzMCwxMzM1OSwxMzQxNCwxMzQyMCwxMzUwOCwxMzUxMywxMzU3OSwxMzYwMiwxMzYyNiwxMzYzMSwxMzc2MiwxMzc2NywxMzg1NSwxMzkzNiwxMzk5NSwxNDIxNCwxNDI4NSwxNDMxMiwxNDQzMiw0LDIsMTAzLDExNiwxMzE0OCwxMzE1Miw1OSwzLDg5MjEsODI0LDQsMiw1OSwxMTgsMTMxNTgsMTMxNjEsMyw4ODExLDg0MDIsNTksMyw4ODExLDgyNCw0LDMsMTAxLDEwOCwxMTYsMTMxNzMsMTMyMDAsMTMyMDQsMTAyLDExNiw0LDIsOTcsMTE0LDEzMTgxLDEzMTg4LDExNCwxMTQsMTExLDExOSw1OSwxLDg2NTMsMTA1LDEwMywxMDQsMTE2LDk3LDExNCwxMTQsMTExLDExOSw1OSwxLDg2NTQsNTksMyw4OTIwLDgyNCw0LDIsNTksMTE4LDEzMjEwLDEzMjEzLDMsODgxMCw4NDAyLDU5LDMsODgxMCw4MjQsMTA1LDEwMywxMDQsMTE2LDk3LDExNCwxMTQsMTExLDExOSw1OSwxLDg2NTUsNCwyLDY4LDEwMCwxMzIzNSwxMzI0MSw5NywxMTUsMTA0LDU5LDEsODg3OSw5NywxMTUsMTA0LDU5LDEsODg3OCw0LDUsOTgsOTksMTEwLDExMiwxMTYsMTMyNTksMTMyNjQsMTMyNzAsMTMyNzUsMTMzMDgsMTA4LDk3LDU5LDEsODcxMSwxMTcsMTE2LDEwMSw1OSwxLDMyNCwxMDMsNTksMyw4NzM2LDg0MDIsNCw1LDU5LDY5LDEwNSwxMTEsMTEyLDEzMjg3LDEzMjg5LDEzMjkzLDEzMjk4LDEzMzAyLDEsODc3Nyw1OSwzLDEwODY0LDgyNCwxMDAsNTksMyw4Nzc5LDgyNCwxMTUsNTksMSwzMjksMTE0LDExMSwxMjAsNTksMSw4Nzc3LDExNywxMTQsNCwyLDU5LDk3LDEzMzE2LDEzMzE4LDEsOTgzOCwxMDgsNCwyLDU5LDExNSwxMzMyNSwxMzMyNywxLDk4MzgsNTksMSw4NDY5LDQsMiwxMTUsMTE3LDEzMzM2LDEzMzQ0LDExMiw1LDE2MCwxLDU5LDEzMzQyLDEsMTYwLDEwOSwxMTIsNCwyLDU5LDEwMSwxMzM1MiwxMzM1NSwzLDg3ODIsODI0LDU5LDMsODc4Myw4MjQsNCw1LDk3LDEwMSwxMTEsMTE3LDEyMSwxMzM3MSwxMzM4NSwxMzM5MSwxMzQwNywxMzQxMSw0LDIsMTEyLDExNCwxMzM3NywxMzM4MCw1OSwxLDEwODE5LDExMSwxMTAsNTksMSwzMjgsMTAwLDEwNSwxMDgsNTksMSwzMjYsMTEwLDEwMyw0LDIsNTksMTAwLDEzMzk5LDEzNDAxLDEsODc3NSwxMTEsMTE2LDU5LDMsMTA4NjEsODI0LDExMiw1OSwxLDEwODE4LDU5LDEsMTA4NSw5NywxMTUsMTA0LDU5LDEsODIxMSw0LDcsNTksNjUsOTcsMTAwLDExMywxMTUsMTIwLDEzNDM2LDEzNDM4LDEzNDQzLDEzNDY2LDEzNDcyLDEzNDc4LDEzNDk0LDEsODgwMCwxMTQsMTE0LDU5LDEsODY2MywxMTQsNCwyLDEwNCwxMTQsMTM0NTAsMTM0NTQsMTA3LDU5LDEsMTA1MzIsNCwyLDU5LDExMSwxMzQ2MCwxMzQ2MiwxLDg1OTksMTE5LDU5LDEsODU5OSwxMTEsMTE2LDU5LDMsODc4NCw4MjQsMTE3LDEwNSwxMTgsNTksMSw4ODAyLDQsMiwxMDEsMTA1LDEzNDg0LDEzNDg5LDk3LDExNCw1OSwxLDEwNTM2LDEwOSw1OSwzLDg3NzAsODI0LDEwNSwxMTUsMTE2LDQsMiw1OSwxMTUsMTM1MDMsMTM1MDUsMSw4NzA4LDU5LDEsODcwOCwxMTQsNTksMyw1NTM0OSw1NjYxOSw0LDQsNjksMTAxLDExNSwxMTYsMTM1MjMsMTM1MjcsMTM1NjMsMTM1NjgsNTksMyw4ODA3LDgyNCw0LDMsNTksMTEzLDExNSwxMzUzNSwxMzUzNywxMzU1OSwxLDg4MTcsNCwzLDU5LDExMywxMTUsMTM1NDUsMTM1NDcsMTM1NTEsMSw4ODE3LDU5LDMsODgwNyw4MjQsMTA4LDk3LDExMCwxMTYsNTksMywxMDg3OCw4MjQsNTksMywxMDg3OCw4MjQsMTA1LDEwOSw1OSwxLDg4MjEsNCwyLDU5LDExNCwxMzU3NCwxMzU3NiwxLDg4MTUsNTksMSw4ODE1LDQsMyw2NSw5NywxMTIsMTM1ODcsMTM1OTIsMTM1OTcsMTE0LDExNCw1OSwxLDg2NTQsMTE0LDExNCw1OSwxLDg2MjIsOTcsMTE0LDU5LDEsMTA5OTQsNCwzLDU5LDExNSwxMTgsMTM2MTAsMTM2MTIsMTM2MjMsMSw4NzE1LDQsMiw1OSwxMDAsMTM2MTgsMTM2MjAsMSw4OTU2LDU5LDEsODk1NCw1OSwxLDg3MTUsOTksMTIxLDU5LDEsMTExNCw0LDcsNjUsNjksOTcsMTAwLDEwMSwxMTUsMTE2LDEzNjQ3LDEzNjUyLDEzNjU2LDEzNjYxLDEzNjY1LDEzNzM3LDEzNzQyLDExNCwxMTQsNTksMSw4NjUzLDU5LDMsODgwNiw4MjQsMTE0LDExNCw1OSwxLDg2MDIsMTE0LDU5LDEsODIyOSw0LDQsNTksMTAyLDExMywxMTUsMTM2NzUsMTM2NzcsMTM3MDMsMTM3MjUsMSw4ODE2LDExNiw0LDIsOTcsMTE0LDEzNjg0LDEzNjkxLDExNCwxMTQsMTExLDExOSw1OSwxLDg2MDIsMTA1LDEwMywxMDQsMTE2LDk3LDExNCwxMTQsMTExLDExOSw1OSwxLDg2MjIsNCwzLDU5LDExMywxMTUsMTM3MTEsMTM3MTMsMTM3MTcsMSw4ODE2LDU5LDMsODgwNiw4MjQsMTA4LDk3LDExMCwxMTYsNTksMywxMDg3Nyw4MjQsNCwyLDU5LDExNSwxMzczMSwxMzczNCwzLDEwODc3LDgyNCw1OSwxLDg4MTQsMTA1LDEwOSw1OSwxLDg4MjAsNCwyLDU5LDExNCwxMzc0OCwxMzc1MCwxLDg4MTQsMTA1LDQsMiw1OSwxMDEsMTM3NTcsMTM3NTksMSw4OTM4LDU5LDEsODk0MCwxMDUsMTAwLDU5LDEsODc0MCw0LDIsMTEyLDExNiwxMzc3MywxMzc3OCwxMDIsNTksMyw1NTM0OSw1NjY3MSw1LDE3MiwzLDU5LDEwNSwxMTAsMTM3ODcsMTM3ODksMTM4MjksMSwxNzIsMTEwLDQsNCw1OSw2OSwxMDAsMTE4LDEzODAwLDEzODAyLDEzODA2LDEzODEyLDEsODcxMyw1OSwzLDg5NTMsODI0LDExMSwxMTYsNTksMyw4OTQ5LDgyNCw0LDMsOTcsOTgsOTksMTM4MjAsMTM4MjMsMTM4MjYsNTksMSw4NzEzLDU5LDEsODk1MSw1OSwxLDg5NTAsMTA1LDQsMiw1OSwxMTgsMTM4MzYsMTM4MzgsMSw4NzE2LDQsMyw5Nyw5OCw5OSwxMzg0NiwxMzg0OSwxMzg1Miw1OSwxLDg3MTYsNTksMSw4OTU4LDU5LDEsODk1Nyw0LDMsOTcsMTExLDExNCwxMzg2MywxMzg5MiwxMzg5OSwxMTQsNCw0LDU5LDk3LDExNSwxMTYsMTM4NzQsMTM4NzYsMTM4ODMsMTM4ODgsMSw4NzQyLDEwOCwxMDgsMTAxLDEwOCw1OSwxLDg3NDIsMTA4LDU5LDMsMTEwMDUsODQyMSw1OSwzLDg3MDYsODI0LDEwOCwxMDUsMTEwLDExNiw1OSwxLDEwNzcyLDQsMyw1OSw5OSwxMDEsMTM5MDcsMTM5MDksMTM5MTQsMSw4ODMyLDExNywxMDEsNTksMSw4OTI4LDQsMiw1OSw5OSwxMzkyMCwxMzkyMywzLDEwOTI3LDgyNCw0LDIsNTksMTAxLDEzOTI5LDEzOTMxLDEsODgzMiwxMTMsNTksMywxMDkyNyw4MjQsNCw0LDY1LDk3LDEwNSwxMTYsMTM5NDYsMTM5NTEsMTM5NzEsMTM5ODIsMTE0LDExNCw1OSwxLDg2NTUsMTE0LDExNCw0LDMsNTksOTksMTE5LDEzOTYxLDEzOTYzLDEzOTY3LDEsODYwMyw1OSwzLDEwNTQ3LDgyNCw1OSwzLDg2MDUsODI0LDEwMywxMDQsMTE2LDk3LDExNCwxMTQsMTExLDExOSw1OSwxLDg2MDMsMTE0LDEwNSw0LDIsNTksMTAxLDEzOTkwLDEzOTkyLDEsODkzOSw1OSwxLDg5NDEsNCw3LDk5LDEwNCwxMDUsMTA5LDExMiwxMTMsMTE3LDE0MDExLDE0MDM2LDE0MDYwLDE0MDgwLDE0MDg1LDE0MDkwLDE0MTA2LDQsNCw1OSw5OSwxMDEsMTE0LDE0MDIxLDE0MDIzLDE0MDI4LDE0MDMyLDEsODgzMywxMTcsMTAxLDU5LDEsODkyOSw1OSwzLDEwOTI4LDgyNCw1OSwzLDU1MzQ5LDU2NTE1LDExMSwxMTQsMTE2LDQsMiwxMDksMTEyLDE0MDQ1LDE0MDUwLDEwNSwxMDAsNTksMSw4NzQwLDk3LDExNCw5NywxMDgsMTA4LDEwMSwxMDgsNTksMSw4NzQyLDEwOSw0LDIsNTksMTAxLDE0MDY3LDE0MDY5LDEsODc2OSw0LDIsNTksMTEzLDE0MDc1LDE0MDc3LDEsODc3Miw1OSwxLDg3NzIsMTA1LDEwMCw1OSwxLDg3NDAsOTcsMTE0LDU5LDEsODc0MiwxMTUsMTE3LDQsMiw5OCwxMTIsMTQwOTgsMTQxMDIsMTAxLDU5LDEsODkzMCwxMDEsNTksMSw4OTMxLDQsMyw5OCw5OSwxMTIsMTQxMTQsMTQxNTcsMTQxNzEsNCw0LDU5LDY5LDEwMSwxMTUsMTQxMjQsMTQxMjYsMTQxMzAsMTQxMzMsMSw4ODM2LDU5LDMsMTA5NDksODI0LDU5LDEsODg0MCwxMDEsMTE2LDQsMiw1OSwxMDEsMTQxNDEsMTQxNDQsMyw4ODM0LDg0MDIsMTEzLDQsMiw1OSwxMTMsMTQxNTEsMTQxNTMsMSw4ODQwLDU5LDMsMTA5NDksODI0LDk5LDQsMiw1OSwxMDEsMTQxNjQsMTQxNjYsMSw4ODMzLDExMyw1OSwzLDEwOTI4LDgyNCw0LDQsNTksNjksMTAxLDExNSwxNDE4MSwxNDE4MywxNDE4NywxNDE5MCwxLDg4MzcsNTksMywxMDk1MCw4MjQsNTksMSw4ODQxLDEwMSwxMTYsNCwyLDU5LDEwMSwxNDE5OCwxNDIwMSwzLDg4MzUsODQwMiwxMTMsNCwyLDU5LDExMywxNDIwOCwxNDIxMCwxLDg4NDEsNTksMywxMDk1MCw4MjQsNCw0LDEwMywxMDUsMTA4LDExNCwxNDIyNCwxNDIyOCwxNDIzOCwxNDI0MiwxMDgsNTksMSw4ODI1LDEwOCwxMDAsMTAxLDUsMjQxLDEsNTksMTQyMzYsMSwyNDEsMTAzLDU5LDEsODgyNCwxMDUsOTcsMTEwLDEwMywxMDgsMTAxLDQsMiwxMDgsMTE0LDE0MjU0LDE0MjY5LDEwMSwxMDIsMTE2LDQsMiw1OSwxMDEsMTQyNjMsMTQyNjUsMSw4OTM4LDExMyw1OSwxLDg5NDAsMTA1LDEwMywxMDQsMTE2LDQsMiw1OSwxMDEsMTQyNzksMTQyODEsMSw4OTM5LDExMyw1OSwxLDg5NDEsNCwyLDU5LDEwOSwxNDI5MSwxNDI5MywxLDk1Nyw0LDMsNTksMTAxLDExNSwxNDMwMSwxNDMwMywxNDMwOCwxLDM1LDExNCwxMTEsNTksMSw4NDcwLDExMiw1OSwxLDgxOTksNCw5LDY4LDcyLDk3LDEwMCwxMDMsMTA1LDEwOCwxMTQsMTE1LDE0MzMyLDE0MzM4LDE0MzQ0LDE0MzQ5LDE0MzU1LDE0MzY5LDE0Mzc2LDE0NDA4LDE0NDI2LDk3LDExNSwxMDQsNTksMSw4ODc3LDk3LDExNCwxMTQsNTksMSwxMDUwMCwxMTIsNTksMyw4NzgxLDg0MDIsOTcsMTE1LDEwNCw1OSwxLDg4NzYsNCwyLDEwMSwxMTYsMTQzNjEsMTQzNjUsNTksMyw4ODA1LDg0MDIsNTksMyw2Miw4NDAyLDExMCwxMDIsMTA1LDExMCw1OSwxLDEwNzE4LDQsMyw2NSwxMDEsMTE2LDE0Mzg0LDE0Mzg5LDE0MzkzLDExNCwxMTQsNTksMSwxMDQ5OCw1OSwzLDg4MDQsODQwMiw0LDIsNTksMTE0LDE0Mzk5LDE0NDAyLDMsNjAsODQwMiwxMDUsMTAxLDU5LDMsODg4NCw4NDAyLDQsMiw2NSwxMTYsMTQ0MTQsMTQ0MTksMTE0LDExNCw1OSwxLDEwNDk5LDExNCwxMDUsMTAxLDU5LDMsODg4NSw4NDAyLDEwNSwxMDksNTksMyw4NzY0LDg0MDIsNCwzLDY1LDk3LDExMCwxNDQ0MCwxNDQ0NSwxNDQ2OCwxMTQsMTE0LDU5LDEsODY2MiwxMTQsNCwyLDEwNCwxMTQsMTQ0NTIsMTQ0NTYsMTA3LDU5LDEsMTA1MzEsNCwyLDU5LDExMSwxNDQ2MiwxNDQ2NCwxLDg1OTgsMTE5LDU5LDEsODU5OCwxMDEsOTcsMTE0LDU5LDEsMTA1MzUsNCwxOCw4Myw5Nyw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDgsMTA5LDExMSwxMTIsMTE0LDExNSwxMTYsMTE3LDExOCwxNDUxMiwxNDUxNSwxNDUzNSwxNDU2MCwxNDU5NywxNDYwMywxNDYxOCwxNDY0MywxNDY1NywxNDY2MiwxNDcwMSwxNDc0MSwxNDc0NywxNDc2OSwxNDg1MSwxNDg3NywxNDkwNywxNDkxNiw1OSwxLDk0MTYsNCwyLDk5LDExNSwxNDUyMSwxNDUzMSwxMTcsMTE2LDEwMSw1LDI0MywxLDU5LDE0NTI5LDEsMjQzLDExNiw1OSwxLDg4NTksNCwyLDEwNSwxMjEsMTQ1NDEsMTQ1NTcsMTE0LDQsMiw1OSw5OSwxNDU0OCwxNDU1MCwxLDg4NTgsNSwyNDQsMSw1OSwxNDU1NSwxLDI0NCw1OSwxLDEwODYsNCw1LDk3LDk4LDEwNSwxMTEsMTE1LDE0NTcyLDE0NTc3LDE0NTgzLDE0NTg3LDE0NTkxLDExNSwxMDQsNTksMSw4ODYxLDEwOCw5Nyw5OSw1OSwxLDMzNywxMTgsNTksMSwxMDgwOCwxMTYsNTksMSw4ODU3LDExMSwxMDgsMTAwLDU5LDEsMTA2ODQsMTA4LDEwNSwxMDMsNTksMSwzMzksNCwyLDk5LDExNCwxNDYwOSwxNDYxNCwxMDUsMTE0LDU5LDEsMTA2ODcsNTksMyw1NTM0OSw1NjYyMCw0LDMsMTExLDExNCwxMTYsMTQ2MjYsMTQ2MzAsMTQ2NDAsMTEwLDU5LDEsNzMxLDk3LDExOCwxMDEsNSwyNDIsMSw1OSwxNDYzOCwxLDI0Miw1OSwxLDEwNjg5LDQsMiw5OCwxMDksMTQ2NDksMTQ2NTQsOTcsMTE0LDU5LDEsMTA2NzcsNTksMSw5MzcsMTEwLDExNiw1OSwxLDg3NTAsNCw0LDk3LDk5LDEwNSwxMTYsMTQ2NzIsMTQ2NzcsMTQ2OTMsMTQ2OTgsMTE0LDExNCw1OSwxLDg2MzQsNCwyLDEwNSwxMTQsMTQ2ODMsMTQ2ODcsMTE0LDU5LDEsMTA2ODYsMTExLDExNSwxMTUsNTksMSwxMDY4MywxMTAsMTAxLDU5LDEsODI1NCw1OSwxLDEwNjg4LDQsMyw5NywxMDEsMTA1LDE0NzA5LDE0NzE0LDE0NzE5LDk5LDExNCw1OSwxLDMzMywxMDMsOTcsNTksMSw5NjksNCwzLDk5LDEwMCwxMTAsMTQ3MjcsMTQ3MzMsMTQ3MzYsMTE0LDExMSwxMTAsNTksMSw5NTksNTksMSwxMDY3OCwxMTcsMTE1LDU5LDEsODg1NCwxMTIsMTAyLDU5LDMsNTUzNDksNTY2NzIsNCwzLDk3LDEwMSwxMDgsMTQ3NTUsMTQ3NTksMTQ3NjQsMTE0LDU5LDEsMTA2NzksMTE0LDExMiw1OSwxLDEwNjgxLDExNywxMTUsNTksMSw4ODUzLDQsNyw1OSw5NywxMDAsMTA1LDExMSwxMTUsMTE4LDE0Nzg1LDE0Nzg3LDE0NzkyLDE0ODMxLDE0ODM3LDE0ODQxLDE0ODQ4LDEsODc0NCwxMTQsMTE0LDU5LDEsODYzNSw0LDQsNTksMTAxLDEwMiwxMDksMTQ4MDIsMTQ4MDQsMTQ4MTcsMTQ4MjQsMSwxMDg0NSwxMTQsNCwyLDU5LDExMSwxNDgxMSwxNDgxMywxLDg1MDAsMTAyLDU5LDEsODUwMCw1LDE3MCwxLDU5LDE0ODIyLDEsMTcwLDUsMTg2LDEsNTksMTQ4MjksMSwxODYsMTAzLDExMSwxMDIsNTksMSw4ODg2LDExNCw1OSwxLDEwODM4LDEwOCwxMTEsMTEyLDEwMSw1OSwxLDEwODM5LDU5LDEsMTA4NDMsNCwzLDk5LDEwOCwxMTEsMTQ4NTksMTQ4NjMsMTQ4NzMsMTE0LDU5LDEsODUwMCw5NywxMTUsMTA0LDUsMjQ4LDEsNTksMTQ4NzEsMSwyNDgsMTA4LDU5LDEsODg1NiwxMDUsNCwyLDEwOCwxMDksMTQ4ODQsMTQ4OTMsMTAwLDEwMSw1LDI0NSwxLDU5LDE0ODkxLDEsMjQ1LDEwMSwxMTUsNCwyLDU5LDk3LDE0OTAxLDE0OTAzLDEsODg1NSwxMTUsNTksMSwxMDgwNiwxMDksMTA4LDUsMjQ2LDEsNTksMTQ5MTQsMSwyNDYsOTgsOTcsMTE0LDU5LDEsOTAyMSw0LDEyLDk3LDk5LDEwMSwxMDIsMTA0LDEwNSwxMDgsMTA5LDExMSwxMTQsMTE1LDExNywxNDk0OCwxNDk5MiwxNDk5NiwxNTAzMywxNTAzOCwxNTA2OCwxNTA5MCwxNTE4OSwxNTE5MiwxNTIyMiwxNTQyNywxNTQ0MSwxMTQsNCw0LDU5LDk3LDExNSwxMTYsMTQ5NTksMTQ5NjEsMTQ5NzYsMTQ5ODksMSw4NzQxLDUsMTgyLDIsNTksMTA4LDE0OTY4LDE0OTcwLDEsMTgyLDEwOCwxMDEsMTA4LDU5LDEsODc0MSw0LDIsMTA1LDEwOCwxNDk4MiwxNDk4NiwxMDksNTksMSwxMDk5NSw1OSwxLDExMDA1LDU5LDEsODcwNiwxMjEsNTksMSwxMDg3LDExNCw0LDUsOTksMTA1LDEwOSwxMTIsMTE2LDE1MDA5LDE1MDE0LDE1MDE5LDE1MDI0LDE1MDI3LDExMCwxMTYsNTksMSwzNywxMTEsMTAwLDU5LDEsNDYsMTA1LDEwOCw1OSwxLDgyNDAsNTksMSw4ODY5LDEwMSwxMTAsMTA3LDU5LDEsODI0MSwxMTQsNTksMyw1NTM0OSw1NjYyMSw0LDMsMTA1LDEwOSwxMTEsMTUwNDYsMTUwNTcsMTUwNjMsNCwyLDU5LDExOCwxNTA1MiwxNTA1NCwxLDk2Niw1OSwxLDk4MSwxMDksOTcsMTE2LDU5LDEsODQ5OSwxMTAsMTAxLDU5LDEsOTc0Miw0LDMsNTksMTE2LDExOCwxNTA3NiwxNTA3OCwxNTA4NywxLDk2MCw5OSwxMDQsMTAyLDExMSwxMTQsMTA3LDU5LDEsODkxNiw1OSwxLDk4Miw0LDIsOTcsMTE3LDE1MDk2LDE1MTE5LDExMCw0LDIsOTksMTA3LDE1MTAzLDE1MTE1LDEwNyw0LDIsNTksMTA0LDE1MTEwLDE1MTEyLDEsODQ2Myw1OSwxLDg0NjIsMTE4LDU5LDEsODQ2MywxMTUsNCw5LDU5LDk3LDk4LDk5LDEwMCwxMDEsMTA5LDExNSwxMTYsMTUxNDAsMTUxNDIsMTUxNDgsMTUxNTEsMTUxNTYsMTUxNjgsMTUxNzEsMTUxNzksMTUxODQsMSw0Myw5OSwxMDUsMTE0LDU5LDEsMTA3ODcsNTksMSw4ODYyLDEwNSwxMTQsNTksMSwxMDc4Niw0LDIsMTExLDExNywxNTE2MiwxNTE2NSw1OSwxLDg3MjQsNTksMSwxMDc4OSw1OSwxLDEwODY2LDExMCw1LDE3NywxLDU5LDE1MTc3LDEsMTc3LDEwNSwxMDksNTksMSwxMDc5MCwxMTksMTExLDU5LDEsMTA3OTEsNTksMSwxNzcsNCwzLDEwNSwxMTIsMTE3LDE1MjAwLDE1MjA4LDE1MjEzLDExMCwxMTYsMTA1LDExMCwxMTYsNTksMSwxMDc3MywxMDIsNTksMyw1NTM0OSw1NjY3MywxMTAsMTAwLDUsMTYzLDEsNTksMTUyMjAsMSwxNjMsNCwxMCw1OSw2OSw5Nyw5OSwxMDEsMTA1LDExMCwxMTEsMTE1LDExNywxNTI0NCwxNTI0NiwxNTI0OSwxNTI1MywxNTI1OCwxNTMzNCwxNTM0NywxNTM2NywxNTQxNiwxNTQyMSwxLDg4MjYsNTksMSwxMDkzMSwxMTIsNTksMSwxMDkzNSwxMTcsMTAxLDU5LDEsODgyOCw0LDIsNTksOTksMTUyNjQsMTUyNjYsMSwxMDkyNyw0LDYsNTksOTcsOTksMTAxLDExMCwxMTUsMTUyODAsMTUyODIsMTUyOTAsMTUyOTksMTUzMDMsMTUzMjksMSw4ODI2LDExMiwxMTIsMTE0LDExMSwxMjAsNTksMSwxMDkzNSwxMTcsMTE0LDEwOCwxMjEsMTAxLDExMyw1OSwxLDg4MjgsMTEzLDU5LDEsMTA5MjcsNCwzLDk3LDEwMSwxMTUsMTUzMTEsMTUzMTksMTUzMjQsMTEyLDExMiwxMTQsMTExLDEyMCw1OSwxLDEwOTM3LDExMywxMTMsNTksMSwxMDkzMywxMDUsMTA5LDU5LDEsODkzNiwxMDUsMTA5LDU5LDEsODgzMCwxMDksMTAxLDQsMiw1OSwxMTUsMTUzNDIsMTUzNDQsMSw4MjQyLDU5LDEsODQ3Myw0LDMsNjksOTcsMTE1LDE1MzU1LDE1MzU4LDE1MzYyLDU5LDEsMTA5MzMsMTEyLDU5LDEsMTA5MzcsMTA1LDEwOSw1OSwxLDg5MzYsNCwzLDEwMCwxMDIsMTEyLDE1Mzc1LDE1Mzc4LDE1NDA0LDU5LDEsODcxOSw0LDMsOTcsMTA4LDExNSwxNTM4NiwxNTM5MiwxNTM5OCwxMDgsOTcsMTE0LDU5LDEsOTAwNiwxMDUsMTEwLDEwMSw1OSwxLDg5NzgsMTE3LDExNCwxMDIsNTksMSw4OTc5LDQsMiw1OSwxMTYsMTU0MTAsMTU0MTIsMSw4NzMzLDExMSw1OSwxLDg3MzMsMTA1LDEwOSw1OSwxLDg4MzAsMTE0LDEwMSwxMDgsNTksMSw4ODgwLDQsMiw5OSwxMDUsMTU0MzMsMTU0MzgsMTE0LDU5LDMsNTUzNDksNTY1MTcsNTksMSw5NjgsMTEwLDk5LDExNSwxMTIsNTksMSw4MjAwLDQsNiwxMDIsMTA1LDExMSwxMTIsMTE1LDExNywxNTQ2MiwxNTQ2NywxNTQ3MiwxNTQ3OCwxNTQ4NSwxNTQ5MSwxMTQsNTksMyw1NTM0OSw1NjYyMiwxMTAsMTE2LDU5LDEsMTA3NjQsMTEyLDEwMiw1OSwzLDU1MzQ5LDU2Njc0LDExNCwxMDUsMTA5LDEwMSw1OSwxLDgyNzksOTksMTE0LDU5LDMsNTUzNDksNTY1MTgsNCwzLDk3LDEwMSwxMTEsMTU0OTksMTU1MjAsMTU1MzQsMTE2LDQsMiwxMDEsMTA1LDE1NTA2LDE1NTE1LDExNCwxMTAsMTA1LDExMSwxMTAsMTE1LDU5LDEsODQ2MSwxMTAsMTE2LDU5LDEsMTA3NzQsMTE1LDExNiw0LDIsNTksMTAxLDE1NTI4LDE1NTMwLDEsNjMsMTEzLDU5LDEsODc5OSwxMTYsNSwzNCwxLDU5LDE1NTQwLDEsMzQsNCwyMSw2NSw2Niw3Miw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDQsMTA1LDEwOCwxMDksMTEwLDExMSwxMTIsMTE0LDExNSwxMTYsMTE3LDEyMCwxNTU4NiwxNTYwOSwxNTYxNSwxNTYyMCwxNTc5NiwxNTg1NSwxNTg5MywxNTkzMSwxNTk3NywxNjAwMSwxNjAzOSwxNjE4MywxNjIwNCwxNjIyMiwxNjIyOCwxNjI4NSwxNjMxMiwxNjMxOCwxNjM2MywxNjQwOCwxNjQxNiw0LDMsOTcsMTE0LDExNiwxNTU5NCwxNTU5OSwxNTYwMywxMTQsMTE0LDU5LDEsODY2NywxMTQsNTksMSw4NjU4LDk3LDEwNSwxMDgsNTksMSwxMDUyNCw5NywxMTQsMTE0LDU5LDEsMTA1MTEsOTcsMTE0LDU5LDEsMTA1OTYsNCw3LDk5LDEwMCwxMDEsMTEwLDExMywxMTQsMTE2LDE1NjM2LDE1NjUxLDE1NjU2LDE1NjY0LDE1Njg3LDE1Njk2LDE1NzcwLDQsMiwxMDEsMTE3LDE1NjQyLDE1NjQ2LDU5LDMsODc2NSw4MTcsMTE2LDEwMSw1OSwxLDM0MSwxMDUsOTksNTksMSw4NzMwLDEwOSwxMTIsMTE2LDEyMSwxMTgsNTksMSwxMDY3NSwxMDMsNCw0LDU5LDEwMCwxMDEsMTA4LDE1Njc1LDE1Njc3LDE1NjgwLDE1NjgzLDEsMTAyMTcsNTksMSwxMDY0Miw1OSwxLDEwNjYxLDEwMSw1OSwxLDEwMjE3LDExNywxMTEsNSwxODcsMSw1OSwxNTY5NCwxLDE4NywxMTQsNCwxMSw1OSw5Nyw5OCw5OSwxMDIsMTA0LDEwOCwxMTIsMTE1LDExNiwxMTksMTU3MjEsMTU3MjMsMTU3MjcsMTU3MzksMTU3NDIsMTU3NDYsMTU3NTAsMTU3NTQsMTU3NTgsMTU3NjMsMTU3NjcsMSw4NTk0LDExMiw1OSwxLDEwNjEzLDQsMiw1OSwxMDIsMTU3MzMsMTU3MzUsMSw4Njc3LDExNSw1OSwxLDEwNTI4LDU5LDEsMTA1NDcsMTE1LDU5LDEsMTA1MjYsMTA3LDU5LDEsODYxOCwxMTIsNTksMSw4NjIwLDEwOCw1OSwxLDEwNTY1LDEwNSwxMDksNTksMSwxMDYxMiwxMDgsNTksMSw4NjExLDU5LDEsODYwNSw0LDIsOTcsMTA1LDE1Nzc2LDE1NzgxLDEwNSwxMDgsNTksMSwxMDUyMiwxMTEsNCwyLDU5LDExMCwxNTc4OCwxNTc5MCwxLDg3NTgsOTcsMTA4LDExNSw1OSwxLDg0NzQsNCwzLDk3LDk4LDExNCwxNTgwNCwxNTgwOSwxNTgxNCwxMTQsMTE0LDU5LDEsMTA1MDksMTE0LDEwNyw1OSwxLDEwMDk5LDQsMiw5NywxMDcsMTU4MjAsMTU4MzMsOTksNCwyLDEwMSwxMDcsMTU4MjcsMTU4MzAsNTksMSwxMjUsNTksMSw5Myw0LDIsMTAxLDExNSwxNTgzOSwxNTg0Miw1OSwxLDEwNjM2LDEwOCw0LDIsMTAwLDExNywxNTg0OSwxNTg1Miw1OSwxLDEwNjM4LDU5LDEsMTA2NDAsNCw0LDk3LDEwMSwxMTcsMTIxLDE1ODY1LDE1ODcxLDE1ODg2LDE1ODkwLDExNCwxMTEsMTEwLDU5LDEsMzQ1LDQsMiwxMDAsMTA1LDE1ODc3LDE1ODgyLDEwNSwxMDgsNTksMSwzNDMsMTA4LDU5LDEsODk2OSw5OCw1OSwxLDEyNSw1OSwxLDEwODgsNCw0LDk5LDEwOCwxMTMsMTE1LDE1OTAzLDE1OTA3LDE1OTE0LDE1OTI3LDk3LDU5LDEsMTA1NTEsMTAwLDEwNCw5NywxMTQsNTksMSwxMDYwMSwxMTcsMTExLDQsMiw1OSwxMTQsMTU5MjIsMTU5MjQsMSw4MjIxLDU5LDEsODIyMSwxMDQsNTksMSw4NjI3LDQsMyw5Nyw5OSwxMDMsMTU5MzksMTU5NjYsMTU5NzAsMTA4LDQsNCw1OSwxMDUsMTEyLDExNSwxNTk1MCwxNTk1MiwxNTk1NywxNTk2MywxLDg0NzYsMTEwLDEwMSw1OSwxLDg0NzUsOTcsMTE0LDExNiw1OSwxLDg0NzYsNTksMSw4NDc3LDExNiw1OSwxLDk2NDUsNSwxNzQsMSw1OSwxNTk3NSwxLDE3NCw0LDMsMTA1LDEwOCwxMTQsMTU5ODUsMTU5OTEsMTU5OTcsMTE1LDEwNCwxMTYsNTksMSwxMDYyMSwxMTEsMTExLDExNCw1OSwxLDg5NzEsNTksMyw1NTM0OSw1NjYyMyw0LDIsOTcsMTExLDE2MDA3LDE2MDI4LDExNCw0LDIsMTAwLDExNywxNjAxNCwxNjAxNyw1OSwxLDg2NDEsNCwyLDU5LDEwOCwxNjAyMywxNjAyNSwxLDg2NDAsNTksMSwxMDYwNCw0LDIsNTksMTE4LDE2MDM0LDE2MDM2LDEsOTYxLDU5LDEsMTAwOSw0LDMsMTAzLDExMCwxMTUsMTYwNDcsMTYxNjcsMTYxNzEsMTA0LDExNiw0LDYsOTcsMTA0LDEwOCwxMTQsMTE1LDExNiwxNjA2MywxNjA4MSwxNjEwMywxNjEzMCwxNjE0MywxNjE1NSwxMTQsMTE0LDExMSwxMTksNCwyLDU5LDExNiwxNjA3MywxNjA3NSwxLDg1OTQsOTcsMTA1LDEwOCw1OSwxLDg2MTEsOTcsMTE0LDExMiwxMTEsMTExLDExMCw0LDIsMTAwLDExNywxNjA5MywxNjA5OSwxMTEsMTE5LDExMCw1OSwxLDg2NDEsMTEyLDU5LDEsODY0MCwxMDEsMTAyLDExNiw0LDIsOTcsMTA0LDE2MTEyLDE2MTIwLDExNCwxMTQsMTExLDExOSwxMTUsNTksMSw4NjQ0LDk3LDExNCwxMTIsMTExLDExMSwxMTAsMTE1LDU5LDEsODY1MiwxMDUsMTAzLDEwNCwxMTYsOTcsMTE0LDExNCwxMTEsMTE5LDExNSw1OSwxLDg2NDksMTEzLDExNywxMDUsMTAzLDk3LDExNCwxMTQsMTExLDExOSw1OSwxLDg2MDUsMTA0LDExNCwxMDEsMTAxLDExNiwxMDUsMTA5LDEwMSwxMTUsNTksMSw4OTA4LDEwMyw1OSwxLDczMCwxMDUsMTEwLDEwMywxMDAsMTExLDExNiwxMTUsMTAxLDExMyw1OSwxLDg3ODcsNCwzLDk3LDEwNCwxMDksMTYxOTEsMTYxOTYsMTYyMDEsMTE0LDExNCw1OSwxLDg2NDQsOTcsMTE0LDU5LDEsODY1Miw1OSwxLDgyMDcsMTExLDExNywxMTUsMTE2LDQsMiw1OSw5NywxNjIxNCwxNjIxNiwxLDkxMzcsOTksMTA0LDEwMSw1OSwxLDkxMzcsMTA5LDEwNSwxMDAsNTksMSwxMDk5MCw0LDQsOTcsOTgsMTEyLDExNiwxNjIzOCwxNjI1MiwxNjI1NywxNjI3OCw0LDIsMTEwLDExNCwxNjI0NCwxNjI0OCwxMDMsNTksMSwxMDIyMSwxMTQsNTksMSw4NzAyLDExNCwxMDcsNTksMSwxMDIxNSw0LDMsOTcsMTAyLDEwOCwxNjI2NSwxNjI2OSwxNjI3MywxMTQsNTksMSwxMDYzMCw1OSwzLDU1MzQ5LDU2Njc1LDExNywxMTUsNTksMSwxMDc5OCwxMDUsMTA5LDEwMSwxMTUsNTksMSwxMDgwNSw0LDIsOTcsMTEyLDE2MjkxLDE2MzA0LDExNCw0LDIsNTksMTAzLDE2Mjk4LDE2MzAwLDEsNDEsMTE2LDU5LDEsMTA2NDQsMTExLDEwOCwxMDUsMTEwLDExNiw1OSwxLDEwNzcwLDk3LDExNCwxMTQsNTksMSw4NjQ5LDQsNCw5Nyw5OSwxMDQsMTEzLDE2MzI4LDE2MzM0LDE2MzM5LDE2MzQyLDExMywxMTcsMTExLDU5LDEsODI1MCwxMTQsNTksMyw1NTM0OSw1NjUxOSw1OSwxLDg2MjUsNCwyLDk4LDExNywxNjM0OCwxNjM1MSw1OSwxLDkzLDExMSw0LDIsNTksMTE0LDE2MzU4LDE2MzYwLDEsODIxNyw1OSwxLDgyMTcsNCwzLDEwNCwxMDUsMTE0LDE2MzcxLDE2Mzc3LDE2MzgzLDExNCwxMDEsMTAxLDU5LDEsODkwOCwxMDksMTAxLDExNSw1OSwxLDg5MDYsMTA1LDQsNCw1OSwxMDEsMTAyLDEwOCwxNjM5NCwxNjM5NiwxNjM5OSwxNjQwMiwxLDk2NTcsNTksMSw4ODg1LDU5LDEsOTY1NiwxMTYsMTE0LDEwNSw1OSwxLDEwNzAyLDEwOCwxMTcsMTA0LDk3LDExNCw1OSwxLDEwNjAwLDU5LDEsODQ3OCw0LDE5LDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwNCwxMDUsMTA4LDEwOSwxMTEsMTEyLDExMywxMTQsMTE1LDExNiwxMTcsMTE5LDEyMiwxNjQ1OSwxNjQ2NiwxNjQ3MiwxNjU3MiwxNjU5MCwxNjY3MiwxNjY4NywxNjc0NiwxNjg0NCwxNjg1MCwxNjkyNCwxNjk2MywxNjk4OCwxNzExNSwxNzEyMSwxNzE1NCwxNzIwNiwxNzYxNCwxNzY1Niw5OSwxMTcsMTE2LDEwMSw1OSwxLDM0NywxMTMsMTE3LDExMSw1OSwxLDgyMTgsNCwxMCw1OSw2OSw5Nyw5OSwxMDEsMTA1LDExMCwxMTIsMTE1LDEyMSwxNjQ5NCwxNjQ5NiwxNjQ5OSwxNjUxMywxNjUxOCwxNjUzMSwxNjUzNiwxNjU1NiwxNjU2NCwxNjU2OSwxLDg4MjcsNTksMSwxMDkzMiw0LDIsMTEyLDExNCwxNjUwNSwxNjUwOCw1OSwxLDEwOTM2LDExMSwxMTAsNTksMSwzNTMsMTE3LDEwMSw1OSwxLDg4MjksNCwyLDU5LDEwMCwxNjUyNCwxNjUyNiwxLDEwOTI4LDEwNSwxMDgsNTksMSwzNTEsMTE0LDk5LDU5LDEsMzQ5LDQsMyw2OSw5NywxMTUsMTY1NDQsMTY1NDcsMTY1NTEsNTksMSwxMDkzNCwxMTIsNTksMSwxMDkzOCwxMDUsMTA5LDU5LDEsODkzNywxMTEsMTA4LDEwNSwxMTAsMTE2LDU5LDEsMTA3NzEsMTA1LDEwOSw1OSwxLDg4MzEsNTksMSwxMDg5LDExMSwxMTYsNCwzLDU5LDk4LDEwMSwxNjU4MiwxNjU4NCwxNjU4NywxLDg5MDEsNTksMSw4ODY1LDU5LDEsMTA4NTQsNCw3LDY1LDk3LDk5LDEwOSwxMTUsMTE2LDEyMCwxNjYwNiwxNjYxMSwxNjYzNCwxNjY0MiwxNjY0NiwxNjY1MiwxNjY2OCwxMTQsMTE0LDU5LDEsODY2NCwxMTQsNCwyLDEwNCwxMTQsMTY2MTgsMTY2MjIsMTA3LDU5LDEsMTA1MzMsNCwyLDU5LDExMSwxNjYyOCwxNjYzMCwxLDg2MDAsMTE5LDU5LDEsODYwMCwxMTYsNSwxNjcsMSw1OSwxNjY0MCwxLDE2NywxMDUsNTksMSw1OSwxMTksOTcsMTE0LDU5LDEsMTA1MzcsMTA5LDQsMiwxMDUsMTEwLDE2NjU5LDE2NjY1LDExMCwxMTcsMTE1LDU5LDEsODcyNiw1OSwxLDg3MjYsMTE2LDU5LDEsMTAwMzgsMTE0LDQsMiw1OSwxMTEsMTY2NzksMTY2ODIsMyw1NTM0OSw1NjYyNCwxMTksMTEwLDU5LDEsODk5NCw0LDQsOTcsOTksMTExLDEyMSwxNjY5NywxNjcwMiwxNjcxNiwxNjczOSwxMTQsMTEyLDU5LDEsOTgzOSw0LDIsMTA0LDEyMSwxNjcwOCwxNjcxMyw5OSwxMjEsNTksMSwxMDk3LDU5LDEsMTA5NiwxMTQsMTE2LDQsMiwxMDksMTEyLDE2NzI0LDE2NzI5LDEwNSwxMDAsNTksMSw4NzM5LDk3LDExNCw5NywxMDgsMTA4LDEwMSwxMDgsNTksMSw4NzQxLDUsMTczLDEsNTksMTY3NDQsMSwxNzMsNCwyLDEwMywxMDksMTY3NTIsMTY3NzAsMTA5LDk3LDQsMyw1OSwxMDIsMTE4LDE2NzYyLDE2NzY0LDE2NzY3LDEsOTYzLDU5LDEsOTYyLDU5LDEsOTYyLDQsOCw1OSwxMDAsMTAxLDEwMywxMDgsMTEwLDExMiwxMTQsMTY3ODgsMTY3OTAsMTY3OTUsMTY4MDYsMTY4MTcsMTY4MjgsMTY4MzIsMTY4MzgsMSw4NzY0LDExMSwxMTYsNTksMSwxMDg1OCw0LDIsNTksMTEzLDE2ODAxLDE2ODAzLDEsODc3MSw1OSwxLDg3NzEsNCwyLDU5LDY5LDE2ODEyLDE2ODE0LDEsMTA5MTAsNTksMSwxMDkxMiw0LDIsNTksNjksMTY4MjMsMTY4MjUsMSwxMDkwOSw1OSwxLDEwOTExLDEwMSw1OSwxLDg3NzQsMTA4LDExNywxMTUsNTksMSwxMDc4OCw5NywxMTQsMTE0LDU5LDEsMTA2MTAsOTcsMTE0LDExNCw1OSwxLDg1OTIsNCw0LDk3LDEwMSwxMDUsMTE2LDE2ODYwLDE2ODgzLDE2ODkxLDE2OTA0LDQsMiwxMDgsMTE1LDE2ODY2LDE2ODc4LDEwOCwxMTUsMTAxLDExNiwxMDksMTA1LDExMCwxMTcsMTE1LDU5LDEsODcyNiwxMDQsMTEyLDU5LDEsMTA4MDMsMTEyLDk3LDExNCwxMTUsMTA4LDU5LDEsMTA3MjQsNCwyLDEwMCwxMDgsMTY4OTcsMTY5MDAsNTksMSw4NzM5LDEwMSw1OSwxLDg5OTUsNCwyLDU5LDEwMSwxNjkxMCwxNjkxMiwxLDEwOTIyLDQsMiw1OSwxMTUsMTY5MTgsMTY5MjAsMSwxMDkyNCw1OSwzLDEwOTI0LDY1MDI0LDQsMywxMDIsMTA4LDExMiwxNjkzMiwxNjkzOCwxNjk1OCwxMTYsOTksMTIxLDU5LDEsMTEwMCw0LDIsNTksOTgsMTY5NDQsMTY5NDYsMSw0Nyw0LDIsNTksOTcsMTY5NTIsMTY5NTQsMSwxMDY5MiwxMTQsNTksMSw5MDIzLDEwMiw1OSwzLDU1MzQ5LDU2Njc2LDk3LDQsMiwxMDAsMTE0LDE2OTcwLDE2OTg1LDEwMSwxMTUsNCwyLDU5LDExNywxNjk3OCwxNjk4MCwxLDk4MjQsMTA1LDExNiw1OSwxLDk4MjQsNTksMSw4NzQxLDQsMyw5OSwxMTUsMTE3LDE2OTk2LDE3MDI4LDE3MDg5LDQsMiw5NywxMTcsMTcwMDIsMTcwMTUsMTEyLDQsMiw1OSwxMTUsMTcwMDksMTcwMTEsMSw4ODUxLDU5LDMsODg1MSw2NTAyNCwxMTIsNCwyLDU5LDExNSwxNzAyMiwxNzAyNCwxLDg4NTIsNTksMyw4ODUyLDY1MDI0LDExNyw0LDIsOTgsMTEyLDE3MDM1LDE3MDYyLDQsMyw1OSwxMDEsMTE1LDE3MDQzLDE3MDQ1LDE3MDQ4LDEsODg0Nyw1OSwxLDg4NDksMTAxLDExNiw0LDIsNTksMTAxLDE3MDU2LDE3MDU4LDEsODg0NywxMTMsNTksMSw4ODQ5LDQsMyw1OSwxMDEsMTE1LDE3MDcwLDE3MDcyLDE3MDc1LDEsODg0OCw1OSwxLDg4NTAsMTAxLDExNiw0LDIsNTksMTAxLDE3MDgzLDE3MDg1LDEsODg0OCwxMTMsNTksMSw4ODUwLDQsMyw1OSw5NywxMDIsMTcwOTcsMTcwOTksMTcxMTIsMSw5NjMzLDExNCw0LDIsMTAxLDEwMiwxNzEwNiwxNzEwOSw1OSwxLDk2MzMsNTksMSw5NjQyLDU5LDEsOTY0Miw5NywxMTQsMTE0LDU5LDEsODU5NCw0LDQsOTksMTAxLDEwOSwxMTYsMTcxMzEsMTcxMzYsMTcxNDIsMTcxNDgsMTE0LDU5LDMsNTUzNDksNTY1MjAsMTE2LDEwOSwxMTAsNTksMSw4NzI2LDEwNSwxMDgsMTAxLDU5LDEsODk5NSw5NywxMTQsMTAyLDU5LDEsODkwMiw0LDIsOTcsMTE0LDE3MTYwLDE3MTcyLDExNCw0LDIsNTksMTAyLDE3MTY3LDE3MTY5LDEsOTczNCw1OSwxLDk3MzMsNCwyLDk3LDExMCwxNzE3OCwxNzIwMiwxMDUsMTAzLDEwNCwxMTYsNCwyLDEwMSwxMTIsMTcxODgsMTcxOTcsMTEyLDExNSwxMDUsMTA4LDExMSwxMTAsNTksMSwxMDEzLDEwNCwxMDUsNTksMSw5ODEsMTE1LDU5LDEsMTc1LDQsNSw5OCw5OSwxMDksMTEwLDExMiwxNzIxOCwxNzM1MSwxNzQyMCwxNzQyMywxNzQyNyw0LDksNTksNjksMTAwLDEwMSwxMDksMTEwLDExMiwxMTQsMTE1LDE3MjM4LDE3MjQwLDE3MjQzLDE3MjQ4LDE3MjYxLDE3MjY3LDE3Mjc5LDE3Mjg1LDE3MjkxLDEsODgzNCw1OSwxLDEwOTQ5LDExMSwxMTYsNTksMSwxMDk0MSw0LDIsNTksMTAwLDE3MjU0LDE3MjU2LDEsODgzOCwxMTEsMTE2LDU5LDEsMTA5NDcsMTE3LDEwOCwxMTYsNTksMSwxMDk0NSw0LDIsNjksMTAxLDE3MjczLDE3Mjc2LDU5LDEsMTA5NTUsNTksMSw4ODQyLDEwOCwxMTcsMTE1LDU5LDEsMTA5NDMsOTcsMTE0LDExNCw1OSwxLDEwNjE3LDQsMywxMDEsMTA1LDExNywxNzI5OSwxNzMzNSwxNzMzOSwxMTYsNCwzLDU5LDEwMSwxMTAsMTczMDgsMTczMTAsMTczMjIsMSw4ODM0LDExMyw0LDIsNTksMTEzLDE3MzE3LDE3MzE5LDEsODgzOCw1OSwxLDEwOTQ5LDEwMSwxMTMsNCwyLDU5LDExMywxNzMzMCwxNzMzMiwxLDg4NDIsNTksMSwxMDk1NSwxMDksNTksMSwxMDk1MSw0LDIsOTgsMTEyLDE3MzQ1LDE3MzQ4LDU5LDEsMTA5NjUsNTksMSwxMDk2Myw5OSw0LDYsNTksOTcsOTksMTAxLDExMCwxMTUsMTczNjYsMTczNjgsMTczNzYsMTczODUsMTczODksMTc0MTUsMSw4ODI3LDExMiwxMTIsMTE0LDExMSwxMjAsNTksMSwxMDkzNiwxMTcsMTE0LDEwOCwxMjEsMTAxLDExMyw1OSwxLDg4MjksMTEzLDU5LDEsMTA5MjgsNCwzLDk3LDEwMSwxMTUsMTczOTcsMTc0MDUsMTc0MTAsMTEyLDExMiwxMTQsMTExLDEyMCw1OSwxLDEwOTM4LDExMywxMTMsNTksMSwxMDkzNCwxMDUsMTA5LDU5LDEsODkzNywxMDUsMTA5LDU5LDEsODgzMSw1OSwxLDg3MjEsMTAzLDU5LDEsOTgzNCw0LDEzLDQ5LDUwLDUxLDU5LDY5LDEwMCwxMDEsMTA0LDEwOCwxMDksMTEwLDExMiwxMTUsMTc0NTUsMTc0NjIsMTc0NjksMTc0NzYsMTc0NzgsMTc0ODEsMTc0OTYsMTc1MDksMTc1MjQsMTc1MzAsMTc1MzYsMTc1NDgsMTc1NTQsNSwxODUsMSw1OSwxNzQ2MCwxLDE4NSw1LDE3OCwxLDU5LDE3NDY3LDEsMTc4LDUsMTc5LDEsNTksMTc0NzQsMSwxNzksMSw4ODM1LDU5LDEsMTA5NTAsNCwyLDExMSwxMTUsMTc0ODcsMTc0OTEsMTE2LDU5LDEsMTA5NDIsMTE3LDk4LDU5LDEsMTA5NjgsNCwyLDU5LDEwMCwxNzUwMiwxNzUwNCwxLDg4MzksMTExLDExNiw1OSwxLDEwOTQ4LDExNSw0LDIsMTExLDExNywxNzUxNiwxNzUyMCwxMDgsNTksMSwxMDE4NSw5OCw1OSwxLDEwOTY3LDk3LDExNCwxMTQsNTksMSwxMDYxOSwxMTcsMTA4LDExNiw1OSwxLDEwOTQ2LDQsMiw2OSwxMDEsMTc1NDIsMTc1NDUsNTksMSwxMDk1Niw1OSwxLDg4NDMsMTA4LDExNywxMTUsNTksMSwxMDk0NCw0LDMsMTAxLDEwNSwxMTcsMTc1NjIsMTc1OTgsMTc2MDIsMTE2LDQsMyw1OSwxMDEsMTEwLDE3NTcxLDE3NTczLDE3NTg1LDEsODgzNSwxMTMsNCwyLDU5LDExMywxNzU4MCwxNzU4MiwxLDg4MzksNTksMSwxMDk1MCwxMDEsMTEzLDQsMiw1OSwxMTMsMTc1OTMsMTc1OTUsMSw4ODQzLDU5LDEsMTA5NTYsMTA5LDU5LDEsMTA5NTIsNCwyLDk4LDExMiwxNzYwOCwxNzYxMSw1OSwxLDEwOTY0LDU5LDEsMTA5NjYsNCwzLDY1LDk3LDExMCwxNzYyMiwxNzYyNywxNzY1MCwxMTQsMTE0LDU5LDEsODY2NSwxMTQsNCwyLDEwNCwxMTQsMTc2MzQsMTc2MzgsMTA3LDU5LDEsMTA1MzQsNCwyLDU5LDExMSwxNzY0NCwxNzY0NiwxLDg2MDEsMTE5LDU5LDEsODYwMSwxMTksOTcsMTE0LDU5LDEsMTA1MzgsMTA4LDEwNSwxMDMsNSwyMjMsMSw1OSwxNzY2NCwxLDIyMyw0LDEzLDk3LDk4LDk5LDEwMCwxMDEsMTAyLDEwNCwxMDUsMTExLDExMiwxMTQsMTE1LDExOSwxNzY5NCwxNzcwOSwxNzcxNCwxNzczNywxNzc0MiwxNzc0OSwxNzc1NCwxNzg2MCwxNzkwNSwxNzk1NywxNzk2NCwxODA5MCwxODEyMiw0LDIsMTE0LDExNywxNzcwMCwxNzcwNiwxMDMsMTAxLDExNiw1OSwxLDg5ODIsNTksMSw5NjQsMTE0LDEwNyw1OSwxLDkxNDAsNCwzLDk3LDEwMSwxMjEsMTc3MjIsMTc3MjgsMTc3MzQsMTE0LDExMSwxMTAsNTksMSwzNTcsMTAwLDEwNSwxMDgsNTksMSwzNTUsNTksMSwxMDkwLDExMSwxMTYsNTksMSw4NDExLDEwOCwxMTQsMTAxLDk5LDU5LDEsODk4MSwxMTQsNTksMyw1NTM0OSw1NjYyNSw0LDQsMTAxLDEwNSwxMDcsMTExLDE3NzY0LDE3ODA1LDE3ODM2LDE3ODUxLDQsMiwxMTQsMTE2LDE3NzcwLDE3Nzg2LDEwMSw0LDIsNTIsMTAyLDE3Nzc3LDE3NzgwLDU5LDEsODc1NiwxMTEsMTE0LDEwMSw1OSwxLDg3NTYsOTcsNCwzLDU5LDExNSwxMTgsMTc3OTUsMTc3OTcsMTc4MDIsMSw5NTIsMTIxLDEwOSw1OSwxLDk3Nyw1OSwxLDk3Nyw0LDIsOTksMTEwLDE3ODExLDE3ODMxLDEwNyw0LDIsOTcsMTE1LDE3ODE4LDE3ODI2LDExMiwxMTIsMTE0LDExMSwxMjAsNTksMSw4Nzc2LDEwNSwxMDksNTksMSw4NzY0LDExNSwxMTIsNTksMSw4MjAxLDQsMiw5NywxMTUsMTc4NDIsMTc4NDYsMTEyLDU5LDEsODc3NiwxMDUsMTA5LDU5LDEsODc2NCwxMTQsMTEwLDUsMjU0LDEsNTksMTc4NTgsMSwyNTQsNCwzLDEwOCwxMDksMTEwLDE3ODY4LDE3ODczLDE3OTAxLDEwMCwxMDEsNTksMSw3MzIsMTAxLDExNSw1LDIxNSwzLDU5LDk4LDEwMCwxNzg4NCwxNzg4NiwxNzg5OCwxLDIxNSw0LDIsNTksOTcsMTc4OTIsMTc4OTQsMSw4ODY0LDExNCw1OSwxLDEwODAxLDU5LDEsMTA4MDAsMTE2LDU5LDEsODc0OSw0LDMsMTAxLDExMiwxMTUsMTc5MTMsMTc5MTcsMTc5NTMsOTcsNTksMSwxMDUzNiw0LDQsNTksOTgsOTksMTAyLDE3OTI3LDE3OTI5LDE3OTM0LDE3OTM5LDEsODg2OCwxMTEsMTE2LDU5LDEsOTAxNCwxMDUsMTE0LDU5LDEsMTA5OTMsNCwyLDU5LDExMSwxNzk0NSwxNzk0OCwzLDU1MzQ5LDU2Njc3LDExNCwxMDcsNTksMSwxMDk3MCw5Nyw1OSwxLDEwNTM3LDExNCwxMDUsMTA5LDEwMSw1OSwxLDgyNDQsNCwzLDk3LDEwNSwxMTIsMTc5NzIsMTc5NzcsMTgwODIsMTAwLDEwMSw1OSwxLDg0ODIsNCw3LDk3LDEwMCwxMDEsMTA5LDExMiwxMTUsMTE2LDE3OTkzLDE4MDUxLDE4MDU2LDE4MDU5LDE4MDY2LDE4MDcyLDE4MDc2LDExMCwxMDMsMTA4LDEwMSw0LDUsNTksMTAwLDEwOCwxMTMsMTE0LDE4MDA5LDE4MDExLDE4MDE3LDE4MDMyLDE4MDM1LDEsOTY1MywxMTEsMTE5LDExMCw1OSwxLDk2NjMsMTAxLDEwMiwxMTYsNCwyLDU5LDEwMSwxODAyNiwxODAyOCwxLDk2NjcsMTEzLDU5LDEsODg4NCw1OSwxLDg3OTYsMTA1LDEwMywxMDQsMTE2LDQsMiw1OSwxMDEsMTgwNDUsMTgwNDcsMSw5NjU3LDExMyw1OSwxLDg4ODUsMTExLDExNiw1OSwxLDk3MDgsNTksMSw4Nzk2LDEwNSwxMTAsMTE3LDExNSw1OSwxLDEwODEwLDEwOCwxMTcsMTE1LDU5LDEsMTA4MDksOTgsNTksMSwxMDcwMSwxMDUsMTA5LDEwMSw1OSwxLDEwODExLDEwMSwxMjIsMTA1LDExNywxMDksNTksMSw5MTg2LDQsMyw5OSwxMDQsMTE2LDE4MDk4LDE4MTExLDE4MTE2LDQsMiwxMTQsMTIxLDE4MTA0LDE4MTA4LDU5LDMsNTUzNDksNTY1MjEsNTksMSwxMDk0LDk5LDEyMSw1OSwxLDExMTUsMTE0LDExMSwxMDcsNTksMSwzNTksNCwyLDEwNSwxMTEsMTgxMjgsMTgxMzMsMTIwLDExNiw1OSwxLDg4MTIsMTA0LDEwMSw5NywxMDAsNCwyLDEwOCwxMTQsMTgxNDMsMTgxNTQsMTAxLDEwMiwxMTYsOTcsMTE0LDExNCwxMTEsMTE5LDU5LDEsODYwNiwxMDUsMTAzLDEwNCwxMTYsOTcsMTE0LDExNCwxMTEsMTE5LDU5LDEsODYwOCw0LDE4LDY1LDcyLDk3LDk4LDk5LDEwMCwxMDIsMTAzLDEwNCwxMDgsMTA5LDExMSwxMTIsMTE0LDExNSwxMTYsMTE3LDExOSwxODIwNCwxODIwOSwxODIxNCwxODIzNCwxODI1MCwxODI2OCwxODI5MiwxODMwOCwxODMxOSwxODM0MywxODM3OSwxODM5NywxODQxMywxODUwNCwxODU0NywxODU1MywxODU4NCwxODYwMywxMTQsMTE0LDU5LDEsODY1Nyw5NywxMTQsNTksMSwxMDU5NSw0LDIsOTksMTE0LDE4MjIwLDE4MjMwLDExNywxMTYsMTAxLDUsMjUwLDEsNTksMTgyMjgsMSwyNTAsMTE0LDU5LDEsODU5MywxMTQsNCwyLDk5LDEwMSwxODI0MSwxODI0NSwxMjEsNTksMSwxMTE4LDExOCwxMDEsNTksMSwzNjUsNCwyLDEwNSwxMjEsMTgyNTYsMTgyNjUsMTE0LDk5LDUsMjUxLDEsNTksMTgyNjMsMSwyNTEsNTksMSwxMDkxLDQsMyw5Nyw5OCwxMDQsMTgyNzYsMTgyODEsMTgyODcsMTE0LDExNCw1OSwxLDg2NDUsMTA4LDk3LDk5LDU5LDEsMzY5LDk3LDExNCw1OSwxLDEwNjA2LDQsMiwxMDUsMTE0LDE4Mjk4LDE4MzA0LDExNSwxMDQsMTE2LDU5LDEsMTA2MjIsNTksMyw1NTM0OSw1NjYyNiwxMTQsOTcsMTE4LDEwMSw1LDI0OSwxLDU5LDE4MzE3LDEsMjQ5LDQsMiw5Nyw5OCwxODMyNSwxODMzOCwxMTQsNCwyLDEwOCwxMTQsMTgzMzIsMTgzMzUsNTksMSw4NjM5LDU5LDEsODYzOCwxMDgsMTA3LDU5LDEsOTYwMCw0LDIsOTksMTE2LDE4MzQ5LDE4Mzc0LDQsMiwxMTEsMTE0LDE4MzU1LDE4MzY5LDExNCwxMTAsNCwyLDU5LDEwMSwxODM2MywxODM2NSwxLDg5ODgsMTE0LDU5LDEsODk4OCwxMTEsMTEyLDU5LDEsODk3NSwxMTQsMTA1LDU5LDEsOTcyMCw0LDIsOTcsMTA4LDE4Mzg1LDE4MzkwLDk5LDExNCw1OSwxLDM2Myw1LDE2OCwxLDU5LDE4Mzk1LDEsMTY4LDQsMiwxMDMsMTEyLDE4NDAzLDE4NDA4LDExMSwxMTAsNTksMSwzNzEsMTAyLDU5LDMsNTUzNDksNTY2NzgsNCw2LDk3LDEwMCwxMDQsMTA4LDExNSwxMTcsMTg0MjcsMTg0MzQsMTg0NDUsMTg0NzAsMTg0NzUsMTg0OTQsMTE0LDExNCwxMTEsMTE5LDU5LDEsODU5MywxMTEsMTE5LDExMCw5NywxMTQsMTE0LDExMSwxMTksNTksMSw4NTk3LDk3LDExNCwxMTIsMTExLDExMSwxMTAsNCwyLDEwOCwxMTQsMTg0NTcsMTg0NjMsMTAxLDEwMiwxMTYsNTksMSw4NjM5LDEwNSwxMDMsMTA0LDExNiw1OSwxLDg2MzgsMTE3LDExNSw1OSwxLDg4NDYsMTA1LDQsMyw1OSwxMDQsMTA4LDE4NDg0LDE4NDg2LDE4NDg5LDEsOTY1LDU5LDEsOTc4LDExMSwxMTAsNTksMSw5NjUsMTEyLDk3LDExNCwxMTQsMTExLDExOSwxMTUsNTksMSw4NjQ4LDQsMyw5OSwxMDUsMTE2LDE4NTEyLDE4NTM3LDE4NTQyLDQsMiwxMTEsMTE0LDE4NTE4LDE4NTMyLDExNCwxMTAsNCwyLDU5LDEwMSwxODUyNiwxODUyOCwxLDg5ODksMTE0LDU5LDEsODk4OSwxMTEsMTEyLDU5LDEsODk3NCwxMTAsMTAzLDU5LDEsMzY3LDExNCwxMDUsNTksMSw5NzIxLDk5LDExNCw1OSwzLDU1MzQ5LDU2NTIyLDQsMywxMDAsMTA1LDExNCwxODU2MSwxODU2NiwxODU3MiwxMTEsMTE2LDU5LDEsODk0NCwxMDgsMTAwLDEwMSw1OSwxLDM2MSwxMDUsNCwyLDU5LDEwMiwxODU3OSwxODU4MSwxLDk2NTMsNTksMSw5NjUyLDQsMiw5NywxMDksMTg1OTAsMTg1OTUsMTE0LDExNCw1OSwxLDg2NDgsMTA4LDUsMjUyLDEsNTksMTg2MDEsMSwyNTIsOTcsMTEwLDEwMywxMDgsMTAxLDU5LDEsMTA2NjMsNCwxNSw2NSw2Niw2OCw5Nyw5OSwxMDAsMTAxLDEwMiwxMDgsMTEwLDExMSwxMTIsMTE0LDExNSwxMjIsMTg2NDMsMTg2NDgsMTg2NjEsMTg2NjcsMTg4NDcsMTg4NTEsMTg4NTcsMTg5MDQsMTg5MDksMTg5MTUsMTg5MzEsMTg5MzcsMTg5NDMsMTg5NDksMTg5OTYsMTE0LDExNCw1OSwxLDg2NjEsOTcsMTE0LDQsMiw1OSwxMTgsMTg2NTYsMTg2NTgsMSwxMDk4NCw1OSwxLDEwOTg1LDk3LDExNSwxMDQsNTksMSw4ODcyLDQsMiwxMTAsMTE0LDE4NjczLDE4Njc5LDEwMywxMTQsMTE2LDU5LDEsMTA2NTIsNCw3LDEwMSwxMDcsMTEwLDExMiwxMTQsMTE1LDExNiwxODY5NSwxODcwNCwxODcxMSwxODcyMCwxODc0MiwxODc1NCwxODgxMCwxMTIsMTE1LDEwNSwxMDgsMTExLDExMCw1OSwxLDEwMTMsOTcsMTEyLDExMiw5Nyw1OSwxLDEwMDgsMTExLDExNiwxMDQsMTA1LDExMCwxMDMsNTksMSw4NzA5LDQsMywxMDQsMTA1LDExNCwxODcyOCwxODczMiwxODczNSwxMDUsNTksMSw5ODEsNTksMSw5ODIsMTExLDExMiwxMTYsMTExLDU5LDEsODczMyw0LDIsNTksMTA0LDE4NzQ4LDE4NzUwLDEsODU5NywxMTEsNTksMSwxMDA5LDQsMiwxMDUsMTE3LDE4NzYwLDE4NzY2LDEwMywxMDksOTcsNTksMSw5NjIsNCwyLDk4LDExMiwxODc3MiwxODc5MSwxMTUsMTAxLDExNiwxMTAsMTAxLDExMyw0LDIsNTksMTEzLDE4Nzg0LDE4Nzg3LDMsODg0Miw2NTAyNCw1OSwzLDEwOTU1LDY1MDI0LDExNSwxMDEsMTE2LDExMCwxMDEsMTEzLDQsMiw1OSwxMTMsMTg4MDMsMTg4MDYsMyw4ODQzLDY1MDI0LDU5LDMsMTA5NTYsNjUwMjQsNCwyLDEwNCwxMTQsMTg4MTYsMTg4MjIsMTAxLDExNiw5Nyw1OSwxLDk3NywxMDUsOTcsMTEwLDEwMywxMDgsMTAxLDQsMiwxMDgsMTE0LDE4ODM0LDE4ODQwLDEwMSwxMDIsMTE2LDU5LDEsODg4MiwxMDUsMTAzLDEwNCwxMTYsNTksMSw4ODgzLDEyMSw1OSwxLDEwNzQsOTcsMTE1LDEwNCw1OSwxLDg4NjYsNCwzLDEwMSwxMDgsMTE0LDE4ODY1LDE4ODg0LDE4ODkwLDQsMyw1OSw5OCwxMDEsMTg4NzMsMTg4NzUsMTg4ODAsMSw4NzQ0LDk3LDExNCw1OSwxLDg4OTEsMTEzLDU5LDEsODc5NCwxMDgsMTA1LDExMiw1OSwxLDg5NDIsNCwyLDk4LDExNiwxODg5NiwxODkwMSw5NywxMTQsNTksMSwxMjQsNTksMSwxMjQsMTE0LDU5LDMsNTUzNDksNTY2MjcsMTE2LDExNCwxMDUsNTksMSw4ODgyLDExNSwxMTcsNCwyLDk4LDExMiwxODkyMywxODkyNyw1OSwzLDg4MzQsODQwMiw1OSwzLDg4MzUsODQwMiwxMTIsMTAyLDU5LDMsNTUzNDksNTY2NzksMTE0LDExMSwxMTIsNTksMSw4NzMzLDExNiwxMTQsMTA1LDU5LDEsODg4Myw0LDIsOTksMTE3LDE4OTU1LDE4OTYwLDExNCw1OSwzLDU1MzQ5LDU2NTIzLDQsMiw5OCwxMTIsMTg5NjYsMTg5ODEsMTEwLDQsMiw2OSwxMDEsMTg5NzMsMTg5NzcsNTksMywxMDk1NSw2NTAyNCw1OSwzLDg4NDIsNjUwMjQsMTEwLDQsMiw2OSwxMDEsMTg5ODgsMTg5OTIsNTksMywxMDk1Niw2NTAyNCw1OSwzLDg4NDMsNjUwMjQsMTA1LDEwMywxMjIsOTcsMTAzLDU5LDEsMTA2NTAsNCw3LDk5LDEwMSwxMDIsMTExLDExMiwxMTQsMTE1LDE5MDIwLDE5MDI2LDE5MDYxLDE5MDY2LDE5MDcyLDE5MDc1LDE5MDg5LDEwNSwxMTQsOTksNTksMSwzNzMsNCwyLDEwMCwxMDUsMTkwMzIsMTkwNTUsNCwyLDk4LDEwMywxOTAzOCwxOTA0Myw5NywxMTQsNTksMSwxMDg0NywxMDEsNCwyLDU5LDExMywxOTA1MCwxOTA1MiwxLDg3NDMsNTksMSw4NzkzLDEwMSwxMTQsMTEyLDU5LDEsODQ3MiwxMTQsNTksMyw1NTM0OSw1NjYyOCwxMTIsMTAyLDU5LDMsNTUzNDksNTY2ODAsNTksMSw4NDcyLDQsMiw1OSwxMDEsMTkwODEsMTkwODMsMSw4NzY4LDk3LDExNiwxMDQsNTksMSw4NzY4LDk5LDExNCw1OSwzLDU1MzQ5LDU2NTI0LDQsMTQsOTksMTAwLDEwMiwxMDQsMTA1LDEwOCwxMDksMTEwLDExMSwxMTQsMTE1LDExNywxMTgsMTE5LDE5MTI1LDE5MTQ2LDE5MTUyLDE5MTU3LDE5MTczLDE5MTc2LDE5MTkyLDE5MTk3LDE5MjAyLDE5MjM2LDE5MjUyLDE5MjY5LDE5Mjg2LDE5MjkxLDQsMyw5NywxMDUsMTE3LDE5MTMzLDE5MTM3LDE5MTQyLDExMiw1OSwxLDg4OTgsMTE0LDk5LDU5LDEsOTcxMSwxMTIsNTksMSw4ODk5LDExNiwxMTQsMTA1LDU5LDEsOTY2MSwxMTQsNTksMyw1NTM0OSw1NjYyOSw0LDIsNjUsOTcsMTkxNjMsMTkxNjgsMTE0LDExNCw1OSwxLDEwMjM0LDExNCwxMTQsNTksMSwxMDIzMSw1OSwxLDk1OCw0LDIsNjUsOTcsMTkxODIsMTkxODcsMTE0LDExNCw1OSwxLDEwMjMyLDExNCwxMTQsNTksMSwxMDIyOSw5NywxMTIsNTksMSwxMDIzNiwxMDUsMTE1LDU5LDEsODk1NSw0LDMsMTAwLDExMiwxMTYsMTkyMTAsMTkyMTUsMTkyMzAsMTExLDExNiw1OSwxLDEwNzUyLDQsMiwxMDIsMTA4LDE5MjIxLDE5MjI1LDU5LDMsNTUzNDksNTY2ODEsMTE3LDExNSw1OSwxLDEwNzUzLDEwNSwxMDksMTAxLDU5LDEsMTA3NTQsNCwyLDY1LDk3LDE5MjQyLDE5MjQ3LDExNCwxMTQsNTksMSwxMDIzMywxMTQsMTE0LDU5LDEsMTAyMzAsNCwyLDk5LDExMywxOTI1OCwxOTI2MywxMTQsNTksMyw1NTM0OSw1NjUyNSw5OSwxMTcsMTEyLDU5LDEsMTA3NTgsNCwyLDExMiwxMTYsMTkyNzUsMTkyODEsMTA4LDExNywxMTUsNTksMSwxMDc1NiwxMTQsMTA1LDU5LDEsOTY1MSwxMDEsMTAxLDU5LDEsODg5NywxMDEsMTAwLDEwMywxMDEsNTksMSw4ODk2LDQsOCw5Nyw5OSwxMDEsMTAyLDEwNSwxMTEsMTE1LDExNywxOTMxNiwxOTMzNSwxOTM0OSwxOTM1NywxOTM2MiwxOTM2NywxOTM3MywxOTM3OSw5OSw0LDIsMTE3LDEyMSwxOTMyMywxOTMzMiwxMTYsMTAxLDUsMjUzLDEsNTksMTkzMzAsMSwyNTMsNTksMSwxMTAzLDQsMiwxMDUsMTIxLDE5MzQxLDE5MzQ2LDExNCw5OSw1OSwxLDM3NSw1OSwxLDEwOTksMTEwLDUsMTY1LDEsNTksMTkzNTUsMSwxNjUsMTE0LDU5LDMsNTUzNDksNTY2MzAsOTksMTIxLDU5LDEsMTExMSwxMTIsMTAyLDU5LDMsNTUzNDksNTY2ODIsOTksMTE0LDU5LDMsNTUzNDksNTY1MjYsNCwyLDk5LDEwOSwxOTM4NSwxOTM4OSwxMjEsNTksMSwxMTAyLDEwOCw1LDI1NSwxLDU5LDE5Mzk1LDEsMjU1LDQsMTAsOTcsOTksMTAwLDEwMSwxMDIsMTA0LDEwNSwxMTEsMTE1LDExOSwxOTQxOSwxOTQyNiwxOTQ0MSwxOTQ0NiwxOTQ2MiwxOTQ2NywxOTQ3MiwxOTQ4MCwxOTQ4NiwxOTQ5Miw5OSwxMTcsMTE2LDEwMSw1OSwxLDM3OCw0LDIsOTcsMTIxLDE5NDMyLDE5NDM4LDExNCwxMTEsMTEwLDU5LDEsMzgyLDU5LDEsMTA3OSwxMTEsMTE2LDU5LDEsMzgwLDQsMiwxMDEsMTE2LDE5NDUyLDE5NDU4LDExNiwxMTQsMTAyLDU5LDEsODQ4OCw5Nyw1OSwxLDk1MCwxMTQsNTksMyw1NTM0OSw1NjYzMSw5OSwxMjEsNTksMSwxMDc4LDEwMywxMTQsOTcsMTE0LDExNCw1OSwxLDg2NjksMTEyLDEwMiw1OSwzLDU1MzQ5LDU2NjgzLDk5LDExNCw1OSwzLDU1MzQ5LDU2NTI3LDQsMiwxMDYsMTEwLDE5NDk4LDE5NTAxLDU5LDEsODIwNSwxMDYsNTksMSw4MjA0XSk7IiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1bmljb2RlID0gcmVxdWlyZSgnLi4vY29tbW9uL3VuaWNvZGUnKTtcbmNvbnN0IEVSUiA9IHJlcXVpcmUoJy4uL2NvbW1vbi9lcnJvci1jb2RlcycpO1xuXG4vL0FsaWFzZXNcbmNvbnN0ICQgPSB1bmljb2RlLkNPREVfUE9JTlRTO1xuXG4vL0NvbnN0XG5jb25zdCBERUZBVUxUX0JVRkZFUl9XQVRFUkxJTkUgPSAxIDw8IDE2O1xuXG4vL1ByZXByb2Nlc3NvclxuLy9OT1RFOiBIVE1MIGlucHV0IHByZXByb2Nlc3Npbmdcbi8vKHNlZTogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvcGFyc2luZy5odG1sI3ByZXByb2Nlc3NpbmctdGhlLWlucHV0LXN0cmVhbSlcbmNsYXNzIFByZXByb2Nlc3NvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaHRtbCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5wb3MgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0R2FwUG9zID0gLTE7XG4gICAgICAgIHRoaXMubGFzdENoYXJQb3MgPSAtMTtcblxuICAgICAgICB0aGlzLmdhcFN0YWNrID0gW107XG5cbiAgICAgICAgdGhpcy5za2lwTmV4dE5ld0xpbmUgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmxhc3RDaHVua1dyaXR0ZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbmRPZkNodW5rSGl0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnVmZmVyV2F0ZXJsaW5lID0gREVGQVVMVF9CVUZGRVJfV0FURVJMSU5FO1xuICAgIH1cblxuICAgIF9lcnIoKSB7XG4gICAgICAgIC8vIE5PVEU6IGVyciByZXBvcnRpbmcgaXMgbm9vcCBieSBkZWZhdWx0LiBFbmFibGVkIGJ5IG1peGluLlxuICAgIH1cblxuICAgIF9hZGRHYXAoKSB7XG4gICAgICAgIHRoaXMuZ2FwU3RhY2sucHVzaCh0aGlzLmxhc3RHYXBQb3MpO1xuICAgICAgICB0aGlzLmxhc3RHYXBQb3MgPSB0aGlzLnBvcztcbiAgICB9XG5cbiAgICBfcHJvY2Vzc1N1cnJvZ2F0ZShjcCkge1xuICAgICAgICAvL05PVEU6IHRyeSB0byBwZWVrIGEgc3Vycm9nYXRlIHBhaXJcbiAgICAgICAgaWYgKHRoaXMucG9zICE9PSB0aGlzLmxhc3RDaGFyUG9zKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0Q3AgPSB0aGlzLmh0bWwuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuXG4gICAgICAgICAgICBpZiAodW5pY29kZS5pc1N1cnJvZ2F0ZVBhaXIobmV4dENwKSkge1xuICAgICAgICAgICAgICAgIC8vTk9URTogd2UgaGF2ZSBhIHN1cnJvZ2F0ZSBwYWlyLiBQZWVrIHBhaXIgY2hhcmFjdGVyIGFuZCByZWNhbGN1bGF0ZSBjb2RlIHBvaW50LlxuICAgICAgICAgICAgICAgIHRoaXMucG9zKys7XG5cbiAgICAgICAgICAgICAgICAvL05PVEU6IGFkZCBnYXAgdGhhdCBzaG91bGQgYmUgYXZvaWRlZCBkdXJpbmcgcmV0cmVhdFxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZEdhcCgpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUuZ2V0U3Vycm9nYXRlUGFpckNvZGVQb2ludChjcCwgbmV4dENwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vTk9URTogd2UgYXJlIGF0IHRoZSBlbmQgb2YgYSBjaHVuaywgdGhlcmVmb3JlIHdlIGNhbid0IGluZmVyIHN1cnJvZ2F0ZSBwYWlyIHlldC5cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMubGFzdENodW5rV3JpdHRlbikge1xuICAgICAgICAgICAgdGhpcy5lbmRPZkNodW5rSGl0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiAkLkVPRjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vTk9URTogaXNvbGF0ZWQgc3Vycm9nYXRlXG4gICAgICAgIHRoaXMuX2VycihFUlIuc3Vycm9nYXRlSW5JbnB1dFN0cmVhbSk7XG5cbiAgICAgICAgcmV0dXJuIGNwO1xuICAgIH1cblxuICAgIGRyb3BQYXJzZWRDaHVuaygpIHtcbiAgICAgICAgaWYgKHRoaXMucG9zID4gdGhpcy5idWZmZXJXYXRlcmxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdENoYXJQb3MgLT0gdGhpcy5wb3M7XG4gICAgICAgICAgICB0aGlzLmh0bWwgPSB0aGlzLmh0bWwuc3Vic3RyaW5nKHRoaXMucG9zKTtcbiAgICAgICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgICAgIHRoaXMubGFzdEdhcFBvcyA9IC0xO1xuICAgICAgICAgICAgdGhpcy5nYXBTdGFjayA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGUoY2h1bmssIGlzTGFzdENodW5rKSB7XG4gICAgICAgIGlmICh0aGlzLmh0bWwpIHtcbiAgICAgICAgICAgIHRoaXMuaHRtbCArPSBjaHVuaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaHRtbCA9IGNodW5rO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sYXN0Q2hhclBvcyA9IHRoaXMuaHRtbC5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLmVuZE9mQ2h1bmtIaXQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sYXN0Q2h1bmtXcml0dGVuID0gaXNMYXN0Q2h1bms7XG4gICAgfVxuXG4gICAgaW5zZXJ0SHRtbEF0Q3VycmVudFBvcyhjaHVuaykge1xuICAgICAgICB0aGlzLmh0bWwgPSB0aGlzLmh0bWwuc3Vic3RyaW5nKDAsIHRoaXMucG9zICsgMSkgKyBjaHVuayArIHRoaXMuaHRtbC5zdWJzdHJpbmcodGhpcy5wb3MgKyAxLCB0aGlzLmh0bWwubGVuZ3RoKTtcblxuICAgICAgICB0aGlzLmxhc3RDaGFyUG9zID0gdGhpcy5odG1sLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuZW5kT2ZDaHVua0hpdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFkdmFuY2UoKSB7XG4gICAgICAgIHRoaXMucG9zKys7XG5cbiAgICAgICAgaWYgKHRoaXMucG9zID4gdGhpcy5sYXN0Q2hhclBvcykge1xuICAgICAgICAgICAgdGhpcy5lbmRPZkNodW5rSGl0ID0gIXRoaXMubGFzdENodW5rV3JpdHRlbjtcbiAgICAgICAgICAgIHJldHVybiAkLkVPRjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjcCA9IHRoaXMuaHRtbC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcblxuICAgICAgICAvL05PVEU6IGFueSBVKzAwMEEgTElORSBGRUVEIChMRikgY2hhcmFjdGVycyB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvdyBhIFUrMDAwRCBDQVJSSUFHRSBSRVRVUk4gKENSKSBjaGFyYWN0ZXJcbiAgICAgICAgLy9tdXN0IGJlIGlnbm9yZWQuXG4gICAgICAgIGlmICh0aGlzLnNraXBOZXh0TmV3TGluZSAmJiBjcCA9PT0gJC5MSU5FX0ZFRUQpIHtcbiAgICAgICAgICAgIHRoaXMuc2tpcE5leHROZXdMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9hZGRHYXAoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vTk9URTogYWxsIFUrMDAwRCBDQVJSSUFHRSBSRVRVUk4gKENSKSBjaGFyYWN0ZXJzIG11c3QgYmUgY29udmVydGVkIHRvIFUrMDAwQSBMSU5FIEZFRUQgKExGKSBjaGFyYWN0ZXJzXG4gICAgICAgIGlmIChjcCA9PT0gJC5DQVJSSUFHRV9SRVRVUk4pIHtcbiAgICAgICAgICAgIHRoaXMuc2tpcE5leHROZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiAkLkxJTkVfRkVFRDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2tpcE5leHROZXdMaW5lID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHVuaWNvZGUuaXNTdXJyb2dhdGUoY3ApKSB7XG4gICAgICAgICAgICBjcCA9IHRoaXMuX3Byb2Nlc3NTdXJyb2dhdGUoY3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9PUFRJTUlaQVRJT046IGZpcnN0IGNoZWNrIGlmIGNvZGUgcG9pbnQgaXMgaW4gdGhlIGNvbW1vbiBhbGxvd2VkXG4gICAgICAgIC8vcmFuZ2UgKEFTQ0lJIGFscGhhbnVtZXJpYywgd2hpdGVzcGFjZXMsIGJpZyBjaHVuayBvZiBCTVApXG4gICAgICAgIC8vYmVmb3JlIGdvaW5nIGludG8gZGV0YWlsZWQgcGVyZm9ybWFuY2UgY29zdCB2YWxpZGF0aW9uLlxuICAgICAgICBjb25zdCBpc0NvbW1vblZhbGlkUmFuZ2UgPVxuICAgICAgICAgICAgKGNwID4gMHgxZiAmJiBjcCA8IDB4N2YpIHx8IGNwID09PSAkLkxJTkVfRkVFRCB8fCBjcCA9PT0gJC5DQVJSSUFHRV9SRVRVUk4gfHwgKGNwID4gMHg5ZiAmJiBjcCA8IDB4ZmRkMCk7XG5cbiAgICAgICAgaWYgKCFpc0NvbW1vblZhbGlkUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrRm9yUHJvYmxlbWF0aWNDaGFyYWN0ZXJzKGNwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjcDtcbiAgICB9XG5cbiAgICBfY2hlY2tGb3JQcm9ibGVtYXRpY0NoYXJhY3RlcnMoY3ApIHtcbiAgICAgICAgaWYgKHVuaWNvZGUuaXNDb250cm9sQ29kZVBvaW50KGNwKSkge1xuICAgICAgICAgICAgdGhpcy5fZXJyKEVSUi5jb250cm9sQ2hhcmFjdGVySW5JbnB1dFN0cmVhbSk7XG4gICAgICAgIH0gZWxzZSBpZiAodW5pY29kZS5pc1VuZGVmaW5lZENvZGVQb2ludChjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihFUlIubm9uY2hhcmFjdGVySW5JbnB1dFN0cmVhbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXRyZWF0KCkge1xuICAgICAgICBpZiAodGhpcy5wb3MgPT09IHRoaXMubGFzdEdhcFBvcykge1xuICAgICAgICAgICAgdGhpcy5sYXN0R2FwUG9zID0gdGhpcy5nYXBTdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMucG9zLS07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvcy0tO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBQcmVwcm9jZXNzb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgRE9DVU1FTlRfTU9ERSB9ID0gcmVxdWlyZSgnLi4vY29tbW9uL2h0bWwnKTtcblxuLy9Ob2RlIGNvbnN0cnVjdGlvblxuZXhwb3J0cy5jcmVhdGVEb2N1bWVudCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVOYW1lOiAnI2RvY3VtZW50JyxcbiAgICAgICAgbW9kZTogRE9DVU1FTlRfTU9ERS5OT19RVUlSS1MsXG4gICAgICAgIGNoaWxkTm9kZXM6IFtdXG4gICAgfTtcbn07XG5cbmV4cG9ydHMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVOYW1lOiAnI2RvY3VtZW50LWZyYWdtZW50JyxcbiAgICAgICAgY2hpbGROb2RlczogW11cbiAgICB9O1xufTtcblxuZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24odGFnTmFtZSwgbmFtZXNwYWNlVVJJLCBhdHRycykge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVOYW1lOiB0YWdOYW1lLFxuICAgICAgICB0YWdOYW1lOiB0YWdOYW1lLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIG5hbWVzcGFjZVVSSTogbmFtZXNwYWNlVVJJLFxuICAgICAgICBjaGlsZE5vZGVzOiBbXSxcbiAgICAgICAgcGFyZW50Tm9kZTogbnVsbFxuICAgIH07XG59O1xuXG5leHBvcnRzLmNyZWF0ZUNvbW1lbnROb2RlID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVOYW1lOiAnI2NvbW1lbnQnLFxuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBwYXJlbnROb2RlOiBudWxsXG4gICAgfTtcbn07XG5cbmNvbnN0IGNyZWF0ZVRleHROb2RlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBub2RlTmFtZTogJyN0ZXh0JyxcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBwYXJlbnROb2RlOiBudWxsXG4gICAgfTtcbn07XG5cbi8vVHJlZSBtdXRhdGlvblxuY29uc3QgYXBwZW5kQ2hpbGQgPSAoZXhwb3J0cy5hcHBlbmRDaGlsZCA9IGZ1bmN0aW9uKHBhcmVudE5vZGUsIG5ld05vZGUpIHtcbiAgICBwYXJlbnROb2RlLmNoaWxkTm9kZXMucHVzaChuZXdOb2RlKTtcbiAgICBuZXdOb2RlLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlO1xufSk7XG5cbmNvbnN0IGluc2VydEJlZm9yZSA9IChleHBvcnRzLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uKHBhcmVudE5vZGUsIG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHtcbiAgICBjb25zdCBpbnNlcnRpb25JZHggPSBwYXJlbnROb2RlLmNoaWxkTm9kZXMuaW5kZXhPZihyZWZlcmVuY2VOb2RlKTtcblxuICAgIHBhcmVudE5vZGUuY2hpbGROb2Rlcy5zcGxpY2UoaW5zZXJ0aW9uSWR4LCAwLCBuZXdOb2RlKTtcbiAgICBuZXdOb2RlLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlO1xufSk7XG5cbmV4cG9ydHMuc2V0VGVtcGxhdGVDb250ZW50ID0gZnVuY3Rpb24odGVtcGxhdGVFbGVtZW50LCBjb250ZW50RWxlbWVudCkge1xuICAgIHRlbXBsYXRlRWxlbWVudC5jb250ZW50ID0gY29udGVudEVsZW1lbnQ7XG59O1xuXG5leHBvcnRzLmdldFRlbXBsYXRlQ29udGVudCA9IGZ1bmN0aW9uKHRlbXBsYXRlRWxlbWVudCkge1xuICAgIHJldHVybiB0ZW1wbGF0ZUVsZW1lbnQuY29udGVudDtcbn07XG5cbmV4cG9ydHMuc2V0RG9jdW1lbnRUeXBlID0gZnVuY3Rpb24oZG9jdW1lbnQsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkge1xuICAgIGxldCBkb2N0eXBlTm9kZSA9IG51bGw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvY3VtZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LmNoaWxkTm9kZXNbaV0ubm9kZU5hbWUgPT09ICcjZG9jdW1lbnRUeXBlJykge1xuICAgICAgICAgICAgZG9jdHlwZU5vZGUgPSBkb2N1bWVudC5jaGlsZE5vZGVzW2ldO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZG9jdHlwZU5vZGUpIHtcbiAgICAgICAgZG9jdHlwZU5vZGUubmFtZSA9IG5hbWU7XG4gICAgICAgIGRvY3R5cGVOb2RlLnB1YmxpY0lkID0gcHVibGljSWQ7XG4gICAgICAgIGRvY3R5cGVOb2RlLnN5c3RlbUlkID0gc3lzdGVtSWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXBwZW5kQ2hpbGQoZG9jdW1lbnQsIHtcbiAgICAgICAgICAgIG5vZGVOYW1lOiAnI2RvY3VtZW50VHlwZScsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgcHVibGljSWQ6IHB1YmxpY0lkLFxuICAgICAgICAgICAgc3lzdGVtSWQ6IHN5c3RlbUlkXG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbmV4cG9ydHMuc2V0RG9jdW1lbnRNb2RlID0gZnVuY3Rpb24oZG9jdW1lbnQsIG1vZGUpIHtcbiAgICBkb2N1bWVudC5tb2RlID0gbW9kZTtcbn07XG5cbmV4cG9ydHMuZ2V0RG9jdW1lbnRNb2RlID0gZnVuY3Rpb24oZG9jdW1lbnQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQubW9kZTtcbn07XG5cbmV4cG9ydHMuZGV0YWNoTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzLmluZGV4T2Yobm9kZSk7XG5cbiAgICAgICAgbm9kZS5wYXJlbnROb2RlLmNoaWxkTm9kZXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIG5vZGUucGFyZW50Tm9kZSA9IG51bGw7XG4gICAgfVxufTtcblxuZXhwb3J0cy5pbnNlcnRUZXh0ID0gZnVuY3Rpb24ocGFyZW50Tm9kZSwgdGV4dCkge1xuICAgIGlmIChwYXJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHByZXZOb2RlID0gcGFyZW50Tm9kZS5jaGlsZE5vZGVzW3BhcmVudE5vZGUuY2hpbGROb2Rlcy5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAocHJldk5vZGUubm9kZU5hbWUgPT09ICcjdGV4dCcpIHtcbiAgICAgICAgICAgIHByZXZOb2RlLnZhbHVlICs9IHRleHQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBlbmRDaGlsZChwYXJlbnROb2RlLCBjcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7XG59O1xuXG5leHBvcnRzLmluc2VydFRleHRCZWZvcmUgPSBmdW5jdGlvbihwYXJlbnROb2RlLCB0ZXh0LCByZWZlcmVuY2VOb2RlKSB7XG4gICAgY29uc3QgcHJldk5vZGUgPSBwYXJlbnROb2RlLmNoaWxkTm9kZXNbcGFyZW50Tm9kZS5jaGlsZE5vZGVzLmluZGV4T2YocmVmZXJlbmNlTm9kZSkgLSAxXTtcblxuICAgIGlmIChwcmV2Tm9kZSAmJiBwcmV2Tm9kZS5ub2RlTmFtZSA9PT0gJyN0ZXh0Jykge1xuICAgICAgICBwcmV2Tm9kZS52YWx1ZSArPSB0ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGluc2VydEJlZm9yZShwYXJlbnROb2RlLCBjcmVhdGVUZXh0Tm9kZSh0ZXh0KSwgcmVmZXJlbmNlTm9kZSk7XG4gICAgfVxufTtcblxuZXhwb3J0cy5hZG9wdEF0dHJpYnV0ZXMgPSBmdW5jdGlvbihyZWNpcGllbnQsIGF0dHJzKSB7XG4gICAgY29uc3QgcmVjaXBpZW50QXR0cnNNYXAgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjaXBpZW50LmF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlY2lwaWVudEF0dHJzTWFwLnB1c2gocmVjaXBpZW50LmF0dHJzW2ldLm5hbWUpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlY2lwaWVudEF0dHJzTWFwLmluZGV4T2YoYXR0cnNbal0ubmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICByZWNpcGllbnQuYXR0cnMucHVzaChhdHRyc1tqXSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vL1RyZWUgdHJhdmVyc2luZ1xuZXhwb3J0cy5nZXRGaXJzdENoaWxkID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBub2RlLmNoaWxkTm9kZXNbMF07XG59O1xuXG5leHBvcnRzLmdldENoaWxkTm9kZXMgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuY2hpbGROb2Rlcztcbn07XG5cbmV4cG9ydHMuZ2V0UGFyZW50Tm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlO1xufTtcblxuZXhwb3J0cy5nZXRBdHRyTGlzdCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gZWxlbWVudC5hdHRycztcbn07XG5cbi8vTm9kZSBkYXRhXG5leHBvcnRzLmdldFRhZ05hbWUgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQudGFnTmFtZTtcbn07XG5cbmV4cG9ydHMuZ2V0TmFtZXNwYWNlVVJJID0gZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50Lm5hbWVzcGFjZVVSSTtcbn07XG5cbmV4cG9ydHMuZ2V0VGV4dE5vZGVDb250ZW50ID0gZnVuY3Rpb24odGV4dE5vZGUpIHtcbiAgICByZXR1cm4gdGV4dE5vZGUudmFsdWU7XG59O1xuXG5leHBvcnRzLmdldENvbW1lbnROb2RlQ29udGVudCA9IGZ1bmN0aW9uKGNvbW1lbnROb2RlKSB7XG4gICAgcmV0dXJuIGNvbW1lbnROb2RlLmRhdGE7XG59O1xuXG5leHBvcnRzLmdldERvY3VtZW50VHlwZU5vZGVOYW1lID0gZnVuY3Rpb24oZG9jdHlwZU5vZGUpIHtcbiAgICByZXR1cm4gZG9jdHlwZU5vZGUubmFtZTtcbn07XG5cbmV4cG9ydHMuZ2V0RG9jdW1lbnRUeXBlTm9kZVB1YmxpY0lkID0gZnVuY3Rpb24oZG9jdHlwZU5vZGUpIHtcbiAgICByZXR1cm4gZG9jdHlwZU5vZGUucHVibGljSWQ7XG59O1xuXG5leHBvcnRzLmdldERvY3VtZW50VHlwZU5vZGVTeXN0ZW1JZCA9IGZ1bmN0aW9uKGRvY3R5cGVOb2RlKSB7XG4gICAgcmV0dXJuIGRvY3R5cGVOb2RlLnN5c3RlbUlkO1xufTtcblxuLy9Ob2RlIHR5cGVzXG5leHBvcnRzLmlzVGV4dE5vZGUgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZU5hbWUgPT09ICcjdGV4dCc7XG59O1xuXG5leHBvcnRzLmlzQ29tbWVudE5vZGUgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZU5hbWUgPT09ICcjY29tbWVudCc7XG59O1xuXG5leHBvcnRzLmlzRG9jdW1lbnRUeXBlTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlTmFtZSA9PT0gJyNkb2N1bWVudFR5cGUnO1xufTtcblxuZXhwb3J0cy5pc0VsZW1lbnROb2RlID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiAhIW5vZGUudGFnTmFtZTtcbn07XG5cbi8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uXG5leHBvcnRzLnNldE5vZGVTb3VyY2VDb2RlTG9jYXRpb24gPSBmdW5jdGlvbihub2RlLCBsb2NhdGlvbikge1xuICAgIG5vZGUuc291cmNlQ29kZUxvY2F0aW9uID0gbG9jYXRpb247XG59O1xuXG5leHBvcnRzLmdldE5vZGVTb3VyY2VDb2RlTG9jYXRpb24gPSBmdW5jdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuc291cmNlQ29kZUxvY2F0aW9uO1xufTtcblxuZXhwb3J0cy51cGRhdGVOb2RlU291cmNlQ29kZUxvY2F0aW9uID0gZnVuY3Rpb24obm9kZSwgZW5kTG9jYXRpb24pIHtcbiAgICBub2RlLnNvdXJjZUNvZGVMb2NhdGlvbiA9IE9iamVjdC5hc3NpZ24obm9kZS5zb3VyY2VDb2RlTG9jYXRpb24sIGVuZExvY2F0aW9uKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbWVyZ2VPcHRpb25zKGRlZmF1bHRzLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHJldHVybiBbZGVmYXVsdHMsIG9wdGlvbnNdLnJlZHVjZSgobWVyZ2VkLCBvcHRPYmopID0+IHtcbiAgICAgICAgT2JqZWN0LmtleXMob3B0T2JqKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBtZXJnZWRba2V5XSA9IG9wdE9ialtrZXldO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY2xhc3MgTWl4aW4ge1xuICAgIGNvbnN0cnVjdG9yKGhvc3QpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2RzID0ge307XG4gICAgICAgIGNvbnN0IG92ZXJyaWRkZW5NZXRob2RzID0gdGhpcy5fZ2V0T3ZlcnJpZGRlbk1ldGhvZHModGhpcywgb3JpZ2luYWxNZXRob2RzKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvdmVycmlkZGVuTWV0aG9kcykpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3ZlcnJpZGRlbk1ldGhvZHNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kc1trZXldID0gaG9zdFtrZXldO1xuICAgICAgICAgICAgICAgIGhvc3Rba2V5XSA9IG92ZXJyaWRkZW5NZXRob2RzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZ2V0T3ZlcnJpZGRlbk1ldGhvZHMoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxufVxuXG5NaXhpbi5pbnN0YWxsID0gZnVuY3Rpb24oaG9zdCwgQ3Rvciwgb3B0cykge1xuICAgIGlmICghaG9zdC5fX21peGlucykge1xuICAgICAgICBob3N0Ll9fbWl4aW5zID0gW107XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBob3N0Ll9fbWl4aW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChob3N0Ll9fbWl4aW5zW2ldLmNvbnN0cnVjdG9yID09PSBDdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gaG9zdC5fX21peGluc1tpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1peGluID0gbmV3IEN0b3IoaG9zdCwgb3B0cyk7XG5cbiAgICBob3N0Ll9fbWl4aW5zLnB1c2gobWl4aW4pO1xuXG4gICAgcmV0dXJuIG1peGluO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBNaXhpbjtcbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImNvbW1vbi9kb2N0eXBlLmpzIiwiY29tbW9uL2Vycm9yLWNvZGVzLmpzIiwiY29tbW9uL2ZvcmVpZ24tY29udGVudC5qcyIsImNvbW1vbi9odG1sLmpzIiwiY29tbW9uL3Rva2VuLmpzIiwiY29tbW9uL3VuaWNvZGUuanMiLCJpbmRleC5qcyIsInBhcnNlci9mb3JtYXR0aW5nLWVsZW1lbnQtbGlzdC5qcyIsInBhcnNlci9pbmRleC5qcyIsInBhcnNlci9vcGVuLWVsZW1lbnQtc3RhY2suanMiLCJzZXJpYWxpemVyL2luZGV4LmpzIiwidG9rZW5pemVyL2luZGV4LmpzIiwidG9rZW5pemVyL3ByZXByb2Nlc3Nvci5qcyIsInRyZWUtYWRhcHRlcnMvZGVmYXVsdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9lbnRpdGllcy9saWIvZGVjb2RlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2VudGl0aWVzL2xpYi9kZWNvZGVfY29kZXBvaW50LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2VudGl0aWVzL2xpYi9lc2NhcGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZW50aXRpZXMvbGliL2dlbmVyYXRlZC9kZWNvZGUtZGF0YS1odG1sLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2VudGl0aWVzL2xpYi9nZW5lcmF0ZWQvZGVjb2RlLWRhdGEteG1sLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaGhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3grRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeDJGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDck1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0RG9jdW1lbnRNb2RlID0gZXhwb3J0cy5pc0NvbmZvcm1pbmcgPSB2b2lkIDA7XG5jb25zdCBodG1sX2pzXzEgPSByZXF1aXJlKFwiLi9odG1sLmpzXCIpO1xuLy9Db25zdFxuY29uc3QgVkFMSURfRE9DVFlQRV9OQU1FID0gJ2h0bWwnO1xuY29uc3QgVkFMSURfU1lTVEVNX0lEID0gJ2Fib3V0OmxlZ2FjeS1jb21wYXQnO1xuY29uc3QgUVVJUktTX01PREVfU1lTVEVNX0lEID0gJ2h0dHA6Ly93d3cuaWJtLmNvbS9kYXRhL2R0ZC92MTEvaWJteGh0bWwxLXRyYW5zaXRpb25hbC5kdGQnO1xuY29uc3QgUVVJUktTX01PREVfUFVCTElDX0lEX1BSRUZJWEVTID0gW1xuICAgICcrLy9zaWxtYXJpbC8vZHRkIGh0bWwgcHJvIHYwcjExIDE5OTcwMTAxLy8nLFxuICAgICctLy9hcy8vZHRkIGh0bWwgMy4wIGFzd2VkaXQgKyBleHRlbnNpb25zLy8nLFxuICAgICctLy9hZHZhc29mdCBsdGQvL2R0ZCBodG1sIDMuMCBhc3dlZGl0ICsgZXh0ZW5zaW9ucy8vJyxcbiAgICAnLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIGxldmVsIDEvLycsXG4gICAgJy0vL2lldGYvL2R0ZCBodG1sIDIuMCBsZXZlbCAyLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCAyLjAgc3RyaWN0IGxldmVsIDEvLycsXG4gICAgJy0vL2lldGYvL2R0ZCBodG1sIDIuMCBzdHJpY3QgbGV2ZWwgMi8vJyxcbiAgICAnLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIHN0cmljdC8vJyxcbiAgICAnLS8vaWV0Zi8vZHRkIGh0bWwgMi4wLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCAyLjFlLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCAzLjAvLycsXG4gICAgJy0vL2lldGYvL2R0ZCBodG1sIDMuMiBmaW5hbC8vJyxcbiAgICAnLS8vaWV0Zi8vZHRkIGh0bWwgMy4yLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCAzLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAwLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAxLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAyLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAzLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QgbGV2ZWwgMC8vJyxcbiAgICAnLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0IGxldmVsIDEvLycsXG4gICAgJy0vL2lldGYvL2R0ZCBodG1sIHN0cmljdCBsZXZlbCAyLy8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbCBzdHJpY3QgbGV2ZWwgMy8vJyxcbiAgICAnLS8vaWV0Zi8vZHRkIGh0bWwgc3RyaWN0Ly8nLFxuICAgICctLy9pZXRmLy9kdGQgaHRtbC8vJyxcbiAgICAnLS8vbWV0cml1cy8vZHRkIG1ldHJpdXMgcHJlc2VudGF0aW9uYWwvLycsXG4gICAgJy0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDIuMCBodG1sIHN0cmljdC8vJyxcbiAgICAnLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMi4wIGh0bWwvLycsXG4gICAgJy0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDIuMCB0YWJsZXMvLycsXG4gICAgJy0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDMuMCBodG1sIHN0cmljdC8vJyxcbiAgICAnLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMy4wIGh0bWwvLycsXG4gICAgJy0vL21pY3Jvc29mdC8vZHRkIGludGVybmV0IGV4cGxvcmVyIDMuMCB0YWJsZXMvLycsXG4gICAgJy0vL25ldHNjYXBlIGNvbW0uIGNvcnAuLy9kdGQgaHRtbC8vJyxcbiAgICAnLS8vbmV0c2NhcGUgY29tbS4gY29ycC4vL2R0ZCBzdHJpY3QgaHRtbC8vJyxcbiAgICBcIi0vL28ncmVpbGx5IGFuZCBhc3NvY2lhdGVzLy9kdGQgaHRtbCAyLjAvL1wiLFxuICAgIFwiLS8vbydyZWlsbHkgYW5kIGFzc29jaWF0ZXMvL2R0ZCBodG1sIGV4dGVuZGVkIDEuMC8vXCIsXG4gICAgXCItLy9vJ3JlaWxseSBhbmQgYXNzb2NpYXRlcy8vZHRkIGh0bWwgZXh0ZW5kZWQgcmVsYXhlZCAxLjAvL1wiLFxuICAgICctLy9zcS8vZHRkIGh0bWwgMi4wIGhvdG1ldGFsICsgZXh0ZW5zaW9ucy8vJyxcbiAgICAnLS8vc29mdHF1YWQgc29mdHdhcmUvL2R0ZCBob3RtZXRhbCBwcm8gNi4wOjoxOTk5MDYwMTo6ZXh0ZW5zaW9ucyB0byBodG1sIDQuMC8vJyxcbiAgICAnLS8vc29mdHF1YWQvL2R0ZCBob3RtZXRhbCBwcm8gNC4wOjoxOTk3MTAxMDo6ZXh0ZW5zaW9ucyB0byBodG1sIDQuMC8vJyxcbiAgICAnLS8vc3B5Z2xhc3MvL2R0ZCBodG1sIDIuMCBleHRlbmRlZC8vJyxcbiAgICAnLS8vc3VuIG1pY3Jvc3lzdGVtcyBjb3JwLi8vZHRkIGhvdGphdmEgaHRtbC8vJyxcbiAgICAnLS8vc3VuIG1pY3Jvc3lzdGVtcyBjb3JwLi8vZHRkIGhvdGphdmEgc3RyaWN0IGh0bWwvLycsXG4gICAgJy0vL3czYy8vZHRkIGh0bWwgMyAxOTk1LTAzLTI0Ly8nLFxuICAgICctLy93M2MvL2R0ZCBodG1sIDMuMiBkcmFmdC8vJyxcbiAgICAnLS8vdzNjLy9kdGQgaHRtbCAzLjIgZmluYWwvLycsXG4gICAgJy0vL3czYy8vZHRkIGh0bWwgMy4yLy8nLFxuICAgICctLy93M2MvL2R0ZCBodG1sIDMuMnMgZHJhZnQvLycsXG4gICAgJy0vL3czYy8vZHRkIGh0bWwgNC4wIGZyYW1lc2V0Ly8nLFxuICAgICctLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvLycsXG4gICAgJy0vL3czYy8vZHRkIGh0bWwgZXhwZXJpbWVudGFsIDE5OTYwNzEyLy8nLFxuICAgICctLy93M2MvL2R0ZCBodG1sIGV4cGVyaW1lbnRhbCA5NzA0MjEvLycsXG4gICAgJy0vL3czYy8vZHRkIHczIGh0bWwvLycsXG4gICAgJy0vL3czby8vZHRkIHczIGh0bWwgMy4wLy8nLFxuICAgICctLy93ZWJ0ZWNocy8vZHRkIG1vemlsbGEgaHRtbCAyLjAvLycsXG4gICAgJy0vL3dlYnRlY2hzLy9kdGQgbW96aWxsYSBodG1sLy8nLFxuXTtcbmNvbnN0IFFVSVJLU19NT0RFX05PX1NZU1RFTV9JRF9QVUJMSUNfSURfUFJFRklYRVMgPSBbXG4gICAgLi4uUVVJUktTX01PREVfUFVCTElDX0lEX1BSRUZJWEVTLFxuICAgICctLy93M2MvL2R0ZCBodG1sIDQuMDEgZnJhbWVzZXQvLycsXG4gICAgJy0vL3czYy8vZHRkIGh0bWwgNC4wMSB0cmFuc2l0aW9uYWwvLycsXG5dO1xuY29uc3QgUVVJUktTX01PREVfUFVCTElDX0lEUyA9IG5ldyBTZXQoW1xuICAgICctLy93M28vL2R0ZCB3MyBodG1sIHN0cmljdCAzLjAvL2VuLy8nLFxuICAgICctL3czYy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsL2VuJyxcbiAgICAnaHRtbCcsXG5dKTtcbmNvbnN0IExJTUlURURfUVVJUktTX1BVQkxJQ19JRF9QUkVGSVhFUyA9IFsnLS8vdzNjLy9kdGQgeGh0bWwgMS4wIGZyYW1lc2V0Ly8nLCAnLS8vdzNjLy9kdGQgeGh0bWwgMS4wIHRyYW5zaXRpb25hbC8vJ107XG5jb25zdCBMSU1JVEVEX1FVSVJLU19XSVRIX1NZU1RFTV9JRF9QVUJMSUNfSURfUFJFRklYRVMgPSBbXG4gICAgLi4uTElNSVRFRF9RVUlSS1NfUFVCTElDX0lEX1BSRUZJWEVTLFxuICAgICctLy93M2MvL2R0ZCBodG1sIDQuMDEgZnJhbWVzZXQvLycsXG4gICAgJy0vL3czYy8vZHRkIGh0bWwgNC4wMSB0cmFuc2l0aW9uYWwvLycsXG5dO1xuLy9VdGlsc1xuZnVuY3Rpb24gaGFzUHJlZml4KHB1YmxpY0lkLCBwcmVmaXhlcykge1xuICAgIHJldHVybiBwcmVmaXhlcy5zb21lKChwcmVmaXgpID0+IHB1YmxpY0lkLnN0YXJ0c1dpdGgocHJlZml4KSk7XG59XG4vL0FQSVxuZnVuY3Rpb24gaXNDb25mb3JtaW5nKHRva2VuKSB7XG4gICAgcmV0dXJuICh0b2tlbi5uYW1lID09PSBWQUxJRF9ET0NUWVBFX05BTUUgJiZcbiAgICAgICAgdG9rZW4ucHVibGljSWQgPT09IG51bGwgJiZcbiAgICAgICAgKHRva2VuLnN5c3RlbUlkID09PSBudWxsIHx8IHRva2VuLnN5c3RlbUlkID09PSBWQUxJRF9TWVNURU1fSUQpKTtcbn1cbmV4cG9ydHMuaXNDb25mb3JtaW5nID0gaXNDb25mb3JtaW5nO1xuZnVuY3Rpb24gZ2V0RG9jdW1lbnRNb2RlKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLm5hbWUgIT09IFZBTElEX0RPQ1RZUEVfTkFNRSkge1xuICAgICAgICByZXR1cm4gaHRtbF9qc18xLkRPQ1VNRU5UX01PREUuUVVJUktTO1xuICAgIH1cbiAgICBjb25zdCB7IHN5c3RlbUlkIH0gPSB0b2tlbjtcbiAgICBpZiAoc3lzdGVtSWQgJiYgc3lzdGVtSWQudG9Mb3dlckNhc2UoKSA9PT0gUVVJUktTX01PREVfU1lTVEVNX0lEKSB7XG4gICAgICAgIHJldHVybiBodG1sX2pzXzEuRE9DVU1FTlRfTU9ERS5RVUlSS1M7XG4gICAgfVxuICAgIGxldCB7IHB1YmxpY0lkIH0gPSB0b2tlbjtcbiAgICBpZiAocHVibGljSWQgIT09IG51bGwpIHtcbiAgICAgICAgcHVibGljSWQgPSBwdWJsaWNJZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoUVVJUktTX01PREVfUFVCTElDX0lEUy5oYXMocHVibGljSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gaHRtbF9qc18xLkRPQ1VNRU5UX01PREUuUVVJUktTO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcmVmaXhlcyA9IHN5c3RlbUlkID09PSBudWxsID8gUVVJUktTX01PREVfTk9fU1lTVEVNX0lEX1BVQkxJQ19JRF9QUkVGSVhFUyA6IFFVSVJLU19NT0RFX1BVQkxJQ19JRF9QUkVGSVhFUztcbiAgICAgICAgaWYgKGhhc1ByZWZpeChwdWJsaWNJZCwgcHJlZml4ZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gaHRtbF9qc18xLkRPQ1VNRU5UX01PREUuUVVJUktTO1xuICAgICAgICB9XG4gICAgICAgIHByZWZpeGVzID1cbiAgICAgICAgICAgIHN5c3RlbUlkID09PSBudWxsID8gTElNSVRFRF9RVUlSS1NfUFVCTElDX0lEX1BSRUZJWEVTIDogTElNSVRFRF9RVUlSS1NfV0lUSF9TWVNURU1fSURfUFVCTElDX0lEX1BSRUZJWEVTO1xuICAgICAgICBpZiAoaGFzUHJlZml4KHB1YmxpY0lkLCBwcmVmaXhlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBodG1sX2pzXzEuRE9DVU1FTlRfTU9ERS5MSU1JVEVEX1FVSVJLUztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaHRtbF9qc18xLkRPQ1VNRU5UX01PREUuTk9fUVVJUktTO1xufVxuZXhwb3J0cy5nZXREb2N1bWVudE1vZGUgPSBnZXREb2N1bWVudE1vZGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kb2N0eXBlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5FUlIgPSB2b2lkIDA7XG52YXIgRVJSO1xuKGZ1bmN0aW9uIChFUlIpIHtcbiAgICBFUlJbXCJjb250cm9sQ2hhcmFjdGVySW5JbnB1dFN0cmVhbVwiXSA9IFwiY29udHJvbC1jaGFyYWN0ZXItaW4taW5wdXQtc3RyZWFtXCI7XG4gICAgRVJSW1wibm9uY2hhcmFjdGVySW5JbnB1dFN0cmVhbVwiXSA9IFwibm9uY2hhcmFjdGVyLWluLWlucHV0LXN0cmVhbVwiO1xuICAgIEVSUltcInN1cnJvZ2F0ZUluSW5wdXRTdHJlYW1cIl0gPSBcInN1cnJvZ2F0ZS1pbi1pbnB1dC1zdHJlYW1cIjtcbiAgICBFUlJbXCJub25Wb2lkSHRtbEVsZW1lbnRTdGFydFRhZ1dpdGhUcmFpbGluZ1NvbGlkdXNcIl0gPSBcIm5vbi12b2lkLWh0bWwtZWxlbWVudC1zdGFydC10YWctd2l0aC10cmFpbGluZy1zb2xpZHVzXCI7XG4gICAgRVJSW1wiZW5kVGFnV2l0aEF0dHJpYnV0ZXNcIl0gPSBcImVuZC10YWctd2l0aC1hdHRyaWJ1dGVzXCI7XG4gICAgRVJSW1wiZW5kVGFnV2l0aFRyYWlsaW5nU29saWR1c1wiXSA9IFwiZW5kLXRhZy13aXRoLXRyYWlsaW5nLXNvbGlkdXNcIjtcbiAgICBFUlJbXCJ1bmV4cGVjdGVkU29saWR1c0luVGFnXCJdID0gXCJ1bmV4cGVjdGVkLXNvbGlkdXMtaW4tdGFnXCI7XG4gICAgRVJSW1widW5leHBlY3RlZE51bGxDaGFyYWN0ZXJcIl0gPSBcInVuZXhwZWN0ZWQtbnVsbC1jaGFyYWN0ZXJcIjtcbiAgICBFUlJbXCJ1bmV4cGVjdGVkUXVlc3Rpb25NYXJrSW5zdGVhZE9mVGFnTmFtZVwiXSA9IFwidW5leHBlY3RlZC1xdWVzdGlvbi1tYXJrLWluc3RlYWQtb2YtdGFnLW5hbWVcIjtcbiAgICBFUlJbXCJpbnZhbGlkRmlyc3RDaGFyYWN0ZXJPZlRhZ05hbWVcIl0gPSBcImludmFsaWQtZmlyc3QtY2hhcmFjdGVyLW9mLXRhZy1uYW1lXCI7XG4gICAgRVJSW1widW5leHBlY3RlZEVxdWFsc1NpZ25CZWZvcmVBdHRyaWJ1dGVOYW1lXCJdID0gXCJ1bmV4cGVjdGVkLWVxdWFscy1zaWduLWJlZm9yZS1hdHRyaWJ1dGUtbmFtZVwiO1xuICAgIEVSUltcIm1pc3NpbmdFbmRUYWdOYW1lXCJdID0gXCJtaXNzaW5nLWVuZC10YWctbmFtZVwiO1xuICAgIEVSUltcInVuZXhwZWN0ZWRDaGFyYWN0ZXJJbkF0dHJpYnV0ZU5hbWVcIl0gPSBcInVuZXhwZWN0ZWQtY2hhcmFjdGVyLWluLWF0dHJpYnV0ZS1uYW1lXCI7XG4gICAgRVJSW1widW5rbm93bk5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlXCJdID0gXCJ1bmtub3duLW5hbWVkLWNoYXJhY3Rlci1yZWZlcmVuY2VcIjtcbiAgICBFUlJbXCJtaXNzaW5nU2VtaWNvbG9uQWZ0ZXJDaGFyYWN0ZXJSZWZlcmVuY2VcIl0gPSBcIm1pc3Npbmctc2VtaWNvbG9uLWFmdGVyLWNoYXJhY3Rlci1yZWZlcmVuY2VcIjtcbiAgICBFUlJbXCJ1bmV4cGVjdGVkQ2hhcmFjdGVyQWZ0ZXJEb2N0eXBlU3lzdGVtSWRlbnRpZmllclwiXSA9IFwidW5leHBlY3RlZC1jaGFyYWN0ZXItYWZ0ZXItZG9jdHlwZS1zeXN0ZW0taWRlbnRpZmllclwiO1xuICAgIEVSUltcInVuZXhwZWN0ZWRDaGFyYWN0ZXJJblVucXVvdGVkQXR0cmlidXRlVmFsdWVcIl0gPSBcInVuZXhwZWN0ZWQtY2hhcmFjdGVyLWluLXVucXVvdGVkLWF0dHJpYnV0ZS12YWx1ZVwiO1xuICAgIEVSUltcImVvZkJlZm9yZVRhZ05hbWVcIl0gPSBcImVvZi1iZWZvcmUtdGFnLW5hbWVcIjtcbiAgICBFUlJbXCJlb2ZJblRhZ1wiXSA9IFwiZW9mLWluLXRhZ1wiO1xuICAgIEVSUltcIm1pc3NpbmdBdHRyaWJ1dGVWYWx1ZVwiXSA9IFwibWlzc2luZy1hdHRyaWJ1dGUtdmFsdWVcIjtcbiAgICBFUlJbXCJtaXNzaW5nV2hpdGVzcGFjZUJldHdlZW5BdHRyaWJ1dGVzXCJdID0gXCJtaXNzaW5nLXdoaXRlc3BhY2UtYmV0d2Vlbi1hdHRyaWJ1dGVzXCI7XG4gICAgRVJSW1wibWlzc2luZ1doaXRlc3BhY2VBZnRlckRvY3R5cGVQdWJsaWNLZXl3b3JkXCJdID0gXCJtaXNzaW5nLXdoaXRlc3BhY2UtYWZ0ZXItZG9jdHlwZS1wdWJsaWMta2V5d29yZFwiO1xuICAgIEVSUltcIm1pc3NpbmdXaGl0ZXNwYWNlQmV0d2VlbkRvY3R5cGVQdWJsaWNBbmRTeXN0ZW1JZGVudGlmaWVyc1wiXSA9IFwibWlzc2luZy13aGl0ZXNwYWNlLWJldHdlZW4tZG9jdHlwZS1wdWJsaWMtYW5kLXN5c3RlbS1pZGVudGlmaWVyc1wiO1xuICAgIEVSUltcIm1pc3NpbmdXaGl0ZXNwYWNlQWZ0ZXJEb2N0eXBlU3lzdGVtS2V5d29yZFwiXSA9IFwibWlzc2luZy13aGl0ZXNwYWNlLWFmdGVyLWRvY3R5cGUtc3lzdGVtLWtleXdvcmRcIjtcbiAgICBFUlJbXCJtaXNzaW5nUXVvdGVCZWZvcmVEb2N0eXBlUHVibGljSWRlbnRpZmllclwiXSA9IFwibWlzc2luZy1xdW90ZS1iZWZvcmUtZG9jdHlwZS1wdWJsaWMtaWRlbnRpZmllclwiO1xuICAgIEVSUltcIm1pc3NpbmdRdW90ZUJlZm9yZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyXCJdID0gXCJtaXNzaW5nLXF1b3RlLWJlZm9yZS1kb2N0eXBlLXN5c3RlbS1pZGVudGlmaWVyXCI7XG4gICAgRVJSW1wibWlzc2luZ0RvY3R5cGVQdWJsaWNJZGVudGlmaWVyXCJdID0gXCJtaXNzaW5nLWRvY3R5cGUtcHVibGljLWlkZW50aWZpZXJcIjtcbiAgICBFUlJbXCJtaXNzaW5nRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJcIl0gPSBcIm1pc3NpbmctZG9jdHlwZS1zeXN0ZW0taWRlbnRpZmllclwiO1xuICAgIEVSUltcImFicnVwdERvY3R5cGVQdWJsaWNJZGVudGlmaWVyXCJdID0gXCJhYnJ1cHQtZG9jdHlwZS1wdWJsaWMtaWRlbnRpZmllclwiO1xuICAgIEVSUltcImFicnVwdERvY3R5cGVTeXN0ZW1JZGVudGlmaWVyXCJdID0gXCJhYnJ1cHQtZG9jdHlwZS1zeXN0ZW0taWRlbnRpZmllclwiO1xuICAgIEVSUltcImNkYXRhSW5IdG1sQ29udGVudFwiXSA9IFwiY2RhdGEtaW4taHRtbC1jb250ZW50XCI7XG4gICAgRVJSW1wiaW5jb3JyZWN0bHlPcGVuZWRDb21tZW50XCJdID0gXCJpbmNvcnJlY3RseS1vcGVuZWQtY29tbWVudFwiO1xuICAgIEVSUltcImVvZkluU2NyaXB0SHRtbENvbW1lbnRMaWtlVGV4dFwiXSA9IFwiZW9mLWluLXNjcmlwdC1odG1sLWNvbW1lbnQtbGlrZS10ZXh0XCI7XG4gICAgRVJSW1wiZW9mSW5Eb2N0eXBlXCJdID0gXCJlb2YtaW4tZG9jdHlwZVwiO1xuICAgIEVSUltcIm5lc3RlZENvbW1lbnRcIl0gPSBcIm5lc3RlZC1jb21tZW50XCI7XG4gICAgRVJSW1wiYWJydXB0Q2xvc2luZ09mRW1wdHlDb21tZW50XCJdID0gXCJhYnJ1cHQtY2xvc2luZy1vZi1lbXB0eS1jb21tZW50XCI7XG4gICAgRVJSW1wiZW9mSW5Db21tZW50XCJdID0gXCJlb2YtaW4tY29tbWVudFwiO1xuICAgIEVSUltcImluY29ycmVjdGx5Q2xvc2VkQ29tbWVudFwiXSA9IFwiaW5jb3JyZWN0bHktY2xvc2VkLWNvbW1lbnRcIjtcbiAgICBFUlJbXCJlb2ZJbkNkYXRhXCJdID0gXCJlb2YtaW4tY2RhdGFcIjtcbiAgICBFUlJbXCJhYnNlbmNlT2ZEaWdpdHNJbk51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2VcIl0gPSBcImFic2VuY2Utb2YtZGlnaXRzLWluLW51bWVyaWMtY2hhcmFjdGVyLXJlZmVyZW5jZVwiO1xuICAgIEVSUltcIm51bGxDaGFyYWN0ZXJSZWZlcmVuY2VcIl0gPSBcIm51bGwtY2hhcmFjdGVyLXJlZmVyZW5jZVwiO1xuICAgIEVSUltcInN1cnJvZ2F0ZUNoYXJhY3RlclJlZmVyZW5jZVwiXSA9IFwic3Vycm9nYXRlLWNoYXJhY3Rlci1yZWZlcmVuY2VcIjtcbiAgICBFUlJbXCJjaGFyYWN0ZXJSZWZlcmVuY2VPdXRzaWRlVW5pY29kZVJhbmdlXCJdID0gXCJjaGFyYWN0ZXItcmVmZXJlbmNlLW91dHNpZGUtdW5pY29kZS1yYW5nZVwiO1xuICAgIEVSUltcImNvbnRyb2xDaGFyYWN0ZXJSZWZlcmVuY2VcIl0gPSBcImNvbnRyb2wtY2hhcmFjdGVyLXJlZmVyZW5jZVwiO1xuICAgIEVSUltcIm5vbmNoYXJhY3RlckNoYXJhY3RlclJlZmVyZW5jZVwiXSA9IFwibm9uY2hhcmFjdGVyLWNoYXJhY3Rlci1yZWZlcmVuY2VcIjtcbiAgICBFUlJbXCJtaXNzaW5nV2hpdGVzcGFjZUJlZm9yZURvY3R5cGVOYW1lXCJdID0gXCJtaXNzaW5nLXdoaXRlc3BhY2UtYmVmb3JlLWRvY3R5cGUtbmFtZVwiO1xuICAgIEVSUltcIm1pc3NpbmdEb2N0eXBlTmFtZVwiXSA9IFwibWlzc2luZy1kb2N0eXBlLW5hbWVcIjtcbiAgICBFUlJbXCJpbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2VBZnRlckRvY3R5cGVOYW1lXCJdID0gXCJpbnZhbGlkLWNoYXJhY3Rlci1zZXF1ZW5jZS1hZnRlci1kb2N0eXBlLW5hbWVcIjtcbiAgICBFUlJbXCJkdXBsaWNhdGVBdHRyaWJ1dGVcIl0gPSBcImR1cGxpY2F0ZS1hdHRyaWJ1dGVcIjtcbiAgICBFUlJbXCJub25Db25mb3JtaW5nRG9jdHlwZVwiXSA9IFwibm9uLWNvbmZvcm1pbmctZG9jdHlwZVwiO1xuICAgIEVSUltcIm1pc3NpbmdEb2N0eXBlXCJdID0gXCJtaXNzaW5nLWRvY3R5cGVcIjtcbiAgICBFUlJbXCJtaXNwbGFjZWREb2N0eXBlXCJdID0gXCJtaXNwbGFjZWQtZG9jdHlwZVwiO1xuICAgIEVSUltcImVuZFRhZ1dpdGhvdXRNYXRjaGluZ09wZW5FbGVtZW50XCJdID0gXCJlbmQtdGFnLXdpdGhvdXQtbWF0Y2hpbmctb3Blbi1lbGVtZW50XCI7XG4gICAgRVJSW1wiY2xvc2luZ09mRWxlbWVudFdpdGhPcGVuQ2hpbGRFbGVtZW50c1wiXSA9IFwiY2xvc2luZy1vZi1lbGVtZW50LXdpdGgtb3Blbi1jaGlsZC1lbGVtZW50c1wiO1xuICAgIEVSUltcImRpc2FsbG93ZWRDb250ZW50SW5Ob3NjcmlwdEluSGVhZFwiXSA9IFwiZGlzYWxsb3dlZC1jb250ZW50LWluLW5vc2NyaXB0LWluLWhlYWRcIjtcbiAgICBFUlJbXCJvcGVuRWxlbWVudHNMZWZ0QWZ0ZXJFb2ZcIl0gPSBcIm9wZW4tZWxlbWVudHMtbGVmdC1hZnRlci1lb2ZcIjtcbiAgICBFUlJbXCJhYmFuZG9uZWRIZWFkRWxlbWVudENoaWxkXCJdID0gXCJhYmFuZG9uZWQtaGVhZC1lbGVtZW50LWNoaWxkXCI7XG4gICAgRVJSW1wibWlzcGxhY2VkU3RhcnRUYWdGb3JIZWFkRWxlbWVudFwiXSA9IFwibWlzcGxhY2VkLXN0YXJ0LXRhZy1mb3ItaGVhZC1lbGVtZW50XCI7XG4gICAgRVJSW1wibmVzdGVkTm9zY3JpcHRJbkhlYWRcIl0gPSBcIm5lc3RlZC1ub3NjcmlwdC1pbi1oZWFkXCI7XG4gICAgRVJSW1wiZW9mSW5FbGVtZW50VGhhdENhbkNvbnRhaW5Pbmx5VGV4dFwiXSA9IFwiZW9mLWluLWVsZW1lbnQtdGhhdC1jYW4tY29udGFpbi1vbmx5LXRleHRcIjtcbn0pKEVSUiA9IGV4cG9ydHMuRVJSIHx8IChleHBvcnRzLkVSUiA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvci1jb2Rlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNJbnRlZ3JhdGlvblBvaW50ID0gZXhwb3J0cy5hZGp1c3RUb2tlblNWR1RhZ05hbWUgPSBleHBvcnRzLmFkanVzdFRva2VuWE1MQXR0cnMgPSBleHBvcnRzLmFkanVzdFRva2VuU1ZHQXR0cnMgPSBleHBvcnRzLmFkanVzdFRva2VuTWF0aE1MQXR0cnMgPSBleHBvcnRzLmNhdXNlc0V4aXQgPSBleHBvcnRzLlNWR19UQUdfTkFNRVNfQURKVVNUTUVOVF9NQVAgPSB2b2lkIDA7XG5jb25zdCBodG1sX2pzXzEgPSByZXF1aXJlKFwiLi9odG1sLmpzXCIpO1xuLy9NSU1FIHR5cGVzXG5jb25zdCBNSU1FX1RZUEVTID0ge1xuICAgIFRFWFRfSFRNTDogJ3RleHQvaHRtbCcsXG4gICAgQVBQTElDQVRJT05fWE1MOiAnYXBwbGljYXRpb24veGh0bWwreG1sJyxcbn07XG4vL0F0dHJpYnV0ZXNcbmNvbnN0IERFRklOSVRJT05fVVJMX0FUVFIgPSAnZGVmaW5pdGlvbnVybCc7XG5jb25zdCBBREpVU1RFRF9ERUZJTklUSU9OX1VSTF9BVFRSID0gJ2RlZmluaXRpb25VUkwnO1xuY29uc3QgU1ZHX0FUVFJTX0FESlVTVE1FTlRfTUFQID0gbmV3IE1hcChbXG4gICAgJ2F0dHJpYnV0ZU5hbWUnLFxuICAgICdhdHRyaWJ1dGVUeXBlJyxcbiAgICAnYmFzZUZyZXF1ZW5jeScsXG4gICAgJ2Jhc2VQcm9maWxlJyxcbiAgICAnY2FsY01vZGUnLFxuICAgICdjbGlwUGF0aFVuaXRzJyxcbiAgICAnZGlmZnVzZUNvbnN0YW50JyxcbiAgICAnZWRnZU1vZGUnLFxuICAgICdmaWx0ZXJVbml0cycsXG4gICAgJ2dseXBoUmVmJyxcbiAgICAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxuICAgICdncmFkaWVudFVuaXRzJyxcbiAgICAna2VybmVsTWF0cml4JyxcbiAgICAna2VybmVsVW5pdExlbmd0aCcsXG4gICAgJ2tleVBvaW50cycsXG4gICAgJ2tleVNwbGluZXMnLFxuICAgICdrZXlUaW1lcycsXG4gICAgJ2xlbmd0aEFkanVzdCcsXG4gICAgJ2xpbWl0aW5nQ29uZUFuZ2xlJyxcbiAgICAnbWFya2VySGVpZ2h0JyxcbiAgICAnbWFya2VyVW5pdHMnLFxuICAgICdtYXJrZXJXaWR0aCcsXG4gICAgJ21hc2tDb250ZW50VW5pdHMnLFxuICAgICdtYXNrVW5pdHMnLFxuICAgICdudW1PY3RhdmVzJyxcbiAgICAncGF0aExlbmd0aCcsXG4gICAgJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICAgICdwYXR0ZXJuVHJhbnNmb3JtJyxcbiAgICAncGF0dGVyblVuaXRzJyxcbiAgICAncG9pbnRzQXRYJyxcbiAgICAncG9pbnRzQXRZJyxcbiAgICAncG9pbnRzQXRaJyxcbiAgICAncHJlc2VydmVBbHBoYScsXG4gICAgJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLFxuICAgICdwcmltaXRpdmVVbml0cycsXG4gICAgJ3JlZlgnLFxuICAgICdyZWZZJyxcbiAgICAncmVwZWF0Q291bnQnLFxuICAgICdyZXBlYXREdXInLFxuICAgICdyZXF1aXJlZEV4dGVuc2lvbnMnLFxuICAgICdyZXF1aXJlZEZlYXR1cmVzJyxcbiAgICAnc3BlY3VsYXJDb25zdGFudCcsXG4gICAgJ3NwZWN1bGFyRXhwb25lbnQnLFxuICAgICdzcHJlYWRNZXRob2QnLFxuICAgICdzdGFydE9mZnNldCcsXG4gICAgJ3N0ZERldmlhdGlvbicsXG4gICAgJ3N0aXRjaFRpbGVzJyxcbiAgICAnc3VyZmFjZVNjYWxlJyxcbiAgICAnc3lzdGVtTGFuZ3VhZ2UnLFxuICAgICd0YWJsZVZhbHVlcycsXG4gICAgJ3RhcmdldFgnLFxuICAgICd0YXJnZXRZJyxcbiAgICAndGV4dExlbmd0aCcsXG4gICAgJ3ZpZXdCb3gnLFxuICAgICd2aWV3VGFyZ2V0JyxcbiAgICAneENoYW5uZWxTZWxlY3RvcicsXG4gICAgJ3lDaGFubmVsU2VsZWN0b3InLFxuICAgICd6b29tQW5kUGFuJyxcbl0ubWFwKChhdHRyKSA9PiBbYXR0ci50b0xvd2VyQ2FzZSgpLCBhdHRyXSkpO1xuY29uc3QgWE1MX0FUVFJTX0FESlVTVE1FTlRfTUFQID0gbmV3IE1hcChbXG4gICAgWyd4bGluazphY3R1YXRlJywgeyBwcmVmaXg6ICd4bGluaycsIG5hbWU6ICdhY3R1YXRlJywgbmFtZXNwYWNlOiBodG1sX2pzXzEuTlMuWExJTksgfV0sXG4gICAgWyd4bGluazphcmNyb2xlJywgeyBwcmVmaXg6ICd4bGluaycsIG5hbWU6ICdhcmNyb2xlJywgbmFtZXNwYWNlOiBodG1sX2pzXzEuTlMuWExJTksgfV0sXG4gICAgWyd4bGluazpocmVmJywgeyBwcmVmaXg6ICd4bGluaycsIG5hbWU6ICdocmVmJywgbmFtZXNwYWNlOiBodG1sX2pzXzEuTlMuWExJTksgfV0sXG4gICAgWyd4bGluazpyb2xlJywgeyBwcmVmaXg6ICd4bGluaycsIG5hbWU6ICdyb2xlJywgbmFtZXNwYWNlOiBodG1sX2pzXzEuTlMuWExJTksgfV0sXG4gICAgWyd4bGluazpzaG93JywgeyBwcmVmaXg6ICd4bGluaycsIG5hbWU6ICdzaG93JywgbmFtZXNwYWNlOiBodG1sX2pzXzEuTlMuWExJTksgfV0sXG4gICAgWyd4bGluazp0aXRsZScsIHsgcHJlZml4OiAneGxpbmsnLCBuYW1lOiAndGl0bGUnLCBuYW1lc3BhY2U6IGh0bWxfanNfMS5OUy5YTElOSyB9XSxcbiAgICBbJ3hsaW5rOnR5cGUnLCB7IHByZWZpeDogJ3hsaW5rJywgbmFtZTogJ3R5cGUnLCBuYW1lc3BhY2U6IGh0bWxfanNfMS5OUy5YTElOSyB9XSxcbiAgICBbJ3htbDpiYXNlJywgeyBwcmVmaXg6ICd4bWwnLCBuYW1lOiAnYmFzZScsIG5hbWVzcGFjZTogaHRtbF9qc18xLk5TLlhNTCB9XSxcbiAgICBbJ3htbDpsYW5nJywgeyBwcmVmaXg6ICd4bWwnLCBuYW1lOiAnbGFuZycsIG5hbWVzcGFjZTogaHRtbF9qc18xLk5TLlhNTCB9XSxcbiAgICBbJ3htbDpzcGFjZScsIHsgcHJlZml4OiAneG1sJywgbmFtZTogJ3NwYWNlJywgbmFtZXNwYWNlOiBodG1sX2pzXzEuTlMuWE1MIH1dLFxuICAgIFsneG1sbnMnLCB7IHByZWZpeDogJycsIG5hbWU6ICd4bWxucycsIG5hbWVzcGFjZTogaHRtbF9qc18xLk5TLlhNTE5TIH1dLFxuICAgIFsneG1sbnM6eGxpbmsnLCB7IHByZWZpeDogJ3htbG5zJywgbmFtZTogJ3hsaW5rJywgbmFtZXNwYWNlOiBodG1sX2pzXzEuTlMuWE1MTlMgfV0sXG5dKTtcbi8vU1ZHIHRhZyBuYW1lcyBhZGp1c3RtZW50IG1hcFxuZXhwb3J0cy5TVkdfVEFHX05BTUVTX0FESlVTVE1FTlRfTUFQID0gbmV3IE1hcChbXG4gICAgJ2FsdEdseXBoJyxcbiAgICAnYWx0R2x5cGhEZWYnLFxuICAgICdhbHRHbHlwaEl0ZW0nLFxuICAgICdhbmltYXRlQ29sb3InLFxuICAgICdhbmltYXRlTW90aW9uJyxcbiAgICAnYW5pbWF0ZVRyYW5zZm9ybScsXG4gICAgJ2NsaXBQYXRoJyxcbiAgICAnZmVCbGVuZCcsXG4gICAgJ2ZlQ29sb3JNYXRyaXgnLFxuICAgICdmZUNvbXBvbmVudFRyYW5zZmVyJyxcbiAgICAnZmVDb21wb3NpdGUnLFxuICAgICdmZUNvbnZvbHZlTWF0cml4JyxcbiAgICAnZmVEaWZmdXNlTGlnaHRpbmcnLFxuICAgICdmZURpc3BsYWNlbWVudE1hcCcsXG4gICAgJ2ZlRGlzdGFudExpZ2h0JyxcbiAgICAnZmVGbG9vZCcsXG4gICAgJ2ZlRnVuY0EnLFxuICAgICdmZUZ1bmNCJyxcbiAgICAnZmVGdW5jRycsXG4gICAgJ2ZlRnVuY1InLFxuICAgICdmZUdhdXNzaWFuQmx1cicsXG4gICAgJ2ZlSW1hZ2UnLFxuICAgICdmZU1lcmdlJyxcbiAgICAnZmVNZXJnZU5vZGUnLFxuICAgICdmZU1vcnBob2xvZ3knLFxuICAgICdmZU9mZnNldCcsXG4gICAgJ2ZlUG9pbnRMaWdodCcsXG4gICAgJ2ZlU3BlY3VsYXJMaWdodGluZycsXG4gICAgJ2ZlU3BvdExpZ2h0JyxcbiAgICAnZmVUaWxlJyxcbiAgICAnZmVUdXJidWxlbmNlJyxcbiAgICAnZm9yZWlnbk9iamVjdCcsXG4gICAgJ2dseXBoUmVmJyxcbiAgICAnbGluZWFyR3JhZGllbnQnLFxuICAgICdyYWRpYWxHcmFkaWVudCcsXG4gICAgJ3RleHRQYXRoJyxcbl0ubWFwKCh0bikgPT4gW3RuLnRvTG93ZXJDYXNlKCksIHRuXSkpO1xuLy9UYWdzIHRoYXQgY2F1c2VzIGV4aXQgZnJvbSBmb3JlaWduIGNvbnRlbnRcbmNvbnN0IEVYSVRTX0ZPUkVJR05fQ09OVEVOVCA9IG5ldyBTZXQoW1xuICAgIGh0bWxfanNfMS5UQUdfSUQuQixcbiAgICBodG1sX2pzXzEuVEFHX0lELkJJRyxcbiAgICBodG1sX2pzXzEuVEFHX0lELkJMT0NLUVVPVEUsXG4gICAgaHRtbF9qc18xLlRBR19JRC5CT0RZLFxuICAgIGh0bWxfanNfMS5UQUdfSUQuQlIsXG4gICAgaHRtbF9qc18xLlRBR19JRC5DRU5URVIsXG4gICAgaHRtbF9qc18xLlRBR19JRC5DT0RFLFxuICAgIGh0bWxfanNfMS5UQUdfSUQuREQsXG4gICAgaHRtbF9qc18xLlRBR19JRC5ESVYsXG4gICAgaHRtbF9qc18xLlRBR19JRC5ETCxcbiAgICBodG1sX2pzXzEuVEFHX0lELkRULFxuICAgIGh0bWxfanNfMS5UQUdfSUQuRU0sXG4gICAgaHRtbF9qc18xLlRBR19JRC5FTUJFRCxcbiAgICBodG1sX2pzXzEuVEFHX0lELkgxLFxuICAgIGh0bWxfanNfMS5UQUdfSUQuSDIsXG4gICAgaHRtbF9qc18xLlRBR19JRC5IMyxcbiAgICBodG1sX2pzXzEuVEFHX0lELkg0LFxuICAgIGh0bWxfanNfMS5UQUdfSUQuSDUsXG4gICAgaHRtbF9qc18xLlRBR19JRC5INixcbiAgICBodG1sX2pzXzEuVEFHX0lELkhFQUQsXG4gICAgaHRtbF9qc18xLlRBR19JRC5IUixcbiAgICBodG1sX2pzXzEuVEFHX0lELkksXG4gICAgaHRtbF9qc18xLlRBR19JRC5JTUcsXG4gICAgaHRtbF9qc18xLlRBR19JRC5MSSxcbiAgICBodG1sX2pzXzEuVEFHX0lELkxJU1RJTkcsXG4gICAgaHRtbF9qc18xLlRBR19JRC5NRU5VLFxuICAgIGh0bWxfanNfMS5UQUdfSUQuTUVUQSxcbiAgICBodG1sX2pzXzEuVEFHX0lELk5PQlIsXG4gICAgaHRtbF9qc18xLlRBR19JRC5PTCxcbiAgICBodG1sX2pzXzEuVEFHX0lELlAsXG4gICAgaHRtbF9qc18xLlRBR19JRC5QUkUsXG4gICAgaHRtbF9qc18xLlRBR19JRC5SVUJZLFxuICAgIGh0bWxfanNfMS5UQUdfSUQuUyxcbiAgICBodG1sX2pzXzEuVEFHX0lELlNNQUxMLFxuICAgIGh0bWxfanNfMS5UQUdfSUQuU1BBTixcbiAgICBodG1sX2pzXzEuVEFHX0lELlNUUk9ORyxcbiAgICBodG1sX2pzXzEuVEFHX0lELlNUUklLRSxcbiAgICBodG1sX2pzXzEuVEFHX0lELlNVQixcbiAgICBodG1sX2pzXzEuVEFHX0lELlNVUCxcbiAgICBodG1sX2pzXzEuVEFHX0lELlRBQkxFLFxuICAgIGh0bWxfanNfMS5UQUdfSUQuVFQsXG4gICAgaHRtbF9qc18xLlRBR19JRC5VLFxuICAgIGh0bWxfanNfMS5UQUdfSUQuVUwsXG4gICAgaHRtbF9qc18xLlRBR19JRC5WQVIsXG5dKTtcbi8vQ2hlY2sgZXhpdCBmcm9tIGZvcmVpZ24gY29udGVudFxuZnVuY3Rpb24gY2F1c2VzRXhpdChzdGFydFRhZ1Rva2VuKSB7XG4gICAgY29uc3QgdG4gPSBzdGFydFRhZ1Rva2VuLnRhZ0lEO1xuICAgIGNvbnN0IGlzRm9udFdpdGhBdHRycyA9IHRuID09PSBodG1sX2pzXzEuVEFHX0lELkZPTlQgJiZcbiAgICAgICAgc3RhcnRUYWdUb2tlbi5hdHRycy5zb21lKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gaHRtbF9qc18xLkFUVFJTLkNPTE9SIHx8IG5hbWUgPT09IGh0bWxfanNfMS5BVFRSUy5TSVpFIHx8IG5hbWUgPT09IGh0bWxfanNfMS5BVFRSUy5GQUNFKTtcbiAgICByZXR1cm4gaXNGb250V2l0aEF0dHJzIHx8IEVYSVRTX0ZPUkVJR05fQ09OVEVOVC5oYXModG4pO1xufVxuZXhwb3J0cy5jYXVzZXNFeGl0ID0gY2F1c2VzRXhpdDtcbi8vVG9rZW4gYWRqdXN0bWVudHNcbmZ1bmN0aW9uIGFkanVzdFRva2VuTWF0aE1MQXR0cnModG9rZW4pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2VuLmF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0b2tlbi5hdHRyc1tpXS5uYW1lID09PSBERUZJTklUSU9OX1VSTF9BVFRSKSB7XG4gICAgICAgICAgICB0b2tlbi5hdHRyc1tpXS5uYW1lID0gQURKVVNURURfREVGSU5JVElPTl9VUkxfQVRUUjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5hZGp1c3RUb2tlbk1hdGhNTEF0dHJzID0gYWRqdXN0VG9rZW5NYXRoTUxBdHRycztcbmZ1bmN0aW9uIGFkanVzdFRva2VuU1ZHQXR0cnModG9rZW4pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2VuLmF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkQXR0ck5hbWUgPSBTVkdfQVRUUlNfQURKVVNUTUVOVF9NQVAuZ2V0KHRva2VuLmF0dHJzW2ldLm5hbWUpO1xuICAgICAgICBpZiAoYWRqdXN0ZWRBdHRyTmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0b2tlbi5hdHRyc1tpXS5uYW1lID0gYWRqdXN0ZWRBdHRyTmFtZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuYWRqdXN0VG9rZW5TVkdBdHRycyA9IGFkanVzdFRva2VuU1ZHQXR0cnM7XG5mdW5jdGlvbiBhZGp1c3RUb2tlblhNTEF0dHJzKHRva2VuKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbi5hdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhZGp1c3RlZEF0dHJFbnRyeSA9IFhNTF9BVFRSU19BREpVU1RNRU5UX01BUC5nZXQodG9rZW4uYXR0cnNbaV0ubmFtZSk7XG4gICAgICAgIGlmIChhZGp1c3RlZEF0dHJFbnRyeSkge1xuICAgICAgICAgICAgdG9rZW4uYXR0cnNbaV0ucHJlZml4ID0gYWRqdXN0ZWRBdHRyRW50cnkucHJlZml4O1xuICAgICAgICAgICAgdG9rZW4uYXR0cnNbaV0ubmFtZSA9IGFkanVzdGVkQXR0ckVudHJ5Lm5hbWU7XG4gICAgICAgICAgICB0b2tlbi5hdHRyc1tpXS5uYW1lc3BhY2UgPSBhZGp1c3RlZEF0dHJFbnRyeS5uYW1lc3BhY2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLmFkanVzdFRva2VuWE1MQXR0cnMgPSBhZGp1c3RUb2tlblhNTEF0dHJzO1xuZnVuY3Rpb24gYWRqdXN0VG9rZW5TVkdUYWdOYW1lKHRva2VuKSB7XG4gICAgY29uc3QgYWRqdXN0ZWRUYWdOYW1lID0gZXhwb3J0cy5TVkdfVEFHX05BTUVTX0FESlVTVE1FTlRfTUFQLmdldCh0b2tlbi50YWdOYW1lKTtcbiAgICBpZiAoYWRqdXN0ZWRUYWdOYW1lICE9IG51bGwpIHtcbiAgICAgICAgdG9rZW4udGFnTmFtZSA9IGFkanVzdGVkVGFnTmFtZTtcbiAgICAgICAgdG9rZW4udGFnSUQgPSAoMCwgaHRtbF9qc18xLmdldFRhZ0lEKSh0b2tlbi50YWdOYW1lKTtcbiAgICB9XG59XG5leHBvcnRzLmFkanVzdFRva2VuU1ZHVGFnTmFtZSA9IGFkanVzdFRva2VuU1ZHVGFnTmFtZTtcbi8vSW50ZWdyYXRpb24gcG9pbnRzXG5mdW5jdGlvbiBpc01hdGhNTFRleHRJbnRlZ3JhdGlvblBvaW50KHRuLCBucykge1xuICAgIHJldHVybiBucyA9PT0gaHRtbF9qc18xLk5TLk1BVEhNTCAmJiAodG4gPT09IGh0bWxfanNfMS5UQUdfSUQuTUkgfHwgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuTU8gfHwgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuTU4gfHwgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuTVMgfHwgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuTVRFWFQpO1xufVxuZnVuY3Rpb24gaXNIdG1sSW50ZWdyYXRpb25Qb2ludCh0biwgbnMsIGF0dHJzKSB7XG4gICAgaWYgKG5zID09PSBodG1sX2pzXzEuTlMuTUFUSE1MICYmIHRuID09PSBodG1sX2pzXzEuVEFHX0lELkFOTk9UQVRJT05fWE1MKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChhdHRyc1tpXS5uYW1lID09PSBodG1sX2pzXzEuQVRUUlMuRU5DT0RJTkcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF0dHJzW2ldLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBNSU1FX1RZUEVTLlRFWFRfSFRNTCB8fCB2YWx1ZSA9PT0gTUlNRV9UWVBFUy5BUFBMSUNBVElPTl9YTUw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5zID09PSBodG1sX2pzXzEuTlMuU1ZHICYmICh0biA9PT0gaHRtbF9qc18xLlRBR19JRC5GT1JFSUdOX09CSkVDVCB8fCB0biA9PT0gaHRtbF9qc18xLlRBR19JRC5ERVNDIHx8IHRuID09PSBodG1sX2pzXzEuVEFHX0lELlRJVExFKTtcbn1cbmZ1bmN0aW9uIGlzSW50ZWdyYXRpb25Qb2ludCh0biwgbnMsIGF0dHJzLCBmb3JlaWduTlMpIHtcbiAgICByZXR1cm4gKCgoIWZvcmVpZ25OUyB8fCBmb3JlaWduTlMgPT09IGh0bWxfanNfMS5OUy5IVE1MKSAmJiBpc0h0bWxJbnRlZ3JhdGlvblBvaW50KHRuLCBucywgYXR0cnMpKSB8fFxuICAgICAgICAoKCFmb3JlaWduTlMgfHwgZm9yZWlnbk5TID09PSBodG1sX2pzXzEuTlMuTUFUSE1MKSAmJiBpc01hdGhNTFRleHRJbnRlZ3JhdGlvblBvaW50KHRuLCBucykpKTtcbn1cbmV4cG9ydHMuaXNJbnRlZ3JhdGlvblBvaW50ID0gaXNJbnRlZ3JhdGlvblBvaW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9yZWlnbi1jb250ZW50LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5oYXNVbmVzY2FwZWRUZXh0ID0gZXhwb3J0cy5pc051bWJlcmVkSGVhZGVyID0gZXhwb3J0cy5TUEVDSUFMX0VMRU1FTlRTID0gZXhwb3J0cy5nZXRUYWdJRCA9IGV4cG9ydHMuVEFHX0lEID0gZXhwb3J0cy5UQUdfTkFNRVMgPSBleHBvcnRzLkRPQ1VNRU5UX01PREUgPSBleHBvcnRzLkFUVFJTID0gZXhwb3J0cy5OUyA9IHZvaWQgMDtcbi8qKiBBbGwgdmFsaWQgbmFtZXNwYWNlcyBpbiBIVE1MLiAqL1xudmFyIE5TO1xuKGZ1bmN0aW9uIChOUykge1xuICAgIE5TW1wiSFRNTFwiXSA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiO1xuICAgIE5TW1wiTUFUSE1MXCJdID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCI7XG4gICAgTlNbXCJTVkdcIl0gPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7XG4gICAgTlNbXCJYTElOS1wiXSA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiO1xuICAgIE5TW1wiWE1MXCJdID0gXCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VcIjtcbiAgICBOU1tcIlhNTE5TXCJdID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zL1wiO1xufSkoTlMgPSBleHBvcnRzLk5TIHx8IChleHBvcnRzLk5TID0ge30pKTtcbnZhciBBVFRSUztcbihmdW5jdGlvbiAoQVRUUlMpIHtcbiAgICBBVFRSU1tcIlRZUEVcIl0gPSBcInR5cGVcIjtcbiAgICBBVFRSU1tcIkFDVElPTlwiXSA9IFwiYWN0aW9uXCI7XG4gICAgQVRUUlNbXCJFTkNPRElOR1wiXSA9IFwiZW5jb2RpbmdcIjtcbiAgICBBVFRSU1tcIlBST01QVFwiXSA9IFwicHJvbXB0XCI7XG4gICAgQVRUUlNbXCJOQU1FXCJdID0gXCJuYW1lXCI7XG4gICAgQVRUUlNbXCJDT0xPUlwiXSA9IFwiY29sb3JcIjtcbiAgICBBVFRSU1tcIkZBQ0VcIl0gPSBcImZhY2VcIjtcbiAgICBBVFRSU1tcIlNJWkVcIl0gPSBcInNpemVcIjtcbn0pKEFUVFJTID0gZXhwb3J0cy5BVFRSUyB8fCAoZXhwb3J0cy5BVFRSUyA9IHt9KSk7XG4vKipcbiAqIFRoZSBtb2RlIG9mIHRoZSBkb2N1bWVudC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZG9jdW1lbnQtbGltaXRlZC1xdWlya3N9XG4gKi9cbnZhciBET0NVTUVOVF9NT0RFO1xuKGZ1bmN0aW9uIChET0NVTUVOVF9NT0RFKSB7XG4gICAgRE9DVU1FTlRfTU9ERVtcIk5PX1FVSVJLU1wiXSA9IFwibm8tcXVpcmtzXCI7XG4gICAgRE9DVU1FTlRfTU9ERVtcIlFVSVJLU1wiXSA9IFwicXVpcmtzXCI7XG4gICAgRE9DVU1FTlRfTU9ERVtcIkxJTUlURURfUVVJUktTXCJdID0gXCJsaW1pdGVkLXF1aXJrc1wiO1xufSkoRE9DVU1FTlRfTU9ERSA9IGV4cG9ydHMuRE9DVU1FTlRfTU9ERSB8fCAoZXhwb3J0cy5ET0NVTUVOVF9NT0RFID0ge30pKTtcbnZhciBUQUdfTkFNRVM7XG4oZnVuY3Rpb24gKFRBR19OQU1FUykge1xuICAgIFRBR19OQU1FU1tcIkFcIl0gPSBcImFcIjtcbiAgICBUQUdfTkFNRVNbXCJBRERSRVNTXCJdID0gXCJhZGRyZXNzXCI7XG4gICAgVEFHX05BTUVTW1wiQU5OT1RBVElPTl9YTUxcIl0gPSBcImFubm90YXRpb24teG1sXCI7XG4gICAgVEFHX05BTUVTW1wiQVBQTEVUXCJdID0gXCJhcHBsZXRcIjtcbiAgICBUQUdfTkFNRVNbXCJBUkVBXCJdID0gXCJhcmVhXCI7XG4gICAgVEFHX05BTUVTW1wiQVJUSUNMRVwiXSA9IFwiYXJ0aWNsZVwiO1xuICAgIFRBR19OQU1FU1tcIkFTSURFXCJdID0gXCJhc2lkZVwiO1xuICAgIFRBR19OQU1FU1tcIkJcIl0gPSBcImJcIjtcbiAgICBUQUdfTkFNRVNbXCJCQVNFXCJdID0gXCJiYXNlXCI7XG4gICAgVEFHX05BTUVTW1wiQkFTRUZPTlRcIl0gPSBcImJhc2Vmb250XCI7XG4gICAgVEFHX05BTUVTW1wiQkdTT1VORFwiXSA9IFwiYmdzb3VuZFwiO1xuICAgIFRBR19OQU1FU1tcIkJJR1wiXSA9IFwiYmlnXCI7XG4gICAgVEFHX05BTUVTW1wiQkxPQ0tRVU9URVwiXSA9IFwiYmxvY2txdW90ZVwiO1xuICAgIFRBR19OQU1FU1tcIkJPRFlcIl0gPSBcImJvZHlcIjtcbiAgICBUQUdfTkFNRVNbXCJCUlwiXSA9IFwiYnJcIjtcbiAgICBUQUdfTkFNRVNbXCJCVVRUT05cIl0gPSBcImJ1dHRvblwiO1xuICAgIFRBR19OQU1FU1tcIkNBUFRJT05cIl0gPSBcImNhcHRpb25cIjtcbiAgICBUQUdfTkFNRVNbXCJDRU5URVJcIl0gPSBcImNlbnRlclwiO1xuICAgIFRBR19OQU1FU1tcIkNPREVcIl0gPSBcImNvZGVcIjtcbiAgICBUQUdfTkFNRVNbXCJDT0xcIl0gPSBcImNvbFwiO1xuICAgIFRBR19OQU1FU1tcIkNPTEdST1VQXCJdID0gXCJjb2xncm91cFwiO1xuICAgIFRBR19OQU1FU1tcIkREXCJdID0gXCJkZFwiO1xuICAgIFRBR19OQU1FU1tcIkRFU0NcIl0gPSBcImRlc2NcIjtcbiAgICBUQUdfTkFNRVNbXCJERVRBSUxTXCJdID0gXCJkZXRhaWxzXCI7XG4gICAgVEFHX05BTUVTW1wiRElBTE9HXCJdID0gXCJkaWFsb2dcIjtcbiAgICBUQUdfTkFNRVNbXCJESVJcIl0gPSBcImRpclwiO1xuICAgIFRBR19OQU1FU1tcIkRJVlwiXSA9IFwiZGl2XCI7XG4gICAgVEFHX05BTUVTW1wiRExcIl0gPSBcImRsXCI7XG4gICAgVEFHX05BTUVTW1wiRFRcIl0gPSBcImR0XCI7XG4gICAgVEFHX05BTUVTW1wiRU1cIl0gPSBcImVtXCI7XG4gICAgVEFHX05BTUVTW1wiRU1CRURcIl0gPSBcImVtYmVkXCI7XG4gICAgVEFHX05BTUVTW1wiRklFTERTRVRcIl0gPSBcImZpZWxkc2V0XCI7XG4gICAgVEFHX05BTUVTW1wiRklHQ0FQVElPTlwiXSA9IFwiZmlnY2FwdGlvblwiO1xuICAgIFRBR19OQU1FU1tcIkZJR1VSRVwiXSA9IFwiZmlndXJlXCI7XG4gICAgVEFHX05BTUVTW1wiRk9OVFwiXSA9IFwiZm9udFwiO1xuICAgIFRBR19OQU1FU1tcIkZPT1RFUlwiXSA9IFwiZm9vdGVyXCI7XG4gICAgVEFHX05BTUVTW1wiRk9SRUlHTl9PQkpFQ1RcIl0gPSBcImZvcmVpZ25PYmplY3RcIjtcbiAgICBUQUdfTkFNRVNbXCJGT1JNXCJdID0gXCJmb3JtXCI7XG4gICAgVEFHX05BTUVTW1wiRlJBTUVcIl0gPSBcImZyYW1lXCI7XG4gICAgVEFHX05BTUVTW1wiRlJBTUVTRVRcIl0gPSBcImZyYW1lc2V0XCI7XG4gICAgVEFHX05BTUVTW1wiSDFcIl0gPSBcImgxXCI7XG4gICAgVEFHX05BTUVTW1wiSDJcIl0gPSBcImgyXCI7XG4gICAgVEFHX05BTUVTW1wiSDNcIl0gPSBcImgzXCI7XG4gICAgVEFHX05BTUVTW1wiSDRcIl0gPSBcImg0XCI7XG4gICAgVEFHX05BTUVTW1wiSDVcIl0gPSBcImg1XCI7XG4gICAgVEFHX05BTUVTW1wiSDZcIl0gPSBcImg2XCI7XG4gICAgVEFHX05BTUVTW1wiSEVBRFwiXSA9IFwiaGVhZFwiO1xuICAgIFRBR19OQU1FU1tcIkhFQURFUlwiXSA9IFwiaGVhZGVyXCI7XG4gICAgVEFHX05BTUVTW1wiSEdST1VQXCJdID0gXCJoZ3JvdXBcIjtcbiAgICBUQUdfTkFNRVNbXCJIUlwiXSA9IFwiaHJcIjtcbiAgICBUQUdfTkFNRVNbXCJIVE1MXCJdID0gXCJodG1sXCI7XG4gICAgVEFHX05BTUVTW1wiSVwiXSA9IFwiaVwiO1xuICAgIFRBR19OQU1FU1tcIklNR1wiXSA9IFwiaW1nXCI7XG4gICAgVEFHX05BTUVTW1wiSU1BR0VcIl0gPSBcImltYWdlXCI7XG4gICAgVEFHX05BTUVTW1wiSU5QVVRcIl0gPSBcImlucHV0XCI7XG4gICAgVEFHX05BTUVTW1wiSUZSQU1FXCJdID0gXCJpZnJhbWVcIjtcbiAgICBUQUdfTkFNRVNbXCJLRVlHRU5cIl0gPSBcImtleWdlblwiO1xuICAgIFRBR19OQU1FU1tcIkxBQkVMXCJdID0gXCJsYWJlbFwiO1xuICAgIFRBR19OQU1FU1tcIkxJXCJdID0gXCJsaVwiO1xuICAgIFRBR19OQU1FU1tcIkxJTktcIl0gPSBcImxpbmtcIjtcbiAgICBUQUdfTkFNRVNbXCJMSVNUSU5HXCJdID0gXCJsaXN0aW5nXCI7XG4gICAgVEFHX05BTUVTW1wiTUFJTlwiXSA9IFwibWFpblwiO1xuICAgIFRBR19OQU1FU1tcIk1BTElHTk1BUktcIl0gPSBcIm1hbGlnbm1hcmtcIjtcbiAgICBUQUdfTkFNRVNbXCJNQVJRVUVFXCJdID0gXCJtYXJxdWVlXCI7XG4gICAgVEFHX05BTUVTW1wiTUFUSFwiXSA9IFwibWF0aFwiO1xuICAgIFRBR19OQU1FU1tcIk1FTlVcIl0gPSBcIm1lbnVcIjtcbiAgICBUQUdfTkFNRVNbXCJNRVRBXCJdID0gXCJtZXRhXCI7XG4gICAgVEFHX05BTUVTW1wiTUdMWVBIXCJdID0gXCJtZ2x5cGhcIjtcbiAgICBUQUdfTkFNRVNbXCJNSVwiXSA9IFwibWlcIjtcbiAgICBUQUdfTkFNRVNbXCJNT1wiXSA9IFwibW9cIjtcbiAgICBUQUdfTkFNRVNbXCJNTlwiXSA9IFwibW5cIjtcbiAgICBUQUdfTkFNRVNbXCJNU1wiXSA9IFwibXNcIjtcbiAgICBUQUdfTkFNRVNbXCJNVEVYVFwiXSA9IFwibXRleHRcIjtcbiAgICBUQUdfTkFNRVNbXCJOQVZcIl0gPSBcIm5hdlwiO1xuICAgIFRBR19OQU1FU1tcIk5PQlJcIl0gPSBcIm5vYnJcIjtcbiAgICBUQUdfTkFNRVNbXCJOT0ZSQU1FU1wiXSA9IFwibm9mcmFtZXNcIjtcbiAgICBUQUdfTkFNRVNbXCJOT0VNQkVEXCJdID0gXCJub2VtYmVkXCI7XG4gICAgVEFHX05BTUVTW1wiTk9TQ1JJUFRcIl0gPSBcIm5vc2NyaXB0XCI7XG4gICAgVEFHX05BTUVTW1wiT0JKRUNUXCJdID0gXCJvYmplY3RcIjtcbiAgICBUQUdfTkFNRVNbXCJPTFwiXSA9IFwib2xcIjtcbiAgICBUQUdfTkFNRVNbXCJPUFRHUk9VUFwiXSA9IFwib3B0Z3JvdXBcIjtcbiAgICBUQUdfTkFNRVNbXCJPUFRJT05cIl0gPSBcIm9wdGlvblwiO1xuICAgIFRBR19OQU1FU1tcIlBcIl0gPSBcInBcIjtcbiAgICBUQUdfTkFNRVNbXCJQQVJBTVwiXSA9IFwicGFyYW1cIjtcbiAgICBUQUdfTkFNRVNbXCJQTEFJTlRFWFRcIl0gPSBcInBsYWludGV4dFwiO1xuICAgIFRBR19OQU1FU1tcIlBSRVwiXSA9IFwicHJlXCI7XG4gICAgVEFHX05BTUVTW1wiUkJcIl0gPSBcInJiXCI7XG4gICAgVEFHX05BTUVTW1wiUlBcIl0gPSBcInJwXCI7XG4gICAgVEFHX05BTUVTW1wiUlRcIl0gPSBcInJ0XCI7XG4gICAgVEFHX05BTUVTW1wiUlRDXCJdID0gXCJydGNcIjtcbiAgICBUQUdfTkFNRVNbXCJSVUJZXCJdID0gXCJydWJ5XCI7XG4gICAgVEFHX05BTUVTW1wiU1wiXSA9IFwic1wiO1xuICAgIFRBR19OQU1FU1tcIlNDUklQVFwiXSA9IFwic2NyaXB0XCI7XG4gICAgVEFHX05BTUVTW1wiU0VDVElPTlwiXSA9IFwic2VjdGlvblwiO1xuICAgIFRBR19OQU1FU1tcIlNFTEVDVFwiXSA9IFwic2VsZWN0XCI7XG4gICAgVEFHX05BTUVTW1wiU09VUkNFXCJdID0gXCJzb3VyY2VcIjtcbiAgICBUQUdfTkFNRVNbXCJTTUFMTFwiXSA9IFwic21hbGxcIjtcbiAgICBUQUdfTkFNRVNbXCJTUEFOXCJdID0gXCJzcGFuXCI7XG4gICAgVEFHX05BTUVTW1wiU1RSSUtFXCJdID0gXCJzdHJpa2VcIjtcbiAgICBUQUdfTkFNRVNbXCJTVFJPTkdcIl0gPSBcInN0cm9uZ1wiO1xuICAgIFRBR19OQU1FU1tcIlNUWUxFXCJdID0gXCJzdHlsZVwiO1xuICAgIFRBR19OQU1FU1tcIlNVQlwiXSA9IFwic3ViXCI7XG4gICAgVEFHX05BTUVTW1wiU1VNTUFSWVwiXSA9IFwic3VtbWFyeVwiO1xuICAgIFRBR19OQU1FU1tcIlNVUFwiXSA9IFwic3VwXCI7XG4gICAgVEFHX05BTUVTW1wiVEFCTEVcIl0gPSBcInRhYmxlXCI7XG4gICAgVEFHX05BTUVTW1wiVEJPRFlcIl0gPSBcInRib2R5XCI7XG4gICAgVEFHX05BTUVTW1wiVEVNUExBVEVcIl0gPSBcInRlbXBsYXRlXCI7XG4gICAgVEFHX05BTUVTW1wiVEVYVEFSRUFcIl0gPSBcInRleHRhcmVhXCI7XG4gICAgVEFHX05BTUVTW1wiVEZPT1RcIl0gPSBcInRmb290XCI7XG4gICAgVEFHX05BTUVTW1wiVERcIl0gPSBcInRkXCI7XG4gICAgVEFHX05BTUVTW1wiVEhcIl0gPSBcInRoXCI7XG4gICAgVEFHX05BTUVTW1wiVEhFQURcIl0gPSBcInRoZWFkXCI7XG4gICAgVEFHX05BTUVTW1wiVElUTEVcIl0gPSBcInRpdGxlXCI7XG4gICAgVEFHX05BTUVTW1wiVFJcIl0gPSBcInRyXCI7XG4gICAgVEFHX05BTUVTW1wiVFJBQ0tcIl0gPSBcInRyYWNrXCI7XG4gICAgVEFHX05BTUVTW1wiVFRcIl0gPSBcInR0XCI7XG4gICAgVEFHX05BTUVTW1wiVVwiXSA9IFwidVwiO1xuICAgIFRBR19OQU1FU1tcIlVMXCJdID0gXCJ1bFwiO1xuICAgIFRBR19OQU1FU1tcIlNWR1wiXSA9IFwic3ZnXCI7XG4gICAgVEFHX05BTUVTW1wiVkFSXCJdID0gXCJ2YXJcIjtcbiAgICBUQUdfTkFNRVNbXCJXQlJcIl0gPSBcIndiclwiO1xuICAgIFRBR19OQU1FU1tcIlhNUFwiXSA9IFwieG1wXCI7XG59KShUQUdfTkFNRVMgPSBleHBvcnRzLlRBR19OQU1FUyB8fCAoZXhwb3J0cy5UQUdfTkFNRVMgPSB7fSkpO1xuLyoqXG4gKiBUYWcgSURzIGFyZSBudW1lcmljIElEcyBmb3Iga25vd24gdGFnIG5hbWVzLlxuICpcbiAqIFdlIHVzZSB0YWcgSURzIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRhZyBuYW1lIGNvbXBhcmlzb25zLlxuICovXG52YXIgVEFHX0lEO1xuKGZ1bmN0aW9uIChUQUdfSUQpIHtcbiAgICBUQUdfSURbVEFHX0lEW1wiVU5LTk9XTlwiXSA9IDBdID0gXCJVTktOT1dOXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkFcIl0gPSAxXSA9IFwiQVwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJBRERSRVNTXCJdID0gMl0gPSBcIkFERFJFU1NcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiQU5OT1RBVElPTl9YTUxcIl0gPSAzXSA9IFwiQU5OT1RBVElPTl9YTUxcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiQVBQTEVUXCJdID0gNF0gPSBcIkFQUExFVFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJBUkVBXCJdID0gNV0gPSBcIkFSRUFcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiQVJUSUNMRVwiXSA9IDZdID0gXCJBUlRJQ0xFXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkFTSURFXCJdID0gN10gPSBcIkFTSURFXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkJcIl0gPSA4XSA9IFwiQlwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJCQVNFXCJdID0gOV0gPSBcIkJBU0VcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiQkFTRUZPTlRcIl0gPSAxMF0gPSBcIkJBU0VGT05UXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkJHU09VTkRcIl0gPSAxMV0gPSBcIkJHU09VTkRcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiQklHXCJdID0gMTJdID0gXCJCSUdcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiQkxPQ0tRVU9URVwiXSA9IDEzXSA9IFwiQkxPQ0tRVU9URVwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJCT0RZXCJdID0gMTRdID0gXCJCT0RZXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkJSXCJdID0gMTVdID0gXCJCUlwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJCVVRUT05cIl0gPSAxNl0gPSBcIkJVVFRPTlwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJDQVBUSU9OXCJdID0gMTddID0gXCJDQVBUSU9OXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkNFTlRFUlwiXSA9IDE4XSA9IFwiQ0VOVEVSXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkNPREVcIl0gPSAxOV0gPSBcIkNPREVcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiQ09MXCJdID0gMjBdID0gXCJDT0xcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiQ09MR1JPVVBcIl0gPSAyMV0gPSBcIkNPTEdST1VQXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkREXCJdID0gMjJdID0gXCJERFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJERVNDXCJdID0gMjNdID0gXCJERVNDXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkRFVEFJTFNcIl0gPSAyNF0gPSBcIkRFVEFJTFNcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiRElBTE9HXCJdID0gMjVdID0gXCJESUFMT0dcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiRElSXCJdID0gMjZdID0gXCJESVJcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiRElWXCJdID0gMjddID0gXCJESVZcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiRExcIl0gPSAyOF0gPSBcIkRMXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkRUXCJdID0gMjldID0gXCJEVFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJFTVwiXSA9IDMwXSA9IFwiRU1cIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiRU1CRURcIl0gPSAzMV0gPSBcIkVNQkVEXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkZJRUxEU0VUXCJdID0gMzJdID0gXCJGSUVMRFNFVFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJGSUdDQVBUSU9OXCJdID0gMzNdID0gXCJGSUdDQVBUSU9OXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkZJR1VSRVwiXSA9IDM0XSA9IFwiRklHVVJFXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkZPTlRcIl0gPSAzNV0gPSBcIkZPTlRcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiRk9PVEVSXCJdID0gMzZdID0gXCJGT09URVJcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiRk9SRUlHTl9PQkpFQ1RcIl0gPSAzN10gPSBcIkZPUkVJR05fT0JKRUNUXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkZPUk1cIl0gPSAzOF0gPSBcIkZPUk1cIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiRlJBTUVcIl0gPSAzOV0gPSBcIkZSQU1FXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkZSQU1FU0VUXCJdID0gNDBdID0gXCJGUkFNRVNFVFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJIMVwiXSA9IDQxXSA9IFwiSDFcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiSDJcIl0gPSA0Ml0gPSBcIkgyXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkgzXCJdID0gNDNdID0gXCJIM1wiO1xuICAgIFRBR19JRFtUQUdfSURbXCJINFwiXSA9IDQ0XSA9IFwiSDRcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiSDVcIl0gPSA0NV0gPSBcIkg1XCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkg2XCJdID0gNDZdID0gXCJINlwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJIRUFEXCJdID0gNDddID0gXCJIRUFEXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkhFQURFUlwiXSA9IDQ4XSA9IFwiSEVBREVSXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkhHUk9VUFwiXSA9IDQ5XSA9IFwiSEdST1VQXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkhSXCJdID0gNTBdID0gXCJIUlwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJIVE1MXCJdID0gNTFdID0gXCJIVE1MXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIklcIl0gPSA1Ml0gPSBcIklcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiSU1HXCJdID0gNTNdID0gXCJJTUdcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiSU1BR0VcIl0gPSA1NF0gPSBcIklNQUdFXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIklOUFVUXCJdID0gNTVdID0gXCJJTlBVVFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJJRlJBTUVcIl0gPSA1Nl0gPSBcIklGUkFNRVwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJLRVlHRU5cIl0gPSA1N10gPSBcIktFWUdFTlwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJMQUJFTFwiXSA9IDU4XSA9IFwiTEFCRUxcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiTElcIl0gPSA1OV0gPSBcIkxJXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIkxJTktcIl0gPSA2MF0gPSBcIkxJTktcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiTElTVElOR1wiXSA9IDYxXSA9IFwiTElTVElOR1wiO1xuICAgIFRBR19JRFtUQUdfSURbXCJNQUlOXCJdID0gNjJdID0gXCJNQUlOXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIk1BTElHTk1BUktcIl0gPSA2M10gPSBcIk1BTElHTk1BUktcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiTUFSUVVFRVwiXSA9IDY0XSA9IFwiTUFSUVVFRVwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJNQVRIXCJdID0gNjVdID0gXCJNQVRIXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIk1FTlVcIl0gPSA2Nl0gPSBcIk1FTlVcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiTUVUQVwiXSA9IDY3XSA9IFwiTUVUQVwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJNR0xZUEhcIl0gPSA2OF0gPSBcIk1HTFlQSFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJNSVwiXSA9IDY5XSA9IFwiTUlcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiTU9cIl0gPSA3MF0gPSBcIk1PXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIk1OXCJdID0gNzFdID0gXCJNTlwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJNU1wiXSA9IDcyXSA9IFwiTVNcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiTVRFWFRcIl0gPSA3M10gPSBcIk1URVhUXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIk5BVlwiXSA9IDc0XSA9IFwiTkFWXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIk5PQlJcIl0gPSA3NV0gPSBcIk5PQlJcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiTk9GUkFNRVNcIl0gPSA3Nl0gPSBcIk5PRlJBTUVTXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIk5PRU1CRURcIl0gPSA3N10gPSBcIk5PRU1CRURcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiTk9TQ1JJUFRcIl0gPSA3OF0gPSBcIk5PU0NSSVBUXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIk9CSkVDVFwiXSA9IDc5XSA9IFwiT0JKRUNUXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIk9MXCJdID0gODBdID0gXCJPTFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJPUFRHUk9VUFwiXSA9IDgxXSA9IFwiT1BUR1JPVVBcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiT1BUSU9OXCJdID0gODJdID0gXCJPUFRJT05cIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiUFwiXSA9IDgzXSA9IFwiUFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJQQVJBTVwiXSA9IDg0XSA9IFwiUEFSQU1cIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiUExBSU5URVhUXCJdID0gODVdID0gXCJQTEFJTlRFWFRcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiUFJFXCJdID0gODZdID0gXCJQUkVcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiUkJcIl0gPSA4N10gPSBcIlJCXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlJQXCJdID0gODhdID0gXCJSUFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJSVFwiXSA9IDg5XSA9IFwiUlRcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiUlRDXCJdID0gOTBdID0gXCJSVENcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiUlVCWVwiXSA9IDkxXSA9IFwiUlVCWVwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJTXCJdID0gOTJdID0gXCJTXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlNDUklQVFwiXSA9IDkzXSA9IFwiU0NSSVBUXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlNFQ1RJT05cIl0gPSA5NF0gPSBcIlNFQ1RJT05cIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiU0VMRUNUXCJdID0gOTVdID0gXCJTRUxFQ1RcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiU09VUkNFXCJdID0gOTZdID0gXCJTT1VSQ0VcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiU01BTExcIl0gPSA5N10gPSBcIlNNQUxMXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlNQQU5cIl0gPSA5OF0gPSBcIlNQQU5cIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiU1RSSUtFXCJdID0gOTldID0gXCJTVFJJS0VcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiU1RST05HXCJdID0gMTAwXSA9IFwiU1RST05HXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlNUWUxFXCJdID0gMTAxXSA9IFwiU1RZTEVcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiU1VCXCJdID0gMTAyXSA9IFwiU1VCXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlNVTU1BUllcIl0gPSAxMDNdID0gXCJTVU1NQVJZXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlNVUFwiXSA9IDEwNF0gPSBcIlNVUFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJUQUJMRVwiXSA9IDEwNV0gPSBcIlRBQkxFXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlRCT0RZXCJdID0gMTA2XSA9IFwiVEJPRFlcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiVEVNUExBVEVcIl0gPSAxMDddID0gXCJURU1QTEFURVwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJURVhUQVJFQVwiXSA9IDEwOF0gPSBcIlRFWFRBUkVBXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlRGT09UXCJdID0gMTA5XSA9IFwiVEZPT1RcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiVERcIl0gPSAxMTBdID0gXCJURFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJUSFwiXSA9IDExMV0gPSBcIlRIXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlRIRUFEXCJdID0gMTEyXSA9IFwiVEhFQURcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiVElUTEVcIl0gPSAxMTNdID0gXCJUSVRMRVwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJUUlwiXSA9IDExNF0gPSBcIlRSXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlRSQUNLXCJdID0gMTE1XSA9IFwiVFJBQ0tcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiVFRcIl0gPSAxMTZdID0gXCJUVFwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJVXCJdID0gMTE3XSA9IFwiVVwiO1xuICAgIFRBR19JRFtUQUdfSURbXCJVTFwiXSA9IDExOF0gPSBcIlVMXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlNWR1wiXSA9IDExOV0gPSBcIlNWR1wiO1xuICAgIFRBR19JRFtUQUdfSURbXCJWQVJcIl0gPSAxMjBdID0gXCJWQVJcIjtcbiAgICBUQUdfSURbVEFHX0lEW1wiV0JSXCJdID0gMTIxXSA9IFwiV0JSXCI7XG4gICAgVEFHX0lEW1RBR19JRFtcIlhNUFwiXSA9IDEyMl0gPSBcIlhNUFwiO1xufSkoVEFHX0lEID0gZXhwb3J0cy5UQUdfSUQgfHwgKGV4cG9ydHMuVEFHX0lEID0ge30pKTtcbmNvbnN0IFRBR19OQU1FX1RPX0lEID0gbmV3IE1hcChbXG4gICAgW1RBR19OQU1FUy5BLCBUQUdfSUQuQV0sXG4gICAgW1RBR19OQU1FUy5BRERSRVNTLCBUQUdfSUQuQUREUkVTU10sXG4gICAgW1RBR19OQU1FUy5BTk5PVEFUSU9OX1hNTCwgVEFHX0lELkFOTk9UQVRJT05fWE1MXSxcbiAgICBbVEFHX05BTUVTLkFQUExFVCwgVEFHX0lELkFQUExFVF0sXG4gICAgW1RBR19OQU1FUy5BUkVBLCBUQUdfSUQuQVJFQV0sXG4gICAgW1RBR19OQU1FUy5BUlRJQ0xFLCBUQUdfSUQuQVJUSUNMRV0sXG4gICAgW1RBR19OQU1FUy5BU0lERSwgVEFHX0lELkFTSURFXSxcbiAgICBbVEFHX05BTUVTLkIsIFRBR19JRC5CXSxcbiAgICBbVEFHX05BTUVTLkJBU0UsIFRBR19JRC5CQVNFXSxcbiAgICBbVEFHX05BTUVTLkJBU0VGT05ULCBUQUdfSUQuQkFTRUZPTlRdLFxuICAgIFtUQUdfTkFNRVMuQkdTT1VORCwgVEFHX0lELkJHU09VTkRdLFxuICAgIFtUQUdfTkFNRVMuQklHLCBUQUdfSUQuQklHXSxcbiAgICBbVEFHX05BTUVTLkJMT0NLUVVPVEUsIFRBR19JRC5CTE9DS1FVT1RFXSxcbiAgICBbVEFHX05BTUVTLkJPRFksIFRBR19JRC5CT0RZXSxcbiAgICBbVEFHX05BTUVTLkJSLCBUQUdfSUQuQlJdLFxuICAgIFtUQUdfTkFNRVMuQlVUVE9OLCBUQUdfSUQuQlVUVE9OXSxcbiAgICBbVEFHX05BTUVTLkNBUFRJT04sIFRBR19JRC5DQVBUSU9OXSxcbiAgICBbVEFHX05BTUVTLkNFTlRFUiwgVEFHX0lELkNFTlRFUl0sXG4gICAgW1RBR19OQU1FUy5DT0RFLCBUQUdfSUQuQ09ERV0sXG4gICAgW1RBR19OQU1FUy5DT0wsIFRBR19JRC5DT0xdLFxuICAgIFtUQUdfTkFNRVMuQ09MR1JPVVAsIFRBR19JRC5DT0xHUk9VUF0sXG4gICAgW1RBR19OQU1FUy5ERCwgVEFHX0lELkREXSxcbiAgICBbVEFHX05BTUVTLkRFU0MsIFRBR19JRC5ERVNDXSxcbiAgICBbVEFHX05BTUVTLkRFVEFJTFMsIFRBR19JRC5ERVRBSUxTXSxcbiAgICBbVEFHX05BTUVTLkRJQUxPRywgVEFHX0lELkRJQUxPR10sXG4gICAgW1RBR19OQU1FUy5ESVIsIFRBR19JRC5ESVJdLFxuICAgIFtUQUdfTkFNRVMuRElWLCBUQUdfSUQuRElWXSxcbiAgICBbVEFHX05BTUVTLkRMLCBUQUdfSUQuRExdLFxuICAgIFtUQUdfTkFNRVMuRFQsIFRBR19JRC5EVF0sXG4gICAgW1RBR19OQU1FUy5FTSwgVEFHX0lELkVNXSxcbiAgICBbVEFHX05BTUVTLkVNQkVELCBUQUdfSUQuRU1CRURdLFxuICAgIFtUQUdfTkFNRVMuRklFTERTRVQsIFRBR19JRC5GSUVMRFNFVF0sXG4gICAgW1RBR19OQU1FUy5GSUdDQVBUSU9OLCBUQUdfSUQuRklHQ0FQVElPTl0sXG4gICAgW1RBR19OQU1FUy5GSUdVUkUsIFRBR19JRC5GSUdVUkVdLFxuICAgIFtUQUdfTkFNRVMuRk9OVCwgVEFHX0lELkZPTlRdLFxuICAgIFtUQUdfTkFNRVMuRk9PVEVSLCBUQUdfSUQuRk9PVEVSXSxcbiAgICBbVEFHX05BTUVTLkZPUkVJR05fT0JKRUNULCBUQUdfSUQuRk9SRUlHTl9PQkpFQ1RdLFxuICAgIFtUQUdfTkFNRVMuRk9STSwgVEFHX0lELkZPUk1dLFxuICAgIFtUQUdfTkFNRVMuRlJBTUUsIFRBR19JRC5GUkFNRV0sXG4gICAgW1RBR19OQU1FUy5GUkFNRVNFVCwgVEFHX0lELkZSQU1FU0VUXSxcbiAgICBbVEFHX05BTUVTLkgxLCBUQUdfSUQuSDFdLFxuICAgIFtUQUdfTkFNRVMuSDIsIFRBR19JRC5IMl0sXG4gICAgW1RBR19OQU1FUy5IMywgVEFHX0lELkgzXSxcbiAgICBbVEFHX05BTUVTLkg0LCBUQUdfSUQuSDRdLFxuICAgIFtUQUdfTkFNRVMuSDUsIFRBR19JRC5INV0sXG4gICAgW1RBR19OQU1FUy5INiwgVEFHX0lELkg2XSxcbiAgICBbVEFHX05BTUVTLkhFQUQsIFRBR19JRC5IRUFEXSxcbiAgICBbVEFHX05BTUVTLkhFQURFUiwgVEFHX0lELkhFQURFUl0sXG4gICAgW1RBR19OQU1FUy5IR1JPVVAsIFRBR19JRC5IR1JPVVBdLFxuICAgIFtUQUdfTkFNRVMuSFIsIFRBR19JRC5IUl0sXG4gICAgW1RBR19OQU1FUy5IVE1MLCBUQUdfSUQuSFRNTF0sXG4gICAgW1RBR19OQU1FUy5JLCBUQUdfSUQuSV0sXG4gICAgW1RBR19OQU1FUy5JTUcsIFRBR19JRC5JTUddLFxuICAgIFtUQUdfTkFNRVMuSU1BR0UsIFRBR19JRC5JTUFHRV0sXG4gICAgW1RBR19OQU1FUy5JTlBVVCwgVEFHX0lELklOUFVUXSxcbiAgICBbVEFHX05BTUVTLklGUkFNRSwgVEFHX0lELklGUkFNRV0sXG4gICAgW1RBR19OQU1FUy5LRVlHRU4sIFRBR19JRC5LRVlHRU5dLFxuICAgIFtUQUdfTkFNRVMuTEFCRUwsIFRBR19JRC5MQUJFTF0sXG4gICAgW1RBR19OQU1FUy5MSSwgVEFHX0lELkxJXSxcbiAgICBbVEFHX05BTUVTLkxJTkssIFRBR19JRC5MSU5LXSxcbiAgICBbVEFHX05BTUVTLkxJU1RJTkcsIFRBR19JRC5MSVNUSU5HXSxcbiAgICBbVEFHX05BTUVTLk1BSU4sIFRBR19JRC5NQUlOXSxcbiAgICBbVEFHX05BTUVTLk1BTElHTk1BUkssIFRBR19JRC5NQUxJR05NQVJLXSxcbiAgICBbVEFHX05BTUVTLk1BUlFVRUUsIFRBR19JRC5NQVJRVUVFXSxcbiAgICBbVEFHX05BTUVTLk1BVEgsIFRBR19JRC5NQVRIXSxcbiAgICBbVEFHX05BTUVTLk1FTlUsIFRBR19JRC5NRU5VXSxcbiAgICBbVEFHX05BTUVTLk1FVEEsIFRBR19JRC5NRVRBXSxcbiAgICBbVEFHX05BTUVTLk1HTFlQSCwgVEFHX0lELk1HTFlQSF0sXG4gICAgW1RBR19OQU1FUy5NSSwgVEFHX0lELk1JXSxcbiAgICBbVEFHX05BTUVTLk1PLCBUQUdfSUQuTU9dLFxuICAgIFtUQUdfTkFNRVMuTU4sIFRBR19JRC5NTl0sXG4gICAgW1RBR19OQU1FUy5NUywgVEFHX0lELk1TXSxcbiAgICBbVEFHX05BTUVTLk1URVhULCBUQUdfSUQuTVRFWFRdLFxuICAgIFtUQUdfTkFNRVMuTkFWLCBUQUdfSUQuTkFWXSxcbiAgICBbVEFHX05BTUVTLk5PQlIsIFRBR19JRC5OT0JSXSxcbiAgICBbVEFHX05BTUVTLk5PRlJBTUVTLCBUQUdfSUQuTk9GUkFNRVNdLFxuICAgIFtUQUdfTkFNRVMuTk9FTUJFRCwgVEFHX0lELk5PRU1CRURdLFxuICAgIFtUQUdfTkFNRVMuTk9TQ1JJUFQsIFRBR19JRC5OT1NDUklQVF0sXG4gICAgW1RBR19OQU1FUy5PQkpFQ1QsIFRBR19JRC5PQkpFQ1RdLFxuICAgIFtUQUdfTkFNRVMuT0wsIFRBR19JRC5PTF0sXG4gICAgW1RBR19OQU1FUy5PUFRHUk9VUCwgVEFHX0lELk9QVEdST1VQXSxcbiAgICBbVEFHX05BTUVTLk9QVElPTiwgVEFHX0lELk9QVElPTl0sXG4gICAgW1RBR19OQU1FUy5QLCBUQUdfSUQuUF0sXG4gICAgW1RBR19OQU1FUy5QQVJBTSwgVEFHX0lELlBBUkFNXSxcbiAgICBbVEFHX05BTUVTLlBMQUlOVEVYVCwgVEFHX0lELlBMQUlOVEVYVF0sXG4gICAgW1RBR19OQU1FUy5QUkUsIFRBR19JRC5QUkVdLFxuICAgIFtUQUdfTkFNRVMuUkIsIFRBR19JRC5SQl0sXG4gICAgW1RBR19OQU1FUy5SUCwgVEFHX0lELlJQXSxcbiAgICBbVEFHX05BTUVTLlJULCBUQUdfSUQuUlRdLFxuICAgIFtUQUdfTkFNRVMuUlRDLCBUQUdfSUQuUlRDXSxcbiAgICBbVEFHX05BTUVTLlJVQlksIFRBR19JRC5SVUJZXSxcbiAgICBbVEFHX05BTUVTLlMsIFRBR19JRC5TXSxcbiAgICBbVEFHX05BTUVTLlNDUklQVCwgVEFHX0lELlNDUklQVF0sXG4gICAgW1RBR19OQU1FUy5TRUNUSU9OLCBUQUdfSUQuU0VDVElPTl0sXG4gICAgW1RBR19OQU1FUy5TRUxFQ1QsIFRBR19JRC5TRUxFQ1RdLFxuICAgIFtUQUdfTkFNRVMuU09VUkNFLCBUQUdfSUQuU09VUkNFXSxcbiAgICBbVEFHX05BTUVTLlNNQUxMLCBUQUdfSUQuU01BTExdLFxuICAgIFtUQUdfTkFNRVMuU1BBTiwgVEFHX0lELlNQQU5dLFxuICAgIFtUQUdfTkFNRVMuU1RSSUtFLCBUQUdfSUQuU1RSSUtFXSxcbiAgICBbVEFHX05BTUVTLlNUUk9ORywgVEFHX0lELlNUUk9OR10sXG4gICAgW1RBR19OQU1FUy5TVFlMRSwgVEFHX0lELlNUWUxFXSxcbiAgICBbVEFHX05BTUVTLlNVQiwgVEFHX0lELlNVQl0sXG4gICAgW1RBR19OQU1FUy5TVU1NQVJZLCBUQUdfSUQuU1VNTUFSWV0sXG4gICAgW1RBR19OQU1FUy5TVVAsIFRBR19JRC5TVVBdLFxuICAgIFtUQUdfTkFNRVMuVEFCTEUsIFRBR19JRC5UQUJMRV0sXG4gICAgW1RBR19OQU1FUy5UQk9EWSwgVEFHX0lELlRCT0RZXSxcbiAgICBbVEFHX05BTUVTLlRFTVBMQVRFLCBUQUdfSUQuVEVNUExBVEVdLFxuICAgIFtUQUdfTkFNRVMuVEVYVEFSRUEsIFRBR19JRC5URVhUQVJFQV0sXG4gICAgW1RBR19OQU1FUy5URk9PVCwgVEFHX0lELlRGT09UXSxcbiAgICBbVEFHX05BTUVTLlRELCBUQUdfSUQuVERdLFxuICAgIFtUQUdfTkFNRVMuVEgsIFRBR19JRC5USF0sXG4gICAgW1RBR19OQU1FUy5USEVBRCwgVEFHX0lELlRIRUFEXSxcbiAgICBbVEFHX05BTUVTLlRJVExFLCBUQUdfSUQuVElUTEVdLFxuICAgIFtUQUdfTkFNRVMuVFIsIFRBR19JRC5UUl0sXG4gICAgW1RBR19OQU1FUy5UUkFDSywgVEFHX0lELlRSQUNLXSxcbiAgICBbVEFHX05BTUVTLlRULCBUQUdfSUQuVFRdLFxuICAgIFtUQUdfTkFNRVMuVSwgVEFHX0lELlVdLFxuICAgIFtUQUdfTkFNRVMuVUwsIFRBR19JRC5VTF0sXG4gICAgW1RBR19OQU1FUy5TVkcsIFRBR19JRC5TVkddLFxuICAgIFtUQUdfTkFNRVMuVkFSLCBUQUdfSUQuVkFSXSxcbiAgICBbVEFHX05BTUVTLldCUiwgVEFHX0lELldCUl0sXG4gICAgW1RBR19OQU1FUy5YTVAsIFRBR19JRC5YTVBdLFxuXSk7XG5mdW5jdGlvbiBnZXRUYWdJRCh0YWdOYW1lKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBUQUdfTkFNRV9UT19JRC5nZXQodGFnTmFtZSkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFRBR19JRC5VTktOT1dOO1xufVxuZXhwb3J0cy5nZXRUYWdJRCA9IGdldFRhZ0lEO1xuY29uc3QgJCA9IFRBR19JRDtcbmV4cG9ydHMuU1BFQ0lBTF9FTEVNRU5UUyA9IHtcbiAgICBbTlMuSFRNTF06IG5ldyBTZXQoW1xuICAgICAgICAkLkFERFJFU1MsXG4gICAgICAgICQuQVBQTEVULFxuICAgICAgICAkLkFSRUEsXG4gICAgICAgICQuQVJUSUNMRSxcbiAgICAgICAgJC5BU0lERSxcbiAgICAgICAgJC5CQVNFLFxuICAgICAgICAkLkJBU0VGT05ULFxuICAgICAgICAkLkJHU09VTkQsXG4gICAgICAgICQuQkxPQ0tRVU9URSxcbiAgICAgICAgJC5CT0RZLFxuICAgICAgICAkLkJSLFxuICAgICAgICAkLkJVVFRPTixcbiAgICAgICAgJC5DQVBUSU9OLFxuICAgICAgICAkLkNFTlRFUixcbiAgICAgICAgJC5DT0wsXG4gICAgICAgICQuQ09MR1JPVVAsXG4gICAgICAgICQuREQsXG4gICAgICAgICQuREVUQUlMUyxcbiAgICAgICAgJC5ESVIsXG4gICAgICAgICQuRElWLFxuICAgICAgICAkLkRMLFxuICAgICAgICAkLkRULFxuICAgICAgICAkLkVNQkVELFxuICAgICAgICAkLkZJRUxEU0VULFxuICAgICAgICAkLkZJR0NBUFRJT04sXG4gICAgICAgICQuRklHVVJFLFxuICAgICAgICAkLkZPT1RFUixcbiAgICAgICAgJC5GT1JNLFxuICAgICAgICAkLkZSQU1FLFxuICAgICAgICAkLkZSQU1FU0VULFxuICAgICAgICAkLkgxLFxuICAgICAgICAkLkgyLFxuICAgICAgICAkLkgzLFxuICAgICAgICAkLkg0LFxuICAgICAgICAkLkg1LFxuICAgICAgICAkLkg2LFxuICAgICAgICAkLkhFQUQsXG4gICAgICAgICQuSEVBREVSLFxuICAgICAgICAkLkhHUk9VUCxcbiAgICAgICAgJC5IUixcbiAgICAgICAgJC5IVE1MLFxuICAgICAgICAkLklGUkFNRSxcbiAgICAgICAgJC5JTUcsXG4gICAgICAgICQuSU5QVVQsXG4gICAgICAgICQuTEksXG4gICAgICAgICQuTElOSyxcbiAgICAgICAgJC5MSVNUSU5HLFxuICAgICAgICAkLk1BSU4sXG4gICAgICAgICQuTUFSUVVFRSxcbiAgICAgICAgJC5NRU5VLFxuICAgICAgICAkLk1FVEEsXG4gICAgICAgICQuTkFWLFxuICAgICAgICAkLk5PRU1CRUQsXG4gICAgICAgICQuTk9GUkFNRVMsXG4gICAgICAgICQuTk9TQ1JJUFQsXG4gICAgICAgICQuT0JKRUNULFxuICAgICAgICAkLk9MLFxuICAgICAgICAkLlAsXG4gICAgICAgICQuUEFSQU0sXG4gICAgICAgICQuUExBSU5URVhULFxuICAgICAgICAkLlBSRSxcbiAgICAgICAgJC5TQ1JJUFQsXG4gICAgICAgICQuU0VDVElPTixcbiAgICAgICAgJC5TRUxFQ1QsXG4gICAgICAgICQuU09VUkNFLFxuICAgICAgICAkLlNUWUxFLFxuICAgICAgICAkLlNVTU1BUlksXG4gICAgICAgICQuVEFCTEUsXG4gICAgICAgICQuVEJPRFksXG4gICAgICAgICQuVEQsXG4gICAgICAgICQuVEVNUExBVEUsXG4gICAgICAgICQuVEVYVEFSRUEsXG4gICAgICAgICQuVEZPT1QsXG4gICAgICAgICQuVEgsXG4gICAgICAgICQuVEhFQUQsXG4gICAgICAgICQuVElUTEUsXG4gICAgICAgICQuVFIsXG4gICAgICAgICQuVFJBQ0ssXG4gICAgICAgICQuVUwsXG4gICAgICAgICQuV0JSLFxuICAgICAgICAkLlhNUCxcbiAgICBdKSxcbiAgICBbTlMuTUFUSE1MXTogbmV3IFNldChbJC5NSSwgJC5NTywgJC5NTiwgJC5NUywgJC5NVEVYVCwgJC5BTk5PVEFUSU9OX1hNTF0pLFxuICAgIFtOUy5TVkddOiBuZXcgU2V0KFskLlRJVExFLCAkLkZPUkVJR05fT0JKRUNULCAkLkRFU0NdKSxcbiAgICBbTlMuWExJTktdOiBuZXcgU2V0KCksXG4gICAgW05TLlhNTF06IG5ldyBTZXQoKSxcbiAgICBbTlMuWE1MTlNdOiBuZXcgU2V0KCksXG59O1xuZnVuY3Rpb24gaXNOdW1iZXJlZEhlYWRlcih0bikge1xuICAgIHJldHVybiB0biA9PT0gJC5IMSB8fCB0biA9PT0gJC5IMiB8fCB0biA9PT0gJC5IMyB8fCB0biA9PT0gJC5INCB8fCB0biA9PT0gJC5INSB8fCB0biA9PT0gJC5INjtcbn1cbmV4cG9ydHMuaXNOdW1iZXJlZEhlYWRlciA9IGlzTnVtYmVyZWRIZWFkZXI7XG5jb25zdCBVTkVTQ0FQRURfVEVYVCA9IG5ldyBTZXQoW1xuICAgIFRBR19OQU1FUy5TVFlMRSxcbiAgICBUQUdfTkFNRVMuU0NSSVBULFxuICAgIFRBR19OQU1FUy5YTVAsXG4gICAgVEFHX05BTUVTLklGUkFNRSxcbiAgICBUQUdfTkFNRVMuTk9FTUJFRCxcbiAgICBUQUdfTkFNRVMuTk9GUkFNRVMsXG4gICAgVEFHX05BTUVTLlBMQUlOVEVYVCxcbl0pO1xuZnVuY3Rpb24gaGFzVW5lc2NhcGVkVGV4dCh0biwgc2NyaXB0aW5nRW5hYmxlZCkge1xuICAgIHJldHVybiBVTkVTQ0FQRURfVEVYVC5oYXModG4pIHx8IChzY3JpcHRpbmdFbmFibGVkICYmIHRuID09PSBUQUdfTkFNRVMuTk9TQ1JJUFQpO1xufVxuZXhwb3J0cy5oYXNVbmVzY2FwZWRUZXh0ID0gaGFzVW5lc2NhcGVkVGV4dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0bWwuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldFRva2VuQXR0ciA9IGV4cG9ydHMuVG9rZW5UeXBlID0gdm9pZCAwO1xudmFyIFRva2VuVHlwZTtcbihmdW5jdGlvbiAoVG9rZW5UeXBlKSB7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkNIQVJBQ1RFUlwiXSA9IDBdID0gXCJDSEFSQUNURVJcIjtcbiAgICBUb2tlblR5cGVbVG9rZW5UeXBlW1wiTlVMTF9DSEFSQUNURVJcIl0gPSAxXSA9IFwiTlVMTF9DSEFSQUNURVJcIjtcbiAgICBUb2tlblR5cGVbVG9rZW5UeXBlW1wiV0hJVEVTUEFDRV9DSEFSQUNURVJcIl0gPSAyXSA9IFwiV0hJVEVTUEFDRV9DSEFSQUNURVJcIjtcbiAgICBUb2tlblR5cGVbVG9rZW5UeXBlW1wiU1RBUlRfVEFHXCJdID0gM10gPSBcIlNUQVJUX1RBR1wiO1xuICAgIFRva2VuVHlwZVtUb2tlblR5cGVbXCJFTkRfVEFHXCJdID0gNF0gPSBcIkVORF9UQUdcIjtcbiAgICBUb2tlblR5cGVbVG9rZW5UeXBlW1wiQ09NTUVOVFwiXSA9IDVdID0gXCJDT01NRU5UXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkRPQ1RZUEVcIl0gPSA2XSA9IFwiRE9DVFlQRVwiO1xuICAgIFRva2VuVHlwZVtUb2tlblR5cGVbXCJFT0ZcIl0gPSA3XSA9IFwiRU9GXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkhJQkVSTkFUSU9OXCJdID0gOF0gPSBcIkhJQkVSTkFUSU9OXCI7XG59KShUb2tlblR5cGUgPSBleHBvcnRzLlRva2VuVHlwZSB8fCAoZXhwb3J0cy5Ub2tlblR5cGUgPSB7fSkpO1xuZnVuY3Rpb24gZ2V0VG9rZW5BdHRyKHRva2VuLCBhdHRyTmFtZSkge1xuICAgIGZvciAobGV0IGkgPSB0b2tlbi5hdHRycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAodG9rZW4uYXR0cnNbaV0ubmFtZSA9PT0gYXR0ck5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2tlbi5hdHRyc1tpXS52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmV4cG9ydHMuZ2V0VG9rZW5BdHRyID0gZ2V0VG9rZW5BdHRyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG9rZW4uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzVW5kZWZpbmVkQ29kZVBvaW50ID0gZXhwb3J0cy5pc0NvbnRyb2xDb2RlUG9pbnQgPSBleHBvcnRzLmdldFN1cnJvZ2F0ZVBhaXJDb2RlUG9pbnQgPSBleHBvcnRzLmlzU3Vycm9nYXRlUGFpciA9IGV4cG9ydHMuaXNTdXJyb2dhdGUgPSBleHBvcnRzLlNFUVVFTkNFUyA9IGV4cG9ydHMuQ09ERV9QT0lOVFMgPSBleHBvcnRzLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUiA9IHZvaWQgMDtcbmNvbnN0IFVOREVGSU5FRF9DT0RFX1BPSU5UUyA9IG5ldyBTZXQoW1xuICAgIDY1NTM0LCA2NTUzNSwgMTMxMDcwLCAxMzEwNzEsIDE5NjYwNiwgMTk2NjA3LCAyNjIxNDIsIDI2MjE0MywgMzI3Njc4LCAzMjc2NzksIDM5MzIxNCxcbiAgICAzOTMyMTUsIDQ1ODc1MCwgNDU4NzUxLCA1MjQyODYsIDUyNDI4NywgNTg5ODIyLCA1ODk4MjMsIDY1NTM1OCwgNjU1MzU5LCA3MjA4OTQsXG4gICAgNzIwODk1LCA3ODY0MzAsIDc4NjQzMSwgODUxOTY2LCA4NTE5NjcsIDkxNzUwMiwgOTE3NTAzLCA5ODMwMzgsIDk4MzAzOSwgMTA0ODU3NCxcbiAgICAxMDQ4NTc1LCAxMTE0MTEwLCAxMTE0MTExLFxuXSk7XG5leHBvcnRzLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUiA9ICdcXHVGRkZEJztcbnZhciBDT0RFX1BPSU5UUztcbihmdW5jdGlvbiAoQ09ERV9QT0lOVFMpIHtcbiAgICBDT0RFX1BPSU5UU1tDT0RFX1BPSU5UU1tcIkVPRlwiXSA9IC0xXSA9IFwiRU9GXCI7XG4gICAgQ09ERV9QT0lOVFNbQ09ERV9QT0lOVFNbXCJOVUxMXCJdID0gMF0gPSBcIk5VTExcIjtcbiAgICBDT0RFX1BPSU5UU1tDT0RFX1BPSU5UU1tcIlRBQlVMQVRJT05cIl0gPSA5XSA9IFwiVEFCVUxBVElPTlwiO1xuICAgIENPREVfUE9JTlRTW0NPREVfUE9JTlRTW1wiQ0FSUklBR0VfUkVUVVJOXCJdID0gMTNdID0gXCJDQVJSSUFHRV9SRVRVUk5cIjtcbiAgICBDT0RFX1BPSU5UU1tDT0RFX1BPSU5UU1tcIkxJTkVfRkVFRFwiXSA9IDEwXSA9IFwiTElORV9GRUVEXCI7XG4gICAgQ09ERV9QT0lOVFNbQ09ERV9QT0lOVFNbXCJGT1JNX0ZFRURcIl0gPSAxMl0gPSBcIkZPUk1fRkVFRFwiO1xuICAgIENPREVfUE9JTlRTW0NPREVfUE9JTlRTW1wiU1BBQ0VcIl0gPSAzMl0gPSBcIlNQQUNFXCI7XG4gICAgQ09ERV9QT0lOVFNbQ09ERV9QT0lOVFNbXCJFWENMQU1BVElPTl9NQVJLXCJdID0gMzNdID0gXCJFWENMQU1BVElPTl9NQVJLXCI7XG4gICAgQ09ERV9QT0lOVFNbQ09ERV9QT0lOVFNbXCJRVU9UQVRJT05fTUFSS1wiXSA9IDM0XSA9IFwiUVVPVEFUSU9OX01BUktcIjtcbiAgICBDT0RFX1BPSU5UU1tDT0RFX1BPSU5UU1tcIk5VTUJFUl9TSUdOXCJdID0gMzVdID0gXCJOVU1CRVJfU0lHTlwiO1xuICAgIENPREVfUE9JTlRTW0NPREVfUE9JTlRTW1wiQU1QRVJTQU5EXCJdID0gMzhdID0gXCJBTVBFUlNBTkRcIjtcbiAgICBDT0RFX1BPSU5UU1tDT0RFX1BPSU5UU1tcIkFQT1NUUk9QSEVcIl0gPSAzOV0gPSBcIkFQT1NUUk9QSEVcIjtcbiAgICBDT0RFX1BPSU5UU1tDT0RFX1BPSU5UU1tcIkhZUEhFTl9NSU5VU1wiXSA9IDQ1XSA9IFwiSFlQSEVOX01JTlVTXCI7XG4gICAgQ09ERV9QT0lOVFNbQ09ERV9QT0lOVFNbXCJTT0xJRFVTXCJdID0gNDddID0gXCJTT0xJRFVTXCI7XG4gICAgQ09ERV9QT0lOVFNbQ09ERV9QT0lOVFNbXCJESUdJVF8wXCJdID0gNDhdID0gXCJESUdJVF8wXCI7XG4gICAgQ09ERV9QT0lOVFNbQ09ERV9QT0lOVFNbXCJESUdJVF85XCJdID0gNTddID0gXCJESUdJVF85XCI7XG4gICAgQ09ERV9QT0lOVFNbQ09ERV9QT0lOVFNbXCJTRU1JQ09MT05cIl0gPSA1OV0gPSBcIlNFTUlDT0xPTlwiO1xuICAgIENPREVfUE9JTlRTW0NPREVfUE9JTlRTW1wiTEVTU19USEFOX1NJR05cIl0gPSA2MF0gPSBcIkxFU1NfVEhBTl9TSUdOXCI7XG4gICAgQ09ERV9QT0lOVFNbQ09ERV9QT0lOVFNbXCJFUVVBTFNfU0lHTlwiXSA9IDYxXSA9IFwiRVFVQUxTX1NJR05cIjtcbiAgICBDT0RFX1BPSU5UU1tDT0RFX1BPSU5UU1tcIkdSRUFURVJfVEhBTl9TSUdOXCJdID0gNjJdID0gXCJHUkVBVEVSX1RIQU5fU0lHTlwiO1xuICAgIENPREVfUE9JTlRTW0NPREVfUE9JTlRTW1wiUVVFU1RJT05fTUFSS1wiXSA9IDYzXSA9IFwiUVVFU1RJT05fTUFSS1wiO1xuICAgIENPREVfUE9JTlRTW0NPREVfUE9JTlRTW1wiTEFUSU5fQ0FQSVRBTF9BXCJdID0gNjVdID0gXCJMQVRJTl9DQVBJVEFMX0FcIjtcbiAgICBDT0RFX1BPSU5UU1tDT0RFX1BPSU5UU1tcIkxBVElOX0NBUElUQUxfRlwiXSA9IDcwXSA9IFwiTEFUSU5fQ0FQSVRBTF9GXCI7XG4gICAgQ09ERV9QT0lOVFNbQ09ERV9QT0lOVFNbXCJMQVRJTl9DQVBJVEFMX1hcIl0gPSA4OF0gPSBcIkxBVElOX0NBUElUQUxfWFwiO1xuICAgIENPREVfUE9JTlRTW0NPREVfUE9JTlRTW1wiTEFUSU5fQ0FQSVRBTF9aXCJdID0gOTBdID0gXCJMQVRJTl9DQVBJVEFMX1pcIjtcbiAgICBDT0RFX1BPSU5UU1tDT0RFX1BPSU5UU1tcIlJJR0hUX1NRVUFSRV9CUkFDS0VUXCJdID0gOTNdID0gXCJSSUdIVF9TUVVBUkVfQlJBQ0tFVFwiO1xuICAgIENPREVfUE9JTlRTW0NPREVfUE9JTlRTW1wiR1JBVkVfQUNDRU5UXCJdID0gOTZdID0gXCJHUkFWRV9BQ0NFTlRcIjtcbiAgICBDT0RFX1BPSU5UU1tDT0RFX1BPSU5UU1tcIkxBVElOX1NNQUxMX0FcIl0gPSA5N10gPSBcIkxBVElOX1NNQUxMX0FcIjtcbiAgICBDT0RFX1BPSU5UU1tDT0RFX1BPSU5UU1tcIkxBVElOX1NNQUxMX0ZcIl0gPSAxMDJdID0gXCJMQVRJTl9TTUFMTF9GXCI7XG4gICAgQ09ERV9QT0lOVFNbQ09ERV9QT0lOVFNbXCJMQVRJTl9TTUFMTF9YXCJdID0gMTIwXSA9IFwiTEFUSU5fU01BTExfWFwiO1xuICAgIENPREVfUE9JTlRTW0NPREVfUE9JTlRTW1wiTEFUSU5fU01BTExfWlwiXSA9IDEyMl0gPSBcIkxBVElOX1NNQUxMX1pcIjtcbiAgICBDT0RFX1BPSU5UU1tDT0RFX1BPSU5UU1tcIlJFUExBQ0VNRU5UX0NIQVJBQ1RFUlwiXSA9IDY1NTMzXSA9IFwiUkVQTEFDRU1FTlRfQ0hBUkFDVEVSXCI7XG59KShDT0RFX1BPSU5UUyA9IGV4cG9ydHMuQ09ERV9QT0lOVFMgfHwgKGV4cG9ydHMuQ09ERV9QT0lOVFMgPSB7fSkpO1xuZXhwb3J0cy5TRVFVRU5DRVMgPSB7XG4gICAgREFTSF9EQVNIOiAnLS0nLFxuICAgIENEQVRBX1NUQVJUOiAnW0NEQVRBWycsXG4gICAgRE9DVFlQRTogJ2RvY3R5cGUnLFxuICAgIFNDUklQVDogJ3NjcmlwdCcsXG4gICAgUFVCTElDOiAncHVibGljJyxcbiAgICBTWVNURU06ICdzeXN0ZW0nLFxufTtcbi8vU3Vycm9nYXRlc1xuZnVuY3Rpb24gaXNTdXJyb2dhdGUoY3ApIHtcbiAgICByZXR1cm4gY3AgPj0gNTUyOTYgJiYgY3AgPD0gNTczNDM7XG59XG5leHBvcnRzLmlzU3Vycm9nYXRlID0gaXNTdXJyb2dhdGU7XG5mdW5jdGlvbiBpc1N1cnJvZ2F0ZVBhaXIoY3ApIHtcbiAgICByZXR1cm4gY3AgPj0gNTYzMjAgJiYgY3AgPD0gNTczNDM7XG59XG5leHBvcnRzLmlzU3Vycm9nYXRlUGFpciA9IGlzU3Vycm9nYXRlUGFpcjtcbmZ1bmN0aW9uIGdldFN1cnJvZ2F0ZVBhaXJDb2RlUG9pbnQoY3AxLCBjcDIpIHtcbiAgICByZXR1cm4gKGNwMSAtIDU1Mjk2KSAqIDEwMjQgKyA5MjE2ICsgY3AyO1xufVxuZXhwb3J0cy5nZXRTdXJyb2dhdGVQYWlyQ29kZVBvaW50ID0gZ2V0U3Vycm9nYXRlUGFpckNvZGVQb2ludDtcbi8vTk9URTogZXhjbHVkaW5nIE5VTEwgYW5kIEFTQ0lJIHdoaXRlc3BhY2VcbmZ1bmN0aW9uIGlzQ29udHJvbENvZGVQb2ludChjcCkge1xuICAgIHJldHVybiAoKGNwICE9PSAweDIwICYmIGNwICE9PSAweDBhICYmIGNwICE9PSAweDBkICYmIGNwICE9PSAweDA5ICYmIGNwICE9PSAweDBjICYmIGNwID49IDB4MDEgJiYgY3AgPD0gMHgxZikgfHxcbiAgICAgICAgKGNwID49IDB4N2YgJiYgY3AgPD0gMHg5ZikpO1xufVxuZXhwb3J0cy5pc0NvbnRyb2xDb2RlUG9pbnQgPSBpc0NvbnRyb2xDb2RlUG9pbnQ7XG5mdW5jdGlvbiBpc1VuZGVmaW5lZENvZGVQb2ludChjcCkge1xuICAgIHJldHVybiAoY3AgPj0gNjQ5NzYgJiYgY3AgPD0gNjUwMDcpIHx8IFVOREVGSU5FRF9DT0RFX1BPSU5UUy5oYXMoY3ApO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZENvZGVQb2ludCA9IGlzVW5kZWZpbmVkQ29kZVBvaW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5pY29kZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VGcmFnbWVudCA9IGV4cG9ydHMucGFyc2UgPSBleHBvcnRzLlRva2VuaXplck1vZGUgPSBleHBvcnRzLlRva2VuaXplciA9IGV4cG9ydHMuVG9rZW4gPSBleHBvcnRzLmh0bWwgPSBleHBvcnRzLmZvcmVpZ25Db250ZW50ID0gZXhwb3J0cy5zZXJpYWxpemVPdXRlciA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5QYXJzZXIgPSBleHBvcnRzLmRlZmF1bHRUcmVlQWRhcHRlciA9IHZvaWQgMDtcbmNvbnN0IGluZGV4X2pzXzEgPSByZXF1aXJlKFwiLi9wYXJzZXIvaW5kZXguanNcIik7XG52YXIgZGVmYXVsdF9qc18xID0gcmVxdWlyZShcIi4vdHJlZS1hZGFwdGVycy9kZWZhdWx0LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVmYXVsdFRyZWVBZGFwdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkZWZhdWx0X2pzXzEuZGVmYXVsdFRyZWVBZGFwdGVyOyB9IH0pO1xudmFyIGluZGV4X2pzXzIgPSByZXF1aXJlKFwiLi9wYXJzZXIvaW5kZXguanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQYXJzZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGluZGV4X2pzXzIuUGFyc2VyOyB9IH0pO1xudmFyIGluZGV4X2pzXzMgPSByZXF1aXJlKFwiLi9zZXJpYWxpemVyL2luZGV4LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2VyaWFsaXplXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBpbmRleF9qc18zLnNlcmlhbGl6ZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInNlcmlhbGl6ZU91dGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBpbmRleF9qc18zLnNlcmlhbGl6ZU91dGVyOyB9IH0pO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0cy5mb3JlaWduQ29udGVudCA9IHJlcXVpcmUoXCIuL2NvbW1vbi9mb3JlaWduLWNvbnRlbnQuanNcIik7XG4vKiogQGludGVybmFsICovXG5leHBvcnRzLmh0bWwgPSByZXF1aXJlKFwiLi9jb21tb24vaHRtbC5qc1wiKTtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydHMuVG9rZW4gPSByZXF1aXJlKFwiLi9jb21tb24vdG9rZW4uanNcIik7XG4vKiogQGludGVybmFsICovXG52YXIgaW5kZXhfanNfNCA9IHJlcXVpcmUoXCIuL3Rva2VuaXplci9pbmRleC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRva2VuaXplclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaW5kZXhfanNfNC5Ub2tlbml6ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb2tlbml6ZXJNb2RlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBpbmRleF9qc180LlRva2VuaXplck1vZGU7IH0gfSk7XG4vLyBTaG9ydGhhbmRzXG4vKipcbiAqIFBhcnNlcyBhbiBIVE1MIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gaHRtbCBJbnB1dCBIVE1MIHN0cmluZy5cbiAqIEBwYXJhbSBvcHRpb25zIFBhcnNpbmcgb3B0aW9ucy5cbiAqIEByZXR1cm5zIERvY3VtZW50XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGFyc2U1ID0gcmVxdWlyZSgncGFyc2U1Jyk7XG4gKlxuICogY29uc3QgZG9jdW1lbnQgPSBwYXJzZTUucGFyc2UoJzwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPjwvaGVhZD48Ym9keT5IaSB0aGVyZSE8L2JvZHk+PC9odG1sPicpO1xuICpcbiAqIGNvbnNvbGUubG9nKGRvY3VtZW50LmNoaWxkTm9kZXNbMV0udGFnTmFtZSk7IC8vPiAnaHRtbCdcbiAqYGBgXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKGh0bWwsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gaW5kZXhfanNfMS5QYXJzZXIucGFyc2UoaHRtbCwgb3B0aW9ucyk7XG59XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5mdW5jdGlvbiBwYXJzZUZyYWdtZW50KGZyYWdtZW50Q29udGV4dCwgaHRtbCwgb3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgZnJhZ21lbnRDb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBvcHRpb25zID0gaHRtbDtcbiAgICAgICAgaHRtbCA9IGZyYWdtZW50Q29udGV4dDtcbiAgICAgICAgZnJhZ21lbnRDb250ZXh0ID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VyID0gaW5kZXhfanNfMS5QYXJzZXIuZ2V0RnJhZ21lbnRQYXJzZXIoZnJhZ21lbnRDb250ZXh0LCBvcHRpb25zKTtcbiAgICBwYXJzZXIudG9rZW5pemVyLndyaXRlKGh0bWwsIHRydWUpO1xuICAgIHJldHVybiBwYXJzZXIuZ2V0RnJhZ21lbnQoKTtcbn1cbmV4cG9ydHMucGFyc2VGcmFnbWVudCA9IHBhcnNlRnJhZ21lbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRm9ybWF0dGluZ0VsZW1lbnRMaXN0ID0gZXhwb3J0cy5FbnRyeVR5cGUgPSB2b2lkIDA7XG4vL0NvbnN0XG5jb25zdCBOT0FIX0FSS19DQVBBQ0lUWSA9IDM7XG52YXIgRW50cnlUeXBlO1xuKGZ1bmN0aW9uIChFbnRyeVR5cGUpIHtcbiAgICBFbnRyeVR5cGVbRW50cnlUeXBlW1wiTWFya2VyXCJdID0gMF0gPSBcIk1hcmtlclwiO1xuICAgIEVudHJ5VHlwZVtFbnRyeVR5cGVbXCJFbGVtZW50XCJdID0gMV0gPSBcIkVsZW1lbnRcIjtcbn0pKEVudHJ5VHlwZSA9IGV4cG9ydHMuRW50cnlUeXBlIHx8IChleHBvcnRzLkVudHJ5VHlwZSA9IHt9KSk7XG5jb25zdCBNQVJLRVIgPSB7IHR5cGU6IEVudHJ5VHlwZS5NYXJrZXIgfTtcbi8vTGlzdCBvZiBmb3JtYXR0aW5nIGVsZW1lbnRzXG5jbGFzcyBGb3JtYXR0aW5nRWxlbWVudExpc3Qge1xuICAgIGNvbnN0cnVjdG9yKHRyZWVBZGFwdGVyKSB7XG4gICAgICAgIHRoaXMudHJlZUFkYXB0ZXIgPSB0cmVlQWRhcHRlcjtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gW107XG4gICAgICAgIHRoaXMuYm9va21hcmsgPSBudWxsO1xuICAgIH1cbiAgICAvL05vYWggQXJrJ3MgY29uZGl0aW9uXG4gICAgLy9PUFRJTUlaQVRJT046IGF0IGZpcnN0IHdlIHRyeSB0byBmaW5kIHBvc3NpYmxlIGNhbmRpZGF0ZXMgZm9yIGV4Y2x1c2lvbiB1c2luZ1xuICAgIC8vbGlnaHR3ZWlnaHQgaGV1cmlzdGljcyB3aXRob3V0IHRob3JvdWdoIGF0dHJpYnV0ZXMgY2hlY2suXG4gICAgX2dldE5vYWhBcmtDb25kaXRpb25DYW5kaWRhdGVzKG5ld0VsZW1lbnQsIG5lQXR0cnMpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IFtdO1xuICAgICAgICBjb25zdCBuZUF0dHJzTGVuZ3RoID0gbmVBdHRycy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG5lVGFnTmFtZSA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShuZXdFbGVtZW50KTtcbiAgICAgICAgY29uc3QgbmVOYW1lc3BhY2VVUkkgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShuZXdFbGVtZW50KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzW2ldO1xuICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09IEVudHJ5VHlwZS5NYXJrZXIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gZW50cnk7XG4gICAgICAgICAgICBpZiAodGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKGVsZW1lbnQpID09PSBuZVRhZ05hbWUgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShlbGVtZW50KSA9PT0gbmVOYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50QXR0cnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldEF0dHJMaXN0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50QXR0cnMubGVuZ3RoID09PSBuZUF0dHJzTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7IGlkeDogaSwgYXR0cnM6IGVsZW1lbnRBdHRycyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZXM7XG4gICAgfVxuICAgIF9lbnN1cmVOb2FoQXJrQ29uZGl0aW9uKG5ld0VsZW1lbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZW50cmllcy5sZW5ndGggPCBOT0FIX0FSS19DQVBBQ0lUWSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgbmVBdHRycyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0QXR0ckxpc3QobmV3RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSB0aGlzLl9nZXROb2FoQXJrQ29uZGl0aW9uQ2FuZGlkYXRlcyhuZXdFbGVtZW50LCBuZUF0dHJzKTtcbiAgICAgICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoIDwgTk9BSF9BUktfQ0FQQUNJVFkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vTk9URTogYnVpbGQgYXR0cnMgbWFwIGZvciB0aGUgbmV3IGVsZW1lbnQsIHNvIHdlIGNhbiBwZXJmb3JtIGZhc3QgbG9va3Vwc1xuICAgICAgICBjb25zdCBuZUF0dHJzTWFwID0gbmV3IE1hcChuZUF0dHJzLm1hcCgobmVBdHRyKSA9PiBbbmVBdHRyLm5hbWUsIG5lQXR0ci52YWx1ZV0pKTtcbiAgICAgICAgbGV0IHZhbGlkQ2FuZGlkYXRlcyA9IDA7XG4gICAgICAgIC8vTk9URTogcmVtb3ZlIGJvdHRvbW1vc3QgY2FuZGlkYXRlcywgdW50aWwgTm9haCdzIEFyayBjb25kaXRpb24gd2lsbCBub3QgYmUgbWV0XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gY2FuZGlkYXRlc1tpXTtcbiAgICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCBgY2FuZGlkYXRlLmF0dHJzLmxlbmd0aCA9PT0gbmVBdHRycy5sZW5ndGhgXG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlLmF0dHJzLmV2ZXJ5KChjQXR0cikgPT4gbmVBdHRyc01hcC5nZXQoY0F0dHIubmFtZSkgPT09IGNBdHRyLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbGlkQ2FuZGlkYXRlcyArPSAxO1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZENhbmRpZGF0ZXMgPj0gTk9BSF9BUktfQ0FQQUNJVFkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNwbGljZShjYW5kaWRhdGUuaWR4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9NdXRhdGlvbnNcbiAgICBpbnNlcnRNYXJrZXIoKSB7XG4gICAgICAgIHRoaXMuZW50cmllcy51bnNoaWZ0KE1BUktFUik7XG4gICAgfVxuICAgIHB1c2hFbGVtZW50KGVsZW1lbnQsIHRva2VuKSB7XG4gICAgICAgIHRoaXMuX2Vuc3VyZU5vYWhBcmtDb25kaXRpb24oZWxlbWVudCk7XG4gICAgICAgIHRoaXMuZW50cmllcy51bnNoaWZ0KHtcbiAgICAgICAgICAgIHR5cGU6IEVudHJ5VHlwZS5FbGVtZW50LFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIHRva2VuLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5zZXJ0RWxlbWVudEFmdGVyQm9va21hcmsoZWxlbWVudCwgdG9rZW4pIHtcbiAgICAgICAgY29uc3QgYm9va21hcmtJZHggPSB0aGlzLmVudHJpZXMuaW5kZXhPZih0aGlzLmJvb2ttYXJrKTtcbiAgICAgICAgdGhpcy5lbnRyaWVzLnNwbGljZShib29rbWFya0lkeCwgMCwge1xuICAgICAgICAgICAgdHlwZTogRW50cnlUeXBlLkVsZW1lbnQsXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgdG9rZW4sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW1vdmVFbnRyeShlbnRyeSkge1xuICAgICAgICBjb25zdCBlbnRyeUluZGV4ID0gdGhpcy5lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuICAgICAgICBpZiAoZW50cnlJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGVudHJ5SW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyVG9MYXN0TWFya2VyKCkge1xuICAgICAgICBjb25zdCBtYXJrZXJJZHggPSB0aGlzLmVudHJpZXMuaW5kZXhPZihNQVJLRVIpO1xuICAgICAgICBpZiAobWFya2VySWR4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zcGxpY2UoMCwgbWFya2VySWR4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL1NlYXJjaFxuICAgIGdldEVsZW1lbnRFbnRyeUluU2NvcGVXaXRoVGFnTmFtZSh0YWdOYW1lKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSBFbnRyeVR5cGUuTWFya2VyIHx8IHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShlbnRyeS5lbGVtZW50KSA9PT0gdGFnTmFtZSk7XG4gICAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS50eXBlID09PSBFbnRyeVR5cGUuRWxlbWVudCA/IGVudHJ5IDogbnVsbDtcbiAgICB9XG4gICAgZ2V0RWxlbWVudEVudHJ5KGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5maW5kKChlbnRyeSkgPT4gZW50cnkudHlwZSA9PT0gRW50cnlUeXBlLkVsZW1lbnQgJiYgZW50cnkuZWxlbWVudCA9PT0gZWxlbWVudCk7XG4gICAgfVxufVxuZXhwb3J0cy5Gb3JtYXR0aW5nRWxlbWVudExpc3QgPSBGb3JtYXR0aW5nRWxlbWVudExpc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JtYXR0aW5nLWVsZW1lbnQtbGlzdC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUGFyc2VyID0gdm9pZCAwO1xuY29uc3QgaW5kZXhfanNfMSA9IHJlcXVpcmUoXCIuLi90b2tlbml6ZXIvaW5kZXguanNcIik7XG5jb25zdCBvcGVuX2VsZW1lbnRfc3RhY2tfanNfMSA9IHJlcXVpcmUoXCIuL29wZW4tZWxlbWVudC1zdGFjay5qc1wiKTtcbmNvbnN0IGZvcm1hdHRpbmdfZWxlbWVudF9saXN0X2pzXzEgPSByZXF1aXJlKFwiLi9mb3JtYXR0aW5nLWVsZW1lbnQtbGlzdC5qc1wiKTtcbmNvbnN0IGRlZmF1bHRfanNfMSA9IHJlcXVpcmUoXCIuLi90cmVlLWFkYXB0ZXJzL2RlZmF1bHQuanNcIik7XG5jb25zdCBkb2N0eXBlID0gcmVxdWlyZShcIi4uL2NvbW1vbi9kb2N0eXBlLmpzXCIpO1xuY29uc3QgZm9yZWlnbkNvbnRlbnQgPSByZXF1aXJlKFwiLi4vY29tbW9uL2ZvcmVpZ24tY29udGVudC5qc1wiKTtcbmNvbnN0IGVycm9yX2NvZGVzX2pzXzEgPSByZXF1aXJlKFwiLi4vY29tbW9uL2Vycm9yLWNvZGVzLmpzXCIpO1xuY29uc3QgdW5pY29kZSA9IHJlcXVpcmUoXCIuLi9jb21tb24vdW5pY29kZS5qc1wiKTtcbmNvbnN0IGh0bWxfanNfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vaHRtbC5qc1wiKTtcbmNvbnN0IHRva2VuX2pzXzEgPSByZXF1aXJlKFwiLi4vY29tbW9uL3Rva2VuLmpzXCIpO1xuLy9NaXNjIGNvbnN0YW50c1xuY29uc3QgSElEREVOX0lOUFVUX1RZUEUgPSAnaGlkZGVuJztcbi8vQWRvcHRpb24gYWdlbmN5IGxvb3BzIGl0ZXJhdGlvbiBjb3VudFxuY29uc3QgQUFfT1VURVJfTE9PUF9JVEVSID0gODtcbmNvbnN0IEFBX0lOTkVSX0xPT1BfSVRFUiA9IDM7XG4vL0luc2VydGlvbiBtb2Rlc1xudmFyIEluc2VydGlvbk1vZGU7XG4oZnVuY3Rpb24gKEluc2VydGlvbk1vZGUpIHtcbiAgICBJbnNlcnRpb25Nb2RlW0luc2VydGlvbk1vZGVbXCJJTklUSUFMXCJdID0gMF0gPSBcIklOSVRJQUxcIjtcbiAgICBJbnNlcnRpb25Nb2RlW0luc2VydGlvbk1vZGVbXCJCRUZPUkVfSFRNTFwiXSA9IDFdID0gXCJCRUZPUkVfSFRNTFwiO1xuICAgIEluc2VydGlvbk1vZGVbSW5zZXJ0aW9uTW9kZVtcIkJFRk9SRV9IRUFEXCJdID0gMl0gPSBcIkJFRk9SRV9IRUFEXCI7XG4gICAgSW5zZXJ0aW9uTW9kZVtJbnNlcnRpb25Nb2RlW1wiSU5fSEVBRFwiXSA9IDNdID0gXCJJTl9IRUFEXCI7XG4gICAgSW5zZXJ0aW9uTW9kZVtJbnNlcnRpb25Nb2RlW1wiSU5fSEVBRF9OT19TQ1JJUFRcIl0gPSA0XSA9IFwiSU5fSEVBRF9OT19TQ1JJUFRcIjtcbiAgICBJbnNlcnRpb25Nb2RlW0luc2VydGlvbk1vZGVbXCJBRlRFUl9IRUFEXCJdID0gNV0gPSBcIkFGVEVSX0hFQURcIjtcbiAgICBJbnNlcnRpb25Nb2RlW0luc2VydGlvbk1vZGVbXCJJTl9CT0RZXCJdID0gNl0gPSBcIklOX0JPRFlcIjtcbiAgICBJbnNlcnRpb25Nb2RlW0luc2VydGlvbk1vZGVbXCJURVhUXCJdID0gN10gPSBcIlRFWFRcIjtcbiAgICBJbnNlcnRpb25Nb2RlW0luc2VydGlvbk1vZGVbXCJJTl9UQUJMRVwiXSA9IDhdID0gXCJJTl9UQUJMRVwiO1xuICAgIEluc2VydGlvbk1vZGVbSW5zZXJ0aW9uTW9kZVtcIklOX1RBQkxFX1RFWFRcIl0gPSA5XSA9IFwiSU5fVEFCTEVfVEVYVFwiO1xuICAgIEluc2VydGlvbk1vZGVbSW5zZXJ0aW9uTW9kZVtcIklOX0NBUFRJT05cIl0gPSAxMF0gPSBcIklOX0NBUFRJT05cIjtcbiAgICBJbnNlcnRpb25Nb2RlW0luc2VydGlvbk1vZGVbXCJJTl9DT0xVTU5fR1JPVVBcIl0gPSAxMV0gPSBcIklOX0NPTFVNTl9HUk9VUFwiO1xuICAgIEluc2VydGlvbk1vZGVbSW5zZXJ0aW9uTW9kZVtcIklOX1RBQkxFX0JPRFlcIl0gPSAxMl0gPSBcIklOX1RBQkxFX0JPRFlcIjtcbiAgICBJbnNlcnRpb25Nb2RlW0luc2VydGlvbk1vZGVbXCJJTl9ST1dcIl0gPSAxM10gPSBcIklOX1JPV1wiO1xuICAgIEluc2VydGlvbk1vZGVbSW5zZXJ0aW9uTW9kZVtcIklOX0NFTExcIl0gPSAxNF0gPSBcIklOX0NFTExcIjtcbiAgICBJbnNlcnRpb25Nb2RlW0luc2VydGlvbk1vZGVbXCJJTl9TRUxFQ1RcIl0gPSAxNV0gPSBcIklOX1NFTEVDVFwiO1xuICAgIEluc2VydGlvbk1vZGVbSW5zZXJ0aW9uTW9kZVtcIklOX1NFTEVDVF9JTl9UQUJMRVwiXSA9IDE2XSA9IFwiSU5fU0VMRUNUX0lOX1RBQkxFXCI7XG4gICAgSW5zZXJ0aW9uTW9kZVtJbnNlcnRpb25Nb2RlW1wiSU5fVEVNUExBVEVcIl0gPSAxN10gPSBcIklOX1RFTVBMQVRFXCI7XG4gICAgSW5zZXJ0aW9uTW9kZVtJbnNlcnRpb25Nb2RlW1wiQUZURVJfQk9EWVwiXSA9IDE4XSA9IFwiQUZURVJfQk9EWVwiO1xuICAgIEluc2VydGlvbk1vZGVbSW5zZXJ0aW9uTW9kZVtcIklOX0ZSQU1FU0VUXCJdID0gMTldID0gXCJJTl9GUkFNRVNFVFwiO1xuICAgIEluc2VydGlvbk1vZGVbSW5zZXJ0aW9uTW9kZVtcIkFGVEVSX0ZSQU1FU0VUXCJdID0gMjBdID0gXCJBRlRFUl9GUkFNRVNFVFwiO1xuICAgIEluc2VydGlvbk1vZGVbSW5zZXJ0aW9uTW9kZVtcIkFGVEVSX0FGVEVSX0JPRFlcIl0gPSAyMV0gPSBcIkFGVEVSX0FGVEVSX0JPRFlcIjtcbiAgICBJbnNlcnRpb25Nb2RlW0luc2VydGlvbk1vZGVbXCJBRlRFUl9BRlRFUl9GUkFNRVNFVFwiXSA9IDIyXSA9IFwiQUZURVJfQUZURVJfRlJBTUVTRVRcIjtcbn0pKEluc2VydGlvbk1vZGUgfHwgKEluc2VydGlvbk1vZGUgPSB7fSkpO1xuY29uc3QgQkFTRV9MT0MgPSB7XG4gICAgc3RhcnRMaW5lOiAtMSxcbiAgICBzdGFydENvbDogLTEsXG4gICAgc3RhcnRPZmZzZXQ6IC0xLFxuICAgIGVuZExpbmU6IC0xLFxuICAgIGVuZENvbDogLTEsXG4gICAgZW5kT2Zmc2V0OiAtMSxcbn07XG5jb25zdCBUQUJMRV9TVFJVQ1RVUkVfVEFHUyA9IG5ldyBTZXQoW2h0bWxfanNfMS5UQUdfSUQuVEFCTEUsIGh0bWxfanNfMS5UQUdfSUQuVEJPRFksIGh0bWxfanNfMS5UQUdfSUQuVEZPT1QsIGh0bWxfanNfMS5UQUdfSUQuVEhFQUQsIGh0bWxfanNfMS5UQUdfSUQuVFJdKTtcbmNvbnN0IGRlZmF1bHRQYXJzZXJPcHRpb25zID0ge1xuICAgIHNjcmlwdGluZ0VuYWJsZWQ6IHRydWUsXG4gICAgc291cmNlQ29kZUxvY2F0aW9uSW5mbzogZmFsc2UsXG4gICAgdHJlZUFkYXB0ZXI6IGRlZmF1bHRfanNfMS5kZWZhdWx0VHJlZUFkYXB0ZXIsXG4gICAgb25QYXJzZUVycm9yOiBudWxsLFxufTtcbi8vUGFyc2VyXG5jbGFzcyBQYXJzZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGRvY3VtZW50LCBmcmFnbWVudENvbnRleHQgPSBudWxsLCBzY3JpcHRIYW5kbGVyID0gbnVsbCkge1xuICAgICAgICB0aGlzLmZyYWdtZW50Q29udGV4dCA9IGZyYWdtZW50Q29udGV4dDtcbiAgICAgICAgdGhpcy5zY3JpcHRIYW5kbGVyID0gc2NyaXB0SGFuZGxlcjtcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4gPSBudWxsO1xuICAgICAgICB0aGlzLnN0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTklUSUFMO1xuICAgICAgICB0aGlzLm9yaWdpbmFsSW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5JVElBTDtcbiAgICAgICAgdGhpcy5oZWFkRWxlbWVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9ybUVsZW1lbnQgPSBudWxsO1xuICAgICAgICAvKiogSW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBub3QgYW4gZWxlbWVudCBpbiB0aGUgSFRNTCBuYW1lc3BhY2UgKi9cbiAgICAgICAgdGhpcy5jdXJyZW50Tm90SW5IVE1MID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdGVtcGxhdGUgaW5zZXJ0aW9uIG1vZGUgc3RhY2sgaXMgbWFpbnRhaW5lZCBmcm9tIHRoZSBsZWZ0LlxuICAgICAgICAgKiBJZS4gdGhlIHRvcG1vc3QgZWxlbWVudCB3aWxsIGFsd2F5cyBoYXZlIGluZGV4IDAuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2sgPSBbXTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQ2hhcmFjdGVyVG9rZW5zID0gW107XG4gICAgICAgIHRoaXMuaGFzTm9uV2hpdGVzcGFjZVBlbmRpbmdDaGFyYWN0ZXJUb2tlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZyYW1lc2V0T2sgPSB0cnVlO1xuICAgICAgICB0aGlzLnNraXBOZXh0TmV3TGluZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvc3RlclBhcmVudGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UGFyc2VyT3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnRyZWVBZGFwdGVyID0gdGhpcy5vcHRpb25zLnRyZWVBZGFwdGVyO1xuICAgICAgICB0aGlzLm9uUGFyc2VFcnJvciA9IHRoaXMub3B0aW9ucy5vblBhcnNlRXJyb3I7XG4gICAgICAgIC8vIEFsd2F5cyBlbmFibGUgbG9jYXRpb24gaW5mbyBpZiB3ZSByZXBvcnQgcGFyc2UgZXJyb3JzLlxuICAgICAgICBpZiAodGhpcy5vblBhcnNlRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zb3VyY2VDb2RlTG9jYXRpb25JbmZvID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQgIT09IG51bGwgJiYgZG9jdW1lbnQgIT09IHZvaWQgMCA/IGRvY3VtZW50IDogdGhpcy50cmVlQWRhcHRlci5jcmVhdGVEb2N1bWVudCgpO1xuICAgICAgICB0aGlzLnRva2VuaXplciA9IG5ldyBpbmRleF9qc18xLlRva2VuaXplcih0aGlzLm9wdGlvbnMsIHRoaXMpO1xuICAgICAgICB0aGlzLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cyA9IG5ldyBmb3JtYXR0aW5nX2VsZW1lbnRfbGlzdF9qc18xLkZvcm1hdHRpbmdFbGVtZW50TGlzdCh0aGlzLnRyZWVBZGFwdGVyKTtcbiAgICAgICAgdGhpcy5mcmFnbWVudENvbnRleHRJRCA9IGZyYWdtZW50Q29udGV4dCA/ICgwLCBodG1sX2pzXzEuZ2V0VGFnSUQpKHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShmcmFnbWVudENvbnRleHQpKSA6IGh0bWxfanNfMS5UQUdfSUQuVU5LTk9XTjtcbiAgICAgICAgdGhpcy5fc2V0Q29udGV4dE1vZGVzKGZyYWdtZW50Q29udGV4dCAhPT0gbnVsbCAmJiBmcmFnbWVudENvbnRleHQgIT09IHZvaWQgMCA/IGZyYWdtZW50Q29udGV4dCA6IHRoaXMuZG9jdW1lbnQsIHRoaXMuZnJhZ21lbnRDb250ZXh0SUQpO1xuICAgICAgICB0aGlzLm9wZW5FbGVtZW50cyA9IG5ldyBvcGVuX2VsZW1lbnRfc3RhY2tfanNfMS5PcGVuRWxlbWVudFN0YWNrKHRoaXMuZG9jdW1lbnQsIHRoaXMudHJlZUFkYXB0ZXIsIHRoaXMpO1xuICAgIH1cbiAgICAvLyBBUElcbiAgICBzdGF0aWMgcGFyc2UoaHRtbCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgdGhpcyhvcHRpb25zKTtcbiAgICAgICAgcGFyc2VyLnRva2VuaXplci53cml0ZShodG1sLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlci5kb2N1bWVudDtcbiAgICB9XG4gICAgc3RhdGljIGdldEZyYWdtZW50UGFyc2VyKGZyYWdtZW50Q29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UGFyc2VyT3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICAvL05PVEU6IHVzZSBhIDx0ZW1wbGF0ZT4gZWxlbWVudCBhcyB0aGUgZnJhZ21lbnQgY29udGV4dCBpZiBubyBjb250ZXh0IGVsZW1lbnQgd2FzIHByb3ZpZGVkLFxuICAgICAgICAvL3NvIHdlIHdpbGwgcGFyc2UgaW4gYSBcImZvcmdpdmluZ1wiIG1hbm5lclxuICAgICAgICBmcmFnbWVudENvbnRleHQgIT09IG51bGwgJiYgZnJhZ21lbnRDb250ZXh0ICE9PSB2b2lkIDAgPyBmcmFnbWVudENvbnRleHQgOiAoZnJhZ21lbnRDb250ZXh0ID0gb3B0cy50cmVlQWRhcHRlci5jcmVhdGVFbGVtZW50KGh0bWxfanNfMS5UQUdfTkFNRVMuVEVNUExBVEUsIGh0bWxfanNfMS5OUy5IVE1MLCBbXSkpO1xuICAgICAgICAvL05PVEU6IGNyZWF0ZSBhIGZha2UgZWxlbWVudCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgdGhlIGBkb2N1bWVudGAgZm9yIGZyYWdtZW50IHBhcnNpbmcuXG4gICAgICAgIC8vVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGpzZG9tLCB3aGVyZSBhIG5ldyBgZG9jdW1lbnRgIGNhbm5vdCBiZSBjcmVhdGVkLiBUaGlzIGxlZCB0b1xuICAgICAgICAvL2ZyYWdtZW50IHBhcnNpbmcgbWVzc2luZyB3aXRoIHRoZSBtYWluIGBkb2N1bWVudGAuXG4gICAgICAgIGNvbnN0IGRvY3VtZW50TW9jayA9IG9wdHMudHJlZUFkYXB0ZXIuY3JlYXRlRWxlbWVudCgnZG9jdW1lbnRtb2NrJywgaHRtbF9qc18xLk5TLkhUTUwsIFtdKTtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IHRoaXMob3B0cywgZG9jdW1lbnRNb2NrLCBmcmFnbWVudENvbnRleHQpO1xuICAgICAgICBpZiAocGFyc2VyLmZyYWdtZW50Q29udGV4dElEID09PSBodG1sX2pzXzEuVEFHX0lELlRFTVBMQVRFKSB7XG4gICAgICAgICAgICBwYXJzZXIudG1wbEluc2VydGlvbk1vZGVTdGFjay51bnNoaWZ0KEluc2VydGlvbk1vZGUuSU5fVEVNUExBVEUpO1xuICAgICAgICB9XG4gICAgICAgIHBhcnNlci5faW5pdFRva2VuaXplckZvckZyYWdtZW50UGFyc2luZygpO1xuICAgICAgICBwYXJzZXIuX2luc2VydEZha2VSb290RWxlbWVudCgpO1xuICAgICAgICBwYXJzZXIuX3Jlc2V0SW5zZXJ0aW9uTW9kZSgpO1xuICAgICAgICBwYXJzZXIuX2ZpbmRGb3JtSW5GcmFnbWVudENvbnRleHQoKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlcjtcbiAgICB9XG4gICAgZ2V0RnJhZ21lbnQoKSB7XG4gICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gdGhpcy50cmVlQWRhcHRlci5nZXRGaXJzdENoaWxkKHRoaXMuZG9jdW1lbnQpO1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IHRoaXMudHJlZUFkYXB0ZXIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICB0aGlzLl9hZG9wdE5vZGVzKHJvb3RFbGVtZW50LCBmcmFnbWVudCk7XG4gICAgICAgIHJldHVybiBmcmFnbWVudDtcbiAgICB9XG4gICAgLy9FcnJvcnNcbiAgICBfZXJyKHRva2VuLCBjb2RlLCBiZWZvcmVUb2tlbikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy5vblBhcnNlRXJyb3IpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGxvYyA9IChfYSA9IHRva2VuLmxvY2F0aW9uKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBCQVNFX0xPQztcbiAgICAgICAgY29uc3QgZXJyID0ge1xuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIHN0YXJ0TGluZTogbG9jLnN0YXJ0TGluZSxcbiAgICAgICAgICAgIHN0YXJ0Q29sOiBsb2Muc3RhcnRDb2wsXG4gICAgICAgICAgICBzdGFydE9mZnNldDogbG9jLnN0YXJ0T2Zmc2V0LFxuICAgICAgICAgICAgZW5kTGluZTogYmVmb3JlVG9rZW4gPyBsb2Muc3RhcnRMaW5lIDogbG9jLmVuZExpbmUsXG4gICAgICAgICAgICBlbmRDb2w6IGJlZm9yZVRva2VuID8gbG9jLnN0YXJ0Q29sIDogbG9jLmVuZENvbCxcbiAgICAgICAgICAgIGVuZE9mZnNldDogYmVmb3JlVG9rZW4gPyBsb2Muc3RhcnRPZmZzZXQgOiBsb2MuZW5kT2Zmc2V0LFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uUGFyc2VFcnJvcihlcnIpO1xuICAgIH1cbiAgICAvL1N0YWNrIGV2ZW50c1xuICAgIG9uSXRlbVB1c2gobm9kZSwgdGlkLCBpc1RvcCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAoX2IgPSAoX2EgPSB0aGlzLnRyZWVBZGFwdGVyKS5vbkl0ZW1QdXNoKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgbm9kZSk7XG4gICAgICAgIGlmIChpc1RvcCAmJiB0aGlzLm9wZW5FbGVtZW50cy5zdGFja1RvcCA+IDApXG4gICAgICAgICAgICB0aGlzLl9zZXRDb250ZXh0TW9kZXMobm9kZSwgdGlkKTtcbiAgICB9XG4gICAgb25JdGVtUG9wKG5vZGUsIGlzVG9wKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc291cmNlQ29kZUxvY2F0aW9uSW5mbykge1xuICAgICAgICAgICAgdGhpcy5fc2V0RW5kTG9jYXRpb24obm9kZSwgdGhpcy5jdXJyZW50VG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIChfYiA9IChfYSA9IHRoaXMudHJlZUFkYXB0ZXIpLm9uSXRlbVBvcCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIG5vZGUsIHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnQpO1xuICAgICAgICBpZiAoaXNUb3ApIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50O1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRUYWdJZDtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5FbGVtZW50cy5zdGFja1RvcCA9PT0gMCAmJiB0aGlzLmZyYWdtZW50Q29udGV4dCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLmZyYWdtZW50Q29udGV4dDtcbiAgICAgICAgICAgICAgICBjdXJyZW50VGFnSWQgPSB0aGlzLmZyYWdtZW50Q29udGV4dElEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgKHsgY3VycmVudCwgY3VycmVudFRhZ0lkIH0gPSB0aGlzLm9wZW5FbGVtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zZXRDb250ZXh0TW9kZXMoY3VycmVudCwgY3VycmVudFRhZ0lkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfc2V0Q29udGV4dE1vZGVzKGN1cnJlbnQsIHRpZCkge1xuICAgICAgICBjb25zdCBpc0hUTUwgPSBjdXJyZW50ID09PSB0aGlzLmRvY3VtZW50IHx8IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKGN1cnJlbnQpID09PSBodG1sX2pzXzEuTlMuSFRNTDtcbiAgICAgICAgdGhpcy5jdXJyZW50Tm90SW5IVE1MID0gIWlzSFRNTDtcbiAgICAgICAgdGhpcy50b2tlbml6ZXIuaW5Gb3JlaWduTm9kZSA9ICFpc0hUTUwgJiYgIXRoaXMuX2lzSW50ZWdyYXRpb25Qb2ludCh0aWQsIGN1cnJlbnQpO1xuICAgIH1cbiAgICBfc3dpdGNoVG9UZXh0UGFyc2luZyhjdXJyZW50VG9rZW4sIG5leHRUb2tlbml6ZXJTdGF0ZSkge1xuICAgICAgICB0aGlzLl9pbnNlcnRFbGVtZW50KGN1cnJlbnRUb2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgICAgICB0aGlzLnRva2VuaXplci5zdGF0ZSA9IG5leHRUb2tlbml6ZXJTdGF0ZTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbEluc2VydGlvbk1vZGUgPSB0aGlzLmluc2VydGlvbk1vZGU7XG4gICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuVEVYVDtcbiAgICB9XG4gICAgc3dpdGNoVG9QbGFpbnRleHRQYXJzaW5nKCkge1xuICAgICAgICB0aGlzLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLlRFWFQ7XG4gICAgICAgIHRoaXMub3JpZ2luYWxJbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9CT0RZO1xuICAgICAgICB0aGlzLnRva2VuaXplci5zdGF0ZSA9IGluZGV4X2pzXzEuVG9rZW5pemVyTW9kZS5QTEFJTlRFWFQ7XG4gICAgfVxuICAgIC8vRnJhZ21lbnQgcGFyc2luZ1xuICAgIF9nZXRBZGp1c3RlZEN1cnJlbnRFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVuRWxlbWVudHMuc3RhY2tUb3AgPT09IDAgJiYgdGhpcy5mcmFnbWVudENvbnRleHRcbiAgICAgICAgICAgID8gdGhpcy5mcmFnbWVudENvbnRleHRcbiAgICAgICAgICAgIDogdGhpcy5vcGVuRWxlbWVudHMuY3VycmVudDtcbiAgICB9XG4gICAgX2ZpbmRGb3JtSW5GcmFnbWVudENvbnRleHQoKSB7XG4gICAgICAgIGxldCBub2RlID0gdGhpcy5mcmFnbWVudENvbnRleHQ7XG4gICAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50cmVlQWRhcHRlci5nZXRUYWdOYW1lKG5vZGUpID09PSBodG1sX2pzXzEuVEFHX05BTUVTLkZPUk0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1FbGVtZW50ID0gbm9kZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUgPSB0aGlzLnRyZWVBZGFwdGVyLmdldFBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2luaXRUb2tlbml6ZXJGb3JGcmFnbWVudFBhcnNpbmcoKSB7XG4gICAgICAgIGlmICghdGhpcy5mcmFnbWVudENvbnRleHQgfHwgdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkodGhpcy5mcmFnbWVudENvbnRleHQpICE9PSBodG1sX2pzXzEuTlMuSFRNTCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGhpcy5mcmFnbWVudENvbnRleHRJRCkge1xuICAgICAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRJVExFOlxuICAgICAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRFWFRBUkVBOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbml6ZXIuc3RhdGUgPSBpbmRleF9qc18xLlRva2VuaXplck1vZGUuUkNEQVRBO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlNUWUxFOlxuICAgICAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlhNUDpcbiAgICAgICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5JRlJBTUU6XG4gICAgICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTk9FTUJFRDpcbiAgICAgICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5OT0ZSQU1FUzpcbiAgICAgICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5OT1NDUklQVDoge1xuICAgICAgICAgICAgICAgIHRoaXMudG9rZW5pemVyLnN0YXRlID0gaW5kZXhfanNfMS5Ub2tlbml6ZXJNb2RlLlJBV1RFWFQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuU0NSSVBUOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbml6ZXIuc3RhdGUgPSBpbmRleF9qc18xLlRva2VuaXplck1vZGUuU0NSSVBUX0RBVEE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuUExBSU5URVhUOiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbml6ZXIuc3RhdGUgPSBpbmRleF9qc18xLlRva2VuaXplck1vZGUuUExBSU5URVhUO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL1RyZWUgbXV0YXRpb25cbiAgICBfc2V0RG9jdW1lbnRUeXBlKHRva2VuKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0b2tlbi5uYW1lIHx8ICcnO1xuICAgICAgICBjb25zdCBwdWJsaWNJZCA9IHRva2VuLnB1YmxpY0lkIHx8ICcnO1xuICAgICAgICBjb25zdCBzeXN0ZW1JZCA9IHRva2VuLnN5c3RlbUlkIHx8ICcnO1xuICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLnNldERvY3VtZW50VHlwZSh0aGlzLmRvY3VtZW50LCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpO1xuICAgICAgICBpZiAodG9rZW4ubG9jYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50Q2hpbGRyZW4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldENoaWxkTm9kZXModGhpcy5kb2N1bWVudCk7XG4gICAgICAgICAgICBjb25zdCBkb2NUeXBlTm9kZSA9IGRvY3VtZW50Q2hpbGRyZW4uZmluZCgobm9kZSkgPT4gdGhpcy50cmVlQWRhcHRlci5pc0RvY3VtZW50VHlwZU5vZGUobm9kZSkpO1xuICAgICAgICAgICAgaWYgKGRvY1R5cGVOb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5zZXROb2RlU291cmNlQ29kZUxvY2F0aW9uKGRvY1R5cGVOb2RlLCB0b2tlbi5sb2NhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2F0dGFjaEVsZW1lbnRUb1RyZWUoZWxlbWVudCwgbG9jYXRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zb3VyY2VDb2RlTG9jYXRpb25JbmZvKSB7XG4gICAgICAgICAgICBjb25zdCBsb2MgPSBsb2NhdGlvbiAmJiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGxvY2F0aW9uKSwgeyBzdGFydFRhZzogbG9jYXRpb24gfSk7XG4gICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLnNldE5vZGVTb3VyY2VDb2RlTG9jYXRpb24oZWxlbWVudCwgbG9jKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2hvdWxkRm9zdGVyUGFyZW50T25JbnNlcnRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5fZm9zdGVyUGFyZW50RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnRUbXBsQ29udGVudE9yTm9kZTtcbiAgICAgICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuYXBwZW5kQ2hpbGQocGFyZW50LCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfYXBwZW5kRWxlbWVudCh0b2tlbiwgbmFtZXNwYWNlVVJJKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRyZWVBZGFwdGVyLmNyZWF0ZUVsZW1lbnQodG9rZW4udGFnTmFtZSwgbmFtZXNwYWNlVVJJLCB0b2tlbi5hdHRycyk7XG4gICAgICAgIHRoaXMuX2F0dGFjaEVsZW1lbnRUb1RyZWUoZWxlbWVudCwgdG9rZW4ubG9jYXRpb24pO1xuICAgIH1cbiAgICBfaW5zZXJ0RWxlbWVudCh0b2tlbiwgbmFtZXNwYWNlVVJJKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRyZWVBZGFwdGVyLmNyZWF0ZUVsZW1lbnQodG9rZW4udGFnTmFtZSwgbmFtZXNwYWNlVVJJLCB0b2tlbi5hdHRycyk7XG4gICAgICAgIHRoaXMuX2F0dGFjaEVsZW1lbnRUb1RyZWUoZWxlbWVudCwgdG9rZW4ubG9jYXRpb24pO1xuICAgICAgICB0aGlzLm9wZW5FbGVtZW50cy5wdXNoKGVsZW1lbnQsIHRva2VuLnRhZ0lEKTtcbiAgICB9XG4gICAgX2luc2VydEZha2VFbGVtZW50KHRhZ05hbWUsIHRhZ0lEKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRyZWVBZGFwdGVyLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSwgaHRtbF9qc18xLk5TLkhUTUwsIFtdKTtcbiAgICAgICAgdGhpcy5fYXR0YWNoRWxlbWVudFRvVHJlZShlbGVtZW50LCBudWxsKTtcbiAgICAgICAgdGhpcy5vcGVuRWxlbWVudHMucHVzaChlbGVtZW50LCB0YWdJRCk7XG4gICAgfVxuICAgIF9pbnNlcnRUZW1wbGF0ZSh0b2tlbikge1xuICAgICAgICBjb25zdCB0bXBsID0gdGhpcy50cmVlQWRhcHRlci5jcmVhdGVFbGVtZW50KHRva2VuLnRhZ05hbWUsIGh0bWxfanNfMS5OUy5IVE1MLCB0b2tlbi5hdHRycyk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnRyZWVBZGFwdGVyLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgdGhpcy50cmVlQWRhcHRlci5zZXRUZW1wbGF0ZUNvbnRlbnQodG1wbCwgY29udGVudCk7XG4gICAgICAgIHRoaXMuX2F0dGFjaEVsZW1lbnRUb1RyZWUodG1wbCwgdG9rZW4ubG9jYXRpb24pO1xuICAgICAgICB0aGlzLm9wZW5FbGVtZW50cy5wdXNoKHRtcGwsIHRva2VuLnRhZ0lEKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zb3VyY2VDb2RlTG9jYXRpb25JbmZvKVxuICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5zZXROb2RlU291cmNlQ29kZUxvY2F0aW9uKGNvbnRlbnQsIG51bGwpO1xuICAgIH1cbiAgICBfaW5zZXJ0RmFrZVJvb3RFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy50cmVlQWRhcHRlci5jcmVhdGVFbGVtZW50KGh0bWxfanNfMS5UQUdfTkFNRVMuSFRNTCwgaHRtbF9qc18xLk5TLkhUTUwsIFtdKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zb3VyY2VDb2RlTG9jYXRpb25JbmZvKVxuICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5zZXROb2RlU291cmNlQ29kZUxvY2F0aW9uKGVsZW1lbnQsIG51bGwpO1xuICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmFwcGVuZENoaWxkKHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnQsIGVsZW1lbnQpO1xuICAgICAgICB0aGlzLm9wZW5FbGVtZW50cy5wdXNoKGVsZW1lbnQsIGh0bWxfanNfMS5UQUdfSUQuSFRNTCk7XG4gICAgfVxuICAgIF9hcHBlbmRDb21tZW50Tm9kZSh0b2tlbiwgcGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbW1lbnROb2RlID0gdGhpcy50cmVlQWRhcHRlci5jcmVhdGVDb21tZW50Tm9kZSh0b2tlbi5kYXRhKTtcbiAgICAgICAgdGhpcy50cmVlQWRhcHRlci5hcHBlbmRDaGlsZChwYXJlbnQsIGNvbW1lbnROb2RlKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zb3VyY2VDb2RlTG9jYXRpb25JbmZvKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLnNldE5vZGVTb3VyY2VDb2RlTG9jYXRpb24oY29tbWVudE5vZGUsIHRva2VuLmxvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfaW5zZXJ0Q2hhcmFjdGVycyh0b2tlbikge1xuICAgICAgICBsZXQgcGFyZW50O1xuICAgICAgICBsZXQgYmVmb3JlRWxlbWVudDtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3VsZEZvc3RlclBhcmVudE9uSW5zZXJ0aW9uKCkpIHtcbiAgICAgICAgICAgICh7IHBhcmVudCwgYmVmb3JlRWxlbWVudCB9ID0gdGhpcy5fZmluZEZvc3RlclBhcmVudGluZ0xvY2F0aW9uKCkpO1xuICAgICAgICAgICAgaWYgKGJlZm9yZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmluc2VydFRleHRCZWZvcmUocGFyZW50LCB0b2tlbi5jaGFycywgYmVmb3JlRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmluc2VydFRleHQocGFyZW50LCB0b2tlbi5jaGFycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXJlbnQgPSB0aGlzLm9wZW5FbGVtZW50cy5jdXJyZW50VG1wbENvbnRlbnRPck5vZGU7XG4gICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmluc2VydFRleHQocGFyZW50LCB0b2tlbi5jaGFycyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0b2tlbi5sb2NhdGlvbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3Qgc2libGluZ3MgPSB0aGlzLnRyZWVBZGFwdGVyLmdldENoaWxkTm9kZXMocGFyZW50KTtcbiAgICAgICAgY29uc3QgdGV4dE5vZGVJZHggPSBiZWZvcmVFbGVtZW50ID8gc2libGluZ3MubGFzdEluZGV4T2YoYmVmb3JlRWxlbWVudCkgOiBzaWJsaW5ncy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gc2libGluZ3NbdGV4dE5vZGVJZHggLSAxXTtcbiAgICAgICAgLy9OT1RFOiBpZiB3ZSBoYXZlIGEgbG9jYXRpb24gYXNzaWduZWQgYnkgYW5vdGhlciB0b2tlbiwgdGhlbiBqdXN0IHVwZGF0ZSB0aGUgZW5kIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHRuTG9jID0gdGhpcy50cmVlQWRhcHRlci5nZXROb2RlU291cmNlQ29kZUxvY2F0aW9uKHRleHROb2RlKTtcbiAgICAgICAgaWYgKHRuTG9jKSB7XG4gICAgICAgICAgICBjb25zdCB7IGVuZExpbmUsIGVuZENvbCwgZW5kT2Zmc2V0IH0gPSB0b2tlbi5sb2NhdGlvbjtcbiAgICAgICAgICAgIHRoaXMudHJlZUFkYXB0ZXIudXBkYXRlTm9kZVNvdXJjZUNvZGVMb2NhdGlvbih0ZXh0Tm9kZSwgeyBlbmRMaW5lLCBlbmRDb2wsIGVuZE9mZnNldCB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc291cmNlQ29kZUxvY2F0aW9uSW5mbykge1xuICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5zZXROb2RlU291cmNlQ29kZUxvY2F0aW9uKHRleHROb2RlLCB0b2tlbi5sb2NhdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2Fkb3B0Tm9kZXMoZG9ub3IsIHJlY2lwaWVudCkge1xuICAgICAgICBmb3IgKGxldCBjaGlsZCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0Rmlyc3RDaGlsZChkb25vcik7IGNoaWxkOyBjaGlsZCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0Rmlyc3RDaGlsZChkb25vcikpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuZGV0YWNoTm9kZShjaGlsZCk7XG4gICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmFwcGVuZENoaWxkKHJlY2lwaWVudCwgY2hpbGQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9zZXRFbmRMb2NhdGlvbihlbGVtZW50LCBjbG9zaW5nVG9rZW4pIHtcbiAgICAgICAgaWYgKHRoaXMudHJlZUFkYXB0ZXIuZ2V0Tm9kZVNvdXJjZUNvZGVMb2NhdGlvbihlbGVtZW50KSAmJiBjbG9zaW5nVG9rZW4ubG9jYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGN0TG9jID0gY2xvc2luZ1Rva2VuLmxvY2F0aW9uO1xuICAgICAgICAgICAgY29uc3QgdG4gPSB0aGlzLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUoZWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBlbmRMb2MgPSBcbiAgICAgICAgICAgIC8vIE5PVEU6IEZvciBjYXNlcyBsaWtlIDxwPiA8cD4gPC9wPiAtIEZpcnN0ICdwJyBjbG9zZXMgd2l0aG91dCBhIGNsb3NpbmdcbiAgICAgICAgICAgIC8vIHRhZyBhbmQgZm9yIGNhc2VzIGxpa2UgPHRkPiA8cD4gPC90ZD4gLSAncCcgY2xvc2VzIHdpdGhvdXQgYSBjbG9zaW5nIHRhZy5cbiAgICAgICAgICAgIGNsb3NpbmdUb2tlbi50eXBlID09PSB0b2tlbl9qc18xLlRva2VuVHlwZS5FTkRfVEFHICYmIHRuID09PSBjbG9zaW5nVG9rZW4udGFnTmFtZVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBlbmRUYWc6IE9iamVjdC5hc3NpZ24oe30sIGN0TG9jKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kTGluZTogY3RMb2MuZW5kTGluZSxcbiAgICAgICAgICAgICAgICAgICAgZW5kQ29sOiBjdExvYy5lbmRDb2wsXG4gICAgICAgICAgICAgICAgICAgIGVuZE9mZnNldDogY3RMb2MuZW5kT2Zmc2V0LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgZW5kTGluZTogY3RMb2Muc3RhcnRMaW5lLFxuICAgICAgICAgICAgICAgICAgICBlbmRDb2w6IGN0TG9jLnN0YXJ0Q29sLFxuICAgICAgICAgICAgICAgICAgICBlbmRPZmZzZXQ6IGN0TG9jLnN0YXJ0T2Zmc2V0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLnVwZGF0ZU5vZGVTb3VyY2VDb2RlTG9jYXRpb24oZWxlbWVudCwgZW5kTG9jKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL1Rva2VuIHByb2Nlc3NpbmdcbiAgICBzaG91bGRQcm9jZXNzU3RhcnRUYWdUb2tlbkluRm9yZWlnbkNvbnRlbnQodG9rZW4pIHtcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCBuZWl0aGVyIGN1cnJlbnQgPT09IGRvY3VtZW50LCBvciBucyA9PT0gTlMuSFRNTFxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudE5vdEluSFRNTClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGN1cnJlbnQ7XG4gICAgICAgIGxldCBjdXJyZW50VGFnSWQ7XG4gICAgICAgIGlmICh0aGlzLm9wZW5FbGVtZW50cy5zdGFja1RvcCA9PT0gMCAmJiB0aGlzLmZyYWdtZW50Q29udGV4dCkge1xuICAgICAgICAgICAgY3VycmVudCA9IHRoaXMuZnJhZ21lbnRDb250ZXh0O1xuICAgICAgICAgICAgY3VycmVudFRhZ0lkID0gdGhpcy5mcmFnbWVudENvbnRleHRJRDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICh7IGN1cnJlbnQsIGN1cnJlbnRUYWdJZCB9ID0gdGhpcy5vcGVuRWxlbWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbi50YWdJRCA9PT0gaHRtbF9qc18xLlRBR19JRC5TVkcgJiZcbiAgICAgICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShjdXJyZW50KSA9PT0gaHRtbF9qc18xLlRBR19OQU1FUy5BTk5PVEFUSU9OX1hNTCAmJlxuICAgICAgICAgICAgdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkoY3VycmVudCkgPT09IGh0bWxfanNfMS5OUy5NQVRITUwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAvLyBDaGVjayB0aGF0IGBjdXJyZW50YCBpcyBub3QgYW4gaW50ZWdyYXRpb24gcG9pbnQgZm9yIEhUTUwgb3IgTWF0aE1MIGVsZW1lbnRzLlxuICAgICAgICB0aGlzLnRva2VuaXplci5pbkZvcmVpZ25Ob2RlIHx8XG4gICAgICAgICAgICAvLyBJZiBpdCBfaXNfIGFuIGludGVncmF0aW9uIHBvaW50LCB0aGVuIHdlIG1pZ2h0IGhhdmUgdG8gY2hlY2sgdGhhdCBpdCBpcyBub3QgYW4gSFRNTFxuICAgICAgICAgICAgLy8gaW50ZWdyYXRpb24gcG9pbnQuXG4gICAgICAgICAgICAoKHRva2VuLnRhZ0lEID09PSBodG1sX2pzXzEuVEFHX0lELk1HTFlQSCB8fCB0b2tlbi50YWdJRCA9PT0gaHRtbF9qc18xLlRBR19JRC5NQUxJR05NQVJLKSAmJlxuICAgICAgICAgICAgICAgICF0aGlzLl9pc0ludGVncmF0aW9uUG9pbnQoY3VycmVudFRhZ0lkLCBjdXJyZW50LCBodG1sX2pzXzEuTlMuSFRNTCkpKTtcbiAgICB9XG4gICAgX3Byb2Nlc3NUb2tlbih0b2tlbikge1xuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgdG9rZW5fanNfMS5Ub2tlblR5cGUuQ0hBUkFDVEVSOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYXJhY3Rlcih0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHRva2VuX2pzXzEuVG9rZW5UeXBlLk5VTExfQ0hBUkFDVEVSOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk51bGxDaGFyYWN0ZXIodG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB0b2tlbl9qc18xLlRva2VuVHlwZS5DT01NRU5UOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNvbW1lbnQodG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB0b2tlbl9qc18xLlRva2VuVHlwZS5ET0NUWVBFOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRvY3R5cGUodG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB0b2tlbl9qc18xLlRva2VuVHlwZS5TVEFSVF9UQUc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzU3RhcnRUYWcodG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB0b2tlbl9qc18xLlRva2VuVHlwZS5FTkRfVEFHOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVuZFRhZyh0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHRva2VuX2pzXzEuVG9rZW5UeXBlLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMub25Fb2YodG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB0b2tlbl9qc18xLlRva2VuVHlwZS5XSElURVNQQUNFX0NIQVJBQ1RFUjoge1xuICAgICAgICAgICAgICAgIHRoaXMub25XaGl0ZXNwYWNlQ2hhcmFjdGVyKHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvL0ludGVncmF0aW9uIHBvaW50c1xuICAgIF9pc0ludGVncmF0aW9uUG9pbnQodGlkLCBlbGVtZW50LCBmb3JlaWduTlMpIHtcbiAgICAgICAgY29uc3QgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgYXR0cnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldEF0dHJMaXN0KGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gZm9yZWlnbkNvbnRlbnQuaXNJbnRlZ3JhdGlvblBvaW50KHRpZCwgbnMsIGF0dHJzLCBmb3JlaWduTlMpO1xuICAgIH1cbiAgICAvL0FjdGl2ZSBmb3JtYXR0aW5nIGVsZW1lbnRzIHJlY29uc3RydWN0aW9uXG4gICAgX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkge1xuICAgICAgICBjb25zdCBsaXN0TGVuZ3RoID0gdGhpcy5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuZW50cmllcy5sZW5ndGg7XG4gICAgICAgIGlmIChsaXN0TGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHRoaXMuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkudHlwZSA9PT0gZm9ybWF0dGluZ19lbGVtZW50X2xpc3RfanNfMS5FbnRyeVR5cGUuTWFya2VyIHx8IHRoaXMub3BlbkVsZW1lbnRzLmNvbnRhaW5zKGVudHJ5LmVsZW1lbnQpKTtcbiAgICAgICAgICAgIGNvbnN0IHVub3BlbklkeCA9IGVuZEluZGV4IDwgMCA/IGxpc3RMZW5ndGggLSAxIDogZW5kSW5kZXggLSAxO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHVub3BlbklkeDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmVudHJpZXNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0RWxlbWVudChlbnRyeS50b2tlbiwgdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkoZW50cnkuZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgIGVudHJ5LmVsZW1lbnQgPSB0aGlzLm9wZW5FbGVtZW50cy5jdXJyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vQ2xvc2UgZWxlbWVudHNcbiAgICBfY2xvc2VUYWJsZUNlbGwoKSB7XG4gICAgICAgIHRoaXMub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKTtcbiAgICAgICAgdGhpcy5vcGVuRWxlbWVudHMucG9wVW50aWxUYWJsZUNlbGxQb3BwZWQoKTtcbiAgICAgICAgdGhpcy5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuY2xlYXJUb0xhc3RNYXJrZXIoKTtcbiAgICAgICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9ST1c7XG4gICAgfVxuICAgIF9jbG9zZVBFbGVtZW50KCkge1xuICAgICAgICB0aGlzLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzV2l0aEV4Y2x1c2lvbihodG1sX2pzXzEuVEFHX0lELlApO1xuICAgICAgICB0aGlzLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoaHRtbF9qc18xLlRBR19JRC5QKTtcbiAgICB9XG4gICAgLy9JbnNlcnRpb24gbW9kZXNcbiAgICBfcmVzZXRJbnNlcnRpb25Nb2RlKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5vcGVuRWxlbWVudHMuc3RhY2tUb3A7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAvL0luc2VydGlvbiBtb2RlIHJlc2V0IG1hcFxuICAgICAgICAgICAgc3dpdGNoIChpID09PSAwICYmIHRoaXMuZnJhZ21lbnRDb250ZXh0ID8gdGhpcy5mcmFnbWVudENvbnRleHRJRCA6IHRoaXMub3BlbkVsZW1lbnRzLnRhZ0lEc1tpXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UUjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9ST1c7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEJPRFk6XG4gICAgICAgICAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRIRUFEOlxuICAgICAgICAgICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URk9PVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9UQUJMRV9CT0RZO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkNBUFRJT046XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fQ0FQVElPTjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5DT0xHUk9VUDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9DT0xVTU5fR1JPVVA7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEFCTEU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fVEFCTEU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQk9EWTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9CT0RZO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkZSQU1FU0VUOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX0ZSQU1FU0VUO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlNFTEVDVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRJbnNlcnRpb25Nb2RlRm9yU2VsZWN0KGkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRFTVBMQVRFOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluc2VydGlvbk1vZGUgPSB0aGlzLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2tbMF07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSFRNTDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gdGhpcy5oZWFkRWxlbWVudCA/IEluc2VydGlvbk1vZGUuQUZURVJfSEVBRCA6IEluc2VydGlvbk1vZGUuQkVGT1JFX0hFQUQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEQ6XG4gICAgICAgICAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRIOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fQ0VMTDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSEVBRDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX0hFQUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9CT0RZO1xuICAgIH1cbiAgICBfcmVzZXRJbnNlcnRpb25Nb2RlRm9yU2VsZWN0KHNlbGVjdElkeCkge1xuICAgICAgICBpZiAoc2VsZWN0SWR4ID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNlbGVjdElkeCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0biA9IHRoaXMub3BlbkVsZW1lbnRzLnRhZ0lEc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAodG4gPT09IGh0bWxfanNfMS5UQUdfSUQuVEVNUExBVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRuID09PSBodG1sX2pzXzEuVEFHX0lELlRBQkxFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fU0VMRUNUX0lOX1RBQkxFO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fU0VMRUNUO1xuICAgIH1cbiAgICAvL0Zvc3RlciBwYXJlbnRpbmdcbiAgICBfaXNFbGVtZW50Q2F1c2VzRm9zdGVyUGFyZW50aW5nKHRuKSB7XG4gICAgICAgIHJldHVybiBUQUJMRV9TVFJVQ1RVUkVfVEFHUy5oYXModG4pO1xuICAgIH1cbiAgICBfc2hvdWxkRm9zdGVyUGFyZW50T25JbnNlcnRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvc3RlclBhcmVudGluZ0VuYWJsZWQgJiYgdGhpcy5faXNFbGVtZW50Q2F1c2VzRm9zdGVyUGFyZW50aW5nKHRoaXMub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdJZCk7XG4gICAgfVxuICAgIF9maW5kRm9zdGVyUGFyZW50aW5nTG9jYXRpb24oKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm9wZW5FbGVtZW50cy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IG9wZW5FbGVtZW50ID0gdGhpcy5vcGVuRWxlbWVudHMuaXRlbXNbaV07XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMub3BlbkVsZW1lbnRzLnRhZ0lEc1tpXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URU1QTEFURTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKG9wZW5FbGVtZW50KSA9PT0gaHRtbF9qc18xLk5TLkhUTUwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudDogdGhpcy50cmVlQWRhcHRlci5nZXRUZW1wbGF0ZUNvbnRlbnQob3BlbkVsZW1lbnQpLCBiZWZvcmVFbGVtZW50OiBudWxsIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRBQkxFOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0UGFyZW50Tm9kZShvcGVuRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudCwgYmVmb3JlRWxlbWVudDogb3BlbkVsZW1lbnQgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnQ6IHRoaXMub3BlbkVsZW1lbnRzLml0ZW1zW2kgLSAxXSwgYmVmb3JlRWxlbWVudDogbnVsbCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBwYXJlbnQ6IHRoaXMub3BlbkVsZW1lbnRzLml0ZW1zWzBdLCBiZWZvcmVFbGVtZW50OiBudWxsIH07XG4gICAgfVxuICAgIF9mb3N0ZXJQYXJlbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLl9maW5kRm9zdGVyUGFyZW50aW5nTG9jYXRpb24oKTtcbiAgICAgICAgaWYgKGxvY2F0aW9uLmJlZm9yZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZUFkYXB0ZXIuaW5zZXJ0QmVmb3JlKGxvY2F0aW9uLnBhcmVudCwgZWxlbWVudCwgbG9jYXRpb24uYmVmb3JlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyZWVBZGFwdGVyLmFwcGVuZENoaWxkKGxvY2F0aW9uLnBhcmVudCwgZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9TcGVjaWFsIGVsZW1lbnRzXG4gICAgX2lzU3BlY2lhbEVsZW1lbnQoZWxlbWVudCwgaWQpIHtcbiAgICAgICAgY29uc3QgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShlbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIGh0bWxfanNfMS5TUEVDSUFMX0VMRU1FTlRTW25zXS5oYXMoaWQpO1xuICAgIH1cbiAgICBvbkNoYXJhY3Rlcih0b2tlbikge1xuICAgICAgICB0aGlzLnNraXBOZXh0TmV3TGluZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy50b2tlbml6ZXIuaW5Gb3JlaWduTm9kZSkge1xuICAgICAgICAgICAgY2hhcmFjdGVySW5Gb3JlaWduQ29udGVudCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aGlzLmluc2VydGlvbk1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTklUSUFMOlxuICAgICAgICAgICAgICAgIHRva2VuSW5Jbml0aWFsTW9kZSh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQkVGT1JFX0hUTUw6XG4gICAgICAgICAgICAgICAgdG9rZW5CZWZvcmVIdG1sKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5CRUZPUkVfSEVBRDpcbiAgICAgICAgICAgICAgICB0b2tlbkJlZm9yZUhlYWQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0hFQUQ6XG4gICAgICAgICAgICAgICAgdG9rZW5JbkhlYWQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0hFQURfTk9fU0NSSVBUOlxuICAgICAgICAgICAgICAgIHRva2VuSW5IZWFkTm9TY3JpcHQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0hFQUQ6XG4gICAgICAgICAgICAgICAgdG9rZW5BZnRlckhlYWQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0JPRFk6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fQ0FQVElPTjpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9DRUxMOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RFTVBMQVRFOlxuICAgICAgICAgICAgICAgIGNoYXJhY3RlckluQm9keSh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuVEVYVDpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9TRUxFQ1Q6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fU0VMRUNUX0lOX1RBQkxFOlxuICAgICAgICAgICAgICAgIHRoaXMuX2luc2VydENoYXJhY3RlcnModG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFX0JPRFk6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fUk9XOlxuICAgICAgICAgICAgICAgIGNoYXJhY3RlckluVGFibGUodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFX1RFWFQ6XG4gICAgICAgICAgICAgICAgY2hhcmFjdGVySW5UYWJsZVRleHQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0NPTFVNTl9HUk9VUDpcbiAgICAgICAgICAgICAgICB0b2tlbkluQ29sdW1uR3JvdXAodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0JPRFk6XG4gICAgICAgICAgICAgICAgdG9rZW5BZnRlckJvZHkodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0FGVEVSX0JPRFk6XG4gICAgICAgICAgICAgICAgdG9rZW5BZnRlckFmdGVyQm9keSh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uTnVsbENoYXJhY3Rlcih0b2tlbikge1xuICAgICAgICB0aGlzLnNraXBOZXh0TmV3TGluZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy50b2tlbml6ZXIuaW5Gb3JlaWduTm9kZSkge1xuICAgICAgICAgICAgbnVsbENoYXJhY3RlckluRm9yZWlnbkNvbnRlbnQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGhpcy5pbnNlcnRpb25Nb2RlKSB7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5JVElBTDpcbiAgICAgICAgICAgICAgICB0b2tlbkluSW5pdGlhbE1vZGUodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkJFRk9SRV9IVE1MOlxuICAgICAgICAgICAgICAgIHRva2VuQmVmb3JlSHRtbCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQkVGT1JFX0hFQUQ6XG4gICAgICAgICAgICAgICAgdG9rZW5CZWZvcmVIZWFkKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9IRUFEOlxuICAgICAgICAgICAgICAgIHRva2VuSW5IZWFkKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9IRUFEX05PX1NDUklQVDpcbiAgICAgICAgICAgICAgICB0b2tlbkluSGVhZE5vU2NyaXB0KHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5BRlRFUl9IRUFEOlxuICAgICAgICAgICAgICAgIHRva2VuQWZ0ZXJIZWFkKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5URVhUOlxuICAgICAgICAgICAgICAgIHRoaXMuX2luc2VydENoYXJhY3RlcnModG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFX0JPRFk6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fUk9XOlxuICAgICAgICAgICAgICAgIGNoYXJhY3RlckluVGFibGUodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0NPTFVNTl9HUk9VUDpcbiAgICAgICAgICAgICAgICB0b2tlbkluQ29sdW1uR3JvdXAodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0JPRFk6XG4gICAgICAgICAgICAgICAgdG9rZW5BZnRlckJvZHkodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0FGVEVSX0JPRFk6XG4gICAgICAgICAgICAgICAgdG9rZW5BZnRlckFmdGVyQm9keSh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uQ29tbWVudCh0b2tlbikge1xuICAgICAgICB0aGlzLnNraXBOZXh0TmV3TGluZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm90SW5IVE1MKSB7XG4gICAgICAgICAgICBhcHBlbmRDb21tZW50KHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRoaXMuaW5zZXJ0aW9uTW9kZSkge1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOSVRJQUw6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQkVGT1JFX0hUTUw6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQkVGT1JFX0hFQUQ6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fSEVBRDpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9IRUFEX05PX1NDUklQVDpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5BRlRFUl9IRUFEOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0JPRFk6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fVEFCTEU6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fQ0FQVElPTjpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9DT0xVTU5fR1JPVVA6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fVEFCTEVfQk9EWTpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9ST1c6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fQ0VMTDpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9TRUxFQ1Q6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fU0VMRUNUX0lOX1RBQkxFOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RFTVBMQVRFOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0ZSQU1FU0VUOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0ZSQU1FU0VUOlxuICAgICAgICAgICAgICAgIGFwcGVuZENvbW1lbnQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFX1RFWFQ6XG4gICAgICAgICAgICAgICAgdG9rZW5JblRhYmxlVGV4dCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQUZURVJfQk9EWTpcbiAgICAgICAgICAgICAgICBhcHBlbmRDb21tZW50VG9Sb290SHRtbEVsZW1lbnQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0FGVEVSX0JPRFk6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQUZURVJfQUZURVJfRlJBTUVTRVQ6XG4gICAgICAgICAgICAgICAgYXBwZW5kQ29tbWVudFRvRG9jdW1lbnQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkRvY3R5cGUodG9rZW4pIHtcbiAgICAgICAgdGhpcy5za2lwTmV4dE5ld0xpbmUgPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmluc2VydGlvbk1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTklUSUFMOlxuICAgICAgICAgICAgICAgIGRvY3R5cGVJbkluaXRpYWxNb2RlKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5CRUZPUkVfSEVBRDpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9IRUFEOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0hFQURfTk9fU0NSSVBUOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0hFQUQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKHRva2VuLCBlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNwbGFjZWREb2N0eXBlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9UQUJMRV9URVhUOlxuICAgICAgICAgICAgICAgIHRva2VuSW5UYWJsZVRleHQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblN0YXJ0VGFnKHRva2VuKSB7XG4gICAgICAgIHRoaXMuc2tpcE5leHROZXdMaW5lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuID0gdG9rZW47XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NTdGFydFRhZyh0b2tlbik7XG4gICAgICAgIGlmICh0b2tlbi5zZWxmQ2xvc2luZyAmJiAhdG9rZW4uYWNrU2VsZkNsb3NpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycih0b2tlbiwgZXJyb3JfY29kZXNfanNfMS5FUlIubm9uVm9pZEh0bWxFbGVtZW50U3RhcnRUYWdXaXRoVHJhaWxpbmdTb2xpZHVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSBnaXZlbiBzdGFydCB0YWcuXG4gICAgICpcbiAgICAgKiBgb25TdGFydFRhZ2AgY2hlY2tzIGlmIGEgc2VsZi1jbG9zaW5nIHRhZyB3YXMgcmVjb2duaXplZC4gV2hlbiBhIHRva2VuXG4gICAgICogaXMgbW92ZWQgaW5iZXR3ZWVuIG11bHRpcGxlIGluc2VydGlvbiBtb2RlcywgdGhpcyBjaGVjayBmb3Igc2VsZi1jbG9zaW5nXG4gICAgICogY291bGQgbGVhZCB0byBmYWxzZSBwb3NpdGl2ZXMuIFRvIGF2b2lkIHRoaXMsIGBfcHJvY2Vzc1N0YXJ0VGFnYCBpcyB1c2VkXG4gICAgICogZm9yIG5lc3RlZCBjYWxscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gdG8gcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBfcHJvY2Vzc1N0YXJ0VGFnKHRva2VuKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFByb2Nlc3NTdGFydFRhZ1Rva2VuSW5Gb3JlaWduQ29udGVudCh0b2tlbikpIHtcbiAgICAgICAgICAgIHN0YXJ0VGFnSW5Gb3JlaWduQ29udGVudCh0aGlzLCB0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zdGFydFRhZ091dHNpZGVGb3JlaWduQ29udGVudCh0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3N0YXJ0VGFnT3V0c2lkZUZvcmVpZ25Db250ZW50KHRva2VuKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5pbnNlcnRpb25Nb2RlKSB7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5JVElBTDpcbiAgICAgICAgICAgICAgICB0b2tlbkluSW5pdGlhbE1vZGUodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkJFRk9SRV9IVE1MOlxuICAgICAgICAgICAgICAgIHN0YXJ0VGFnQmVmb3JlSHRtbCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQkVGT1JFX0hFQUQ6XG4gICAgICAgICAgICAgICAgc3RhcnRUYWdCZWZvcmVIZWFkKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9IRUFEOlxuICAgICAgICAgICAgICAgIHN0YXJ0VGFnSW5IZWFkKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9IRUFEX05PX1NDUklQVDpcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0luSGVhZE5vU2NyaXB0KHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5BRlRFUl9IRUFEOlxuICAgICAgICAgICAgICAgIHN0YXJ0VGFnQWZ0ZXJIZWFkKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9CT0RZOlxuICAgICAgICAgICAgICAgIHN0YXJ0VGFnSW5Cb2R5KHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9UQUJMRTpcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0luVGFibGUodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFX1RFWFQ6XG4gICAgICAgICAgICAgICAgdG9rZW5JblRhYmxlVGV4dCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fQ0FQVElPTjpcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0luQ2FwdGlvbih0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fQ09MVU1OX0dST1VQOlxuICAgICAgICAgICAgICAgIHN0YXJ0VGFnSW5Db2x1bW5Hcm91cCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fVEFCTEVfQk9EWTpcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0luVGFibGVCb2R5KHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9ST1c6XG4gICAgICAgICAgICAgICAgc3RhcnRUYWdJblJvdyh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fQ0VMTDpcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0luQ2VsbCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fU0VMRUNUOlxuICAgICAgICAgICAgICAgIHN0YXJ0VGFnSW5TZWxlY3QodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1NFTEVDVF9JTl9UQUJMRTpcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0luU2VsZWN0SW5UYWJsZSh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fVEVNUExBVEU6XG4gICAgICAgICAgICAgICAgc3RhcnRUYWdJblRlbXBsYXRlKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5BRlRFUl9CT0RZOlxuICAgICAgICAgICAgICAgIHN0YXJ0VGFnQWZ0ZXJCb2R5KHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9GUkFNRVNFVDpcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0luRnJhbWVzZXQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0ZSQU1FU0VUOlxuICAgICAgICAgICAgICAgIHN0YXJ0VGFnQWZ0ZXJGcmFtZXNldCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQUZURVJfQUZURVJfQk9EWTpcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0FmdGVyQWZ0ZXJCb2R5KHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5BRlRFUl9BRlRFUl9GUkFNRVNFVDpcbiAgICAgICAgICAgICAgICBzdGFydFRhZ0FmdGVyQWZ0ZXJGcmFtZXNldCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uRW5kVGFnKHRva2VuKSB7XG4gICAgICAgIHRoaXMuc2tpcE5leHROZXdMaW5lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuID0gdG9rZW47XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb3RJbkhUTUwpIHtcbiAgICAgICAgICAgIGVuZFRhZ0luRm9yZWlnbkNvbnRlbnQodGhpcywgdG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW5kVGFnT3V0c2lkZUZvcmVpZ25Db250ZW50KHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZW5kVGFnT3V0c2lkZUZvcmVpZ25Db250ZW50KHRva2VuKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5pbnNlcnRpb25Nb2RlKSB7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5JVElBTDpcbiAgICAgICAgICAgICAgICB0b2tlbkluSW5pdGlhbE1vZGUodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkJFRk9SRV9IVE1MOlxuICAgICAgICAgICAgICAgIGVuZFRhZ0JlZm9yZUh0bWwodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkJFRk9SRV9IRUFEOlxuICAgICAgICAgICAgICAgIGVuZFRhZ0JlZm9yZUhlYWQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0hFQUQ6XG4gICAgICAgICAgICAgICAgZW5kVGFnSW5IZWFkKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9IRUFEX05PX1NDUklQVDpcbiAgICAgICAgICAgICAgICBlbmRUYWdJbkhlYWROb1NjcmlwdCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQUZURVJfSEVBRDpcbiAgICAgICAgICAgICAgICBlbmRUYWdBZnRlckhlYWQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0JPRFk6XG4gICAgICAgICAgICAgICAgZW5kVGFnSW5Cb2R5KHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5URVhUOlxuICAgICAgICAgICAgICAgIGVuZFRhZ0luVGV4dCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fVEFCTEU6XG4gICAgICAgICAgICAgICAgZW5kVGFnSW5UYWJsZSh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fVEFCTEVfVEVYVDpcbiAgICAgICAgICAgICAgICB0b2tlbkluVGFibGVUZXh0KHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9DQVBUSU9OOlxuICAgICAgICAgICAgICAgIGVuZFRhZ0luQ2FwdGlvbih0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fQ09MVU1OX0dST1VQOlxuICAgICAgICAgICAgICAgIGVuZFRhZ0luQ29sdW1uR3JvdXAodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFX0JPRFk6XG4gICAgICAgICAgICAgICAgZW5kVGFnSW5UYWJsZUJvZHkodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1JPVzpcbiAgICAgICAgICAgICAgICBlbmRUYWdJblJvdyh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fQ0VMTDpcbiAgICAgICAgICAgICAgICBlbmRUYWdJbkNlbGwodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1NFTEVDVDpcbiAgICAgICAgICAgICAgICBlbmRUYWdJblNlbGVjdCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fU0VMRUNUX0lOX1RBQkxFOlxuICAgICAgICAgICAgICAgIGVuZFRhZ0luU2VsZWN0SW5UYWJsZSh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fVEVNUExBVEU6XG4gICAgICAgICAgICAgICAgZW5kVGFnSW5UZW1wbGF0ZSh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQUZURVJfQk9EWTpcbiAgICAgICAgICAgICAgICBlbmRUYWdBZnRlckJvZHkodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0ZSQU1FU0VUOlxuICAgICAgICAgICAgICAgIGVuZFRhZ0luRnJhbWVzZXQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0ZSQU1FU0VUOlxuICAgICAgICAgICAgICAgIGVuZFRhZ0FmdGVyRnJhbWVzZXQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0FGVEVSX0JPRFk6XG4gICAgICAgICAgICAgICAgdG9rZW5BZnRlckFmdGVyQm9keSh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uRW9mKHRva2VuKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5pbnNlcnRpb25Nb2RlKSB7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5JVElBTDpcbiAgICAgICAgICAgICAgICB0b2tlbkluSW5pdGlhbE1vZGUodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkJFRk9SRV9IVE1MOlxuICAgICAgICAgICAgICAgIHRva2VuQmVmb3JlSHRtbCh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQkVGT1JFX0hFQUQ6XG4gICAgICAgICAgICAgICAgdG9rZW5CZWZvcmVIZWFkKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9IRUFEOlxuICAgICAgICAgICAgICAgIHRva2VuSW5IZWFkKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9IRUFEX05PX1NDUklQVDpcbiAgICAgICAgICAgICAgICB0b2tlbkluSGVhZE5vU2NyaXB0KHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5BRlRFUl9IRUFEOlxuICAgICAgICAgICAgICAgIHRva2VuQWZ0ZXJIZWFkKHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9CT0RZOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0NBUFRJT046XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fQ09MVU1OX0dST1VQOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFX0JPRFk6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fUk9XOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0NFTEw6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fU0VMRUNUOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1NFTEVDVF9JTl9UQUJMRTpcbiAgICAgICAgICAgICAgICBlb2ZJbkJvZHkodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLlRFWFQ6XG4gICAgICAgICAgICAgICAgZW9mSW5UZXh0KHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9UQUJMRV9URVhUOlxuICAgICAgICAgICAgICAgIHRva2VuSW5UYWJsZVRleHQodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RFTVBMQVRFOlxuICAgICAgICAgICAgICAgIGVvZkluVGVtcGxhdGUodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0JPRFk6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fRlJBTUVTRVQ6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQUZURVJfRlJBTUVTRVQ6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQUZURVJfQUZURVJfQk9EWTpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5BRlRFUl9BRlRFUl9GUkFNRVNFVDpcbiAgICAgICAgICAgICAgICBzdG9wUGFyc2luZyh0aGlzLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uV2hpdGVzcGFjZUNoYXJhY3Rlcih0b2tlbikge1xuICAgICAgICBpZiAodGhpcy5za2lwTmV4dE5ld0xpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2tpcE5leHROZXdMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodG9rZW4uY2hhcnMuY2hhckNvZGVBdCgwKSA9PT0gdW5pY29kZS5DT0RFX1BPSU5UUy5MSU5FX0ZFRUQpIHtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4uY2hhcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdG9rZW4uY2hhcnMgPSB0b2tlbi5jaGFycy5zdWJzdHIoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudG9rZW5pemVyLmluRm9yZWlnbk5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc2VydENoYXJhY3RlcnModG9rZW4pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGhpcy5pbnNlcnRpb25Nb2RlKSB7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fSEVBRDpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9IRUFEX05PX1NDUklQVDpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5BRlRFUl9IRUFEOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLlRFWFQ6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fQ09MVU1OX0dST1VQOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1NFTEVDVDpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9TRUxFQ1RfSU5fVEFCTEU6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fRlJBTUVTRVQ6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQUZURVJfRlJBTUVTRVQ6XG4gICAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0Q2hhcmFjdGVycyh0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fQk9EWTpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5JTl9DQVBUSU9OOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX0NFTEw6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fVEVNUExBVEU6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuQUZURVJfQk9EWTpcbiAgICAgICAgICAgIGNhc2UgSW5zZXJ0aW9uTW9kZS5BRlRFUl9BRlRFUl9CT0RZOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLkFGVEVSX0FGVEVSX0ZSQU1FU0VUOlxuICAgICAgICAgICAgICAgIHdoaXRlc3BhY2VDaGFyYWN0ZXJJbkJvZHkodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFOlxuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFX0JPRFk6XG4gICAgICAgICAgICBjYXNlIEluc2VydGlvbk1vZGUuSU5fUk9XOlxuICAgICAgICAgICAgICAgIGNoYXJhY3RlckluVGFibGUodGhpcywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFX1RFWFQ6XG4gICAgICAgICAgICAgICAgd2hpdGVzcGFjZUNoYXJhY3RlckluVGFibGVUZXh0KHRoaXMsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBEbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLlBhcnNlciA9IFBhcnNlcjtcbi8vQWRvcHRpb24gYWdlbmN5IGFsZ29yaXRobVxuLy8oc2VlOiBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90cmVlLWNvbnN0cnVjdGlvbi5odG1sI2Fkb3B0aW9uQWdlbmN5KVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vU3RlcHMgNS04IG9mIHRoZSBhbGdvcml0aG1cbmZ1bmN0aW9uIGFhT2J0YWluRm9ybWF0dGluZ0VsZW1lbnRFbnRyeShwLCB0b2tlbikge1xuICAgIGxldCBmb3JtYXR0aW5nRWxlbWVudEVudHJ5ID0gcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuZ2V0RWxlbWVudEVudHJ5SW5TY29wZVdpdGhUYWdOYW1lKHRva2VuLnRhZ05hbWUpO1xuICAgIGlmIChmb3JtYXR0aW5nRWxlbWVudEVudHJ5KSB7XG4gICAgICAgIGlmICghcC5vcGVuRWxlbWVudHMuY29udGFpbnMoZm9ybWF0dGluZ0VsZW1lbnRFbnRyeS5lbGVtZW50KSkge1xuICAgICAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlRW50cnkoZm9ybWF0dGluZ0VsZW1lbnRFbnRyeSk7XG4gICAgICAgICAgICBmb3JtYXR0aW5nRWxlbWVudEVudHJ5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghcC5vcGVuRWxlbWVudHMuaGFzSW5TY29wZSh0b2tlbi50YWdJRCkpIHtcbiAgICAgICAgICAgIGZvcm1hdHRpbmdFbGVtZW50RW50cnkgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnZW5lcmljRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1hdHRpbmdFbGVtZW50RW50cnk7XG59XG4vL1N0ZXBzIDkgYW5kIDEwIG9mIHRoZSBhbGdvcml0aG1cbmZ1bmN0aW9uIGFhT2J0YWluRnVydGhlc3RCbG9jayhwLCBmb3JtYXR0aW5nRWxlbWVudEVudHJ5KSB7XG4gICAgbGV0IGZ1cnRoZXN0QmxvY2sgPSBudWxsO1xuICAgIGxldCBpZHggPSBwLm9wZW5FbGVtZW50cy5zdGFja1RvcDtcbiAgICBmb3IgKDsgaWR4ID49IDA7IGlkeC0tKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy5pdGVtc1tpZHhdO1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gZm9ybWF0dGluZ0VsZW1lbnRFbnRyeS5lbGVtZW50KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAocC5faXNTcGVjaWFsRWxlbWVudChlbGVtZW50LCBwLm9wZW5FbGVtZW50cy50YWdJRHNbaWR4XSkpIHtcbiAgICAgICAgICAgIGZ1cnRoZXN0QmxvY2sgPSBlbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghZnVydGhlc3RCbG9jaykge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5zaG9ydGVuVG9MZW5ndGgoaWR4IDwgMCA/IDAgOiBpZHgpO1xuICAgICAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmVFbnRyeShmb3JtYXR0aW5nRWxlbWVudEVudHJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1cnRoZXN0QmxvY2s7XG59XG4vL1N0ZXAgMTMgb2YgdGhlIGFsZ29yaXRobVxuZnVuY3Rpb24gYWFJbm5lckxvb3AocCwgZnVydGhlc3RCbG9jaywgZm9ybWF0dGluZ0VsZW1lbnQpIHtcbiAgICBsZXQgbGFzdEVsZW1lbnQgPSBmdXJ0aGVzdEJsb2NrO1xuICAgIGxldCBuZXh0RWxlbWVudCA9IHAub3BlbkVsZW1lbnRzLmdldENvbW1vbkFuY2VzdG9yKGZ1cnRoZXN0QmxvY2spO1xuICAgIGZvciAobGV0IGkgPSAwLCBlbGVtZW50ID0gbmV4dEVsZW1lbnQ7IGVsZW1lbnQgIT09IGZvcm1hdHRpbmdFbGVtZW50OyBpKyssIGVsZW1lbnQgPSBuZXh0RWxlbWVudCkge1xuICAgICAgICAvL05PVEU6IHN0b3JlIHRoZSBuZXh0IGVsZW1lbnQgZm9yIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIChpdCBtYXkgYmUgZGVsZXRlZCBmcm9tIHRoZSBzdGFjayBieSBzdGVwIDkuNSlcbiAgICAgICAgbmV4dEVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy5nZXRDb21tb25BbmNlc3RvcihlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZWxlbWVudEVudHJ5ID0gcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuZ2V0RWxlbWVudEVudHJ5KGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBjb3VudGVyT3ZlcmZsb3cgPSBlbGVtZW50RW50cnkgJiYgaSA+PSBBQV9JTk5FUl9MT09QX0lURVI7XG4gICAgICAgIGNvbnN0IHNob3VsZFJlbW92ZUZyb21PcGVuRWxlbWVudHMgPSAhZWxlbWVudEVudHJ5IHx8IGNvdW50ZXJPdmVyZmxvdztcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUZyb21PcGVuRWxlbWVudHMpIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyT3ZlcmZsb3cpIHtcbiAgICAgICAgICAgICAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmVFbnRyeShlbGVtZW50RW50cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudCA9IGFhUmVjcmVhdGVFbGVtZW50RnJvbUVudHJ5KHAsIGVsZW1lbnRFbnRyeSk7XG4gICAgICAgICAgICBpZiAobGFzdEVsZW1lbnQgPT09IGZ1cnRoZXN0QmxvY2spIHtcbiAgICAgICAgICAgICAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5ib29rbWFyayA9IGVsZW1lbnRFbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHAudHJlZUFkYXB0ZXIuZGV0YWNoTm9kZShsYXN0RWxlbWVudCk7XG4gICAgICAgICAgICBwLnRyZWVBZGFwdGVyLmFwcGVuZENoaWxkKGVsZW1lbnQsIGxhc3RFbGVtZW50KTtcbiAgICAgICAgICAgIGxhc3RFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGFzdEVsZW1lbnQ7XG59XG4vL1N0ZXAgMTMuNyBvZiB0aGUgYWxnb3JpdGhtXG5mdW5jdGlvbiBhYVJlY3JlYXRlRWxlbWVudEZyb21FbnRyeShwLCBlbGVtZW50RW50cnkpIHtcbiAgICBjb25zdCBucyA9IHAudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKGVsZW1lbnRFbnRyeS5lbGVtZW50KTtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0gcC50cmVlQWRhcHRlci5jcmVhdGVFbGVtZW50KGVsZW1lbnRFbnRyeS50b2tlbi50YWdOYW1lLCBucywgZWxlbWVudEVudHJ5LnRva2VuLmF0dHJzKTtcbiAgICBwLm9wZW5FbGVtZW50cy5yZXBsYWNlKGVsZW1lbnRFbnRyeS5lbGVtZW50LCBuZXdFbGVtZW50KTtcbiAgICBlbGVtZW50RW50cnkuZWxlbWVudCA9IG5ld0VsZW1lbnQ7XG4gICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vL1N0ZXAgMTQgb2YgdGhlIGFsZ29yaXRobVxuZnVuY3Rpb24gYWFJbnNlcnRMYXN0Tm9kZUluQ29tbW9uQW5jZXN0b3IocCwgY29tbW9uQW5jZXN0b3IsIGxhc3RFbGVtZW50KSB7XG4gICAgY29uc3QgdG4gPSBwLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUoY29tbW9uQW5jZXN0b3IpO1xuICAgIGNvbnN0IHRpZCA9ICgwLCBodG1sX2pzXzEuZ2V0VGFnSUQpKHRuKTtcbiAgICBpZiAocC5faXNFbGVtZW50Q2F1c2VzRm9zdGVyUGFyZW50aW5nKHRpZCkpIHtcbiAgICAgICAgcC5fZm9zdGVyUGFyZW50RWxlbWVudChsYXN0RWxlbWVudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBucyA9IHAudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKGNvbW1vbkFuY2VzdG9yKTtcbiAgICAgICAgaWYgKHRpZCA9PT0gaHRtbF9qc18xLlRBR19JRC5URU1QTEFURSAmJiBucyA9PT0gaHRtbF9qc18xLk5TLkhUTUwpIHtcbiAgICAgICAgICAgIGNvbW1vbkFuY2VzdG9yID0gcC50cmVlQWRhcHRlci5nZXRUZW1wbGF0ZUNvbnRlbnQoY29tbW9uQW5jZXN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHAudHJlZUFkYXB0ZXIuYXBwZW5kQ2hpbGQoY29tbW9uQW5jZXN0b3IsIGxhc3RFbGVtZW50KTtcbiAgICB9XG59XG4vL1N0ZXBzIDE1LTE5IG9mIHRoZSBhbGdvcml0aG1cbmZ1bmN0aW9uIGFhUmVwbGFjZUZvcm1hdHRpbmdFbGVtZW50KHAsIGZ1cnRoZXN0QmxvY2ssIGZvcm1hdHRpbmdFbGVtZW50RW50cnkpIHtcbiAgICBjb25zdCBucyA9IHAudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKGZvcm1hdHRpbmdFbGVtZW50RW50cnkuZWxlbWVudCk7XG4gICAgY29uc3QgeyB0b2tlbiB9ID0gZm9ybWF0dGluZ0VsZW1lbnRFbnRyeTtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0gcC50cmVlQWRhcHRlci5jcmVhdGVFbGVtZW50KHRva2VuLnRhZ05hbWUsIG5zLCB0b2tlbi5hdHRycyk7XG4gICAgcC5fYWRvcHROb2RlcyhmdXJ0aGVzdEJsb2NrLCBuZXdFbGVtZW50KTtcbiAgICBwLnRyZWVBZGFwdGVyLmFwcGVuZENoaWxkKGZ1cnRoZXN0QmxvY2ssIG5ld0VsZW1lbnQpO1xuICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmluc2VydEVsZW1lbnRBZnRlckJvb2ttYXJrKG5ld0VsZW1lbnQsIHRva2VuKTtcbiAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmVFbnRyeShmb3JtYXR0aW5nRWxlbWVudEVudHJ5KTtcbiAgICBwLm9wZW5FbGVtZW50cy5yZW1vdmUoZm9ybWF0dGluZ0VsZW1lbnRFbnRyeS5lbGVtZW50KTtcbiAgICBwLm9wZW5FbGVtZW50cy5pbnNlcnRBZnRlcihmdXJ0aGVzdEJsb2NrLCBuZXdFbGVtZW50LCB0b2tlbi50YWdJRCk7XG59XG4vL0FsZ29yaXRobSBlbnRyeSBwb2ludFxuZnVuY3Rpb24gY2FsbEFkb3B0aW9uQWdlbmN5KHAsIHRva2VuKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBBQV9PVVRFUl9MT09QX0lURVI7IGkrKykge1xuICAgICAgICBjb25zdCBmb3JtYXR0aW5nRWxlbWVudEVudHJ5ID0gYWFPYnRhaW5Gb3JtYXR0aW5nRWxlbWVudEVudHJ5KHAsIHRva2VuKTtcbiAgICAgICAgaWYgKCFmb3JtYXR0aW5nRWxlbWVudEVudHJ5KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmdXJ0aGVzdEJsb2NrID0gYWFPYnRhaW5GdXJ0aGVzdEJsb2NrKHAsIGZvcm1hdHRpbmdFbGVtZW50RW50cnkpO1xuICAgICAgICBpZiAoIWZ1cnRoZXN0QmxvY2spIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmJvb2ttYXJrID0gZm9ybWF0dGluZ0VsZW1lbnRFbnRyeTtcbiAgICAgICAgY29uc3QgbGFzdEVsZW1lbnQgPSBhYUlubmVyTG9vcChwLCBmdXJ0aGVzdEJsb2NrLCBmb3JtYXR0aW5nRWxlbWVudEVudHJ5LmVsZW1lbnQpO1xuICAgICAgICBjb25zdCBjb21tb25BbmNlc3RvciA9IHAub3BlbkVsZW1lbnRzLmdldENvbW1vbkFuY2VzdG9yKGZvcm1hdHRpbmdFbGVtZW50RW50cnkuZWxlbWVudCk7XG4gICAgICAgIHAudHJlZUFkYXB0ZXIuZGV0YWNoTm9kZShsYXN0RWxlbWVudCk7XG4gICAgICAgIGlmIChjb21tb25BbmNlc3RvcilcbiAgICAgICAgICAgIGFhSW5zZXJ0TGFzdE5vZGVJbkNvbW1vbkFuY2VzdG9yKHAsIGNvbW1vbkFuY2VzdG9yLCBsYXN0RWxlbWVudCk7XG4gICAgICAgIGFhUmVwbGFjZUZvcm1hdHRpbmdFbGVtZW50KHAsIGZ1cnRoZXN0QmxvY2ssIGZvcm1hdHRpbmdFbGVtZW50RW50cnkpO1xuICAgIH1cbn1cbi8vR2VuZXJpYyB0b2tlbiBoYW5kbGVyc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGFwcGVuZENvbW1lbnQocCwgdG9rZW4pIHtcbiAgICBwLl9hcHBlbmRDb21tZW50Tm9kZSh0b2tlbiwgcC5vcGVuRWxlbWVudHMuY3VycmVudFRtcGxDb250ZW50T3JOb2RlKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZENvbW1lbnRUb1Jvb3RIdG1sRWxlbWVudChwLCB0b2tlbikge1xuICAgIHAuX2FwcGVuZENvbW1lbnROb2RlKHRva2VuLCBwLm9wZW5FbGVtZW50cy5pdGVtc1swXSk7XG59XG5mdW5jdGlvbiBhcHBlbmRDb21tZW50VG9Eb2N1bWVudChwLCB0b2tlbikge1xuICAgIHAuX2FwcGVuZENvbW1lbnROb2RlKHRva2VuLCBwLmRvY3VtZW50KTtcbn1cbmZ1bmN0aW9uIHN0b3BQYXJzaW5nKHAsIHRva2VuKSB7XG4gICAgcC5zdG9wcGVkID0gdHJ1ZTtcbiAgICAvLyBOT1RFOiBTZXQgZW5kIGxvY2F0aW9ucyBmb3IgZWxlbWVudHMgdGhhdCByZW1haW4gb24gdGhlIG9wZW4gZWxlbWVudCBzdGFjay5cbiAgICBpZiAodG9rZW4ubG9jYXRpb24pIHtcbiAgICAgICAgLy8gTk9URTogSWYgd2UgYXJlIG5vdCBpbiBhIGZyYWdtZW50LCBgaHRtbGAgYW5kIGBib2R5YCB3aWxsIHN0YXkgb24gdGhlIHN0YWNrLlxuICAgICAgICAvLyBUaGlzIGlzIGEgcHJvYmxlbSwgYXMgd2UgbWlnaHQgb3ZlcndyaXRlIHRoZWlyIGVuZCBwb3NpdGlvbiBoZXJlLlxuICAgICAgICBjb25zdCB0YXJnZXQgPSBwLmZyYWdtZW50Q29udGV4dCA/IDAgOiAyO1xuICAgICAgICBmb3IgKGxldCBpID0gcC5vcGVuRWxlbWVudHMuc3RhY2tUb3A7IGkgPj0gdGFyZ2V0OyBpLS0pIHtcbiAgICAgICAgICAgIHAuX3NldEVuZExvY2F0aW9uKHAub3BlbkVsZW1lbnRzLml0ZW1zW2ldLCB0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFuZGxlIGBodG1sYCBhbmQgYGJvZHlgXG4gICAgICAgIGlmICghcC5mcmFnbWVudENvbnRleHQgJiYgcC5vcGVuRWxlbWVudHMuc3RhY2tUb3AgPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy5pdGVtc1swXTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWxMb2NhdGlvbiA9IHAudHJlZUFkYXB0ZXIuZ2V0Tm9kZVNvdXJjZUNvZGVMb2NhdGlvbihodG1sRWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoaHRtbExvY2F0aW9uICYmICFodG1sTG9jYXRpb24uZW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgcC5fc2V0RW5kTG9jYXRpb24oaHRtbEVsZW1lbnQsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuc3RhY2tUb3AgPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5RWxlbWVudCA9IHAub3BlbkVsZW1lbnRzLml0ZW1zWzFdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5TG9jYXRpb24gPSBwLnRyZWVBZGFwdGVyLmdldE5vZGVTb3VyY2VDb2RlTG9jYXRpb24oYm9keUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYm9keUxvY2F0aW9uICYmICFib2R5TG9jYXRpb24uZW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwLl9zZXRFbmRMb2NhdGlvbihib2R5RWxlbWVudCwgdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8gVGhlIFwiaW5pdGlhbFwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gZG9jdHlwZUluSW5pdGlhbE1vZGUocCwgdG9rZW4pIHtcbiAgICBwLl9zZXREb2N1bWVudFR5cGUodG9rZW4pO1xuICAgIGNvbnN0IG1vZGUgPSB0b2tlbi5mb3JjZVF1aXJrcyA/IGh0bWxfanNfMS5ET0NVTUVOVF9NT0RFLlFVSVJLUyA6IGRvY3R5cGUuZ2V0RG9jdW1lbnRNb2RlKHRva2VuKTtcbiAgICBpZiAoIWRvY3R5cGUuaXNDb25mb3JtaW5nKHRva2VuKSkge1xuICAgICAgICBwLl9lcnIodG9rZW4sIGVycm9yX2NvZGVzX2pzXzEuRVJSLm5vbkNvbmZvcm1pbmdEb2N0eXBlKTtcbiAgICB9XG4gICAgcC50cmVlQWRhcHRlci5zZXREb2N1bWVudE1vZGUocC5kb2N1bWVudCwgbW9kZSk7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5CRUZPUkVfSFRNTDtcbn1cbmZ1bmN0aW9uIHRva2VuSW5Jbml0aWFsTW9kZShwLCB0b2tlbikge1xuICAgIHAuX2Vycih0b2tlbiwgZXJyb3JfY29kZXNfanNfMS5FUlIubWlzc2luZ0RvY3R5cGUsIHRydWUpO1xuICAgIHAudHJlZUFkYXB0ZXIuc2V0RG9jdW1lbnRNb2RlKHAuZG9jdW1lbnQsIGh0bWxfanNfMS5ET0NVTUVOVF9NT0RFLlFVSVJLUyk7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5CRUZPUkVfSFRNTDtcbiAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xufVxuLy8gVGhlIFwiYmVmb3JlIGh0bWxcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHN0YXJ0VGFnQmVmb3JlSHRtbChwLCB0b2tlbikge1xuICAgIGlmICh0b2tlbi50YWdJRCA9PT0gaHRtbF9qc18xLlRBR19JRC5IVE1MKSB7XG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIGh0bWxfanNfMS5OUy5IVE1MKTtcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5CRUZPUkVfSEVBRDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRva2VuQmVmb3JlSHRtbChwLCB0b2tlbik7XG4gICAgfVxufVxuZnVuY3Rpb24gZW5kVGFnQmVmb3JlSHRtbChwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnSUQ7XG4gICAgaWYgKHRuID09PSBodG1sX2pzXzEuVEFHX0lELkhUTUwgfHwgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuSEVBRCB8fCB0biA9PT0gaHRtbF9qc18xLlRBR19JRC5CT0RZIHx8IHRuID09PSBodG1sX2pzXzEuVEFHX0lELkJSKSB7XG4gICAgICAgIHRva2VuQmVmb3JlSHRtbChwLCB0b2tlbik7XG4gICAgfVxufVxuZnVuY3Rpb24gdG9rZW5CZWZvcmVIdG1sKHAsIHRva2VuKSB7XG4gICAgcC5faW5zZXJ0RmFrZVJvb3RFbGVtZW50KCk7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5CRUZPUkVfSEVBRDtcbiAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xufVxuLy8gVGhlIFwiYmVmb3JlIGhlYWRcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHN0YXJ0VGFnQmVmb3JlSGVhZChwLCB0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udGFnSUQpIHtcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkhUTUw6IHtcbiAgICAgICAgICAgIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5IRUFEOiB7XG4gICAgICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgICAgICAgICBwLmhlYWRFbGVtZW50ID0gcC5vcGVuRWxlbWVudHMuY3VycmVudDtcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fSEVBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHRva2VuQmVmb3JlSGVhZChwLCB0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBlbmRUYWdCZWZvcmVIZWFkKHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdJRDtcbiAgICBpZiAodG4gPT09IGh0bWxfanNfMS5UQUdfSUQuSEVBRCB8fCB0biA9PT0gaHRtbF9qc18xLlRBR19JRC5CT0RZIHx8IHRuID09PSBodG1sX2pzXzEuVEFHX0lELkhUTUwgfHwgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuQlIpIHtcbiAgICAgICAgdG9rZW5CZWZvcmVIZWFkKHAsIHRva2VuKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHAuX2Vycih0b2tlbiwgZXJyb3JfY29kZXNfanNfMS5FUlIuZW5kVGFnV2l0aG91dE1hdGNoaW5nT3BlbkVsZW1lbnQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRva2VuQmVmb3JlSGVhZChwLCB0b2tlbikge1xuICAgIHAuX2luc2VydEZha2VFbGVtZW50KGh0bWxfanNfMS5UQUdfTkFNRVMuSEVBRCwgaHRtbF9qc18xLlRBR19JRC5IRUFEKTtcbiAgICBwLmhlYWRFbGVtZW50ID0gcC5vcGVuRWxlbWVudHMuY3VycmVudDtcbiAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX0hFQUQ7XG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbn1cbi8vIFRoZSBcImluIGhlYWRcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHN0YXJ0VGFnSW5IZWFkKHAsIHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50YWdJRCkge1xuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSFRNTDoge1xuICAgICAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkJBU0U6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CQVNFRk9OVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkJHU09VTkQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5MSU5LOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTUVUQToge1xuICAgICAgICAgICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgICAgICAgICAgdG9rZW4uYWNrU2VsZkNsb3NpbmcgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRJVExFOiB7XG4gICAgICAgICAgICBwLl9zd2l0Y2hUb1RleHRQYXJzaW5nKHRva2VuLCBpbmRleF9qc18xLlRva2VuaXplck1vZGUuUkNEQVRBKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5OT1NDUklQVDoge1xuICAgICAgICAgICAgaWYgKHAub3B0aW9ucy5zY3JpcHRpbmdFbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgcC5fc3dpdGNoVG9UZXh0UGFyc2luZyh0b2tlbiwgaW5kZXhfanNfMS5Ub2tlbml6ZXJNb2RlLlJBV1RFWFQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgICAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fSEVBRF9OT19TQ1JJUFQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTk9GUkFNRVM6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5TVFlMRToge1xuICAgICAgICAgICAgcC5fc3dpdGNoVG9UZXh0UGFyc2luZyh0b2tlbiwgaW5kZXhfanNfMS5Ub2tlbml6ZXJNb2RlLlJBV1RFWFQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlNDUklQVDoge1xuICAgICAgICAgICAgcC5fc3dpdGNoVG9UZXh0UGFyc2luZyh0b2tlbiwgaW5kZXhfanNfMS5Ub2tlbml6ZXJNb2RlLlNDUklQVF9EQVRBKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URU1QTEFURToge1xuICAgICAgICAgICAgcC5faW5zZXJ0VGVtcGxhdGUodG9rZW4pO1xuICAgICAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5zZXJ0TWFya2VyKCk7XG4gICAgICAgICAgICBwLmZyYW1lc2V0T2sgPSBmYWxzZTtcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fVEVNUExBVEU7XG4gICAgICAgICAgICBwLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2sudW5zaGlmdChJbnNlcnRpb25Nb2RlLklOX1RFTVBMQVRFKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5IRUFEOiB7XG4gICAgICAgICAgICBwLl9lcnIodG9rZW4sIGVycm9yX2NvZGVzX2pzXzEuRVJSLm1pc3BsYWNlZFN0YXJ0VGFnRm9ySGVhZEVsZW1lbnQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdG9rZW5JbkhlYWQocCwgdG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZW5kVGFnSW5IZWFkKHAsIHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50YWdJRCkge1xuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSEVBRDoge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLkFGVEVSX0hFQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQk9EWTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkJSOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSFRNTDoge1xuICAgICAgICAgICAgdG9rZW5JbkhlYWQocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRFTVBMQVRFOiB7XG4gICAgICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMudG1wbENvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3NUaG9yb3VnaGx5KCk7XG4gICAgICAgICAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdJZCAhPT0gaHRtbF9qc18xLlRBR19JRC5URU1QTEFURSkge1xuICAgICAgICAgICAgICAgICAgICBwLl9lcnIodG9rZW4sIGVycm9yX2NvZGVzX2pzXzEuRVJSLmNsb3NpbmdPZkVsZW1lbnRXaXRoT3BlbkNoaWxkRWxlbWVudHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoaHRtbF9qc18xLlRBR19JRC5URU1QTEFURSk7XG4gICAgICAgICAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuY2xlYXJUb0xhc3RNYXJrZXIoKTtcbiAgICAgICAgICAgICAgICBwLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBwLl9yZXNldEluc2VydGlvbk1vZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHAuX2Vycih0b2tlbiwgZXJyb3JfY29kZXNfanNfMS5FUlIuZW5kVGFnV2l0aG91dE1hdGNoaW5nT3BlbkVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgcC5fZXJyKHRva2VuLCBlcnJvcl9jb2Rlc19qc18xLkVSUi5lbmRUYWdXaXRob3V0TWF0Y2hpbmdPcGVuRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB0b2tlbkluSGVhZChwLCB0b2tlbikge1xuICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuQUZURVJfSEVBRDtcbiAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xufVxuLy8gVGhlIFwiaW4gaGVhZCBubyBzY3JpcHRcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHN0YXJ0VGFnSW5IZWFkTm9TY3JpcHQocCwgdG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnRhZ0lEKSB7XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5IVE1MOiB7XG4gICAgICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQkFTRUZPTlQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CR1NPVU5EOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSEVBRDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkxJTks6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5NRVRBOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTk9GUkFNRVM6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5TVFlMRToge1xuICAgICAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELk5PU0NSSVBUOiB7XG4gICAgICAgICAgICBwLl9lcnIodG9rZW4sIGVycm9yX2NvZGVzX2pzXzEuRVJSLm5lc3RlZE5vc2NyaXB0SW5IZWFkKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHRva2VuSW5IZWFkTm9TY3JpcHQocCwgdG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZW5kVGFnSW5IZWFkTm9TY3JpcHQocCwgdG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnRhZ0lEKSB7XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5OT1NDUklQVDoge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX0hFQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQlI6IHtcbiAgICAgICAgICAgIHRva2VuSW5IZWFkTm9TY3JpcHQocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgcC5fZXJyKHRva2VuLCBlcnJvcl9jb2Rlc19qc18xLkVSUi5lbmRUYWdXaXRob3V0TWF0Y2hpbmdPcGVuRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB0b2tlbkluSGVhZE5vU2NyaXB0KHAsIHRva2VuKSB7XG4gICAgY29uc3QgZXJyQ29kZSA9IHRva2VuLnR5cGUgPT09IHRva2VuX2pzXzEuVG9rZW5UeXBlLkVPRiA/IGVycm9yX2NvZGVzX2pzXzEuRVJSLm9wZW5FbGVtZW50c0xlZnRBZnRlckVvZiA6IGVycm9yX2NvZGVzX2pzXzEuRVJSLmRpc2FsbG93ZWRDb250ZW50SW5Ob3NjcmlwdEluSGVhZDtcbiAgICBwLl9lcnIodG9rZW4sIGVyckNvZGUpO1xuICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fSEVBRDtcbiAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xufVxuLy8gVGhlIFwiYWZ0ZXIgaGVhZFwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gc3RhcnRUYWdBZnRlckhlYWQocCwgdG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnRhZ0lEKSB7XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5IVE1MOiB7XG4gICAgICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQk9EWToge1xuICAgICAgICAgICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgICAgICAgICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX0JPRFk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRlJBTUVTRVQ6IHtcbiAgICAgICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIGh0bWxfanNfMS5OUy5IVE1MKTtcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fRlJBTUVTRVQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQkFTRTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkJBU0VGT05UOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQkdTT1VORDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkxJTks6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5NRVRBOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTk9GUkFNRVM6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5TQ1JJUFQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5TVFlMRTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRFTVBMQVRFOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVElUTEU6IHtcbiAgICAgICAgICAgIHAuX2Vycih0b2tlbiwgZXJyb3JfY29kZXNfanNfMS5FUlIuYWJhbmRvbmVkSGVhZEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wdXNoKHAuaGVhZEVsZW1lbnQsIGh0bWxfanNfMS5UQUdfSUQuSEVBRCk7XG4gICAgICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5yZW1vdmUocC5oZWFkRWxlbWVudCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSEVBRDoge1xuICAgICAgICAgICAgcC5fZXJyKHRva2VuLCBlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNwbGFjZWRTdGFydFRhZ0ZvckhlYWRFbGVtZW50KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHRva2VuQWZ0ZXJIZWFkKHAsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGVuZFRhZ0FmdGVySGVhZChwLCB0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udGFnSUQpIHtcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkJPRFk6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5IVE1MOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQlI6IHtcbiAgICAgICAgICAgIHRva2VuQWZ0ZXJIZWFkKHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URU1QTEFURToge1xuICAgICAgICAgICAgZW5kVGFnSW5IZWFkKHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHAuX2Vycih0b2tlbiwgZXJyb3JfY29kZXNfanNfMS5FUlIuZW5kVGFnV2l0aG91dE1hdGNoaW5nT3BlbkVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdG9rZW5BZnRlckhlYWQocCwgdG9rZW4pIHtcbiAgICBwLl9pbnNlcnRGYWtlRWxlbWVudChodG1sX2pzXzEuVEFHX05BTUVTLkJPRFksIGh0bWxfanNfMS5UQUdfSUQuQk9EWSk7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9CT0RZO1xuICAgIG1vZGVJbkJvZHkocCwgdG9rZW4pO1xufVxuLy8gVGhlIFwiaW4gYm9keVwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gbW9kZUluQm9keShwLCB0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlIHRva2VuX2pzXzEuVG9rZW5UeXBlLkNIQVJBQ1RFUjoge1xuICAgICAgICAgICAgY2hhcmFjdGVySW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgdG9rZW5fanNfMS5Ub2tlblR5cGUuV0hJVEVTUEFDRV9DSEFSQUNURVI6IHtcbiAgICAgICAgICAgIHdoaXRlc3BhY2VDaGFyYWN0ZXJJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSB0b2tlbl9qc18xLlRva2VuVHlwZS5DT01NRU5UOiB7XG4gICAgICAgICAgICBhcHBlbmRDb21tZW50KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgdG9rZW5fanNfMS5Ub2tlblR5cGUuU1RBUlRfVEFHOiB7XG4gICAgICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIHRva2VuX2pzXzEuVG9rZW5UeXBlLkVORF9UQUc6IHtcbiAgICAgICAgICAgIGVuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIHRva2VuX2pzXzEuVG9rZW5UeXBlLkVPRjoge1xuICAgICAgICAgICAgZW9mSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICB9XG59XG5mdW5jdGlvbiB3aGl0ZXNwYWNlQ2hhcmFjdGVySW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcbiAgICBwLl9pbnNlcnRDaGFyYWN0ZXJzKHRva2VuKTtcbn1cbmZ1bmN0aW9uIGNoYXJhY3RlckluQm9keShwLCB0b2tlbikge1xuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XG4gICAgcC5faW5zZXJ0Q2hhcmFjdGVycyh0b2tlbik7XG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG59XG5mdW5jdGlvbiBodG1sU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMudG1wbENvdW50ID09PSAwKSB7XG4gICAgICAgIHAudHJlZUFkYXB0ZXIuYWRvcHRBdHRyaWJ1dGVzKHAub3BlbkVsZW1lbnRzLml0ZW1zWzBdLCB0b2tlbi5hdHRycyk7XG4gICAgfVxufVxuZnVuY3Rpb24gYm9keVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgY29uc3QgYm9keUVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy50cnlQZWVrUHJvcGVybHlOZXN0ZWRCb2R5RWxlbWVudCgpO1xuICAgIGlmIChib2R5RWxlbWVudCAmJiBwLm9wZW5FbGVtZW50cy50bXBsQ291bnQgPT09IDApIHtcbiAgICAgICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG4gICAgICAgIHAudHJlZUFkYXB0ZXIuYWRvcHRBdHRyaWJ1dGVzKGJvZHlFbGVtZW50LCB0b2tlbi5hdHRycyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZnJhbWVzZXRTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIGNvbnN0IGJvZHlFbGVtZW50ID0gcC5vcGVuRWxlbWVudHMudHJ5UGVla1Byb3Blcmx5TmVzdGVkQm9keUVsZW1lbnQoKTtcbiAgICBpZiAocC5mcmFtZXNldE9rICYmIGJvZHlFbGVtZW50KSB7XG4gICAgICAgIHAudHJlZUFkYXB0ZXIuZGV0YWNoTm9kZShib2R5RWxlbWVudCk7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcEFsbFVwVG9IdG1sRWxlbWVudCgpO1xuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fRlJBTUVTRVQ7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkcmVzc1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luQnV0dG9uU2NvcGUoaHRtbF9qc18xLlRBR19JRC5QKSkge1xuICAgICAgICBwLl9jbG9zZVBFbGVtZW50KCk7XG4gICAgfVxuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIGh0bWxfanNfMS5OUy5IVE1MKTtcbn1cbmZ1bmN0aW9uIG51bWJlcmVkSGVhZGVyU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5CdXR0b25TY29wZShodG1sX2pzXzEuVEFHX0lELlApKSB7XG4gICAgICAgIHAuX2Nsb3NlUEVsZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKCgwLCBodG1sX2pzXzEuaXNOdW1iZXJlZEhlYWRlcikocC5vcGVuRWxlbWVudHMuY3VycmVudFRhZ0lkKSkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICB9XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xufVxuZnVuY3Rpb24gcHJlU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5CdXR0b25TY29wZShodG1sX2pzXzEuVEFHX0lELlApKSB7XG4gICAgICAgIHAuX2Nsb3NlUEVsZW1lbnQoKTtcbiAgICB9XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgIC8vTk9URTogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBVKzAwMEEgTElORSBGRUVEIChMRikgY2hhcmFjdGVyIHRva2VuLCB0aGVuIGlnbm9yZSB0aGF0IHRva2VuIGFuZCBtb3ZlXG4gICAgLy9vbiB0byB0aGUgbmV4dCBvbmUuIChOZXdsaW5lcyBhdCB0aGUgc3RhcnQgb2YgcHJlIGJsb2NrcyBhcmUgaWdub3JlZCBhcyBhbiBhdXRob3JpbmcgY29udmVuaWVuY2UuKVxuICAgIHAuc2tpcE5leHROZXdMaW5lID0gdHJ1ZTtcbiAgICBwLmZyYW1lc2V0T2sgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGZvcm1TdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIGNvbnN0IGluVGVtcGxhdGUgPSBwLm9wZW5FbGVtZW50cy50bXBsQ291bnQgPiAwO1xuICAgIGlmICghcC5mb3JtRWxlbWVudCB8fCBpblRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJbkJ1dHRvblNjb3BlKGh0bWxfanNfMS5UQUdfSUQuUCkpIHtcbiAgICAgICAgICAgIHAuX2Nsb3NlUEVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgICAgIGlmICghaW5UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcC5mb3JtRWxlbWVudCA9IHAub3BlbkVsZW1lbnRzLmN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBsaXN0SXRlbVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdJRDtcbiAgICBmb3IgKGxldCBpID0gcC5vcGVuRWxlbWVudHMuc3RhY2tUb3A7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRJZCA9IHAub3BlbkVsZW1lbnRzLnRhZ0lEc1tpXTtcbiAgICAgICAgaWYgKCh0biA9PT0gaHRtbF9qc18xLlRBR19JRC5MSSAmJiBlbGVtZW50SWQgPT09IGh0bWxfanNfMS5UQUdfSUQuTEkpIHx8XG4gICAgICAgICAgICAoKHRuID09PSBodG1sX2pzXzEuVEFHX0lELkREIHx8IHRuID09PSBodG1sX2pzXzEuVEFHX0lELkRUKSAmJiAoZWxlbWVudElkID09PSBodG1sX2pzXzEuVEFHX0lELkREIHx8IGVsZW1lbnRJZCA9PT0gaHRtbF9qc18xLlRBR19JRC5EVCkpKSB7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzV2l0aEV4Y2x1c2lvbihlbGVtZW50SWQpO1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKGVsZW1lbnRJZCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudElkICE9PSBodG1sX2pzXzEuVEFHX0lELkFERFJFU1MgJiZcbiAgICAgICAgICAgIGVsZW1lbnRJZCAhPT0gaHRtbF9qc18xLlRBR19JRC5ESVYgJiZcbiAgICAgICAgICAgIGVsZW1lbnRJZCAhPT0gaHRtbF9qc18xLlRBR19JRC5QICYmXG4gICAgICAgICAgICBwLl9pc1NwZWNpYWxFbGVtZW50KHAub3BlbkVsZW1lbnRzLml0ZW1zW2ldLCBlbGVtZW50SWQpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5CdXR0b25TY29wZShodG1sX2pzXzEuVEFHX0lELlApKSB7XG4gICAgICAgIHAuX2Nsb3NlUEVsZW1lbnQoKTtcbiAgICB9XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xufVxuZnVuY3Rpb24gcGxhaW50ZXh0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5CdXR0b25TY29wZShodG1sX2pzXzEuVEFHX0lELlApKSB7XG4gICAgICAgIHAuX2Nsb3NlUEVsZW1lbnQoKTtcbiAgICB9XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgIHAudG9rZW5pemVyLnN0YXRlID0gaW5kZXhfanNfMS5Ub2tlbml6ZXJNb2RlLlBMQUlOVEVYVDtcbn1cbmZ1bmN0aW9uIGJ1dHRvblN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2NvcGUoaHRtbF9qc18xLlRBR19JRC5CVVRUT04pKSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKTtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKGh0bWxfanNfMS5UQUdfSUQuQlVUVE9OKTtcbiAgICB9XG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG59XG5mdW5jdGlvbiBhU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50RW50cnkgPSBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5nZXRFbGVtZW50RW50cnlJblNjb3BlV2l0aFRhZ05hbWUoaHRtbF9qc18xLlRBR19OQU1FUy5BKTtcbiAgICBpZiAoYWN0aXZlRWxlbWVudEVudHJ5KSB7XG4gICAgICAgIGNhbGxBZG9wdGlvbkFnZW5jeShwLCB0b2tlbik7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnJlbW92ZShhY3RpdmVFbGVtZW50RW50cnkuZWxlbWVudCk7XG4gICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnJlbW92ZUVudHJ5KGFjdGl2ZUVsZW1lbnRFbnRyeSk7XG4gICAgfVxuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnB1c2hFbGVtZW50KHAub3BlbkVsZW1lbnRzLmN1cnJlbnQsIHRva2VuKTtcbn1cbmZ1bmN0aW9uIGJTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnB1c2hFbGVtZW50KHAub3BlbkVsZW1lbnRzLmN1cnJlbnQsIHRva2VuKTtcbn1cbmZ1bmN0aW9uIG5vYnJTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2NvcGUoaHRtbF9qc18xLlRBR19JRC5OT0JSKSkge1xuICAgICAgICBjYWxsQWRvcHRpb25BZ2VuY3kocCwgdG9rZW4pO1xuICAgICAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIH1cbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucHVzaEVsZW1lbnQocC5vcGVuRWxlbWVudHMuY3VycmVudCwgdG9rZW4pO1xufVxuZnVuY3Rpb24gYXBwbGV0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIGh0bWxfanNfMS5OUy5IVE1MKTtcbiAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5pbnNlcnRNYXJrZXIoKTtcbiAgICBwLmZyYW1lc2V0T2sgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIHRhYmxlU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAocC50cmVlQWRhcHRlci5nZXREb2N1bWVudE1vZGUocC5kb2N1bWVudCkgIT09IGh0bWxfanNfMS5ET0NVTUVOVF9NT0RFLlFVSVJLUyAmJiBwLm9wZW5FbGVtZW50cy5oYXNJbkJ1dHRvblNjb3BlKGh0bWxfanNfMS5UQUdfSUQuUCkpIHtcbiAgICAgICAgcC5fY2xvc2VQRWxlbWVudCgpO1xuICAgIH1cbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9UQUJMRTtcbn1cbmZ1bmN0aW9uIGFyZWFTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XG4gICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xuICAgIHRva2VuLmFja1NlbGZDbG9zaW5nID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGlzSGlkZGVuSW5wdXQodG9rZW4pIHtcbiAgICBjb25zdCBpbnB1dFR5cGUgPSAoMCwgdG9rZW5fanNfMS5nZXRUb2tlbkF0dHIpKHRva2VuLCBodG1sX2pzXzEuQVRUUlMuVFlQRSk7XG4gICAgcmV0dXJuIGlucHV0VHlwZSAhPSBudWxsICYmIGlucHV0VHlwZS50b0xvd2VyQ2FzZSgpID09PSBISURERU5fSU5QVVRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlucHV0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIHAuX2FwcGVuZEVsZW1lbnQodG9rZW4sIGh0bWxfanNfMS5OUy5IVE1MKTtcbiAgICBpZiAoIWlzSGlkZGVuSW5wdXQodG9rZW4pKSB7XG4gICAgICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xuICAgIH1cbiAgICB0b2tlbi5hY2tTZWxmQ2xvc2luZyA9IHRydWU7XG59XG5mdW5jdGlvbiBwYXJhbVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgIHRva2VuLmFja1NlbGZDbG9zaW5nID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGhyU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5CdXR0b25TY29wZShodG1sX2pzXzEuVEFHX0lELlApKSB7XG4gICAgICAgIHAuX2Nsb3NlUEVsZW1lbnQoKTtcbiAgICB9XG4gICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xuICAgIHRva2VuLmFja1NlbGZDbG9zaW5nID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGltYWdlU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICB0b2tlbi50YWdOYW1lID0gaHRtbF9qc18xLlRBR19OQU1FUy5JTUc7XG4gICAgdG9rZW4udGFnSUQgPSBodG1sX2pzXzEuVEFHX0lELklNRztcbiAgICBhcmVhU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xufVxuZnVuY3Rpb24gdGV4dGFyZWFTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIGh0bWxfanNfMS5OUy5IVE1MKTtcbiAgICAvL05PVEU6IElmIHRoZSBuZXh0IHRva2VuIGlzIGEgVSswMDBBIExJTkUgRkVFRCAoTEYpIGNoYXJhY3RlciB0b2tlbiwgdGhlbiBpZ25vcmUgdGhhdCB0b2tlbiBhbmQgbW92ZVxuICAgIC8vb24gdG8gdGhlIG5leHQgb25lLiAoTmV3bGluZXMgYXQgdGhlIHN0YXJ0IG9mIHRleHRhcmVhIGVsZW1lbnRzIGFyZSBpZ25vcmVkIGFzIGFuIGF1dGhvcmluZyBjb252ZW5pZW5jZS4pXG4gICAgcC5za2lwTmV4dE5ld0xpbmUgPSB0cnVlO1xuICAgIHAudG9rZW5pemVyLnN0YXRlID0gaW5kZXhfanNfMS5Ub2tlbml6ZXJNb2RlLlJDREFUQTtcbiAgICBwLm9yaWdpbmFsSW5zZXJ0aW9uTW9kZSA9IHAuaW5zZXJ0aW9uTW9kZTtcbiAgICBwLmZyYW1lc2V0T2sgPSBmYWxzZTtcbiAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLlRFWFQ7XG59XG5mdW5jdGlvbiB4bXBTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJbkJ1dHRvblNjb3BlKGh0bWxfanNfMS5UQUdfSUQuUCkpIHtcbiAgICAgICAgcC5fY2xvc2VQRWxlbWVudCgpO1xuICAgIH1cbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xuICAgIHAuX3N3aXRjaFRvVGV4dFBhcnNpbmcodG9rZW4sIGluZGV4X2pzXzEuVG9rZW5pemVyTW9kZS5SQVdURVhUKTtcbn1cbmZ1bmN0aW9uIGlmcmFtZVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG4gICAgcC5fc3dpdGNoVG9UZXh0UGFyc2luZyh0b2tlbiwgaW5kZXhfanNfMS5Ub2tlbml6ZXJNb2RlLlJBV1RFWFQpO1xufVxuLy9OT1RFOiBoZXJlIHdlIGFzc3VtZSB0aGF0IHdlIGFsd2F5cyBhY3QgYXMgYW4gdXNlciBhZ2VudCB3aXRoIGVuYWJsZWQgcGx1Z2lucywgc28gd2UgcGFyc2Vcbi8vPG5vZW1iZWQ+IGFzIHJhd3RleHQuXG5mdW5jdGlvbiBub2VtYmVkU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBwLl9zd2l0Y2hUb1RleHRQYXJzaW5nKHRva2VuLCBpbmRleF9qc18xLlRva2VuaXplck1vZGUuUkFXVEVYVCk7XG59XG5mdW5jdGlvbiBzZWxlY3RTdGFydFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xuICAgIHAuaW5zZXJ0aW9uTW9kZSA9XG4gICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9PT0gSW5zZXJ0aW9uTW9kZS5JTl9UQUJMRSB8fFxuICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID09PSBJbnNlcnRpb25Nb2RlLklOX0NBUFRJT04gfHxcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9PT0gSW5zZXJ0aW9uTW9kZS5JTl9UQUJMRV9CT0RZIHx8XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPT09IEluc2VydGlvbk1vZGUuSU5fUk9XIHx8XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPT09IEluc2VydGlvbk1vZGUuSU5fQ0VMTFxuICAgICAgICAgICAgPyBJbnNlcnRpb25Nb2RlLklOX1NFTEVDVF9JTl9UQUJMRVxuICAgICAgICAgICAgOiBJbnNlcnRpb25Nb2RlLklOX1NFTEVDVDtcbn1cbmZ1bmN0aW9uIG9wdGdyb3VwU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuY3VycmVudFRhZ0lkID09PSBodG1sX2pzXzEuVEFHX0lELk9QVElPTikge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICB9XG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG59XG5mdW5jdGlvbiByYlN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2NvcGUoaHRtbF9qc18xLlRBR19JRC5SVUJZKSkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XG4gICAgfVxuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIGh0bWxfanNfMS5OUy5IVE1MKTtcbn1cbmZ1bmN0aW9uIHJ0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5TY29wZShodG1sX2pzXzEuVEFHX0lELlJVQlkpKSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3NXaXRoRXhjbHVzaW9uKGh0bWxfanNfMS5UQUdfSUQuUlRDKTtcbiAgICB9XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xufVxuZnVuY3Rpb24gbWF0aFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgcC5fcmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKTtcbiAgICBmb3JlaWduQ29udGVudC5hZGp1c3RUb2tlbk1hdGhNTEF0dHJzKHRva2VuKTtcbiAgICBmb3JlaWduQ29udGVudC5hZGp1c3RUb2tlblhNTEF0dHJzKHRva2VuKTtcbiAgICBpZiAodG9rZW4uc2VsZkNsb3NpbmcpIHtcbiAgICAgICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLk1BVEhNTCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuTUFUSE1MKTtcbiAgICB9XG4gICAgdG9rZW4uYWNrU2VsZkNsb3NpbmcgPSB0cnVlO1xufVxuZnVuY3Rpb24gc3ZnU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIGZvcmVpZ25Db250ZW50LmFkanVzdFRva2VuU1ZHQXR0cnModG9rZW4pO1xuICAgIGZvcmVpZ25Db250ZW50LmFkanVzdFRva2VuWE1MQXR0cnModG9rZW4pO1xuICAgIGlmICh0b2tlbi5zZWxmQ2xvc2luZykge1xuICAgICAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuU1ZHKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIGh0bWxfanNfMS5OUy5TVkcpO1xuICAgIH1cbiAgICB0b2tlbi5hY2tTZWxmQ2xvc2luZyA9IHRydWU7XG59XG5mdW5jdGlvbiBnZW5lcmljU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBwLl9yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpO1xuICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIGh0bWxfanNfMS5OUy5IVE1MKTtcbn1cbmZ1bmN0aW9uIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50YWdJRCkge1xuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlM6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5COlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkVNOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVFQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CSUc6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5DT0RFOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRk9OVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlNNQUxMOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuU1RSSUtFOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuU1RST05HOiB7XG4gICAgICAgICAgICBiU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkE6IHtcbiAgICAgICAgICAgIGFTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSDE6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5IMjpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkgzOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSDQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5INTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkg2OiB7XG4gICAgICAgICAgICBudW1iZXJlZEhlYWRlclN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5QOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuREw6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5PTDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlVMOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRElWOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRElSOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTkFWOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTUFJTjpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELk1FTlU6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5BU0lERTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkNFTlRFUjpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkZJR1VSRTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkZPT1RFUjpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkhFQURFUjpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkhHUk9VUDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkRJQUxPRzpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkRFVEFJTFM6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5BRERSRVNTOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQVJUSUNMRTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlNFQ1RJT046XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5TVU1NQVJZOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRklFTERTRVQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CTE9DS1FVT1RFOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRklHQ0FQVElPTjoge1xuICAgICAgICAgICAgYWRkcmVzc1N0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5MSTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkREOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRFQ6IHtcbiAgICAgICAgICAgIGxpc3RJdGVtU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkJSOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSU1HOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuV0JSOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQVJFQTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkVNQkVEOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuS0VZR0VOOiB7XG4gICAgICAgICAgICBhcmVhU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkhSOiB7XG4gICAgICAgICAgICBoclN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5SQjpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlJUQzoge1xuICAgICAgICAgICAgcmJTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuUlQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5SUDoge1xuICAgICAgICAgICAgcnRTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuUFJFOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTElTVElORzoge1xuICAgICAgICAgICAgcHJlU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlhNUDoge1xuICAgICAgICAgICAgeG1wU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlNWRzoge1xuICAgICAgICAgICAgc3ZnU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkhUTUw6IHtcbiAgICAgICAgICAgIGh0bWxTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQkFTRTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkxJTks6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5NRVRBOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuU1RZTEU6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5USVRMRTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlNDUklQVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkJHU09VTkQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CQVNFRk9OVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRFTVBMQVRFOiB7XG4gICAgICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQk9EWToge1xuICAgICAgICAgICAgYm9keVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5GT1JNOiB7XG4gICAgICAgICAgICBmb3JtU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELk5PQlI6IHtcbiAgICAgICAgICAgIG5vYnJTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTUFUSDoge1xuICAgICAgICAgICAgbWF0aFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UQUJMRToge1xuICAgICAgICAgICAgdGFibGVTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSU5QVVQ6IHtcbiAgICAgICAgICAgIGlucHV0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlBBUkFNOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVFJBQ0s6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5TT1VSQ0U6IHtcbiAgICAgICAgICAgIHBhcmFtU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELklNQUdFOiB7XG4gICAgICAgICAgICBpbWFnZVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CVVRUT046IHtcbiAgICAgICAgICAgIGJ1dHRvblN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5BUFBMRVQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5PQkpFQ1Q6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5NQVJRVUVFOiB7XG4gICAgICAgICAgICBhcHBsZXRTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSUZSQU1FOiB7XG4gICAgICAgICAgICBpZnJhbWVTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuU0VMRUNUOiB7XG4gICAgICAgICAgICBzZWxlY3RTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuT1BUSU9OOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuT1BUR1JPVVA6IHtcbiAgICAgICAgICAgIG9wdGdyb3VwU3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELk5PRU1CRUQ6IHtcbiAgICAgICAgICAgIG5vZW1iZWRTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRlJBTUVTRVQ6IHtcbiAgICAgICAgICAgIGZyYW1lc2V0U3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRFWFRBUkVBOiB7XG4gICAgICAgICAgICB0ZXh0YXJlYVN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5OT1NDUklQVDoge1xuICAgICAgICAgICAgaWYgKHAub3B0aW9ucy5zY3JpcHRpbmdFbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgbm9lbWJlZFN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGdlbmVyaWNTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuUExBSU5URVhUOiB7XG4gICAgICAgICAgICBwbGFpbnRleHRTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ09MOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEg6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRSOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSEVBRDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkZSQU1FOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEJPRFk6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URk9PVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRIRUFEOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ0FQVElPTjpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkNPTEdST1VQOiB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgdG9rZW5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGdlbmVyaWNTdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBib2R5RW5kVGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2NvcGUoaHRtbF9qc18xLlRBR19JRC5CT0RZKSkge1xuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLkFGVEVSX0JPRFk7XG4gICAgICAgIC8vTk9URTogPGJvZHk+IGlzIG5ldmVyIHBvcHBlZCBmcm9tIHRoZSBzdGFjaywgc28gd2UgbmVlZCB0byB1cGRhdGVkXG4gICAgICAgIC8vdGhlIGVuZCBsb2NhdGlvbiBleHBsaWNpdGx5LlxuICAgICAgICBpZiAocC5vcHRpb25zLnNvdXJjZUNvZGVMb2NhdGlvbkluZm8pIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHlFbGVtZW50ID0gcC5vcGVuRWxlbWVudHMudHJ5UGVla1Byb3Blcmx5TmVzdGVkQm9keUVsZW1lbnQoKTtcbiAgICAgICAgICAgIGlmIChib2R5RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHAuX3NldEVuZExvY2F0aW9uKGJvZHlFbGVtZW50LCB0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBodG1sRW5kVGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2NvcGUoaHRtbF9qc18xLlRBR19JRC5CT0RZKSkge1xuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLkFGVEVSX0JPRFk7XG4gICAgICAgIGVuZFRhZ0FmdGVyQm9keShwLCB0b2tlbik7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkcmVzc0VuZFRhZ0luQm9keShwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnSUQ7XG4gICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2NvcGUodG4pKSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKTtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKHRuKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmb3JtRW5kVGFnSW5Cb2R5KHApIHtcbiAgICBjb25zdCBpblRlbXBsYXRlID0gcC5vcGVuRWxlbWVudHMudG1wbENvdW50ID4gMDtcbiAgICBjb25zdCB7IGZvcm1FbGVtZW50IH0gPSBwO1xuICAgIGlmICghaW5UZW1wbGF0ZSkge1xuICAgICAgICBwLmZvcm1FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKChmb3JtRWxlbWVudCB8fCBpblRlbXBsYXRlKSAmJiBwLm9wZW5FbGVtZW50cy5oYXNJblNjb3BlKGh0bWxfanNfMS5UQUdfSUQuRk9STSkpIHtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpO1xuICAgICAgICBpZiAoaW5UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKGh0bWxfanNfMS5UQUdfSUQuRk9STSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZm9ybUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnJlbW92ZShmb3JtRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBwRW5kVGFnSW5Cb2R5KHApIHtcbiAgICBpZiAoIXAub3BlbkVsZW1lbnRzLmhhc0luQnV0dG9uU2NvcGUoaHRtbF9qc18xLlRBR19JRC5QKSkge1xuICAgICAgICBwLl9pbnNlcnRGYWtlRWxlbWVudChodG1sX2pzXzEuVEFHX05BTUVTLlAsIGh0bWxfanNfMS5UQUdfSUQuUCk7XG4gICAgfVxuICAgIHAuX2Nsb3NlUEVsZW1lbnQoKTtcbn1cbmZ1bmN0aW9uIGxpRW5kVGFnSW5Cb2R5KHApIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5MaXN0SXRlbVNjb3BlKGh0bWxfanNfMS5UQUdfSUQuTEkpKSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3NXaXRoRXhjbHVzaW9uKGh0bWxfanNfMS5UQUdfSUQuTEkpO1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoaHRtbF9qc18xLlRBR19JRC5MSSk7XG4gICAgfVxufVxuZnVuY3Rpb24gZGRFbmRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ0lEO1xuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblNjb3BlKHRuKSkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzV2l0aEV4Y2x1c2lvbih0bik7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZCh0bik7XG4gICAgfVxufVxuZnVuY3Rpb24gbnVtYmVyZWRIZWFkZXJFbmRUYWdJbkJvZHkocCkge1xuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNOdW1iZXJlZEhlYWRlckluU2NvcGUoKSkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsTnVtYmVyZWRIZWFkZXJQb3BwZWQoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhcHBsZXRFbmRUYWdJbkJvZHkocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ0lEO1xuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblNjb3BlKHRuKSkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZCh0bik7XG4gICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmNsZWFyVG9MYXN0TWFya2VyKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYnJFbmRUYWdJbkJvZHkocCkge1xuICAgIHAuX3JlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCk7XG4gICAgcC5faW5zZXJ0RmFrZUVsZW1lbnQoaHRtbF9qc18xLlRBR19OQU1FUy5CUiwgaHRtbF9qc18xLlRBR19JRC5CUik7XG4gICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgcC5mcmFtZXNldE9rID0gZmFsc2U7XG59XG5mdW5jdGlvbiBnZW5lcmljRW5kVGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdOYW1lO1xuICAgIGNvbnN0IHRpZCA9IHRva2VuLnRhZ0lEO1xuICAgIGZvciAobGV0IGkgPSBwLm9wZW5FbGVtZW50cy5zdGFja1RvcDsgaSA+IDA7IGktLSkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcC5vcGVuRWxlbWVudHMuaXRlbXNbaV07XG4gICAgICAgIGNvbnN0IGVsZW1lbnRJZCA9IHAub3BlbkVsZW1lbnRzLnRhZ0lEc1tpXTtcbiAgICAgICAgLy8gQ29tcGFyZSB0aGUgdGFnIG5hbWUgaGVyZSwgYXMgdGhlIHRhZyBtaWdodCBub3QgYmUgYSBrbm93biB0YWcgd2l0aCBhbiBJRC5cbiAgICAgICAgaWYgKHRpZCA9PT0gZWxlbWVudElkICYmICh0aWQgIT09IGh0bWxfanNfMS5UQUdfSUQuVU5LTk9XTiB8fCBwLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUoZWxlbWVudCkgPT09IHRuKSkge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMuZ2VuZXJhdGVJbXBsaWVkRW5kVGFnc1dpdGhFeGNsdXNpb24odGlkKTtcbiAgICAgICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5zdGFja1RvcCA+PSBpKVxuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnNob3J0ZW5Ub0xlbmd0aChpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLl9pc1NwZWNpYWxFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnRJZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZW5kVGFnSW5Cb2R5KHAsIHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50YWdJRCkge1xuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkI6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5JOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuUzpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlU6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5FTTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRUOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQklHOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ09ERTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkZPTlQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5OT0JSOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuU01BTEw6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5TVFJJS0U6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5TVFJPTkc6IHtcbiAgICAgICAgICAgIGNhbGxBZG9wdGlvbkFnZW5jeShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuUDoge1xuICAgICAgICAgICAgcEVuZFRhZ0luQm9keShwKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5ETDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlVMOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuT0w6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5ESVI6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5ESVY6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5OQVY6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5QUkU6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5NQUlOOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTUVOVTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkFTSURFOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ0VOVEVSOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRklHVVJFOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRk9PVEVSOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSEVBREVSOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSEdST1VQOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRElBTE9HOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQUREUkVTUzpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkFSVElDTEU6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5ERVRBSUxTOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuU0VDVElPTjpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlNVTU1BUlk6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5MSVNUSU5HOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRklFTERTRVQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CTE9DS1FVT1RFOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRklHQ0FQVElPTjoge1xuICAgICAgICAgICAgYWRkcmVzc0VuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTEk6IHtcbiAgICAgICAgICAgIGxpRW5kVGFnSW5Cb2R5KHApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkREOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRFQ6IHtcbiAgICAgICAgICAgIGRkRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5IMTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkgyOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSDM6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5INDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkg1OlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSDY6IHtcbiAgICAgICAgICAgIG51bWJlcmVkSGVhZGVyRW5kVGFnSW5Cb2R5KHApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkJSOiB7XG4gICAgICAgICAgICBickVuZFRhZ0luQm9keShwKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CT0RZOiB7XG4gICAgICAgICAgICBib2R5RW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5IVE1MOiB7XG4gICAgICAgICAgICBodG1sRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5GT1JNOiB7XG4gICAgICAgICAgICBmb3JtRW5kVGFnSW5Cb2R5KHApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkFQUExFVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELk9CSkVDVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELk1BUlFVRUU6IHtcbiAgICAgICAgICAgIGFwcGxldEVuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEVNUExBVEU6IHtcbiAgICAgICAgICAgIGVuZFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBnZW5lcmljRW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGVvZkluQm9keShwLCB0b2tlbikge1xuICAgIGlmIChwLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICBlb2ZJblRlbXBsYXRlKHAsIHRva2VuKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0b3BQYXJzaW5nKHAsIHRva2VuKTtcbiAgICB9XG59XG4vLyBUaGUgXCJ0ZXh0XCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBlbmRUYWdJblRleHQocCwgdG9rZW4pIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHRva2VuLnRhZ0lEID09PSBodG1sX2pzXzEuVEFHX0lELlNDUklQVCkge1xuICAgICAgICAoX2EgPSBwLnNjcmlwdEhhbmRsZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHAsIHAub3BlbkVsZW1lbnRzLmN1cnJlbnQpO1xuICAgIH1cbiAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICBwLmluc2VydGlvbk1vZGUgPSBwLm9yaWdpbmFsSW5zZXJ0aW9uTW9kZTtcbn1cbmZ1bmN0aW9uIGVvZkluVGV4dChwLCB0b2tlbikge1xuICAgIHAuX2Vycih0b2tlbiwgZXJyb3JfY29kZXNfanNfMS5FUlIuZW9mSW5FbGVtZW50VGhhdENhbkNvbnRhaW5Pbmx5VGV4dCk7XG4gICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gcC5vcmlnaW5hbEluc2VydGlvbk1vZGU7XG4gICAgcC5vbkVvZih0b2tlbik7XG59XG4vLyBUaGUgXCJpbiB0YWJsZVwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY2hhcmFjdGVySW5UYWJsZShwLCB0b2tlbikge1xuICAgIGlmIChUQUJMRV9TVFJVQ1RVUkVfVEFHUy5oYXMocC5vcGVuRWxlbWVudHMuY3VycmVudFRhZ0lkKSkge1xuICAgICAgICBwLnBlbmRpbmdDaGFyYWN0ZXJUb2tlbnMubGVuZ3RoID0gMDtcbiAgICAgICAgcC5oYXNOb25XaGl0ZXNwYWNlUGVuZGluZ0NoYXJhY3RlclRva2VuID0gZmFsc2U7XG4gICAgICAgIHAub3JpZ2luYWxJbnNlcnRpb25Nb2RlID0gcC5pbnNlcnRpb25Nb2RlO1xuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFX1RFWFQ7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSB0b2tlbl9qc18xLlRva2VuVHlwZS5DSEFSQUNURVI6IHtcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXJJblRhYmxlVGV4dChwLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHRva2VuX2pzXzEuVG9rZW5UeXBlLldISVRFU1BBQ0VfQ0hBUkFDVEVSOiB7XG4gICAgICAgICAgICAgICAgd2hpdGVzcGFjZUNoYXJhY3RlckluVGFibGVUZXh0KHAsIHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElnbm9yZSBudWxsXG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRva2VuSW5UYWJsZShwLCB0b2tlbik7XG4gICAgfVxufVxuZnVuY3Rpb24gY2FwdGlvblN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xuICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVDb250ZXh0KCk7XG4gICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5zZXJ0TWFya2VyKCk7XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fQ0FQVElPTjtcbn1cbmZ1bmN0aW9uIGNvbGdyb3VwU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKSB7XG4gICAgcC5vcGVuRWxlbWVudHMuY2xlYXJCYWNrVG9UYWJsZUNvbnRleHQoKTtcbiAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9DT0xVTU5fR1JPVVA7XG59XG5mdW5jdGlvbiBjb2xTdGFydFRhZ0luVGFibGUocCwgdG9rZW4pIHtcbiAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlQ29udGV4dCgpO1xuICAgIHAuX2luc2VydEZha2VFbGVtZW50KGh0bWxfanNfMS5UQUdfTkFNRVMuQ09MR1JPVVAsIGh0bWxfanNfMS5UQUdfSUQuQ09MR1JPVVApO1xuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fQ09MVU1OX0dST1VQO1xuICAgIHN0YXJ0VGFnSW5Db2x1bW5Hcm91cChwLCB0b2tlbik7XG59XG5mdW5jdGlvbiB0Ym9keVN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xuICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVDb250ZXh0KCk7XG4gICAgcC5faW5zZXJ0RWxlbWVudCh0b2tlbiwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fVEFCTEVfQk9EWTtcbn1cbmZ1bmN0aW9uIHRkU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKSB7XG4gICAgcC5vcGVuRWxlbWVudHMuY2xlYXJCYWNrVG9UYWJsZUNvbnRleHQoKTtcbiAgICBwLl9pbnNlcnRGYWtlRWxlbWVudChodG1sX2pzXzEuVEFHX05BTUVTLlRCT0RZLCBodG1sX2pzXzEuVEFHX0lELlRCT0RZKTtcbiAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFX0JPRFk7XG4gICAgc3RhcnRUYWdJblRhYmxlQm9keShwLCB0b2tlbik7XG59XG5mdW5jdGlvbiB0YWJsZVN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xuICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUoaHRtbF9qc18xLlRBR19JRC5UQUJMRSkpIHtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKGh0bWxfanNfMS5UQUdfSUQuVEFCTEUpO1xuICAgICAgICBwLl9yZXNldEluc2VydGlvbk1vZGUoKTtcbiAgICAgICAgcC5fcHJvY2Vzc1N0YXJ0VGFnKHRva2VuKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnB1dFN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbikge1xuICAgIGlmIChpc0hpZGRlbklucHV0KHRva2VuKSkge1xuICAgICAgICBwLl9hcHBlbmRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0b2tlbkluVGFibGUocCwgdG9rZW4pO1xuICAgIH1cbiAgICB0b2tlbi5hY2tTZWxmQ2xvc2luZyA9IHRydWU7XG59XG5mdW5jdGlvbiBmb3JtU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKSB7XG4gICAgaWYgKCFwLmZvcm1FbGVtZW50ICYmIHAub3BlbkVsZW1lbnRzLnRtcGxDb3VudCA9PT0gMCkge1xuICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgICAgIHAuZm9ybUVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy5jdXJyZW50O1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzdGFydFRhZ0luVGFibGUocCwgdG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnRhZ0lEKSB7XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRIOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVFI6IHtcbiAgICAgICAgICAgIHRkU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5TVFlMRTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlNDUklQVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRFTVBMQVRFOiB7XG4gICAgICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ09MOiB7XG4gICAgICAgICAgICBjb2xTdGFydFRhZ0luVGFibGUocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkZPUk06IHtcbiAgICAgICAgICAgIGZvcm1TdGFydFRhZ0luVGFibGUocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRBQkxFOiB7XG4gICAgICAgICAgICB0YWJsZVN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEJPRFk6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URk9PVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRIRUFEOiB7XG4gICAgICAgICAgICB0Ym9keVN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSU5QVVQ6IHtcbiAgICAgICAgICAgIGlucHV0U3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5DQVBUSU9OOiB7XG4gICAgICAgICAgICBjYXB0aW9uU3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5DT0xHUk9VUDoge1xuICAgICAgICAgICAgY29sZ3JvdXBTdGFydFRhZ0luVGFibGUocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdG9rZW5JblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGVuZFRhZ0luVGFibGUocCwgdG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnRhZ0lEKSB7XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UQUJMRToge1xuICAgICAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZShodG1sX2pzXzEuVEFHX0lELlRBQkxFKSkge1xuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZChodG1sX2pzXzEuVEFHX0lELlRBQkxFKTtcbiAgICAgICAgICAgICAgICBwLl9yZXNldEluc2VydGlvbk1vZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URU1QTEFURToge1xuICAgICAgICAgICAgZW5kVGFnSW5IZWFkKHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CT0RZOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ0FQVElPTjpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkNPTDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkNPTEdST1VQOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSFRNTDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRCT0RZOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URk9PVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRIOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEhFQUQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UUjoge1xuICAgICAgICAgICAgLy8gSWdub3JlIHRva2VuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICB0b2tlbkluVGFibGUocCwgdG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdG9rZW5JblRhYmxlKHAsIHRva2VuKSB7XG4gICAgY29uc3Qgc2F2ZWRGb3N0ZXJQYXJlbnRpbmdTdGF0ZSA9IHAuZm9zdGVyUGFyZW50aW5nRW5hYmxlZDtcbiAgICBwLmZvc3RlclBhcmVudGluZ0VuYWJsZWQgPSB0cnVlO1xuICAgIC8vIFByb2Nlc3MgdG9rZW4gaW4gYEluIEJvZHlgIG1vZGVcbiAgICBtb2RlSW5Cb2R5KHAsIHRva2VuKTtcbiAgICBwLmZvc3RlclBhcmVudGluZ0VuYWJsZWQgPSBzYXZlZEZvc3RlclBhcmVudGluZ1N0YXRlO1xufVxuLy8gVGhlIFwiaW4gdGFibGUgdGV4dFwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gd2hpdGVzcGFjZUNoYXJhY3RlckluVGFibGVUZXh0KHAsIHRva2VuKSB7XG4gICAgcC5wZW5kaW5nQ2hhcmFjdGVyVG9rZW5zLnB1c2godG9rZW4pO1xufVxuZnVuY3Rpb24gY2hhcmFjdGVySW5UYWJsZVRleHQocCwgdG9rZW4pIHtcbiAgICBwLnBlbmRpbmdDaGFyYWN0ZXJUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgcC5oYXNOb25XaGl0ZXNwYWNlUGVuZGluZ0NoYXJhY3RlclRva2VuID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHRva2VuSW5UYWJsZVRleHQocCwgdG9rZW4pIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgaWYgKHAuaGFzTm9uV2hpdGVzcGFjZVBlbmRpbmdDaGFyYWN0ZXJUb2tlbikge1xuICAgICAgICBmb3IgKDsgaSA8IHAucGVuZGluZ0NoYXJhY3RlclRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG9rZW5JblRhYmxlKHAsIHAucGVuZGluZ0NoYXJhY3RlclRva2Vuc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAoOyBpIDwgcC5wZW5kaW5nQ2hhcmFjdGVyVG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwLl9pbnNlcnRDaGFyYWN0ZXJzKHAucGVuZGluZ0NoYXJhY3RlclRva2Vuc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcC5pbnNlcnRpb25Nb2RlID0gcC5vcmlnaW5hbEluc2VydGlvbk1vZGU7XG4gICAgcC5fcHJvY2Vzc1Rva2VuKHRva2VuKTtcbn1cbi8vIFRoZSBcImluIGNhcHRpb25cIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IFRBQkxFX1ZPSURfRUxFTUVOVFMgPSBuZXcgU2V0KFtodG1sX2pzXzEuVEFHX0lELkNBUFRJT04sIGh0bWxfanNfMS5UQUdfSUQuQ09MLCBodG1sX2pzXzEuVEFHX0lELkNPTEdST1VQLCBodG1sX2pzXzEuVEFHX0lELlRCT0RZLCBodG1sX2pzXzEuVEFHX0lELlRELCBodG1sX2pzXzEuVEFHX0lELlRGT09ULCBodG1sX2pzXzEuVEFHX0lELlRILCBodG1sX2pzXzEuVEFHX0lELlRIRUFELCBodG1sX2pzXzEuVEFHX0lELlRSXSk7XG5mdW5jdGlvbiBzdGFydFRhZ0luQ2FwdGlvbihwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnSUQ7XG4gICAgaWYgKFRBQkxFX1ZPSURfRUxFTUVOVFMuaGFzKHRuKSkge1xuICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzSW5UYWJsZVNjb3BlKGh0bWxfanNfMS5UQUdfSUQuQ0FQVElPTikpIHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKTtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZChodG1sX2pzXzEuVEFHX0lELkNBUFRJT04pO1xuICAgICAgICAgICAgcC5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuY2xlYXJUb0xhc3RNYXJrZXIoKTtcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fVEFCTEU7XG4gICAgICAgICAgICBzdGFydFRhZ0luVGFibGUocCwgdG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgfVxufVxuZnVuY3Rpb24gZW5kVGFnSW5DYXB0aW9uKHAsIHRva2VuKSB7XG4gICAgY29uc3QgdG4gPSB0b2tlbi50YWdJRDtcbiAgICBzd2l0Y2ggKHRuKSB7XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5DQVBUSU9OOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEFCTEU6IHtcbiAgICAgICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUoaHRtbF9qc18xLlRBR19JRC5DQVBUSU9OKSkge1xuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKTtcbiAgICAgICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoaHRtbF9qc18xLlRBR19JRC5DQVBUSU9OKTtcbiAgICAgICAgICAgICAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5jbGVhclRvTGFzdE1hcmtlcigpO1xuICAgICAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fVEFCTEU7XG4gICAgICAgICAgICAgICAgaWYgKHRuID09PSBodG1sX2pzXzEuVEFHX0lELlRBQkxFKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZFRhZ0luVGFibGUocCwgdG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CT0RZOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ09MOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ09MR1JPVVA6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5IVE1MOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEJPRFk6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRGT09UOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEg6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5USEVBRDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRSOiB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgdG9rZW5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGVuZFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBUaGUgXCJpbiBjb2x1bW4gZ3JvdXBcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHN0YXJ0VGFnSW5Db2x1bW5Hcm91cChwLCB0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udGFnSUQpIHtcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkhUTUw6IHtcbiAgICAgICAgICAgIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5DT0w6IHtcbiAgICAgICAgICAgIHAuX2FwcGVuZEVsZW1lbnQodG9rZW4sIGh0bWxfanNfMS5OUy5IVE1MKTtcbiAgICAgICAgICAgIHRva2VuLmFja1NlbGZDbG9zaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URU1QTEFURToge1xuICAgICAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdG9rZW5JbkNvbHVtbkdyb3VwKHAsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGVuZFRhZ0luQ29sdW1uR3JvdXAocCwgdG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnRhZ0lEKSB7XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5DT0xHUk9VUDoge1xuICAgICAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdJZCA9PT0gaHRtbF9qc18xLlRBR19JRC5DT0xHUk9VUCkge1xuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fVEFCTEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEVNUExBVEU6IHtcbiAgICAgICAgICAgIGVuZFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ09MOiB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgdG9rZW5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHRva2VuSW5Db2x1bW5Hcm91cChwLCB0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB0b2tlbkluQ29sdW1uR3JvdXAocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMuY3VycmVudFRhZ0lkID09PSBodG1sX2pzXzEuVEFHX0lELkNPTEdST1VQKSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFO1xuICAgICAgICBwLl9wcm9jZXNzVG9rZW4odG9rZW4pO1xuICAgIH1cbn1cbi8vIFRoZSBcImluIHRhYmxlIGJvZHlcIiBpbnNlcnRpb24gbW9kZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIHN0YXJ0VGFnSW5UYWJsZUJvZHkocCwgdG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnRhZ0lEKSB7XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UUjoge1xuICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMuY2xlYXJCYWNrVG9UYWJsZUJvZHlDb250ZXh0KCk7XG4gICAgICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX1JPVztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5USDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlREOiB7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlQm9keUNvbnRleHQoKTtcbiAgICAgICAgICAgIHAuX2luc2VydEZha2VFbGVtZW50KGh0bWxfanNfMS5UQUdfTkFNRVMuVFIsIGh0bWxfanNfMS5UQUdfSUQuVFIpO1xuICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9ST1c7XG4gICAgICAgICAgICBzdGFydFRhZ0luUm93KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5DQVBUSU9OOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ09MOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ09MR1JPVVA6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UQk9EWTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRGT09UOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEhFQUQ6IHtcbiAgICAgICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNUYWJsZUJvZHlDb250ZXh0SW5UYWJsZVNjb3BlKCkpIHtcbiAgICAgICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlQm9keUNvbnRleHQoKTtcbiAgICAgICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICAgICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFO1xuICAgICAgICAgICAgICAgIHN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBzdGFydFRhZ0luVGFibGUocCwgdG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZW5kVGFnSW5UYWJsZUJvZHkocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ0lEO1xuICAgIHN3aXRjaCAodG9rZW4udGFnSUQpIHtcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRCT0RZOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEZPT1Q6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5USEVBRDoge1xuICAgICAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZSh0bikpIHtcbiAgICAgICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlQm9keUNvbnRleHQoKTtcbiAgICAgICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICAgICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRBQkxFOiB7XG4gICAgICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuaGFzVGFibGVCb2R5Q29udGV4dEluVGFibGVTY29wZSgpKSB7XG4gICAgICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMuY2xlYXJCYWNrVG9UYWJsZUJvZHlDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9UQUJMRTtcbiAgICAgICAgICAgICAgICBlbmRUYWdJblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CT0RZOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ0FQVElPTjpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkNPTDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkNPTEdST1VQOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSFRNTDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlREOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEg6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UUjoge1xuICAgICAgICAgICAgLy8gSWdub3JlIHRva2VuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBlbmRUYWdJblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIFRoZSBcImluIHJvd1wiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gc3RhcnRUYWdJblJvdyhwLCB0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udGFnSUQpIHtcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRIOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEQ6IHtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVSb3dDb250ZXh0KCk7XG4gICAgICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX0NFTEw7XG4gICAgICAgICAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5pbnNlcnRNYXJrZXIoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5DQVBUSU9OOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ09MOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ09MR1JPVVA6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UQk9EWTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRGT09UOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEhFQUQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UUjoge1xuICAgICAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZShodG1sX2pzXzEuVEFHX0lELlRSKSkge1xuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVSb3dDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9UQUJMRV9CT0RZO1xuICAgICAgICAgICAgICAgIHN0YXJ0VGFnSW5UYWJsZUJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgc3RhcnRUYWdJblRhYmxlKHAsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGVuZFRhZ0luUm93KHAsIHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50YWdJRCkge1xuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVFI6IHtcbiAgICAgICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUoaHRtbF9qc18xLlRBR19JRC5UUikpIHtcbiAgICAgICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5jbGVhckJhY2tUb1RhYmxlUm93Q29udGV4dCgpO1xuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fVEFCTEVfQk9EWTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UQUJMRToge1xuICAgICAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZShodG1sX2pzXzEuVEFHX0lELlRSKSkge1xuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVSb3dDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9UQUJMRV9CT0RZO1xuICAgICAgICAgICAgICAgIGVuZFRhZ0luVGFibGVCb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UQk9EWTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRGT09UOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEhFQUQ6IHtcbiAgICAgICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUodG9rZW4udGFnSUQpIHx8IHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZShodG1sX2pzXzEuVEFHX0lELlRSKSkge1xuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmNsZWFyQmFja1RvVGFibGVSb3dDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9UQUJMRV9CT0RZO1xuICAgICAgICAgICAgICAgIGVuZFRhZ0luVGFibGVCb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CT0RZOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ0FQVElPTjpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkNPTDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkNPTEdST1VQOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSFRNTDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlREOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEg6IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBlbmQgdGFnXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZW5kVGFnSW5UYWJsZShwLCB0b2tlbik7XG4gICAgfVxufVxuLy8gVGhlIFwiaW4gY2VsbFwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gc3RhcnRUYWdJbkNlbGwocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ0lEO1xuICAgIGlmIChUQUJMRV9WT0lEX0VMRU1FTlRTLmhhcyh0bikpIHtcbiAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZShodG1sX2pzXzEuVEFHX0lELlREKSB8fCBwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUoaHRtbF9qc18xLlRBR19JRC5USCkpIHtcbiAgICAgICAgICAgIHAuX2Nsb3NlVGFibGVDZWxsKCk7XG4gICAgICAgICAgICBzdGFydFRhZ0luUm93KHAsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVuZFRhZ0luQ2VsbChwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnSUQ7XG4gICAgc3dpdGNoICh0bikge1xuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5USDoge1xuICAgICAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luVGFibGVTY29wZSh0bikpIHtcbiAgICAgICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCk7XG4gICAgICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKHRuKTtcbiAgICAgICAgICAgICAgICBwLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5jbGVhclRvTGFzdE1hcmtlcigpO1xuICAgICAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fUk9XO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRBQkxFOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEJPRFk6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URk9PVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRIRUFEOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVFI6IHtcbiAgICAgICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUodG4pKSB7XG4gICAgICAgICAgICAgICAgcC5fY2xvc2VUYWJsZUNlbGwoKTtcbiAgICAgICAgICAgICAgICBlbmRUYWdJblJvdyhwLCB0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQk9EWTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkNBUFRJT046XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5DT0w6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5DT0xHUk9VUDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkhUTUw6IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSB0b2tlblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgZW5kVGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIFRoZSBcImluIHNlbGVjdFwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gc3RhcnRUYWdJblNlbGVjdChwLCB0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udGFnSUQpIHtcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkhUTUw6IHtcbiAgICAgICAgICAgIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5PUFRJT046IHtcbiAgICAgICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnSWQgPT09IGh0bWxfanNfMS5UQUdfSUQuT1BUSU9OKSB7XG4gICAgICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuT1BUR1JPVVA6IHtcbiAgICAgICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5jdXJyZW50VGFnSWQgPT09IGh0bWxfanNfMS5UQUdfSUQuT1BUSU9OKSB7XG4gICAgICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocC5vcGVuRWxlbWVudHMuY3VycmVudFRhZ0lkID09PSBodG1sX2pzXzEuVEFHX0lELk9QVEdST1VQKSB7XG4gICAgICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSU5QVVQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5LRVlHRU46XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URVhUQVJFQTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlNFTEVDVDoge1xuICAgICAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmhhc0luU2VsZWN0U2NvcGUoaHRtbF9qc18xLlRBR19JRC5TRUxFQ1QpKSB7XG4gICAgICAgICAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKGh0bWxfanNfMS5UQUdfSUQuU0VMRUNUKTtcbiAgICAgICAgICAgICAgICBwLl9yZXNldEluc2VydGlvbk1vZGUoKTtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4udGFnSUQgIT09IGh0bWxfanNfMS5UQUdfSUQuU0VMRUNUKSB7XG4gICAgICAgICAgICAgICAgICAgIHAuX3Byb2Nlc3NTdGFydFRhZyh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlNDUklQVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRFTVBMQVRFOiB7XG4gICAgICAgICAgICBzdGFydFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBEbyBub3RoaW5nXG4gICAgfVxufVxuZnVuY3Rpb24gZW5kVGFnSW5TZWxlY3QocCwgdG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnRhZ0lEKSB7XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5PUFRHUk9VUDoge1xuICAgICAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLnN0YWNrVG9wID4gMCAmJlxuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdJZCA9PT0gaHRtbF9qc18xLlRBR19JRC5PUFRJT04gJiZcbiAgICAgICAgICAgICAgICBwLm9wZW5FbGVtZW50cy50YWdJRHNbcC5vcGVuRWxlbWVudHMuc3RhY2tUb3AgLSAxXSA9PT0gaHRtbF9qc18xLlRBR19JRC5PUFRHUk9VUCkge1xuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdJZCA9PT0gaHRtbF9qc18xLlRBR19JRC5PUFRHUk9VUCkge1xuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELk9QVElPTjoge1xuICAgICAgICAgICAgaWYgKHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdJZCA9PT0gaHRtbF9qc18xLlRBR19JRC5PUFRJT04pIHtcbiAgICAgICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5TRUxFQ1Q6IHtcbiAgICAgICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblNlbGVjdFNjb3BlKGh0bWxfanNfMS5UQUdfSUQuU0VMRUNUKSkge1xuICAgICAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcFVudGlsVGFnTmFtZVBvcHBlZChodG1sX2pzXzEuVEFHX0lELlNFTEVDVCk7XG4gICAgICAgICAgICAgICAgcC5fcmVzZXRJbnNlcnRpb25Nb2RlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEVNUExBVEU6IHtcbiAgICAgICAgICAgIGVuZFRhZ0luSGVhZChwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBEbyBub3RoaW5nXG4gICAgfVxufVxuLy8gVGhlIFwiaW4gc2VsZWN0IGluIHRhYmxlXCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0luU2VsZWN0SW5UYWJsZShwLCB0b2tlbikge1xuICAgIGNvbnN0IHRuID0gdG9rZW4udGFnSUQ7XG4gICAgaWYgKHRuID09PSBodG1sX2pzXzEuVEFHX0lELkNBUFRJT04gfHxcbiAgICAgICAgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuVEFCTEUgfHxcbiAgICAgICAgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuVEJPRFkgfHxcbiAgICAgICAgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuVEZPT1QgfHxcbiAgICAgICAgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuVEhFQUQgfHxcbiAgICAgICAgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuVFIgfHxcbiAgICAgICAgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuVEQgfHxcbiAgICAgICAgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuVEgpIHtcbiAgICAgICAgcC5vcGVuRWxlbWVudHMucG9wVW50aWxUYWdOYW1lUG9wcGVkKGh0bWxfanNfMS5UQUdfSUQuU0VMRUNUKTtcbiAgICAgICAgcC5fcmVzZXRJbnNlcnRpb25Nb2RlKCk7XG4gICAgICAgIHAuX3Byb2Nlc3NTdGFydFRhZyh0b2tlbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdGFydFRhZ0luU2VsZWN0KHAsIHRva2VuKTtcbiAgICB9XG59XG5mdW5jdGlvbiBlbmRUYWdJblNlbGVjdEluVGFibGUocCwgdG9rZW4pIHtcbiAgICBjb25zdCB0biA9IHRva2VuLnRhZ0lEO1xuICAgIGlmICh0biA9PT0gaHRtbF9qc18xLlRBR19JRC5DQVBUSU9OIHx8XG4gICAgICAgIHRuID09PSBodG1sX2pzXzEuVEFHX0lELlRBQkxFIHx8XG4gICAgICAgIHRuID09PSBodG1sX2pzXzEuVEFHX0lELlRCT0RZIHx8XG4gICAgICAgIHRuID09PSBodG1sX2pzXzEuVEFHX0lELlRGT09UIHx8XG4gICAgICAgIHRuID09PSBodG1sX2pzXzEuVEFHX0lELlRIRUFEIHx8XG4gICAgICAgIHRuID09PSBodG1sX2pzXzEuVEFHX0lELlRSIHx8XG4gICAgICAgIHRuID09PSBodG1sX2pzXzEuVEFHX0lELlREIHx8XG4gICAgICAgIHRuID09PSBodG1sX2pzXzEuVEFHX0lELlRIKSB7XG4gICAgICAgIGlmIChwLm9wZW5FbGVtZW50cy5oYXNJblRhYmxlU2NvcGUodG4pKSB7XG4gICAgICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoaHRtbF9qc18xLlRBR19JRC5TRUxFQ1QpO1xuICAgICAgICAgICAgcC5fcmVzZXRJbnNlcnRpb25Nb2RlKCk7XG4gICAgICAgICAgICBwLm9uRW5kVGFnKHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZW5kVGFnSW5TZWxlY3QocCwgdG9rZW4pO1xuICAgIH1cbn1cbi8vIFRoZSBcImluIHRlbXBsYXRlXCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0luVGVtcGxhdGUocCwgdG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnRhZ0lEKSB7XG4gICAgICAgIC8vIEZpcnN0LCBoYW5kbGUgdGFncyB0aGF0IGNhbiBzdGFydCB3aXRob3V0IGEgbW9kZSBjaGFuZ2VcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkJBU0U6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5CQVNFRk9OVDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkJHU09VTkQ6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5MSU5LOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTUVUQTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELk5PRlJBTUVTOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuU0NSSVBUOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuU1RZTEU6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URU1QTEFURTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRJVExFOlxuICAgICAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFJlLXByb2Nlc3MgdGhlIHRva2VuIGluIHRoZSBhcHByb3ByaWF0ZSBtb2RlXG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5DQVBUSU9OOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuQ09MR1JPVVA6XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UQk9EWTpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRGT09UOlxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuVEhFQUQ6XG4gICAgICAgICAgICBwLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2tbMF0gPSBJbnNlcnRpb25Nb2RlLklOX1RBQkxFO1xuICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9UQUJMRTtcbiAgICAgICAgICAgIHN0YXJ0VGFnSW5UYWJsZShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkNPTDpcbiAgICAgICAgICAgIHAudG1wbEluc2VydGlvbk1vZGVTdGFja1swXSA9IEluc2VydGlvbk1vZGUuSU5fQ09MVU1OX0dST1VQO1xuICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5JTl9DT0xVTU5fR1JPVVA7XG4gICAgICAgICAgICBzdGFydFRhZ0luQ29sdW1uR3JvdXAocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5UUjpcbiAgICAgICAgICAgIHAudG1wbEluc2VydGlvbk1vZGVTdGFja1swXSA9IEluc2VydGlvbk1vZGUuSU5fVEFCTEVfQk9EWTtcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fVEFCTEVfQk9EWTtcbiAgICAgICAgICAgIHN0YXJ0VGFnSW5UYWJsZUJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5URDpcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELlRIOlxuICAgICAgICAgICAgcC50bXBsSW5zZXJ0aW9uTW9kZVN0YWNrWzBdID0gSW5zZXJ0aW9uTW9kZS5JTl9ST1c7XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX1JPVztcbiAgICAgICAgICAgIHN0YXJ0VGFnSW5Sb3cocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBwLnRtcGxJbnNlcnRpb25Nb2RlU3RhY2tbMF0gPSBJbnNlcnRpb25Nb2RlLklOX0JPRFk7XG4gICAgICAgICAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX0JPRFk7XG4gICAgICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgfVxufVxuZnVuY3Rpb24gZW5kVGFnSW5UZW1wbGF0ZShwLCB0b2tlbikge1xuICAgIGlmICh0b2tlbi50YWdJRCA9PT0gaHRtbF9qc18xLlRBR19JRC5URU1QTEFURSkge1xuICAgICAgICBlbmRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVvZkluVGVtcGxhdGUocCwgdG9rZW4pIHtcbiAgICBpZiAocC5vcGVuRWxlbWVudHMudG1wbENvdW50ID4gMCkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3BVbnRpbFRhZ05hbWVQb3BwZWQoaHRtbF9qc18xLlRBR19JRC5URU1QTEFURSk7XG4gICAgICAgIHAuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmNsZWFyVG9MYXN0TWFya2VyKCk7XG4gICAgICAgIHAudG1wbEluc2VydGlvbk1vZGVTdGFjay5zaGlmdCgpO1xuICAgICAgICBwLl9yZXNldEluc2VydGlvbk1vZGUoKTtcbiAgICAgICAgcC5vbkVvZih0b2tlbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdG9wUGFyc2luZyhwLCB0b2tlbik7XG4gICAgfVxufVxuLy8gVGhlIFwiYWZ0ZXIgYm9keVwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gc3RhcnRUYWdBZnRlckJvZHkocCwgdG9rZW4pIHtcbiAgICBpZiAodG9rZW4udGFnSUQgPT09IGh0bWxfanNfMS5UQUdfSUQuSFRNTCkge1xuICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0b2tlbkFmdGVyQm9keShwLCB0b2tlbik7XG4gICAgfVxufVxuZnVuY3Rpb24gZW5kVGFnQWZ0ZXJCb2R5KHAsIHRva2VuKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICh0b2tlbi50YWdJRCA9PT0gaHRtbF9qc18xLlRBR19JRC5IVE1MKSB7XG4gICAgICAgIGlmICghcC5mcmFnbWVudENvbnRleHQpIHtcbiAgICAgICAgICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuQUZURVJfQUZURVJfQk9EWTtcbiAgICAgICAgfVxuICAgICAgICAvL05PVEU6IDxodG1sPiBpcyBuZXZlciBwb3BwZWQgZnJvbSB0aGUgc3RhY2ssIHNvIHdlIG5lZWQgdG8gdXBkYXRlZFxuICAgICAgICAvL3RoZSBlbmQgbG9jYXRpb24gZXhwbGljaXRseS5cbiAgICAgICAgaWYgKHAub3B0aW9ucy5zb3VyY2VDb2RlTG9jYXRpb25JbmZvICYmIHAub3BlbkVsZW1lbnRzLnRhZ0lEc1swXSA9PT0gaHRtbF9qc18xLlRBR19JRC5IVE1MKSB7XG4gICAgICAgICAgICBwLl9zZXRFbmRMb2NhdGlvbihwLm9wZW5FbGVtZW50cy5pdGVtc1swXSwgdG9rZW4pO1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBib2R5IGVsZW1lbnQsIGlmIGl0IGRvZXNuJ3QgaGF2ZSBhbiBlbmQgdGFnXG4gICAgICAgICAgICBjb25zdCBib2R5RWxlbWVudCA9IHAub3BlbkVsZW1lbnRzLml0ZW1zWzFdO1xuICAgICAgICAgICAgaWYgKGJvZHlFbGVtZW50ICYmICEoKF9hID0gcC50cmVlQWRhcHRlci5nZXROb2RlU291cmNlQ29kZUxvY2F0aW9uKGJvZHlFbGVtZW50KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVuZFRhZykpIHtcbiAgICAgICAgICAgICAgICBwLl9zZXRFbmRMb2NhdGlvbihib2R5RWxlbWVudCwgdG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0b2tlbkFmdGVyQm9keShwLCB0b2tlbik7XG4gICAgfVxufVxuZnVuY3Rpb24gdG9rZW5BZnRlckJvZHkocCwgdG9rZW4pIHtcbiAgICBwLmluc2VydGlvbk1vZGUgPSBJbnNlcnRpb25Nb2RlLklOX0JPRFk7XG4gICAgbW9kZUluQm9keShwLCB0b2tlbik7XG59XG4vLyBUaGUgXCJpbiBmcmFtZXNldFwiIGluc2VydGlvbiBtb2RlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gc3RhcnRUYWdJbkZyYW1lc2V0KHAsIHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50YWdJRCkge1xuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuSFRNTDoge1xuICAgICAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkZSQU1FU0VUOiB7XG4gICAgICAgICAgICBwLl9pbnNlcnRFbGVtZW50KHRva2VuLCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuRlJBTUU6IHtcbiAgICAgICAgICAgIHAuX2FwcGVuZEVsZW1lbnQodG9rZW4sIGh0bWxfanNfMS5OUy5IVE1MKTtcbiAgICAgICAgICAgIHRva2VuLmFja1NlbGZDbG9zaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5OT0ZSQU1FUzoge1xuICAgICAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVuZFRhZ0luRnJhbWVzZXQocCwgdG9rZW4pIHtcbiAgICBpZiAodG9rZW4udGFnSUQgPT09IGh0bWxfanNfMS5UQUdfSUQuRlJBTUVTRVQgJiYgIXAub3BlbkVsZW1lbnRzLmlzUm9vdEh0bWxFbGVtZW50Q3VycmVudCgpKSB7XG4gICAgICAgIHAub3BlbkVsZW1lbnRzLnBvcCgpO1xuICAgICAgICBpZiAoIXAuZnJhZ21lbnRDb250ZXh0ICYmIHAub3BlbkVsZW1lbnRzLmN1cnJlbnRUYWdJZCAhPT0gaHRtbF9qc18xLlRBR19JRC5GUkFNRVNFVCkge1xuICAgICAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5BRlRFUl9GUkFNRVNFVDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIFRoZSBcImFmdGVyIGZyYW1lc2V0XCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0FmdGVyRnJhbWVzZXQocCwgdG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuLnRhZ0lEKSB7XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5IVE1MOiB7XG4gICAgICAgICAgICBzdGFydFRhZ0luQm9keShwLCB0b2tlbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIGh0bWxfanNfMS5UQUdfSUQuTk9GUkFNRVM6IHtcbiAgICAgICAgICAgIHN0YXJ0VGFnSW5IZWFkKHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICB9XG59XG5mdW5jdGlvbiBlbmRUYWdBZnRlckZyYW1lc2V0KHAsIHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnRhZ0lEID09PSBodG1sX2pzXzEuVEFHX0lELkhUTUwpIHtcbiAgICAgICAgcC5pbnNlcnRpb25Nb2RlID0gSW5zZXJ0aW9uTW9kZS5BRlRFUl9BRlRFUl9GUkFNRVNFVDtcbiAgICB9XG59XG4vLyBUaGUgXCJhZnRlciBhZnRlciBib2R5XCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0FmdGVyQWZ0ZXJCb2R5KHAsIHRva2VuKSB7XG4gICAgaWYgKHRva2VuLnRhZ0lEID09PSBodG1sX2pzXzEuVEFHX0lELkhUTUwpIHtcbiAgICAgICAgc3RhcnRUYWdJbkJvZHkocCwgdG9rZW4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdG9rZW5BZnRlckFmdGVyQm9keShwLCB0b2tlbik7XG4gICAgfVxufVxuZnVuY3Rpb24gdG9rZW5BZnRlckFmdGVyQm9keShwLCB0b2tlbikge1xuICAgIHAuaW5zZXJ0aW9uTW9kZSA9IEluc2VydGlvbk1vZGUuSU5fQk9EWTtcbiAgICBtb2RlSW5Cb2R5KHAsIHRva2VuKTtcbn1cbi8vIFRoZSBcImFmdGVyIGFmdGVyIGZyYW1lc2V0XCIgaW5zZXJ0aW9uIG1vZGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydFRhZ0FmdGVyQWZ0ZXJGcmFtZXNldChwLCB0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udGFnSUQpIHtcbiAgICAgICAgY2FzZSBodG1sX2pzXzEuVEFHX0lELkhUTUw6IHtcbiAgICAgICAgICAgIHN0YXJ0VGFnSW5Cb2R5KHAsIHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgaHRtbF9qc18xLlRBR19JRC5OT0ZSQU1FUzoge1xuICAgICAgICAgICAgc3RhcnRUYWdJbkhlYWQocCwgdG9rZW4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgIH1cbn1cbi8vIFRoZSBydWxlcyBmb3IgcGFyc2luZyB0b2tlbnMgaW4gZm9yZWlnbiBjb250ZW50XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gbnVsbENoYXJhY3RlckluRm9yZWlnbkNvbnRlbnQocCwgdG9rZW4pIHtcbiAgICB0b2tlbi5jaGFycyA9IHVuaWNvZGUuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xuICAgIHAuX2luc2VydENoYXJhY3RlcnModG9rZW4pO1xufVxuZnVuY3Rpb24gY2hhcmFjdGVySW5Gb3JlaWduQ29udGVudChwLCB0b2tlbikge1xuICAgIHAuX2luc2VydENoYXJhY3RlcnModG9rZW4pO1xuICAgIHAuZnJhbWVzZXRPayA9IGZhbHNlO1xufVxuZnVuY3Rpb24gcG9wVW50aWxIdG1sT3JJbnRlZ3JhdGlvblBvaW50KHApIHtcbiAgICB3aGlsZSAocC50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkocC5vcGVuRWxlbWVudHMuY3VycmVudCkgIT09IGh0bWxfanNfMS5OUy5IVE1MICYmXG4gICAgICAgICFwLl9pc0ludGVncmF0aW9uUG9pbnQocC5vcGVuRWxlbWVudHMuY3VycmVudFRhZ0lkLCBwLm9wZW5FbGVtZW50cy5jdXJyZW50KSkge1xuICAgICAgICBwLm9wZW5FbGVtZW50cy5wb3AoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzdGFydFRhZ0luRm9yZWlnbkNvbnRlbnQocCwgdG9rZW4pIHtcbiAgICBpZiAoZm9yZWlnbkNvbnRlbnQuY2F1c2VzRXhpdCh0b2tlbikpIHtcbiAgICAgICAgcG9wVW50aWxIdG1sT3JJbnRlZ3JhdGlvblBvaW50KHApO1xuICAgICAgICBwLl9zdGFydFRhZ091dHNpZGVGb3JlaWduQ29udGVudCh0b2tlbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gcC5fZ2V0QWRqdXN0ZWRDdXJyZW50RWxlbWVudCgpO1xuICAgICAgICBjb25zdCBjdXJyZW50TnMgPSBwLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShjdXJyZW50KTtcbiAgICAgICAgaWYgKGN1cnJlbnROcyA9PT0gaHRtbF9qc18xLk5TLk1BVEhNTCkge1xuICAgICAgICAgICAgZm9yZWlnbkNvbnRlbnQuYWRqdXN0VG9rZW5NYXRoTUxBdHRycyh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VycmVudE5zID09PSBodG1sX2pzXzEuTlMuU1ZHKSB7XG4gICAgICAgICAgICBmb3JlaWduQ29udGVudC5hZGp1c3RUb2tlblNWR1RhZ05hbWUodG9rZW4pO1xuICAgICAgICAgICAgZm9yZWlnbkNvbnRlbnQuYWRqdXN0VG9rZW5TVkdBdHRycyh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yZWlnbkNvbnRlbnQuYWRqdXN0VG9rZW5YTUxBdHRycyh0b2tlbik7XG4gICAgICAgIGlmICh0b2tlbi5zZWxmQ2xvc2luZykge1xuICAgICAgICAgICAgcC5fYXBwZW5kRWxlbWVudCh0b2tlbiwgY3VycmVudE5zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHAuX2luc2VydEVsZW1lbnQodG9rZW4sIGN1cnJlbnROcyk7XG4gICAgICAgIH1cbiAgICAgICAgdG9rZW4uYWNrU2VsZkNsb3NpbmcgPSB0cnVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVuZFRhZ0luRm9yZWlnbkNvbnRlbnQocCwgdG9rZW4pIHtcbiAgICBpZiAodG9rZW4udGFnSUQgPT09IGh0bWxfanNfMS5UQUdfSUQuUCB8fCB0b2tlbi50YWdJRCA9PT0gaHRtbF9qc18xLlRBR19JRC5CUikge1xuICAgICAgICBwb3BVbnRpbEh0bWxPckludGVncmF0aW9uUG9pbnQocCk7XG4gICAgICAgIHAuX2VuZFRhZ091dHNpZGVGb3JlaWduQ29udGVudCh0b2tlbik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IHAub3BlbkVsZW1lbnRzLnN0YWNrVG9wOyBpID4gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBwLm9wZW5FbGVtZW50cy5pdGVtc1tpXTtcbiAgICAgICAgaWYgKHAudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKGVsZW1lbnQpID09PSBodG1sX2pzXzEuTlMuSFRNTCkge1xuICAgICAgICAgICAgcC5fZW5kVGFnT3V0c2lkZUZvcmVpZ25Db250ZW50KHRva2VuKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhZ05hbWUgPSBwLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUoZWxlbWVudCk7XG4gICAgICAgIGlmICh0YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHRva2VuLnRhZ05hbWUpIHtcbiAgICAgICAgICAgIC8vTk9URTogdXBkYXRlIHRoZSB0b2tlbiB0YWcgbmFtZSBmb3IgYF9zZXRFbmRMb2NhdGlvbmAuXG4gICAgICAgICAgICB0b2tlbi50YWdOYW1lID0gdGFnTmFtZTtcbiAgICAgICAgICAgIHAub3BlbkVsZW1lbnRzLnNob3J0ZW5Ub0xlbmd0aChpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk9wZW5FbGVtZW50U3RhY2sgPSB2b2lkIDA7XG5jb25zdCBodG1sX2pzXzEgPSByZXF1aXJlKFwiLi4vY29tbW9uL2h0bWwuanNcIik7XG4vL0VsZW1lbnQgdXRpbHNcbmNvbnN0IElNUExJQ0lUX0VORF9UQUdfUkVRVUlSRUQgPSBuZXcgU2V0KFtodG1sX2pzXzEuVEFHX0lELkRELCBodG1sX2pzXzEuVEFHX0lELkRULCBodG1sX2pzXzEuVEFHX0lELkxJLCBodG1sX2pzXzEuVEFHX0lELk9QVEdST1VQLCBodG1sX2pzXzEuVEFHX0lELk9QVElPTiwgaHRtbF9qc18xLlRBR19JRC5QLCBodG1sX2pzXzEuVEFHX0lELlJCLCBodG1sX2pzXzEuVEFHX0lELlJQLCBodG1sX2pzXzEuVEFHX0lELlJULCBodG1sX2pzXzEuVEFHX0lELlJUQ10pO1xuY29uc3QgSU1QTElDSVRfRU5EX1RBR19SRVFVSVJFRF9USE9ST1VHSExZID0gbmV3IFNldChbXG4gICAgLi4uSU1QTElDSVRfRU5EX1RBR19SRVFVSVJFRCxcbiAgICBodG1sX2pzXzEuVEFHX0lELkNBUFRJT04sXG4gICAgaHRtbF9qc18xLlRBR19JRC5DT0xHUk9VUCxcbiAgICBodG1sX2pzXzEuVEFHX0lELlRCT0RZLFxuICAgIGh0bWxfanNfMS5UQUdfSUQuVEQsXG4gICAgaHRtbF9qc18xLlRBR19JRC5URk9PVCxcbiAgICBodG1sX2pzXzEuVEFHX0lELlRILFxuICAgIGh0bWxfanNfMS5UQUdfSUQuVEhFQUQsXG4gICAgaHRtbF9qc18xLlRBR19JRC5UUixcbl0pO1xuY29uc3QgU0NPUElOR19FTEVNRU5UX05TID0gbmV3IE1hcChbXG4gICAgW2h0bWxfanNfMS5UQUdfSUQuQVBQTEVULCBodG1sX2pzXzEuTlMuSFRNTF0sXG4gICAgW2h0bWxfanNfMS5UQUdfSUQuQ0FQVElPTiwgaHRtbF9qc18xLk5TLkhUTUxdLFxuICAgIFtodG1sX2pzXzEuVEFHX0lELkhUTUwsIGh0bWxfanNfMS5OUy5IVE1MXSxcbiAgICBbaHRtbF9qc18xLlRBR19JRC5NQVJRVUVFLCBodG1sX2pzXzEuTlMuSFRNTF0sXG4gICAgW2h0bWxfanNfMS5UQUdfSUQuT0JKRUNULCBodG1sX2pzXzEuTlMuSFRNTF0sXG4gICAgW2h0bWxfanNfMS5UQUdfSUQuVEFCTEUsIGh0bWxfanNfMS5OUy5IVE1MXSxcbiAgICBbaHRtbF9qc18xLlRBR19JRC5URCwgaHRtbF9qc18xLk5TLkhUTUxdLFxuICAgIFtodG1sX2pzXzEuVEFHX0lELlRFTVBMQVRFLCBodG1sX2pzXzEuTlMuSFRNTF0sXG4gICAgW2h0bWxfanNfMS5UQUdfSUQuVEgsIGh0bWxfanNfMS5OUy5IVE1MXSxcbiAgICBbaHRtbF9qc18xLlRBR19JRC5BTk5PVEFUSU9OX1hNTCwgaHRtbF9qc18xLk5TLk1BVEhNTF0sXG4gICAgW2h0bWxfanNfMS5UQUdfSUQuTUksIGh0bWxfanNfMS5OUy5NQVRITUxdLFxuICAgIFtodG1sX2pzXzEuVEFHX0lELk1OLCBodG1sX2pzXzEuTlMuTUFUSE1MXSxcbiAgICBbaHRtbF9qc18xLlRBR19JRC5NTywgaHRtbF9qc18xLk5TLk1BVEhNTF0sXG4gICAgW2h0bWxfanNfMS5UQUdfSUQuTVMsIGh0bWxfanNfMS5OUy5NQVRITUxdLFxuICAgIFtodG1sX2pzXzEuVEFHX0lELk1URVhULCBodG1sX2pzXzEuTlMuTUFUSE1MXSxcbiAgICBbaHRtbF9qc18xLlRBR19JRC5ERVNDLCBodG1sX2pzXzEuTlMuU1ZHXSxcbiAgICBbaHRtbF9qc18xLlRBR19JRC5GT1JFSUdOX09CSkVDVCwgaHRtbF9qc18xLk5TLlNWR10sXG4gICAgW2h0bWxfanNfMS5UQUdfSUQuVElUTEUsIGh0bWxfanNfMS5OUy5TVkddLFxuXSk7XG5jb25zdCBOQU1FRF9IRUFERVJTID0gW2h0bWxfanNfMS5UQUdfSUQuSDEsIGh0bWxfanNfMS5UQUdfSUQuSDIsIGh0bWxfanNfMS5UQUdfSUQuSDMsIGh0bWxfanNfMS5UQUdfSUQuSDQsIGh0bWxfanNfMS5UQUdfSUQuSDUsIGh0bWxfanNfMS5UQUdfSUQuSDZdO1xuY29uc3QgVEFCTEVfUk9XX0NPTlRFWFQgPSBbaHRtbF9qc18xLlRBR19JRC5UUiwgaHRtbF9qc18xLlRBR19JRC5URU1QTEFURSwgaHRtbF9qc18xLlRBR19JRC5IVE1MXTtcbmNvbnN0IFRBQkxFX0JPRFlfQ09OVEVYVCA9IFtodG1sX2pzXzEuVEFHX0lELlRCT0RZLCBodG1sX2pzXzEuVEFHX0lELlRGT09ULCBodG1sX2pzXzEuVEFHX0lELlRIRUFELCBodG1sX2pzXzEuVEFHX0lELlRFTVBMQVRFLCBodG1sX2pzXzEuVEFHX0lELkhUTUxdO1xuY29uc3QgVEFCTEVfQ09OVEVYVCA9IFtodG1sX2pzXzEuVEFHX0lELlRBQkxFLCBodG1sX2pzXzEuVEFHX0lELlRFTVBMQVRFLCBodG1sX2pzXzEuVEFHX0lELkhUTUxdO1xuY29uc3QgVEFCTEVfQ0VMTFMgPSBbaHRtbF9qc18xLlRBR19JRC5URCwgaHRtbF9qc18xLlRBR19JRC5USF07XG4vL1N0YWNrIG9mIG9wZW4gZWxlbWVudHNcbmNsYXNzIE9wZW5FbGVtZW50U3RhY2sge1xuICAgIGNvbnN0cnVjdG9yKGRvY3VtZW50LCB0cmVlQWRhcHRlciwgaGFuZGxlcikge1xuICAgICAgICB0aGlzLnRyZWVBZGFwdGVyID0gdHJlZUFkYXB0ZXI7XG4gICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy50YWdJRHMgPSBbXTtcbiAgICAgICAgdGhpcy5zdGFja1RvcCA9IC0xO1xuICAgICAgICB0aGlzLnRtcGxDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuY3VycmVudFRhZ0lkID0gaHRtbF9qc18xLlRBR19JRC5VTktOT1dOO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBkb2N1bWVudDtcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRUbXBsQ29udGVudE9yTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzSW5UZW1wbGF0ZSgpID8gdGhpcy50cmVlQWRhcHRlci5nZXRUZW1wbGF0ZUNvbnRlbnQodGhpcy5jdXJyZW50KSA6IHRoaXMuY3VycmVudDtcbiAgICB9XG4gICAgLy9JbmRleCBvZiBlbGVtZW50XG4gICAgX2luZGV4T2YoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtcy5sYXN0SW5kZXhPZihlbGVtZW50LCB0aGlzLnN0YWNrVG9wKTtcbiAgICB9XG4gICAgLy9VcGRhdGUgY3VycmVudCBlbGVtZW50XG4gICAgX2lzSW5UZW1wbGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFRhZ0lkID09PSBodG1sX2pzXzEuVEFHX0lELlRFTVBMQVRFICYmIHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuY3VycmVudCkgPT09IGh0bWxfanNfMS5OUy5IVE1MO1xuICAgIH1cbiAgICBfdXBkYXRlQ3VycmVudEVsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuaXRlbXNbdGhpcy5zdGFja1RvcF07XG4gICAgICAgIHRoaXMuY3VycmVudFRhZ0lkID0gdGhpcy50YWdJRHNbdGhpcy5zdGFja1RvcF07XG4gICAgfVxuICAgIC8vTXV0YXRpb25zXG4gICAgcHVzaChlbGVtZW50LCB0YWdJRCkge1xuICAgICAgICB0aGlzLnN0YWNrVG9wKys7XG4gICAgICAgIHRoaXMuaXRlbXNbdGhpcy5zdGFja1RvcF0gPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnRhZ0lEc1t0aGlzLnN0YWNrVG9wXSA9IHRhZ0lEO1xuICAgICAgICB0aGlzLmN1cnJlbnRUYWdJZCA9IHRhZ0lEO1xuICAgICAgICBpZiAodGhpcy5faXNJblRlbXBsYXRlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudG1wbENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVyLm9uSXRlbVB1c2goZWxlbWVudCwgdGFnSUQsIHRydWUpO1xuICAgIH1cbiAgICBwb3AoKSB7XG4gICAgICAgIGNvbnN0IHBvcHBlZCA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHRoaXMudG1wbENvdW50ID4gMCAmJiB0aGlzLl9pc0luVGVtcGxhdGUoKSkge1xuICAgICAgICAgICAgdGhpcy50bXBsQ291bnQtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YWNrVG9wLS07XG4gICAgICAgIHRoaXMuX3VwZGF0ZUN1cnJlbnRFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuaGFuZGxlci5vbkl0ZW1Qb3AocG9wcGVkLCB0cnVlKTtcbiAgICB9XG4gICAgcmVwbGFjZShvbGRFbGVtZW50LCBuZXdFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuX2luZGV4T2Yob2xkRWxlbWVudCk7XG4gICAgICAgIHRoaXMuaXRlbXNbaWR4XSA9IG5ld0VsZW1lbnQ7XG4gICAgICAgIGlmIChpZHggPT09IHRoaXMuc3RhY2tUb3ApIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IG5ld0VsZW1lbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5zZXJ0QWZ0ZXIocmVmZXJlbmNlRWxlbWVudCwgbmV3RWxlbWVudCwgbmV3RWxlbWVudElEKSB7XG4gICAgICAgIGNvbnN0IGluc2VydGlvbklkeCA9IHRoaXMuX2luZGV4T2YocmVmZXJlbmNlRWxlbWVudCkgKyAxO1xuICAgICAgICB0aGlzLml0ZW1zLnNwbGljZShpbnNlcnRpb25JZHgsIDAsIG5ld0VsZW1lbnQpO1xuICAgICAgICB0aGlzLnRhZ0lEcy5zcGxpY2UoaW5zZXJ0aW9uSWR4LCAwLCBuZXdFbGVtZW50SUQpO1xuICAgICAgICB0aGlzLnN0YWNrVG9wKys7XG4gICAgICAgIGlmIChpbnNlcnRpb25JZHggPT09IHRoaXMuc3RhY2tUb3ApIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUN1cnJlbnRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVyLm9uSXRlbVB1c2godGhpcy5jdXJyZW50LCB0aGlzLmN1cnJlbnRUYWdJZCwgaW5zZXJ0aW9uSWR4ID09PSB0aGlzLnN0YWNrVG9wKTtcbiAgICB9XG4gICAgcG9wVW50aWxUYWdOYW1lUG9wcGVkKHRhZ05hbWUpIHtcbiAgICAgICAgbGV0IHRhcmdldElkeCA9IHRoaXMuc3RhY2tUb3AgKyAxO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICB0YXJnZXRJZHggPSB0aGlzLnRhZ0lEcy5sYXN0SW5kZXhPZih0YWdOYW1lLCB0YXJnZXRJZHggLSAxKTtcbiAgICAgICAgfSB3aGlsZSAodGFyZ2V0SWR4ID4gMCAmJiB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLml0ZW1zW3RhcmdldElkeF0pICE9PSBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgICAgIHRoaXMuc2hvcnRlblRvTGVuZ3RoKHRhcmdldElkeCA8IDAgPyAwIDogdGFyZ2V0SWR4KTtcbiAgICB9XG4gICAgc2hvcnRlblRvTGVuZ3RoKGlkeCkge1xuICAgICAgICB3aGlsZSAodGhpcy5zdGFja1RvcCA+PSBpZHgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcHBlZCA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgICAgIGlmICh0aGlzLnRtcGxDb3VudCA+IDAgJiYgdGhpcy5faXNJblRlbXBsYXRlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRtcGxDb3VudCAtPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdGFja1RvcC0tO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ3VycmVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlci5vbkl0ZW1Qb3AocG9wcGVkLCB0aGlzLnN0YWNrVG9wIDwgaWR4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwb3BVbnRpbEVsZW1lbnRQb3BwZWQoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLl9pbmRleE9mKGVsZW1lbnQpO1xuICAgICAgICB0aGlzLnNob3J0ZW5Ub0xlbmd0aChpZHggPCAwID8gMCA6IGlkeCk7XG4gICAgfVxuICAgIHBvcFVudGlsUG9wcGVkKHRhZ05hbWVzLCB0YXJnZXROUykge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLl9pbmRleE9mVGFnTmFtZXModGFnTmFtZXMsIHRhcmdldE5TKTtcbiAgICAgICAgdGhpcy5zaG9ydGVuVG9MZW5ndGgoaWR4IDwgMCA/IDAgOiBpZHgpO1xuICAgIH1cbiAgICBwb3BVbnRpbE51bWJlcmVkSGVhZGVyUG9wcGVkKCkge1xuICAgICAgICB0aGlzLnBvcFVudGlsUG9wcGVkKE5BTUVEX0hFQURFUlMsIGh0bWxfanNfMS5OUy5IVE1MKTtcbiAgICB9XG4gICAgcG9wVW50aWxUYWJsZUNlbGxQb3BwZWQoKSB7XG4gICAgICAgIHRoaXMucG9wVW50aWxQb3BwZWQoVEFCTEVfQ0VMTFMsIGh0bWxfanNfMS5OUy5IVE1MKTtcbiAgICB9XG4gICAgcG9wQWxsVXBUb0h0bWxFbGVtZW50KCkge1xuICAgICAgICAvL05PVEU6IGhlcmUgd2UgYXNzdW1lIHRoYXQgdGhlIHJvb3QgPGh0bWw+IGVsZW1lbnQgaXMgYWx3YXlzIGZpcnN0IGluIHRoZSBvcGVuIGVsZW1lbnQgc3RhY2ssIHNvXG4gICAgICAgIC8vd2UgcGVyZm9ybSB0aGlzIGZhc3Qgc3RhY2sgY2xlYW4gdXAuXG4gICAgICAgIHRoaXMudG1wbENvdW50ID0gMDtcbiAgICAgICAgdGhpcy5zaG9ydGVuVG9MZW5ndGgoMSk7XG4gICAgfVxuICAgIF9pbmRleE9mVGFnTmFtZXModGFnTmFtZXMsIG5hbWVzcGFjZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICh0YWdOYW1lcy5pbmNsdWRlcyh0aGlzLnRhZ0lEc1tpXSkgJiYgdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkodGhpcy5pdGVtc1tpXSkgPT09IG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgY2xlYXJCYWNrVG8odGFnTmFtZXMsIHRhcmdldE5TKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuX2luZGV4T2ZUYWdOYW1lcyh0YWdOYW1lcywgdGFyZ2V0TlMpO1xuICAgICAgICB0aGlzLnNob3J0ZW5Ub0xlbmd0aChpZHggKyAxKTtcbiAgICB9XG4gICAgY2xlYXJCYWNrVG9UYWJsZUNvbnRleHQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJCYWNrVG8oVEFCTEVfQ09OVEVYVCwgaHRtbF9qc18xLk5TLkhUTUwpO1xuICAgIH1cbiAgICBjbGVhckJhY2tUb1RhYmxlQm9keUNvbnRleHQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJCYWNrVG8oVEFCTEVfQk9EWV9DT05URVhULCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgfVxuICAgIGNsZWFyQmFja1RvVGFibGVSb3dDb250ZXh0KCkge1xuICAgICAgICB0aGlzLmNsZWFyQmFja1RvKFRBQkxFX1JPV19DT05URVhULCBodG1sX2pzXzEuTlMuSFRNTCk7XG4gICAgfVxuICAgIHJlbW92ZShlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuX2luZGV4T2YoZWxlbWVudCk7XG4gICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgaWYgKGlkeCA9PT0gdGhpcy5zdGFja1RvcCkge1xuICAgICAgICAgICAgICAgIHRoaXMucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFnSURzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2tUb3AtLTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDdXJyZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlci5vbkl0ZW1Qb3AoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vU2VhcmNoXG4gICAgdHJ5UGVla1Byb3Blcmx5TmVzdGVkQm9keUVsZW1lbnQoKSB7XG4gICAgICAgIC8vUHJvcGVybHkgbmVzdGVkIDxib2R5PiBlbGVtZW50IChzaG91bGQgYmUgc2Vjb25kIGVsZW1lbnQgaW4gc3RhY2spLlxuICAgICAgICByZXR1cm4gdGhpcy5zdGFja1RvcCA+PSAxICYmIHRoaXMudGFnSURzWzFdID09PSBodG1sX2pzXzEuVEFHX0lELkJPRFkgPyB0aGlzLml0ZW1zWzFdIDogbnVsbDtcbiAgICB9XG4gICAgY29udGFpbnMoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXhPZihlbGVtZW50KSA+IC0xO1xuICAgIH1cbiAgICBnZXRDb21tb25BbmNlc3RvcihlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRJZHggPSB0aGlzLl9pbmRleE9mKGVsZW1lbnQpIC0gMTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRJZHggPj0gMCA/IHRoaXMuaXRlbXNbZWxlbWVudElkeF0gOiBudWxsO1xuICAgIH1cbiAgICBpc1Jvb3RIdG1sRWxlbWVudEN1cnJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrVG9wID09PSAwICYmIHRoaXMudGFnSURzWzBdID09PSBodG1sX2pzXzEuVEFHX0lELkhUTUw7XG4gICAgfVxuICAgIC8vRWxlbWVudCBpbiBzY29wZVxuICAgIGhhc0luU2NvcGUodGFnTmFtZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IHRuID0gdGhpcy50YWdJRHNbaV07XG4gICAgICAgICAgICBjb25zdCBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuaXRlbXNbaV0pO1xuICAgICAgICAgICAgaWYgKHRuID09PSB0YWdOYW1lICYmIG5zID09PSBodG1sX2pzXzEuTlMuSFRNTCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFNDT1BJTkdfRUxFTUVOVF9OUy5nZXQodG4pID09PSBucykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaGFzTnVtYmVyZWRIZWFkZXJJblNjb3BlKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zdGFja1RvcDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IHRuID0gdGhpcy50YWdJRHNbaV07XG4gICAgICAgICAgICBjb25zdCBucyA9IHRoaXMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKHRoaXMuaXRlbXNbaV0pO1xuICAgICAgICAgICAgaWYgKCgwLCBodG1sX2pzXzEuaXNOdW1iZXJlZEhlYWRlcikodG4pICYmIG5zID09PSBodG1sX2pzXzEuTlMuSFRNTCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFNDT1BJTkdfRUxFTUVOVF9OUy5nZXQodG4pID09PSBucykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaGFzSW5MaXN0SXRlbVNjb3BlKHRhZ05hbWUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhY2tUb3A7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCB0biA9IHRoaXMudGFnSURzW2ldO1xuICAgICAgICAgICAgY29uc3QgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLml0ZW1zW2ldKTtcbiAgICAgICAgICAgIGlmICh0biA9PT0gdGFnTmFtZSAmJiBucyA9PT0gaHRtbF9qc18xLk5TLkhUTUwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoKHRuID09PSBodG1sX2pzXzEuVEFHX0lELlVMIHx8IHRuID09PSBodG1sX2pzXzEuVEFHX0lELk9MKSAmJiBucyA9PT0gaHRtbF9qc18xLk5TLkhUTUwpIHx8IFNDT1BJTkdfRUxFTUVOVF9OUy5nZXQodG4pID09PSBucykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaGFzSW5CdXR0b25TY29wZSh0YWdOYW1lKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnN0YWNrVG9wOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgdG4gPSB0aGlzLnRhZ0lEc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IG5zID0gdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkodGhpcy5pdGVtc1tpXSk7XG4gICAgICAgICAgICBpZiAodG4gPT09IHRhZ05hbWUgJiYgbnMgPT09IGh0bWxfanNfMS5OUy5IVE1MKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRuID09PSBodG1sX2pzXzEuVEFHX0lELkJVVFRPTiAmJiBucyA9PT0gaHRtbF9qc18xLk5TLkhUTUwpIHx8IFNDT1BJTkdfRUxFTUVOVF9OUy5nZXQodG4pID09PSBucykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaGFzSW5UYWJsZVNjb3BlKHRhZ05hbWUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhY2tUb3A7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCB0biA9IHRoaXMudGFnSURzW2ldO1xuICAgICAgICAgICAgY29uc3QgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLml0ZW1zW2ldKTtcbiAgICAgICAgICAgIGlmIChucyAhPT0gaHRtbF9qc18xLk5TLkhUTUwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0biA9PT0gdGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRuID09PSBodG1sX2pzXzEuVEFHX0lELlRBQkxFIHx8IHRuID09PSBodG1sX2pzXzEuVEFHX0lELlRFTVBMQVRFIHx8IHRuID09PSBodG1sX2pzXzEuVEFHX0lELkhUTUwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGhhc1RhYmxlQm9keUNvbnRleHRJblRhYmxlU2NvcGUoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnN0YWNrVG9wOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgdG4gPSB0aGlzLnRhZ0lEc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IG5zID0gdGhpcy50cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkodGhpcy5pdGVtc1tpXSk7XG4gICAgICAgICAgICBpZiAobnMgIT09IGh0bWxfanNfMS5OUy5IVE1MKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG4gPT09IGh0bWxfanNfMS5UQUdfSUQuVEJPRFkgfHwgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuVEhFQUQgfHwgdG4gPT09IGh0bWxfanNfMS5UQUdfSUQuVEZPT1QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0biA9PT0gaHRtbF9qc18xLlRBR19JRC5UQUJMRSB8fCB0biA9PT0gaHRtbF9qc18xLlRBR19JRC5IVE1MKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBoYXNJblNlbGVjdFNjb3BlKHRhZ05hbWUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhY2tUb3A7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCB0biA9IHRoaXMudGFnSURzW2ldO1xuICAgICAgICAgICAgY29uc3QgbnMgPSB0aGlzLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSSh0aGlzLml0ZW1zW2ldKTtcbiAgICAgICAgICAgIGlmIChucyAhPT0gaHRtbF9qc18xLk5TLkhUTUwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0biA9PT0gdGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRuICE9PSBodG1sX2pzXzEuVEFHX0lELk9QVElPTiAmJiB0biAhPT0gaHRtbF9qc18xLlRBR19JRC5PUFRHUk9VUCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy9JbXBsaWVkIGVuZCB0YWdzXG4gICAgZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpIHtcbiAgICAgICAgd2hpbGUgKElNUExJQ0lUX0VORF9UQUdfUkVRVUlSRUQuaGFzKHRoaXMuY3VycmVudFRhZ0lkKSkge1xuICAgICAgICAgICAgdGhpcy5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZUltcGxpZWRFbmRUYWdzVGhvcm91Z2hseSgpIHtcbiAgICAgICAgd2hpbGUgKElNUExJQ0lUX0VORF9UQUdfUkVRVUlSRURfVEhPUk9VR0hMWS5oYXModGhpcy5jdXJyZW50VGFnSWQpKSB7XG4gICAgICAgICAgICB0aGlzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlSW1wbGllZEVuZFRhZ3NXaXRoRXhjbHVzaW9uKGV4Y2x1c2lvbklkKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRUYWdJZCAhPT0gZXhjbHVzaW9uSWQgJiYgSU1QTElDSVRfRU5EX1RBR19SRVFVSVJFRF9USE9ST1VHSExZLmhhcyh0aGlzLmN1cnJlbnRUYWdJZCkpIHtcbiAgICAgICAgICAgIHRoaXMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLk9wZW5FbGVtZW50U3RhY2sgPSBPcGVuRWxlbWVudFN0YWNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b3Blbi1lbGVtZW50LXN0YWNrLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zZXJpYWxpemVPdXRlciA9IGV4cG9ydHMuc2VyaWFsaXplID0gdm9pZCAwO1xuY29uc3QgaHRtbF9qc18xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9odG1sLmpzXCIpO1xuY29uc3QgZXNjYXBlX2pzXzEgPSByZXF1aXJlKFwiZW50aXRpZXMvbGliL2VzY2FwZS5qc1wiKTtcbmNvbnN0IGRlZmF1bHRfanNfMSA9IHJlcXVpcmUoXCIuLi90cmVlLWFkYXB0ZXJzL2RlZmF1bHQuanNcIik7XG4vLyBTZXRzXG5jb25zdCBWT0lEX0VMRU1FTlRTID0gbmV3IFNldChbXG4gICAgaHRtbF9qc18xLlRBR19OQU1FUy5BUkVBLFxuICAgIGh0bWxfanNfMS5UQUdfTkFNRVMuQkFTRSxcbiAgICBodG1sX2pzXzEuVEFHX05BTUVTLkJBU0VGT05ULFxuICAgIGh0bWxfanNfMS5UQUdfTkFNRVMuQkdTT1VORCxcbiAgICBodG1sX2pzXzEuVEFHX05BTUVTLkJSLFxuICAgIGh0bWxfanNfMS5UQUdfTkFNRVMuQ09MLFxuICAgIGh0bWxfanNfMS5UQUdfTkFNRVMuRU1CRUQsXG4gICAgaHRtbF9qc18xLlRBR19OQU1FUy5GUkFNRSxcbiAgICBodG1sX2pzXzEuVEFHX05BTUVTLkhSLFxuICAgIGh0bWxfanNfMS5UQUdfTkFNRVMuSU1HLFxuICAgIGh0bWxfanNfMS5UQUdfTkFNRVMuSU5QVVQsXG4gICAgaHRtbF9qc18xLlRBR19OQU1FUy5LRVlHRU4sXG4gICAgaHRtbF9qc18xLlRBR19OQU1FUy5MSU5LLFxuICAgIGh0bWxfanNfMS5UQUdfTkFNRVMuTUVUQSxcbiAgICBodG1sX2pzXzEuVEFHX05BTUVTLlBBUkFNLFxuICAgIGh0bWxfanNfMS5UQUdfTkFNRVMuU09VUkNFLFxuICAgIGh0bWxfanNfMS5UQUdfTkFNRVMuVFJBQ0ssXG4gICAgaHRtbF9qc18xLlRBR19OQU1FUy5XQlIsXG5dKTtcbmZ1bmN0aW9uIGlzVm9pZEVsZW1lbnQobm9kZSwgb3B0aW9ucykge1xuICAgIHJldHVybiAob3B0aW9ucy50cmVlQWRhcHRlci5pc0VsZW1lbnROb2RlKG5vZGUpICYmXG4gICAgICAgIG9wdGlvbnMudHJlZUFkYXB0ZXIuZ2V0TmFtZXNwYWNlVVJJKG5vZGUpID09PSBodG1sX2pzXzEuTlMuSFRNTCAmJlxuICAgICAgICBWT0lEX0VMRU1FTlRTLmhhcyhvcHRpb25zLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUobm9kZSkpKTtcbn1cbmNvbnN0IGRlZmF1bHRPcHRzID0geyB0cmVlQWRhcHRlcjogZGVmYXVsdF9qc18xLmRlZmF1bHRUcmVlQWRhcHRlciwgc2NyaXB0aW5nRW5hYmxlZDogdHJ1ZSB9O1xuLyoqXG4gKiBTZXJpYWxpemVzIGFuIEFTVCBub2RlIHRvIGFuIEhUTUwgc3RyaW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBhcnNlNSA9IHJlcXVpcmUoJ3BhcnNlNScpO1xuICpcbiAqIGNvbnN0IGRvY3VtZW50ID0gcGFyc2U1LnBhcnNlKCc8IURPQ1RZUEUgaHRtbD48aHRtbD48aGVhZD48L2hlYWQ+PGJvZHk+SGkgdGhlcmUhPC9ib2R5PjwvaHRtbD4nKTtcbiAqXG4gKiAvLyBTZXJpYWxpemVzIGEgZG9jdW1lbnQuXG4gKiBjb25zdCBodG1sID0gcGFyc2U1LnNlcmlhbGl6ZShkb2N1bWVudCk7XG4gKlxuICogLy8gU2VyaWFsaXplcyB0aGUgPGh0bWw+IGVsZW1lbnQgY29udGVudC5cbiAqIGNvbnN0IHN0ciA9IHBhcnNlNS5zZXJpYWxpemUoZG9jdW1lbnQuY2hpbGROb2Rlc1sxXSk7XG4gKlxuICogY29uc29sZS5sb2coc3RyKTsgLy8+ICc8aGVhZD48L2hlYWQ+PGJvZHk+SGkgdGhlcmUhPC9ib2R5PidcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBub2RlIE5vZGUgdG8gc2VyaWFsaXplLlxuICogQHBhcmFtIG9wdGlvbnMgU2VyaWFsaXphdGlvbiBvcHRpb25zLlxuICovXG5mdW5jdGlvbiBzZXJpYWxpemUobm9kZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRzKSwgb3B0aW9ucyk7XG4gICAgaWYgKGlzVm9pZEVsZW1lbnQobm9kZSwgb3B0cykpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplQ2hpbGROb2Rlcyhub2RlLCBvcHRzKTtcbn1cbmV4cG9ydHMuc2VyaWFsaXplID0gc2VyaWFsaXplO1xuLyoqXG4gKiBTZXJpYWxpemVzIGFuIEFTVCBlbGVtZW50IG5vZGUgdG8gYW4gSFRNTCBzdHJpbmcsIGluY2x1ZGluZyB0aGUgZWxlbWVudCBub2RlLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBhcnNlNSA9IHJlcXVpcmUoJ3BhcnNlNScpO1xuICpcbiAqIGNvbnN0IGRvY3VtZW50ID0gcGFyc2U1LnBhcnNlRnJhZ21lbnQoJzxkaXY+SGVsbG8sIDxiPndvcmxkPC9iPiE8L2Rpdj4nKTtcbiAqXG4gKiAvLyBTZXJpYWxpemVzIHRoZSA8ZGl2PiBlbGVtZW50LlxuICogY29uc3QgaHRtbCA9IHBhcnNlNS5zZXJpYWxpemVPdXRlcihkb2N1bWVudC5jaGlsZE5vZGVzWzBdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhzdHIpOyAvLz4gJzxkaXY+SGVsbG8sIDxiPndvcmxkPC9iPiE8L2Rpdj4nXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbm9kZSBOb2RlIHRvIHNlcmlhbGl6ZS5cbiAqIEBwYXJhbSBvcHRpb25zIFNlcmlhbGl6YXRpb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gc2VyaWFsaXplT3V0ZXIobm9kZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRzKSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZU5vZGUobm9kZSwgb3B0cyk7XG59XG5leHBvcnRzLnNlcmlhbGl6ZU91dGVyID0gc2VyaWFsaXplT3V0ZXI7XG5mdW5jdGlvbiBzZXJpYWxpemVDaGlsZE5vZGVzKHBhcmVudE5vZGUsIG9wdGlvbnMpIHtcbiAgICBsZXQgaHRtbCA9ICcnO1xuICAgIC8vIEdldCBjb250YWluZXIgb2YgdGhlIGNoaWxkIG5vZGVzXG4gICAgY29uc3QgY29udGFpbmVyID0gb3B0aW9ucy50cmVlQWRhcHRlci5pc0VsZW1lbnROb2RlKHBhcmVudE5vZGUpICYmXG4gICAgICAgIG9wdGlvbnMudHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShwYXJlbnROb2RlKSA9PT0gaHRtbF9qc18xLlRBR19OQU1FUy5URU1QTEFURSAmJlxuICAgICAgICBvcHRpb25zLnRyZWVBZGFwdGVyLmdldE5hbWVzcGFjZVVSSShwYXJlbnROb2RlKSA9PT0gaHRtbF9qc18xLk5TLkhUTUxcbiAgICAgICAgPyBvcHRpb25zLnRyZWVBZGFwdGVyLmdldFRlbXBsYXRlQ29udGVudChwYXJlbnROb2RlKVxuICAgICAgICA6IHBhcmVudE5vZGU7XG4gICAgY29uc3QgY2hpbGROb2RlcyA9IG9wdGlvbnMudHJlZUFkYXB0ZXIuZ2V0Q2hpbGROb2Rlcyhjb250YWluZXIpO1xuICAgIGlmIChjaGlsZE5vZGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgY3VycmVudE5vZGUgb2YgY2hpbGROb2Rlcykge1xuICAgICAgICAgICAgaHRtbCArPSBzZXJpYWxpemVOb2RlKGN1cnJlbnROb2RlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaHRtbDtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZU5vZGUobm9kZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnRyZWVBZGFwdGVyLmlzRWxlbWVudE5vZGUobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUVsZW1lbnQobm9kZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRyZWVBZGFwdGVyLmlzVGV4dE5vZGUobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZVRleHROb2RlKG5vZGUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50cmVlQWRhcHRlci5pc0NvbW1lbnROb2RlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVDb21tZW50Tm9kZShub2RlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudHJlZUFkYXB0ZXIuaXNEb2N1bWVudFR5cGVOb2RlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVEb2N1bWVudFR5cGVOb2RlKG5vZGUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGZvciB1bmtub3duIG5vZGVzXG4gICAgcmV0dXJuICcnO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplRWxlbWVudChub2RlLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdG4gPSBvcHRpb25zLnRyZWVBZGFwdGVyLmdldFRhZ05hbWUobm9kZSk7XG4gICAgcmV0dXJuIGA8JHt0bn0ke3NlcmlhbGl6ZUF0dHJpYnV0ZXMobm9kZSwgb3B0aW9ucyl9PiR7aXNWb2lkRWxlbWVudChub2RlLCBvcHRpb25zKSA/ICcnIDogYCR7c2VyaWFsaXplQ2hpbGROb2Rlcyhub2RlLCBvcHRpb25zKX08LyR7dG59PmB9YDtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZUF0dHJpYnV0ZXMobm9kZSwgeyB0cmVlQWRhcHRlciB9KSB7XG4gICAgbGV0IGh0bWwgPSAnJztcbiAgICBmb3IgKGNvbnN0IGF0dHIgb2YgdHJlZUFkYXB0ZXIuZ2V0QXR0ckxpc3Qobm9kZSkpIHtcbiAgICAgICAgaHRtbCArPSAnICc7XG4gICAgICAgIGlmICghYXR0ci5uYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIGh0bWwgKz0gYXR0ci5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN3aXRjaCAoYXR0ci5uYW1lc3BhY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlIGh0bWxfanNfMS5OUy5YTUw6IHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSBgeG1sOiR7YXR0ci5uYW1lfWA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIGh0bWxfanNfMS5OUy5YTUxOUzoge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ci5uYW1lICE9PSAneG1sbnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9ICd4bWxuczonO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gYXR0ci5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBodG1sX2pzXzEuTlMuWExJTks6IHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSBgeGxpbms6JHthdHRyLm5hbWV9YDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSBgJHthdHRyLnByZWZpeH06JHthdHRyLm5hbWV9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gYD1cIiR7KDAsIGVzY2FwZV9qc18xLmVzY2FwZUF0dHJpYnV0ZSkoYXR0ci52YWx1ZSl9XCJgO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbDtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZVRleHROb2RlKG5vZGUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IHRyZWVBZGFwdGVyIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0cmVlQWRhcHRlci5nZXRUZXh0Tm9kZUNvbnRlbnQobm9kZSk7XG4gICAgY29uc3QgcGFyZW50ID0gdHJlZUFkYXB0ZXIuZ2V0UGFyZW50Tm9kZShub2RlKTtcbiAgICBjb25zdCBwYXJlbnRUbiA9IHBhcmVudCAmJiB0cmVlQWRhcHRlci5pc0VsZW1lbnROb2RlKHBhcmVudCkgJiYgdHJlZUFkYXB0ZXIuZ2V0VGFnTmFtZShwYXJlbnQpO1xuICAgIHJldHVybiBwYXJlbnRUbiAmJlxuICAgICAgICB0cmVlQWRhcHRlci5nZXROYW1lc3BhY2VVUkkocGFyZW50KSA9PT0gaHRtbF9qc18xLk5TLkhUTUwgJiZcbiAgICAgICAgKDAsIGh0bWxfanNfMS5oYXNVbmVzY2FwZWRUZXh0KShwYXJlbnRUbiwgb3B0aW9ucy5zY3JpcHRpbmdFbmFibGVkKVxuICAgICAgICA/IGNvbnRlbnRcbiAgICAgICAgOiAoMCwgZXNjYXBlX2pzXzEuZXNjYXBlVGV4dCkoY29udGVudCk7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVDb21tZW50Tm9kZShub2RlLCB7IHRyZWVBZGFwdGVyIH0pIHtcbiAgICByZXR1cm4gYDwhLS0ke3RyZWVBZGFwdGVyLmdldENvbW1lbnROb2RlQ29udGVudChub2RlKX0tLT5gO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplRG9jdW1lbnRUeXBlTm9kZShub2RlLCB7IHRyZWVBZGFwdGVyIH0pIHtcbiAgICByZXR1cm4gYDwhRE9DVFlQRSAke3RyZWVBZGFwdGVyLmdldERvY3VtZW50VHlwZU5vZGVOYW1lKG5vZGUpfT5gO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlRva2VuaXplciA9IGV4cG9ydHMuVG9rZW5pemVyTW9kZSA9IHZvaWQgMDtcbmNvbnN0IHByZXByb2Nlc3Nvcl9qc18xID0gcmVxdWlyZShcIi4vcHJlcHJvY2Vzc29yLmpzXCIpO1xuY29uc3QgdW5pY29kZV9qc18xID0gcmVxdWlyZShcIi4uL2NvbW1vbi91bmljb2RlLmpzXCIpO1xuY29uc3QgdG9rZW5fanNfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vdG9rZW4uanNcIik7XG5jb25zdCBkZWNvZGVfanNfMSA9IHJlcXVpcmUoXCJlbnRpdGllcy9saWIvZGVjb2RlLmpzXCIpO1xuY29uc3QgZXJyb3JfY29kZXNfanNfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vZXJyb3ItY29kZXMuanNcIik7XG5jb25zdCBodG1sX2pzXzEgPSByZXF1aXJlKFwiLi4vY29tbW9uL2h0bWwuanNcIik7XG4vL0MxIFVuaWNvZGUgY29udHJvbCBjaGFyYWN0ZXIgcmVmZXJlbmNlIHJlcGxhY2VtZW50c1xuY29uc3QgQzFfQ09OVFJPTFNfUkVGRVJFTkNFX1JFUExBQ0VNRU5UUyA9IG5ldyBNYXAoW1xuICAgIFsweDgwLCA4MzY0XSxcbiAgICBbMHg4MiwgODIxOF0sXG4gICAgWzB4ODMsIDQwMl0sXG4gICAgWzB4ODQsIDgyMjJdLFxuICAgIFsweDg1LCA4MjMwXSxcbiAgICBbMHg4NiwgODIyNF0sXG4gICAgWzB4ODcsIDgyMjVdLFxuICAgIFsweDg4LCA3MTBdLFxuICAgIFsweDg5LCA4MjQwXSxcbiAgICBbMHg4YSwgMzUyXSxcbiAgICBbMHg4YiwgODI0OV0sXG4gICAgWzB4OGMsIDMzOF0sXG4gICAgWzB4OGUsIDM4MV0sXG4gICAgWzB4OTEsIDgyMTZdLFxuICAgIFsweDkyLCA4MjE3XSxcbiAgICBbMHg5MywgODIyMF0sXG4gICAgWzB4OTQsIDgyMjFdLFxuICAgIFsweDk1LCA4MjI2XSxcbiAgICBbMHg5NiwgODIxMV0sXG4gICAgWzB4OTcsIDgyMTJdLFxuICAgIFsweDk4LCA3MzJdLFxuICAgIFsweDk5LCA4NDgyXSxcbiAgICBbMHg5YSwgMzUzXSxcbiAgICBbMHg5YiwgODI1MF0sXG4gICAgWzB4OWMsIDMzOV0sXG4gICAgWzB4OWUsIDM4Ml0sXG4gICAgWzB4OWYsIDM3Nl0sXG5dKTtcbi8vU3RhdGVzXG52YXIgU3RhdGU7XG4oZnVuY3Rpb24gKFN0YXRlKSB7XG4gICAgU3RhdGVbU3RhdGVbXCJEQVRBXCJdID0gMF0gPSBcIkRBVEFcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlJDREFUQVwiXSA9IDFdID0gXCJSQ0RBVEFcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlJBV1RFWFRcIl0gPSAyXSA9IFwiUkFXVEVYVFwiO1xuICAgIFN0YXRlW1N0YXRlW1wiU0NSSVBUX0RBVEFcIl0gPSAzXSA9IFwiU0NSSVBUX0RBVEFcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlBMQUlOVEVYVFwiXSA9IDRdID0gXCJQTEFJTlRFWFRcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlRBR19PUEVOXCJdID0gNV0gPSBcIlRBR19PUEVOXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJFTkRfVEFHX09QRU5cIl0gPSA2XSA9IFwiRU5EX1RBR19PUEVOXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJUQUdfTkFNRVwiXSA9IDddID0gXCJUQUdfTkFNRVwiO1xuICAgIFN0YXRlW1N0YXRlW1wiUkNEQVRBX0xFU1NfVEhBTl9TSUdOXCJdID0gOF0gPSBcIlJDREFUQV9MRVNTX1RIQU5fU0lHTlwiO1xuICAgIFN0YXRlW1N0YXRlW1wiUkNEQVRBX0VORF9UQUdfT1BFTlwiXSA9IDldID0gXCJSQ0RBVEFfRU5EX1RBR19PUEVOXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJSQ0RBVEFfRU5EX1RBR19OQU1FXCJdID0gMTBdID0gXCJSQ0RBVEFfRU5EX1RBR19OQU1FXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJSQVdURVhUX0xFU1NfVEhBTl9TSUdOXCJdID0gMTFdID0gXCJSQVdURVhUX0xFU1NfVEhBTl9TSUdOXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJSQVdURVhUX0VORF9UQUdfT1BFTlwiXSA9IDEyXSA9IFwiUkFXVEVYVF9FTkRfVEFHX09QRU5cIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlJBV1RFWFRfRU5EX1RBR19OQU1FXCJdID0gMTNdID0gXCJSQVdURVhUX0VORF9UQUdfTkFNRVwiO1xuICAgIFN0YXRlW1N0YXRlW1wiU0NSSVBUX0RBVEFfTEVTU19USEFOX1NJR05cIl0gPSAxNF0gPSBcIlNDUklQVF9EQVRBX0xFU1NfVEhBTl9TSUdOXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJTQ1JJUFRfREFUQV9FTkRfVEFHX09QRU5cIl0gPSAxNV0gPSBcIlNDUklQVF9EQVRBX0VORF9UQUdfT1BFTlwiO1xuICAgIFN0YXRlW1N0YXRlW1wiU0NSSVBUX0RBVEFfRU5EX1RBR19OQU1FXCJdID0gMTZdID0gXCJTQ1JJUFRfREFUQV9FTkRfVEFHX05BTUVcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlNDUklQVF9EQVRBX0VTQ0FQRV9TVEFSVFwiXSA9IDE3XSA9IFwiU0NSSVBUX0RBVEFfRVNDQVBFX1NUQVJUXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJTQ1JJUFRfREFUQV9FU0NBUEVfU1RBUlRfREFTSFwiXSA9IDE4XSA9IFwiU0NSSVBUX0RBVEFfRVNDQVBFX1NUQVJUX0RBU0hcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlNDUklQVF9EQVRBX0VTQ0FQRURcIl0gPSAxOV0gPSBcIlNDUklQVF9EQVRBX0VTQ0FQRURcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlNDUklQVF9EQVRBX0VTQ0FQRURfREFTSFwiXSA9IDIwXSA9IFwiU0NSSVBUX0RBVEFfRVNDQVBFRF9EQVNIXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJTQ1JJUFRfREFUQV9FU0NBUEVEX0RBU0hfREFTSFwiXSA9IDIxXSA9IFwiU0NSSVBUX0RBVEFfRVNDQVBFRF9EQVNIX0RBU0hcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlNDUklQVF9EQVRBX0VTQ0FQRURfTEVTU19USEFOX1NJR05cIl0gPSAyMl0gPSBcIlNDUklQVF9EQVRBX0VTQ0FQRURfTEVTU19USEFOX1NJR05cIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlNDUklQVF9EQVRBX0VTQ0FQRURfRU5EX1RBR19PUEVOXCJdID0gMjNdID0gXCJTQ1JJUFRfREFUQV9FU0NBUEVEX0VORF9UQUdfT1BFTlwiO1xuICAgIFN0YXRlW1N0YXRlW1wiU0NSSVBUX0RBVEFfRVNDQVBFRF9FTkRfVEFHX05BTUVcIl0gPSAyNF0gPSBcIlNDUklQVF9EQVRBX0VTQ0FQRURfRU5EX1RBR19OQU1FXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFX1NUQVJUXCJdID0gMjVdID0gXCJTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFX1NUQVJUXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRFwiXSA9IDI2XSA9IFwiU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0RBU0hcIl0gPSAyN10gPSBcIlNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0RBU0hcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0RBU0hfREFTSFwiXSA9IDI4XSA9IFwiU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfREFTSF9EQVNIXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9MRVNTX1RIQU5fU0lHTlwiXSA9IDI5XSA9IFwiU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfTEVTU19USEFOX1NJR05cIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVfRU5EXCJdID0gMzBdID0gXCJTQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFX0VORFwiO1xuICAgIFN0YXRlW1N0YXRlW1wiQkVGT1JFX0FUVFJJQlVURV9OQU1FXCJdID0gMzFdID0gXCJCRUZPUkVfQVRUUklCVVRFX05BTUVcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkFUVFJJQlVURV9OQU1FXCJdID0gMzJdID0gXCJBVFRSSUJVVEVfTkFNRVwiO1xuICAgIFN0YXRlW1N0YXRlW1wiQUZURVJfQVRUUklCVVRFX05BTUVcIl0gPSAzM10gPSBcIkFGVEVSX0FUVFJJQlVURV9OQU1FXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJCRUZPUkVfQVRUUklCVVRFX1ZBTFVFXCJdID0gMzRdID0gXCJCRUZPUkVfQVRUUklCVVRFX1ZBTFVFXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJBVFRSSUJVVEVfVkFMVUVfRE9VQkxFX1FVT1RFRFwiXSA9IDM1XSA9IFwiQVRUUklCVVRFX1ZBTFVFX0RPVUJMRV9RVU9URURcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkFUVFJJQlVURV9WQUxVRV9TSU5HTEVfUVVPVEVEXCJdID0gMzZdID0gXCJBVFRSSUJVVEVfVkFMVUVfU0lOR0xFX1FVT1RFRFwiO1xuICAgIFN0YXRlW1N0YXRlW1wiQVRUUklCVVRFX1ZBTFVFX1VOUVVPVEVEXCJdID0gMzddID0gXCJBVFRSSUJVVEVfVkFMVUVfVU5RVU9URURcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkFGVEVSX0FUVFJJQlVURV9WQUxVRV9RVU9URURcIl0gPSAzOF0gPSBcIkFGVEVSX0FUVFJJQlVURV9WQUxVRV9RVU9URURcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIlNFTEZfQ0xPU0lOR19TVEFSVF9UQUdcIl0gPSAzOV0gPSBcIlNFTEZfQ0xPU0lOR19TVEFSVF9UQUdcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkJPR1VTX0NPTU1FTlRcIl0gPSA0MF0gPSBcIkJPR1VTX0NPTU1FTlRcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIk1BUktVUF9ERUNMQVJBVElPTl9PUEVOXCJdID0gNDFdID0gXCJNQVJLVVBfREVDTEFSQVRJT05fT1BFTlwiO1xuICAgIFN0YXRlW1N0YXRlW1wiQ09NTUVOVF9TVEFSVFwiXSA9IDQyXSA9IFwiQ09NTUVOVF9TVEFSVFwiO1xuICAgIFN0YXRlW1N0YXRlW1wiQ09NTUVOVF9TVEFSVF9EQVNIXCJdID0gNDNdID0gXCJDT01NRU5UX1NUQVJUX0RBU0hcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkNPTU1FTlRcIl0gPSA0NF0gPSBcIkNPTU1FTlRcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkNPTU1FTlRfTEVTU19USEFOX1NJR05cIl0gPSA0NV0gPSBcIkNPTU1FTlRfTEVTU19USEFOX1NJR05cIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkNPTU1FTlRfTEVTU19USEFOX1NJR05fQkFOR1wiXSA9IDQ2XSA9IFwiQ09NTUVOVF9MRVNTX1RIQU5fU0lHTl9CQU5HXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJDT01NRU5UX0xFU1NfVEhBTl9TSUdOX0JBTkdfREFTSFwiXSA9IDQ3XSA9IFwiQ09NTUVOVF9MRVNTX1RIQU5fU0lHTl9CQU5HX0RBU0hcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkNPTU1FTlRfTEVTU19USEFOX1NJR05fQkFOR19EQVNIX0RBU0hcIl0gPSA0OF0gPSBcIkNPTU1FTlRfTEVTU19USEFOX1NJR05fQkFOR19EQVNIX0RBU0hcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkNPTU1FTlRfRU5EX0RBU0hcIl0gPSA0OV0gPSBcIkNPTU1FTlRfRU5EX0RBU0hcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkNPTU1FTlRfRU5EXCJdID0gNTBdID0gXCJDT01NRU5UX0VORFwiO1xuICAgIFN0YXRlW1N0YXRlW1wiQ09NTUVOVF9FTkRfQkFOR1wiXSA9IDUxXSA9IFwiQ09NTUVOVF9FTkRfQkFOR1wiO1xuICAgIFN0YXRlW1N0YXRlW1wiRE9DVFlQRVwiXSA9IDUyXSA9IFwiRE9DVFlQRVwiO1xuICAgIFN0YXRlW1N0YXRlW1wiQkVGT1JFX0RPQ1RZUEVfTkFNRVwiXSA9IDUzXSA9IFwiQkVGT1JFX0RPQ1RZUEVfTkFNRVwiO1xuICAgIFN0YXRlW1N0YXRlW1wiRE9DVFlQRV9OQU1FXCJdID0gNTRdID0gXCJET0NUWVBFX05BTUVcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkFGVEVSX0RPQ1RZUEVfTkFNRVwiXSA9IDU1XSA9IFwiQUZURVJfRE9DVFlQRV9OQU1FXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJBRlRFUl9ET0NUWVBFX1BVQkxJQ19LRVlXT1JEXCJdID0gNTZdID0gXCJBRlRFUl9ET0NUWVBFX1BVQkxJQ19LRVlXT1JEXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJCRUZPUkVfRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUlwiXSA9IDU3XSA9IFwiQkVGT1JFX0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkRPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfRE9VQkxFX1FVT1RFRFwiXSA9IDU4XSA9IFwiRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9ET1VCTEVfUVVPVEVEXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX1NJTkdMRV9RVU9URURcIl0gPSA1OV0gPSBcIkRPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU0lOR0xFX1FVT1RFRFwiO1xuICAgIFN0YXRlW1N0YXRlW1wiQUZURVJfRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUlwiXSA9IDYwXSA9IFwiQUZURVJfRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUlwiO1xuICAgIFN0YXRlW1N0YXRlW1wiQkVUV0VFTl9ET0NUWVBFX1BVQkxJQ19BTkRfU1lTVEVNX0lERU5USUZJRVJTXCJdID0gNjFdID0gXCJCRVRXRUVOX0RPQ1RZUEVfUFVCTElDX0FORF9TWVNURU1fSURFTlRJRklFUlNcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkFGVEVSX0RPQ1RZUEVfU1lTVEVNX0tFWVdPUkRcIl0gPSA2Ml0gPSBcIkFGVEVSX0RPQ1RZUEVfU1lTVEVNX0tFWVdPUkRcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkJFRk9SRV9ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSXCJdID0gNjNdID0gXCJCRUZPUkVfRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUlwiO1xuICAgIFN0YXRlW1N0YXRlW1wiRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9ET1VCTEVfUVVPVEVEXCJdID0gNjRdID0gXCJET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX0RPVUJMRV9RVU9URURcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkRPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfU0lOR0xFX1FVT1RFRFwiXSA9IDY1XSA9IFwiRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TSU5HTEVfUVVPVEVEXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJBRlRFUl9ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSXCJdID0gNjZdID0gXCJBRlRFUl9ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJCT0dVU19ET0NUWVBFXCJdID0gNjddID0gXCJCT0dVU19ET0NUWVBFXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJDREFUQV9TRUNUSU9OXCJdID0gNjhdID0gXCJDREFUQV9TRUNUSU9OXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJDREFUQV9TRUNUSU9OX0JSQUNLRVRcIl0gPSA2OV0gPSBcIkNEQVRBX1NFQ1RJT05fQlJBQ0tFVFwiO1xuICAgIFN0YXRlW1N0YXRlW1wiQ0RBVEFfU0VDVElPTl9FTkRcIl0gPSA3MF0gPSBcIkNEQVRBX1NFQ1RJT05fRU5EXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJDSEFSQUNURVJfUkVGRVJFTkNFXCJdID0gNzFdID0gXCJDSEFSQUNURVJfUkVGRVJFTkNFXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJOQU1FRF9DSEFSQUNURVJfUkVGRVJFTkNFXCJdID0gNzJdID0gXCJOQU1FRF9DSEFSQUNURVJfUkVGRVJFTkNFXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJBTUJJR1VPVVNfQU1QRVJTQU5EXCJdID0gNzNdID0gXCJBTUJJR1VPVVNfQU1QRVJTQU5EXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJOVU1FUklDX0NIQVJBQ1RFUl9SRUZFUkVOQ0VcIl0gPSA3NF0gPSBcIk5VTUVSSUNfQ0hBUkFDVEVSX1JFRkVSRU5DRVwiO1xuICAgIFN0YXRlW1N0YXRlW1wiSEVYQURFTUlDQUxfQ0hBUkFDVEVSX1JFRkVSRU5DRV9TVEFSVFwiXSA9IDc1XSA9IFwiSEVYQURFTUlDQUxfQ0hBUkFDVEVSX1JFRkVSRU5DRV9TVEFSVFwiO1xuICAgIFN0YXRlW1N0YXRlW1wiREVDSU1BTF9DSEFSQUNURVJfUkVGRVJFTkNFX1NUQVJUXCJdID0gNzZdID0gXCJERUNJTUFMX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfU1RBUlRcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkhFWEFERU1JQ0FMX0NIQVJBQ1RFUl9SRUZFUkVOQ0VcIl0gPSA3N10gPSBcIkhFWEFERU1JQ0FMX0NIQVJBQ1RFUl9SRUZFUkVOQ0VcIjtcbiAgICBTdGF0ZVtTdGF0ZVtcIkRFQ0lNQUxfQ0hBUkFDVEVSX1JFRkVSRU5DRVwiXSA9IDc4XSA9IFwiREVDSU1BTF9DSEFSQUNURVJfUkVGRVJFTkNFXCI7XG4gICAgU3RhdGVbU3RhdGVbXCJOVU1FUklDX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfRU5EXCJdID0gNzldID0gXCJOVU1FUklDX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfRU5EXCI7XG59KShTdGF0ZSB8fCAoU3RhdGUgPSB7fSkpO1xuLy9Ub2tlbml6ZXIgaW5pdGlhbCBzdGF0ZXMgZm9yIGRpZmZlcmVudCBtb2Rlc1xuZXhwb3J0cy5Ub2tlbml6ZXJNb2RlID0ge1xuICAgIERBVEE6IFN0YXRlLkRBVEEsXG4gICAgUkNEQVRBOiBTdGF0ZS5SQ0RBVEEsXG4gICAgUkFXVEVYVDogU3RhdGUuUkFXVEVYVCxcbiAgICBTQ1JJUFRfREFUQTogU3RhdGUuU0NSSVBUX0RBVEEsXG4gICAgUExBSU5URVhUOiBTdGF0ZS5QTEFJTlRFWFQsXG4gICAgQ0RBVEFfU0VDVElPTjogU3RhdGUuQ0RBVEFfU0VDVElPTixcbn07XG4vL1V0aWxzXG4vL09QVElNSVpBVElPTjogdGhlc2UgdXRpbGl0eSBmdW5jdGlvbnMgc2hvdWxkIG5vdCBiZSBtb3ZlZCBvdXQgb2YgdGhpcyBtb2R1bGUuIFY4IENyYW5rc2hhZnQgd2lsbCBub3QgaW5saW5lXG4vL3RoaXMgZnVuY3Rpb25zIGlmIHRoZXkgd2lsbCBiZSBzaXR1YXRlZCBpbiBhbm90aGVyIG1vZHVsZSBkdWUgdG8gY29udGV4dCBzd2l0Y2guXG4vL0Fsd2F5cyBwZXJmb3JtIGlubGluaW5nIGNoZWNrIGJlZm9yZSBtb2RpZnlpbmcgdGhpcyBmdW5jdGlvbnMgKCdub2RlIC0tdHJhY2UtaW5saW5pbmcnKS5cbmZ1bmN0aW9uIGlzQXNjaWlEaWdpdChjcCkge1xuICAgIHJldHVybiBjcCA+PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRElHSVRfMCAmJiBjcCA8PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRElHSVRfOTtcbn1cbmZ1bmN0aW9uIGlzQXNjaWlVcHBlcihjcCkge1xuICAgIHJldHVybiBjcCA+PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTEFUSU5fQ0FQSVRBTF9BICYmIGNwIDw9IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MQVRJTl9DQVBJVEFMX1o7XG59XG5mdW5jdGlvbiBpc0FzY2lpTG93ZXIoY3ApIHtcbiAgICByZXR1cm4gY3AgPj0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxBVElOX1NNQUxMX0EgJiYgY3AgPD0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxBVElOX1NNQUxMX1o7XG59XG5mdW5jdGlvbiBpc0FzY2lpTGV0dGVyKGNwKSB7XG4gICAgcmV0dXJuIGlzQXNjaWlMb3dlcihjcCkgfHwgaXNBc2NpaVVwcGVyKGNwKTtcbn1cbmZ1bmN0aW9uIGlzQXNjaWlBbHBoYU51bWVyaWMoY3ApIHtcbiAgICByZXR1cm4gaXNBc2NpaUxldHRlcihjcCkgfHwgaXNBc2NpaURpZ2l0KGNwKTtcbn1cbmZ1bmN0aW9uIGlzQXNjaWlVcHBlckhleERpZ2l0KGNwKSB7XG4gICAgcmV0dXJuIGNwID49IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MQVRJTl9DQVBJVEFMX0EgJiYgY3AgPD0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxBVElOX0NBUElUQUxfRjtcbn1cbmZ1bmN0aW9uIGlzQXNjaWlMb3dlckhleERpZ2l0KGNwKSB7XG4gICAgcmV0dXJuIGNwID49IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MQVRJTl9TTUFMTF9BICYmIGNwIDw9IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MQVRJTl9TTUFMTF9GO1xufVxuZnVuY3Rpb24gaXNBc2NpaUhleERpZ2l0KGNwKSB7XG4gICAgcmV0dXJuIGlzQXNjaWlEaWdpdChjcCkgfHwgaXNBc2NpaVVwcGVySGV4RGlnaXQoY3ApIHx8IGlzQXNjaWlMb3dlckhleERpZ2l0KGNwKTtcbn1cbmZ1bmN0aW9uIHRvQXNjaWlMb3dlcihjcCkge1xuICAgIHJldHVybiBjcCArIDMyO1xufVxuZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKGNwKSB7XG4gICAgcmV0dXJuIGNwID09PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU1BBQ0UgfHwgY3AgPT09IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MSU5FX0ZFRUQgfHwgY3AgPT09IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5UQUJVTEFUSU9OIHx8IGNwID09PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRk9STV9GRUVEO1xufVxuZnVuY3Rpb24gaXNFbnRpdHlJbkF0dHJpYnV0ZUludmFsaWRFbmQobmV4dENwKSB7XG4gICAgcmV0dXJuIG5leHRDcCA9PT0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVRVUFMU19TSUdOIHx8IGlzQXNjaWlBbHBoYU51bWVyaWMobmV4dENwKTtcbn1cbmZ1bmN0aW9uIGlzU2NyaXB0RGF0YURvdWJsZUVzY2FwZVNlcXVlbmNlRW5kKGNwKSB7XG4gICAgcmV0dXJuIGlzV2hpdGVzcGFjZShjcCkgfHwgY3AgPT09IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5TT0xJRFVTIHx8IGNwID09PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuR1JFQVRFUl9USEFOX1NJR047XG59XG4vL1Rva2VuaXplclxuY2xhc3MgVG9rZW5pemVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBoYW5kbGVyKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XG4gICAgICAgIC8qKiBFbnN1cmVzIHRoYXQgdGhlIHBhcnNpbmcgbG9vcCBpc24ndCBydW4gbXVsdGlwbGUgdGltZXMgYXQgb25jZS4gKi9cbiAgICAgICAgdGhpcy5pbkxvb3AgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGFkanVzdGVkIG5vZGUgZXhpc3RzLCBpcyBub3QgYW4gZWxlbWVudCBpbiB0aGUgSFRNTCBuYW1lc3BhY2UsXG4gICAgICAgICAqIGFuZCB0aGF0IGl0IGlzIG5vdCBhbiBpbnRlZ3JhdGlvbiBwb2ludCBmb3IgZWl0aGVyIE1hdGhNTCBvciBIVE1MLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9wYXJzaW5nLmh0bWwjdHJlZS1jb25zdHJ1Y3Rpb259XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluRm9yZWlnbk5vZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sYXN0U3RhcnRUYWdOYW1lID0gJyc7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICB0aGlzLnJldHVyblN0YXRlID0gU3RhdGUuREFUQTtcbiAgICAgICAgdGhpcy5jaGFyUmVmQ29kZSA9IC0xO1xuICAgICAgICB0aGlzLmNvbnN1bWVkQWZ0ZXJTbmFwc2hvdCA9IC0xO1xuICAgICAgICB0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdXJyZW50QXR0ciA9IHsgbmFtZTogJycsIHZhbHVlOiAnJyB9O1xuICAgICAgICB0aGlzLnByZXByb2Nlc3NvciA9IG5ldyBwcmVwcm9jZXNzb3JfanNfMS5QcmVwcm9jZXNzb3IoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uID0gdGhpcy5nZXRDdXJyZW50TG9jYXRpb24oLTEpO1xuICAgIH1cbiAgICAvL0Vycm9yc1xuICAgIF9lcnIoY29kZSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAoX2IgPSAoX2EgPSB0aGlzLmhhbmRsZXIpLm9uUGFyc2VFcnJvcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIHRoaXMucHJlcHJvY2Vzc29yLmdldEVycm9yKGNvZGUpKTtcbiAgICB9XG4gICAgLy8gTk9URTogYG9mZnNldGAgbWF5IG5ldmVyIHJ1biBhY3Jvc3MgbGluZSBib3VuZGFyaWVzLlxuICAgIGdldEN1cnJlbnRMb2NhdGlvbihvZmZzZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc291cmNlQ29kZUxvY2F0aW9uSW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXJ0TGluZTogdGhpcy5wcmVwcm9jZXNzb3IubGluZSxcbiAgICAgICAgICAgIHN0YXJ0Q29sOiB0aGlzLnByZXByb2Nlc3Nvci5jb2wgLSBvZmZzZXQsXG4gICAgICAgICAgICBzdGFydE9mZnNldDogdGhpcy5wcmVwcm9jZXNzb3Iub2Zmc2V0IC0gb2Zmc2V0LFxuICAgICAgICAgICAgZW5kTGluZTogLTEsXG4gICAgICAgICAgICBlbmRDb2w6IC0xLFxuICAgICAgICAgICAgZW5kT2Zmc2V0OiAtMSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX3J1blBhcnNpbmdMb29wKCkge1xuICAgICAgICBpZiAodGhpcy5pbkxvb3ApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuaW5Mb29wID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKHRoaXMuYWN0aXZlICYmICF0aGlzLnBhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5jb25zdW1lZEFmdGVyU25hcHNob3QgPSAwO1xuICAgICAgICAgICAgY29uc3QgY3AgPSB0aGlzLl9jb25zdW1lKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2Vuc3VyZUhpYmVybmF0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsU3RhdGUoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5Mb29wID0gZmFsc2U7XG4gICAgfVxuICAgIC8vQVBJXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRoaXMucGF1c2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmVzdW1lKHdyaXRlQ2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhdXNlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJzZXIgd2FzIGFscmVhZHkgcmVzdW1lZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XG4gICAgICAgIC8vIE5lY2Vzc2FyeSBmb3Igc3luY2hyb25vdXMgcmVzdW1lLlxuICAgICAgICBpZiAodGhpcy5pbkxvb3ApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX3J1blBhcnNpbmdMb29wKCk7XG4gICAgICAgIGlmICghdGhpcy5wYXVzZWQpIHtcbiAgICAgICAgICAgIHdyaXRlQ2FsbGJhY2sgPT09IG51bGwgfHwgd3JpdGVDYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogd3JpdGVDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdyaXRlKGNodW5rLCBpc0xhc3RDaHVuaywgd3JpdGVDYWxsYmFjaykge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMucHJlcHJvY2Vzc29yLndyaXRlKGNodW5rLCBpc0xhc3RDaHVuayk7XG4gICAgICAgIHRoaXMuX3J1blBhcnNpbmdMb29wKCk7XG4gICAgICAgIGlmICghdGhpcy5wYXVzZWQpIHtcbiAgICAgICAgICAgIHdyaXRlQ2FsbGJhY2sgPT09IG51bGwgfHwgd3JpdGVDYWxsYmFjayA9PT0gdm9pZCAwID8gdm9pZCAwIDogd3JpdGVDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluc2VydEh0bWxBdEN1cnJlbnRQb3MoY2h1bmspIHtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnByZXByb2Nlc3Nvci5pbnNlcnRIdG1sQXRDdXJyZW50UG9zKGNodW5rKTtcbiAgICAgICAgdGhpcy5fcnVuUGFyc2luZ0xvb3AoKTtcbiAgICB9XG4gICAgLy9IaWJlcm5hdGlvblxuICAgIF9lbnN1cmVIaWJlcm5hdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMucHJlcHJvY2Vzc29yLmVuZE9mQ2h1bmtIaXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VuY29uc3VtZSh0aGlzLmNvbnN1bWVkQWZ0ZXJTbmFwc2hvdCk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvL0NvbnN1bXB0aW9uXG4gICAgX2NvbnN1bWUoKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZWRBZnRlclNuYXBzaG90Kys7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXByb2Nlc3Nvci5hZHZhbmNlKCk7XG4gICAgfVxuICAgIF91bmNvbnN1bWUoY291bnQpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lZEFmdGVyU25hcHNob3QgLT0gY291bnQ7XG4gICAgICAgIHRoaXMucHJlcHJvY2Vzc29yLnJldHJlYXQoY291bnQpO1xuICAgIH1cbiAgICBfcmVjb25zdW1lSW5TdGF0ZShzdGF0ZSkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMuX3VuY29uc3VtZSgxKTtcbiAgICB9XG4gICAgX2FkdmFuY2VCeShjb3VudCkge1xuICAgICAgICB0aGlzLmNvbnN1bWVkQWZ0ZXJTbmFwc2hvdCArPSBjb3VudDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnByZXByb2Nlc3Nvci5hZHZhbmNlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2NvbnN1bWVTZXF1ZW5jZUlmTWF0Y2gocGF0dGVybiwgY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICBpZiAodGhpcy5wcmVwcm9jZXNzb3Iuc3RhcnRzV2l0aChwYXR0ZXJuLCBjYXNlU2Vuc2l0aXZlKSkge1xuICAgICAgICAgICAgLy8gV2Ugd2lsbCBhbHJlYWR5IGhhdmUgY29uc3VtZWQgb25lIGNoYXJhY3RlciBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC5cbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VCeShwYXR0ZXJuLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvL1Rva2VuIGNyZWF0aW9uXG4gICAgX2NyZWF0ZVN0YXJ0VGFnVG9rZW4oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuID0ge1xuICAgICAgICAgICAgdHlwZTogdG9rZW5fanNfMS5Ub2tlblR5cGUuU1RBUlRfVEFHLFxuICAgICAgICAgICAgdGFnTmFtZTogJycsXG4gICAgICAgICAgICB0YWdJRDogaHRtbF9qc18xLlRBR19JRC5VTktOT1dOLFxuICAgICAgICAgICAgc2VsZkNsb3Npbmc6IGZhbHNlLFxuICAgICAgICAgICAgYWNrU2VsZkNsb3Npbmc6IGZhbHNlLFxuICAgICAgICAgICAgYXR0cnM6IFtdLFxuICAgICAgICAgICAgbG9jYXRpb246IHRoaXMuZ2V0Q3VycmVudExvY2F0aW9uKDEpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBfY3JlYXRlRW5kVGFnVG9rZW4oKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuID0ge1xuICAgICAgICAgICAgdHlwZTogdG9rZW5fanNfMS5Ub2tlblR5cGUuRU5EX1RBRyxcbiAgICAgICAgICAgIHRhZ05hbWU6ICcnLFxuICAgICAgICAgICAgdGFnSUQ6IGh0bWxfanNfMS5UQUdfSUQuVU5LTk9XTixcbiAgICAgICAgICAgIHNlbGZDbG9zaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGFja1NlbGZDbG9zaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGF0dHJzOiBbXSxcbiAgICAgICAgICAgIGxvY2F0aW9uOiB0aGlzLmdldEN1cnJlbnRMb2NhdGlvbigyKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX2NyZWF0ZUNvbW1lbnRUb2tlbihvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW4gPSB7XG4gICAgICAgICAgICB0eXBlOiB0b2tlbl9qc18xLlRva2VuVHlwZS5DT01NRU5ULFxuICAgICAgICAgICAgZGF0YTogJycsXG4gICAgICAgICAgICBsb2NhdGlvbjogdGhpcy5nZXRDdXJyZW50TG9jYXRpb24ob2Zmc2V0KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX2NyZWF0ZURvY3R5cGVUb2tlbihpbml0aWFsTmFtZSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IHtcbiAgICAgICAgICAgIHR5cGU6IHRva2VuX2pzXzEuVG9rZW5UeXBlLkRPQ1RZUEUsXG4gICAgICAgICAgICBuYW1lOiBpbml0aWFsTmFtZSxcbiAgICAgICAgICAgIGZvcmNlUXVpcmtzOiBmYWxzZSxcbiAgICAgICAgICAgIHB1YmxpY0lkOiBudWxsLFxuICAgICAgICAgICAgc3lzdGVtSWQ6IG51bGwsXG4gICAgICAgICAgICBsb2NhdGlvbjogdGhpcy5jdXJyZW50TG9jYXRpb24sXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9jcmVhdGVDaGFyYWN0ZXJUb2tlbih0eXBlLCBjaGFycykge1xuICAgICAgICB0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbiA9IHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBjaGFycyxcbiAgICAgICAgICAgIGxvY2F0aW9uOiB0aGlzLmN1cnJlbnRMb2NhdGlvbixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy9UYWcgYXR0cmlidXRlc1xuICAgIF9jcmVhdGVBdHRyKGF0dHJOYW1lRmlyc3RDaCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRBdHRyID0ge1xuICAgICAgICAgICAgbmFtZTogYXR0ck5hbWVGaXJzdENoLFxuICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbiA9IHRoaXMuZ2V0Q3VycmVudExvY2F0aW9uKDApO1xuICAgIH1cbiAgICBfbGVhdmVBdHRyTmFtZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgX2I7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW47XG4gICAgICAgIGlmICgoMCwgdG9rZW5fanNfMS5nZXRUb2tlbkF0dHIpKHRva2VuLCB0aGlzLmN1cnJlbnRBdHRyLm5hbWUpID09PSBudWxsKSB7XG4gICAgICAgICAgICB0b2tlbi5hdHRycy5wdXNoKHRoaXMuY3VycmVudEF0dHIpO1xuICAgICAgICAgICAgaWYgKHRva2VuLmxvY2F0aW9uICYmIHRoaXMuY3VycmVudExvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ckxvY2F0aW9ucyA9ICgoX2EgPSAoX2IgPSB0b2tlbi5sb2NhdGlvbikuYXR0cnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IChfYi5hdHRycyA9IE9iamVjdC5jcmVhdGUobnVsbCkpKTtcbiAgICAgICAgICAgICAgICBhdHRyTG9jYXRpb25zW3RoaXMuY3VycmVudEF0dHIubmFtZV0gPSB0aGlzLmN1cnJlbnRMb2NhdGlvbjtcbiAgICAgICAgICAgICAgICAvLyBTZXQgZW5kIGxvY2F0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5fbGVhdmVBdHRyVmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5kdXBsaWNhdGVBdHRyaWJ1dGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9sZWF2ZUF0dHJWYWx1ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudExvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbi5lbmRMaW5lID0gdGhpcy5wcmVwcm9jZXNzb3IubGluZTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uLmVuZENvbCA9IHRoaXMucHJlcHJvY2Vzc29yLmNvbDtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uLmVuZE9mZnNldCA9IHRoaXMucHJlcHJvY2Vzc29yLm9mZnNldDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL1Rva2VuIGVtaXNzaW9uXG4gICAgcHJlcGFyZVRva2VuKGN0KSB7XG4gICAgICAgIHRoaXMuX2VtaXRDdXJyZW50Q2hhcmFjdGVyVG9rZW4oY3QubG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlbiA9IG51bGw7XG4gICAgICAgIGlmIChjdC5sb2NhdGlvbikge1xuICAgICAgICAgICAgY3QubG9jYXRpb24uZW5kTGluZSA9IHRoaXMucHJlcHJvY2Vzc29yLmxpbmU7XG4gICAgICAgICAgICBjdC5sb2NhdGlvbi5lbmRDb2wgPSB0aGlzLnByZXByb2Nlc3Nvci5jb2wgKyAxO1xuICAgICAgICAgICAgY3QubG9jYXRpb24uZW5kT2Zmc2V0ID0gdGhpcy5wcmVwcm9jZXNzb3Iub2Zmc2V0ICsgMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbiA9IHRoaXMuZ2V0Q3VycmVudExvY2F0aW9uKC0xKTtcbiAgICB9XG4gICAgZW1pdEN1cnJlbnRUYWdUb2tlbigpIHtcbiAgICAgICAgY29uc3QgY3QgPSB0aGlzLmN1cnJlbnRUb2tlbjtcbiAgICAgICAgdGhpcy5wcmVwYXJlVG9rZW4oY3QpO1xuICAgICAgICBjdC50YWdJRCA9ICgwLCBodG1sX2pzXzEuZ2V0VGFnSUQpKGN0LnRhZ05hbWUpO1xuICAgICAgICBpZiAoY3QudHlwZSA9PT0gdG9rZW5fanNfMS5Ub2tlblR5cGUuU1RBUlRfVEFHKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RTdGFydFRhZ05hbWUgPSBjdC50YWdOYW1lO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVyLm9uU3RhcnRUYWcoY3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN0LmF0dHJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuZW5kVGFnV2l0aEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0LnNlbGZDbG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVuZFRhZ1dpdGhUcmFpbGluZ1NvbGlkdXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyLm9uRW5kVGFnKGN0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXByb2Nlc3Nvci5kcm9wUGFyc2VkQ2h1bmsoKTtcbiAgICB9XG4gICAgZW1pdEN1cnJlbnRDb21tZW50KGN0KSB7XG4gICAgICAgIHRoaXMucHJlcGFyZVRva2VuKGN0KTtcbiAgICAgICAgdGhpcy5oYW5kbGVyLm9uQ29tbWVudChjdCk7XG4gICAgICAgIHRoaXMucHJlcHJvY2Vzc29yLmRyb3BQYXJzZWRDaHVuaygpO1xuICAgIH1cbiAgICBlbWl0Q3VycmVudERvY3R5cGUoY3QpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlVG9rZW4oY3QpO1xuICAgICAgICB0aGlzLmhhbmRsZXIub25Eb2N0eXBlKGN0KTtcbiAgICAgICAgdGhpcy5wcmVwcm9jZXNzb3IuZHJvcFBhcnNlZENodW5rKCk7XG4gICAgfVxuICAgIF9lbWl0Q3VycmVudENoYXJhY3RlclRva2VuKG5leHRMb2NhdGlvbikge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4pIHtcbiAgICAgICAgICAgIC8vTk9URTogaWYgd2UgaGF2ZSBhIHBlbmRpbmcgY2hhcmFjdGVyIHRva2VuLCBtYWtlIGl0J3MgZW5kIGxvY2F0aW9uIGVxdWFsIHRvIHRoZVxuICAgICAgICAgICAgLy9jdXJyZW50IHRva2VuJ3Mgc3RhcnQgbG9jYXRpb24uXG4gICAgICAgICAgICBpZiAobmV4dExvY2F0aW9uICYmIHRoaXMuY3VycmVudENoYXJhY3RlclRva2VuLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4ubG9jYXRpb24uZW5kTGluZSA9IG5leHRMb2NhdGlvbi5zdGFydExpbmU7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4ubG9jYXRpb24uZW5kQ29sID0gbmV4dExvY2F0aW9uLnN0YXJ0Q29sO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENoYXJhY3RlclRva2VuLmxvY2F0aW9uLmVuZE9mZnNldCA9IG5leHRMb2NhdGlvbi5zdGFydE9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fanNfMS5Ub2tlblR5cGUuQ0hBUkFDVEVSOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlci5vbkNoYXJhY3Rlcih0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2pzXzEuVG9rZW5UeXBlLk5VTExfQ0hBUkFDVEVSOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlci5vbk51bGxDaGFyYWN0ZXIodGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9qc18xLlRva2VuVHlwZS5XSElURVNQQUNFX0NIQVJBQ1RFUjoge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZXIub25XaGl0ZXNwYWNlQ2hhcmFjdGVyKHRoaXMuY3VycmVudENoYXJhY3RlclRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9lbWl0RU9GVG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5nZXRDdXJyZW50TG9jYXRpb24oMCk7XG4gICAgICAgIGlmIChsb2NhdGlvbikge1xuICAgICAgICAgICAgbG9jYXRpb24uZW5kTGluZSA9IGxvY2F0aW9uLnN0YXJ0TGluZTtcbiAgICAgICAgICAgIGxvY2F0aW9uLmVuZENvbCA9IGxvY2F0aW9uLnN0YXJ0Q29sO1xuICAgICAgICAgICAgbG9jYXRpb24uZW5kT2Zmc2V0ID0gbG9jYXRpb24uc3RhcnRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZW1pdEN1cnJlbnRDaGFyYWN0ZXJUb2tlbihsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuaGFuZGxlci5vbkVvZih7IHR5cGU6IHRva2VuX2pzXzEuVG9rZW5UeXBlLkVPRiwgbG9jYXRpb24gfSk7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIC8vQ2hhcmFjdGVycyBlbWlzc2lvblxuICAgIC8vT1BUSU1JWkFUSU9OOiBzcGVjaWZpY2F0aW9uIHVzZXMgb25seSBvbmUgdHlwZSBvZiBjaGFyYWN0ZXIgdG9rZW5zIChvbmUgdG9rZW4gcGVyIGNoYXJhY3RlcikuXG4gICAgLy9UaGlzIGNhdXNlcyBhIGh1Z2UgbWVtb3J5IG92ZXJoZWFkIGFuZCBhIGxvdCBvZiB1bm5lY2Vzc2FyeSBwYXJzZXIgbG9vcHMuIHBhcnNlNSB1c2VzIDMgZ3JvdXBzIG9mIGNoYXJhY3RlcnMuXG4gICAgLy9JZiB3ZSBoYXZlIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyB0aGF0IGJlbG9uZyB0byB0aGUgc2FtZSBncm91cCwgdGhlIHBhcnNlciBjYW4gcHJvY2VzcyBpdFxuICAgIC8vYXMgYSBzaW5nbGUgc29saWQgY2hhcmFjdGVyIHRva2VuLlxuICAgIC8vU28sIHRoZXJlIGFyZSAzIHR5cGVzIG9mIGNoYXJhY3RlciB0b2tlbnMgaW4gcGFyc2U1OlxuICAgIC8vMSlUb2tlblR5cGUuTlVMTF9DSEFSQUNURVIgLSBcXHUwMDAwLWNoYXJhY3RlciBzZXF1ZW5jZXMgKGUuZy4gJ1xcdTAwMDBcXHUwMDAwXFx1MDAwMCcpXG4gICAgLy8yKVRva2VuVHlwZS5XSElURVNQQUNFX0NIQVJBQ1RFUiAtIGFueSB3aGl0ZXNwYWNlL25ldy1saW5lIGNoYXJhY3RlciBzZXF1ZW5jZXMgKGUuZy4gJ1xcbiAgXFxyXFx0ICAgXFxmJylcbiAgICAvLzMpVG9rZW5UeXBlLkNIQVJBQ1RFUiAtIGFueSBjaGFyYWN0ZXIgc2VxdWVuY2Ugd2hpY2ggZG9uJ3QgYmVsb25nIHRvIGdyb3VwcyAxIGFuZCAyIChlLmcuICdhYmNkZWYxMjM0QEAjJCVeJylcbiAgICBfYXBwZW5kQ2hhclRvQ3VycmVudENoYXJhY3RlclRva2VuKHR5cGUsIGNoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDaGFyYWN0ZXJUb2tlbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENoYXJhY3RlclRva2VuLnR5cGUgIT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbiA9IHRoaXMuZ2V0Q3VycmVudExvY2F0aW9uKDApO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDdXJyZW50Q2hhcmFjdGVyVG9rZW4odGhpcy5jdXJyZW50TG9jYXRpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMucHJlcHJvY2Vzc29yLmRyb3BQYXJzZWRDaHVuaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2hhcmFjdGVyVG9rZW4uY2hhcnMgKz0gY2g7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NyZWF0ZUNoYXJhY3RlclRva2VuKHR5cGUsIGNoKTtcbiAgICB9XG4gICAgX2VtaXRDb2RlUG9pbnQoY3ApIHtcbiAgICAgICAgbGV0IHR5cGUgPSB0b2tlbl9qc18xLlRva2VuVHlwZS5DSEFSQUNURVI7XG4gICAgICAgIGlmIChpc1doaXRlc3BhY2UoY3ApKSB7XG4gICAgICAgICAgICB0eXBlID0gdG9rZW5fanNfMS5Ub2tlblR5cGUuV0hJVEVTUEFDRV9DSEFSQUNURVI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3AgPT09IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVUxMKSB7XG4gICAgICAgICAgICB0eXBlID0gdG9rZW5fanNfMS5Ub2tlblR5cGUuTlVMTF9DSEFSQUNURVI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYXBwZW5kQ2hhclRvQ3VycmVudENoYXJhY3RlclRva2VuKHR5cGUsIFN0cmluZy5mcm9tQ29kZVBvaW50KGNwKSk7XG4gICAgfVxuICAgIC8vTk9URTogdXNlZCB3aGVuIHdlIGVtaXQgY2hhcmFjdGVycyBleHBsaWNpdGx5LlxuICAgIC8vVGhpcyBpcyBhbHdheXMgZm9yIG5vbi13aGl0ZXNwYWNlIGFuZCBub24tbnVsbCBjaGFyYWN0ZXJzLCB3aGljaCBhbGxvd3MgdXMgdG8gYXZvaWQgYWRkaXRpb25hbCBjaGVja3MuXG4gICAgX2VtaXRDaGFycyhjaCkge1xuICAgICAgICB0aGlzLl9hcHBlbmRDaGFyVG9DdXJyZW50Q2hhcmFjdGVyVG9rZW4odG9rZW5fanNfMS5Ub2tlblR5cGUuQ0hBUkFDVEVSLCBjaCk7XG4gICAgfVxuICAgIC8vIENoYXJhY3RlciByZWZlcmVuY2UgaGVscGVyc1xuICAgIF9tYXRjaE5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlKGNwKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBsZXQgZXhjZXNzID0gMDtcbiAgICAgICAgbGV0IHdpdGhvdXRTZW1pY29sb24gPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGN1cnJlbnQgPSBkZWNvZGVfanNfMS5odG1sRGVjb2RlVHJlZVswXTsgaSA+PSAwOyBjcCA9IHRoaXMuX2NvbnN1bWUoKSkge1xuICAgICAgICAgICAgaSA9ICgwLCBkZWNvZGVfanNfMS5kZXRlcm1pbmVCcmFuY2gpKGRlY29kZV9qc18xLmh0bWxEZWNvZGVUcmVlLCBjdXJyZW50LCBpICsgMSwgY3ApO1xuICAgICAgICAgICAgaWYgKGkgPCAwKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZXhjZXNzICs9IDE7XG4gICAgICAgICAgICBjdXJyZW50ID0gZGVjb2RlX2pzXzEuaHRtbERlY29kZVRyZWVbaV07XG4gICAgICAgICAgICBjb25zdCBtYXNrZWQgPSBjdXJyZW50ICYgZGVjb2RlX2pzXzEuQmluVHJpZUZsYWdzLlZBTFVFX0xFTkdUSDtcbiAgICAgICAgICAgIC8vIElmIHRoZSBicmFuY2ggaXMgYSB2YWx1ZSwgc3RvcmUgaXQgYW5kIGNvbnRpbnVlXG4gICAgICAgICAgICBpZiAobWFza2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG1hc2sgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiB0aGUgdmFsdWUsIGluY2x1ZGluZyB0aGUgY3VycmVudCBieXRlLlxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlTGVuZ3RoID0gKG1hc2tlZCA+PiAxNCkgLSAxO1xuICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSB2YWx1ZXMgdGhhdCBhcmVuJ3QgdGVybWluYXRlZCBwcm9wZXJseSBhcmVuJ3QgcGFyc2VkLCBhbmQgc2hvdWxkbid0IGxlYWQgdG8gYSBwYXJzZXIgZXJyb3IuXG4gICAgICAgICAgICAgICAgLy8gU2VlIHRoZSBleGFtcGxlIGluIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3BhcnNpbmcuaHRtbCNuYW1lZC1jaGFyYWN0ZXItcmVmZXJlbmNlLXN0YXRlXG4gICAgICAgICAgICAgICAgaWYgKGNwICE9PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU0VNSUNPTE9OICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQ2hhcmFjdGVyUmVmZXJlbmNlSW5BdHRyaWJ1dGUoKSAmJlxuICAgICAgICAgICAgICAgICAgICBpc0VudGl0eUluQXR0cmlidXRlSW52YWxpZEVuZCh0aGlzLnByZXByb2Nlc3Nvci5wZWVrKDEpKSkge1xuICAgICAgICAgICAgICAgICAgICAvL05PVEU6IHdlIGRvbid0IGZsdXNoIGFsbCBjb25zdW1lZCBjb2RlIHBvaW50cyBoZXJlLCBhbmQgaW5zdGVhZCBzd2l0Y2ggYmFjayB0byB0aGUgb3JpZ2luYWwgc3RhdGUgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgLy9lbWl0dGluZyBhbiBhbXBlcnNhbmQuIFRoaXMgaXMgZmluZSwgYXMgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgd29uJ3QgYmUgcGFyc2VkIGRpZmZlcmVudGx5IGluIGF0dHJpYnV0ZXMuXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFt1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuQU1QRVJTQU5EXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBvdmVyIHRoZSB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgaSArPSB2YWx1ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdXJyb2dhdGUgcGFpciwgY29uc3VtZSB0aGUgbmV4dCB0d28gYnl0ZXMuXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gW2RlY29kZV9qc18xLmh0bWxEZWNvZGVUcmVlW2ldICYgfmRlY29kZV9qc18xLkJpblRyaWVGbGFncy5WQUxVRV9MRU5HVEhdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZUxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFtkZWNvZGVfanNfMS5odG1sRGVjb2RlVHJlZVsrK2ldXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtkZWNvZGVfanNfMS5odG1sRGVjb2RlVHJlZVsrK2ldLCBkZWNvZGVfanNfMS5odG1sRGVjb2RlVHJlZVsrK2ldXTtcbiAgICAgICAgICAgICAgICAgICAgZXhjZXNzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgd2l0aG91dFNlbWljb2xvbiA9IGNwICE9PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU0VNSUNPTE9OO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFsdWVMZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIHplcm8tbGVuZ3RoLCB3ZSdyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91bmNvbnN1bWUoZXhjZXNzKTtcbiAgICAgICAgaWYgKHdpdGhvdXRTZW1pY29sb24gJiYgIXRoaXMucHJlcHJvY2Vzc29yLmVuZE9mQ2h1bmtIaXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNzaW5nU2VtaWNvbG9uQWZ0ZXJDaGFyYWN0ZXJSZWZlcmVuY2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gZW1pdCB0aGUgZXJyb3IgYWJvdmUgb24gdGhlIGNvZGUgcG9pbnQgYWZ0ZXIgdGhlIGVudGl0eS5cbiAgICAgICAgLy8gV2UgYWx3YXlzIGNvbnN1bWUgb25lIGNvZGUgcG9pbnQgdG9vIG1hbnkgaW4gdGhlIGxvb3AsIGFuZCB3ZSB3YWl0IHRvXG4gICAgICAgIC8vIHVuY29uc3VtZSBpdCB1bnRpbCBhZnRlciB0aGUgZXJyb3IgaXMgZW1pdHRlZC5cbiAgICAgICAgdGhpcy5fdW5jb25zdW1lKDEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBfaXNDaGFyYWN0ZXJSZWZlcmVuY2VJbkF0dHJpYnV0ZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnJldHVyblN0YXRlID09PSBTdGF0ZS5BVFRSSUJVVEVfVkFMVUVfRE9VQkxFX1FVT1RFRCB8fFxuICAgICAgICAgICAgdGhpcy5yZXR1cm5TdGF0ZSA9PT0gU3RhdGUuQVRUUklCVVRFX1ZBTFVFX1NJTkdMRV9RVU9URUQgfHxcbiAgICAgICAgICAgIHRoaXMucmV0dXJuU3RhdGUgPT09IFN0YXRlLkFUVFJJQlVURV9WQUxVRV9VTlFVT1RFRCk7XG4gICAgfVxuICAgIF9mbHVzaENvZGVQb2ludENvbnN1bWVkQXNDaGFyYWN0ZXJSZWZlcmVuY2UoY3ApIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ2hhcmFjdGVyUmVmZXJlbmNlSW5BdHRyaWJ1dGUoKSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0ci52YWx1ZSArPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDYWxsaW5nIHN0YXRlcyB0aGlzIHdheSB0dXJucyBvdXQgdG8gYmUgbXVjaCBmYXN0ZXIgdGhhbiBhbnkgb3RoZXIgYXBwcm9hY2guXG4gICAgX2NhbGxTdGF0ZShjcCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgU3RhdGUuREFUQToge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlRGF0YShjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLlJDREFUQToge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlUmNkYXRhKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuUkFXVEVYVDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlUmF3dGV4dChjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLlNDUklQVF9EQVRBOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVTY3JpcHREYXRhKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuUExBSU5URVhUOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVQbGFpbnRleHQoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5UQUdfT1BFTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlVGFnT3BlbihjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkVORF9UQUdfT1BFTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlRW5kVGFnT3BlbihjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLlRBR19OQU1FOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVUYWdOYW1lKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuUkNEQVRBX0xFU1NfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVSY2RhdGFMZXNzVGhhblNpZ24oY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5SQ0RBVEFfRU5EX1RBR19PUEVOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVSY2RhdGFFbmRUYWdPcGVuKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuUkNEQVRBX0VORF9UQUdfTkFNRToge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlUmNkYXRhRW5kVGFnTmFtZShjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLlJBV1RFWFRfTEVTU19USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZVJhd3RleHRMZXNzVGhhblNpZ24oY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5SQVdURVhUX0VORF9UQUdfT1BFTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlUmF3dGV4dEVuZFRhZ09wZW4oY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5SQVdURVhUX0VORF9UQUdfTkFNRToge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlUmF3dGV4dEVuZFRhZ05hbWUoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5TQ1JJUFRfREFUQV9MRVNTX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlU2NyaXB0RGF0YUxlc3NUaGFuU2lnbihjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLlNDUklQVF9EQVRBX0VORF9UQUdfT1BFTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlU2NyaXB0RGF0YUVuZFRhZ09wZW4oY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5TQ1JJUFRfREFUQV9FTkRfVEFHX05BTUU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZVNjcmlwdERhdGFFbmRUYWdOYW1lKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuU0NSSVBUX0RBVEFfRVNDQVBFX1NUQVJUOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVTY3JpcHREYXRhRXNjYXBlU3RhcnQoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5TQ1JJUFRfREFUQV9FU0NBUEVfU1RBUlRfREFTSDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlU2NyaXB0RGF0YUVzY2FwZVN0YXJ0RGFzaChjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLlNDUklQVF9EQVRBX0VTQ0FQRUQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZVNjcmlwdERhdGFFc2NhcGVkKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuU0NSSVBUX0RBVEFfRVNDQVBFRF9EQVNIOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVTY3JpcHREYXRhRXNjYXBlZERhc2goY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5TQ1JJUFRfREFUQV9FU0NBUEVEX0RBU0hfREFTSDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlU2NyaXB0RGF0YUVzY2FwZWREYXNoRGFzaChjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLlNDUklQVF9EQVRBX0VTQ0FQRURfTEVTU19USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZVNjcmlwdERhdGFFc2NhcGVkTGVzc1RoYW5TaWduKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuU0NSSVBUX0RBVEFfRVNDQVBFRF9FTkRfVEFHX09QRU46IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZVNjcmlwdERhdGFFc2NhcGVkRW5kVGFnT3BlbihjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLlNDUklQVF9EQVRBX0VTQ0FQRURfRU5EX1RBR19OQU1FOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVTY3JpcHREYXRhRXNjYXBlZEVuZFRhZ05hbWUoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5TQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFX1NUQVJUOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVTY3JpcHREYXRhRG91YmxlRXNjYXBlU3RhcnQoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5TQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlU2NyaXB0RGF0YURvdWJsZUVzY2FwZWQoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5TQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9EQVNIOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVTY3JpcHREYXRhRG91YmxlRXNjYXBlZERhc2goY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5TQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9EQVNIX0RBU0g6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZVNjcmlwdERhdGFEb3VibGVFc2NhcGVkRGFzaERhc2goY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5TQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9MRVNTX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlU2NyaXB0RGF0YURvdWJsZUVzY2FwZWRMZXNzVGhhblNpZ24oY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5TQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFX0VORDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlU2NyaXB0RGF0YURvdWJsZUVzY2FwZUVuZChjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkJFRk9SRV9BVFRSSUJVVEVfTkFNRToge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQmVmb3JlQXR0cmlidXRlTmFtZShjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkFUVFJJQlVURV9OQU1FOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVBdHRyaWJ1dGVOYW1lKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQUZURVJfQVRUUklCVVRFX05BTUU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUFmdGVyQXR0cmlidXRlTmFtZShjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkJFRk9SRV9BVFRSSUJVVEVfVkFMVUU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUJlZm9yZUF0dHJpYnV0ZVZhbHVlKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQVRUUklCVVRFX1ZBTFVFX0RPVUJMRV9RVU9URUQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUF0dHJpYnV0ZVZhbHVlRG91YmxlUXVvdGVkKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQVRUUklCVVRFX1ZBTFVFX1NJTkdMRV9RVU9URUQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUF0dHJpYnV0ZVZhbHVlU2luZ2xlUXVvdGVkKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQVRUUklCVVRFX1ZBTFVFX1VOUVVPVEVEOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQUZURVJfQVRUUklCVVRFX1ZBTFVFX1FVT1RFRDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQWZ0ZXJBdHRyaWJ1dGVWYWx1ZVF1b3RlZChjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLlNFTEZfQ0xPU0lOR19TVEFSVF9UQUc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZVNlbGZDbG9zaW5nU3RhcnRUYWcoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5CT0dVU19DT01NRU5UOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVCb2d1c0NvbW1lbnQoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5NQVJLVVBfREVDTEFSQVRJT05fT1BFTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlTWFya3VwRGVjbGFyYXRpb25PcGVuKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQ09NTUVOVF9TVEFSVDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQ29tbWVudFN0YXJ0KGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQ09NTUVOVF9TVEFSVF9EQVNIOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVDb21tZW50U3RhcnREYXNoKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQ09NTUVOVDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQ29tbWVudChjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkNPTU1FTlRfTEVTU19USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUNvbW1lbnRMZXNzVGhhblNpZ24oY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5DT01NRU5UX0xFU1NfVEhBTl9TSUdOX0JBTkc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUNvbW1lbnRMZXNzVGhhblNpZ25CYW5nKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQ09NTUVOVF9MRVNTX1RIQU5fU0lHTl9CQU5HX0RBU0g6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUNvbW1lbnRMZXNzVGhhblNpZ25CYW5nRGFzaChjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkNPTU1FTlRfTEVTU19USEFOX1NJR05fQkFOR19EQVNIX0RBU0g6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUNvbW1lbnRMZXNzVGhhblNpZ25CYW5nRGFzaERhc2goY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5DT01NRU5UX0VORF9EQVNIOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVDb21tZW50RW5kRGFzaChjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkNPTU1FTlRfRU5EOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVDb21tZW50RW5kKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQ09NTUVOVF9FTkRfQkFORzoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQ29tbWVudEVuZEJhbmcoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5ET0NUWVBFOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVEb2N0eXBlKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQkVGT1JFX0RPQ1RZUEVfTkFNRToge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQmVmb3JlRG9jdHlwZU5hbWUoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5ET0NUWVBFX05BTUU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZURvY3R5cGVOYW1lKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQUZURVJfRE9DVFlQRV9OQU1FOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVBZnRlckRvY3R5cGVOYW1lKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQUZURVJfRE9DVFlQRV9QVUJMSUNfS0VZV09SRDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQWZ0ZXJEb2N0eXBlUHVibGljS2V5d29yZChjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkJFRk9SRV9ET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVCZWZvcmVEb2N0eXBlUHVibGljSWRlbnRpZmllcihjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkRPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfRE9VQkxFX1FVT1RFRDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJEb3VibGVRdW90ZWQoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5ET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX1NJTkdMRV9RVU9URUQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZURvY3R5cGVQdWJsaWNJZGVudGlmaWVyU2luZ2xlUXVvdGVkKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQUZURVJfRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQWZ0ZXJEb2N0eXBlUHVibGljSWRlbnRpZmllcihjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkJFVFdFRU5fRE9DVFlQRV9QVUJMSUNfQU5EX1NZU1RFTV9JREVOVElGSUVSUzoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQmV0d2VlbkRvY3R5cGVQdWJsaWNBbmRTeXN0ZW1JZGVudGlmaWVycyhjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkFGVEVSX0RPQ1RZUEVfU1lTVEVNX0tFWVdPUkQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUFmdGVyRG9jdHlwZVN5c3RlbUtleXdvcmQoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5CRUZPUkVfRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQmVmb3JlRG9jdHlwZVN5c3RlbUlkZW50aWZpZXIoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX0RPVUJMRV9RVU9URUQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyRG91YmxlUXVvdGVkKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TSU5HTEVfUVVPVEVEOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVEb2N0eXBlU3lzdGVtSWRlbnRpZmllclNpbmdsZVF1b3RlZChjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkFGVEVSX0RPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVI6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUFmdGVyRG9jdHlwZVN5c3RlbUlkZW50aWZpZXIoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5CT0dVU19ET0NUWVBFOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVCb2d1c0RvY3R5cGUoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5DREFUQV9TRUNUSU9OOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVDZGF0YVNlY3Rpb24oY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5DREFUQV9TRUNUSU9OX0JSQUNLRVQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUNkYXRhU2VjdGlvbkJyYWNrZXQoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5DREFUQV9TRUNUSU9OX0VORDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQ2RhdGFTZWN0aW9uRW5kKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuQ0hBUkFDVEVSX1JFRkVSRU5DRToge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQ2hhcmFjdGVyUmVmZXJlbmNlKGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuTkFNRURfQ0hBUkFDVEVSX1JFRkVSRU5DRToge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2UoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5BTUJJR1VPVVNfQU1QRVJTQU5EOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVBbWJpZ3VvdXNBbXBlcnNhbmQoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5OVU1FUklDX0NIQVJBQ1RFUl9SRUZFUkVOQ0U6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZU51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2UoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5IRVhBREVNSUNBTF9DSEFSQUNURVJfUkVGRVJFTkNFX1NUQVJUOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVIZXhhZGVtaWNhbENoYXJhY3RlclJlZmVyZW5jZVN0YXJ0KGNwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU3RhdGUuREVDSU1BTF9DSEFSQUNURVJfUkVGRVJFTkNFX1NUQVJUOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVEZWNpbWFsQ2hhcmFjdGVyUmVmZXJlbmNlU3RhcnQoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTdGF0ZS5IRVhBREVNSUNBTF9DSEFSQUNURVJfUkVGRVJFTkNFOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVIZXhhZGVtaWNhbENoYXJhY3RlclJlZmVyZW5jZShjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLkRFQ0lNQUxfQ0hBUkFDVEVSX1JFRkVSRU5DRToge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlRGVjaW1hbENoYXJhY3RlclJlZmVyZW5jZShjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFN0YXRlLk5VTUVSSUNfQ0hBUkFDVEVSX1JFRkVSRU5DRV9FTkQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZU51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2VFbmQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gc3RhdGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTdGF0ZSBtYWNoaW5lXG4gICAgLy8gRGF0YSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlRGF0YShjcCkge1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MRVNTX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5UQUdfT1BFTjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkFNUEVSU0FORDoge1xuICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuU3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5DSEFSQUNURVJfUkVGRVJFTkNFO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTlVMTDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FT0Y6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyAgUkNEQVRBIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVSY2RhdGEoY3ApIHtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuQU1QRVJTQU5EOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXR1cm5TdGF0ZSA9IFN0YXRlLlJDREFUQTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQ0hBUkFDVEVSX1JFRkVSRU5DRTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxFU1NfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlJDREFUQV9MRVNTX1RIQU5fU0lHTjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLk5VTEw6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycyh1bmljb2RlX2pzXzEuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFJBV1RFWFQgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZVJhd3RleHQoY3ApIHtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTEVTU19USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuUkFXVEVYVF9MRVNTX1RIQU5fU0lHTjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLk5VTEw6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycyh1bmljb2RlX2pzXzEuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNjcmlwdCBkYXRhIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVTY3JpcHREYXRhKGNwKSB7XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxFU1NfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0xFU1NfVEhBTl9TSUdOO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTlVMTDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKHVuaWNvZGVfanNfMS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUExBSU5URVhUIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVQbGFpbnRleHQoY3ApIHtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTlVMTDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKHVuaWNvZGVfanNfMS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGFnIG9wZW4gc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZVRhZ09wZW4oY3ApIHtcbiAgICAgICAgaWYgKGlzQXNjaWlMZXR0ZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVTdGFydFRhZ1Rva2VuKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuVEFHX05BTUU7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZVRhZ05hbWUoY3ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FWENMQU1BVElPTl9NQVJLOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5NQVJLVVBfREVDTEFSQVRJT05fT1BFTjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlNPTElEVVM6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkVORF9UQUdfT1BFTjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlFVRVNUSU9OX01BUks6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLnVuZXhwZWN0ZWRRdWVzdGlvbk1hcmtJbnN0ZWFkT2ZUYWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlQ29tbWVudFRva2VuKDEpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQk9HVVNfQ09NTUVOVDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVCb2d1c0NvbW1lbnQoY3ApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5lb2ZCZWZvcmVUYWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuaW52YWxpZEZpcnN0Q2hhcmFjdGVyT2ZUYWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZURhdGEoY3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgLy8gRW5kIHRhZyBvcGVuIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVFbmRUYWdPcGVuKGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpTGV0dGVyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlRW5kVGFnVG9rZW4oKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5UQUdfTkFNRTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlVGFnTmFtZShjcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNzaW5nRW5kVGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5lb2ZCZWZvcmVUYWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8LycpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmludmFsaWRGaXJzdENoYXJhY3Rlck9mVGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUNvbW1lbnRUb2tlbigyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkJPR1VTX0NPTU1FTlQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQm9ndXNDb21tZW50KGNwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRhZyBuYW1lIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVUYWdOYW1lKGNwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW47XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlNQQUNFOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTElORV9GRUVEOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuVEFCVUxBVElPTjpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkZPUk1fRkVFRDoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5CRUZPUkVfQVRUUklCVVRFX05BTUU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5TT0xJRFVTOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNFTEZfQ0xPU0lOR19TVEFSVF9UQUc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnRUYWdUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTlVMTDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgdG9rZW4udGFnTmFtZSArPSB1bmljb2RlX2pzXzEuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluVGFnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0b2tlbi50YWdOYW1lICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGlzQXNjaWlVcHBlcihjcCkgPyB0b0FzY2lpTG93ZXIoY3ApIDogY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFJDREFUQSBsZXNzLXRoYW4gc2lnbiBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlUmNkYXRhTGVzc1RoYW5TaWduKGNwKSB7XG4gICAgICAgIGlmIChjcCA9PT0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlNPTElEVVMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5SQ0RBVEFfRU5EX1RBR19PUEVOO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8Jyk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuUkNEQVRBO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGVSY2RhdGEoY3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFJDREFUQSBlbmQgdGFnIG9wZW4gc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZVJjZGF0YUVuZFRhZ09wZW4oY3ApIHtcbiAgICAgICAgaWYgKGlzQXNjaWlMZXR0ZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuUkNEQVRBX0VORF9UQUdfTkFNRTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlUmNkYXRhRW5kVGFnTmFtZShjcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwvJyk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuUkNEQVRBO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGVSY2RhdGEoY3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZVNwZWNpYWxFbmRUYWcoX2NwKSB7XG4gICAgICAgIGlmICghdGhpcy5wcmVwcm9jZXNzb3Iuc3RhcnRzV2l0aCh0aGlzLmxhc3RTdGFydFRhZ05hbWUsIGZhbHNlKSkge1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzLl9lbnN1cmVIaWJlcm5hdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NyZWF0ZUVuZFRhZ1Rva2VuKCk7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW47XG4gICAgICAgIHRva2VuLnRhZ05hbWUgPSB0aGlzLmxhc3RTdGFydFRhZ05hbWU7XG4gICAgICAgIGNvbnN0IGNwID0gdGhpcy5wcmVwcm9jZXNzb3IucGVlayh0aGlzLmxhc3RTdGFydFRhZ05hbWUubGVuZ3RoKTtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU1BBQ0U6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MSU5FX0ZFRUQ6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5UQUJVTEFUSU9OOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRk9STV9GRUVEOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZUJ5KHRoaXMubGFzdFN0YXJ0VGFnTmFtZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5CRUZPUkVfQVRUUklCVVRFX05BTUU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU09MSURVUzoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VCeSh0aGlzLmxhc3RTdGFydFRhZ05hbWUubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0VMRl9DTE9TSU5HX1NUQVJUX1RBRztcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VCeSh0aGlzLmxhc3RTdGFydFRhZ05hbWUubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50VGFnVG9rZW4oKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuREFUQTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLl9lbnN1cmVIaWJlcm5hdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFJDREFUQSBlbmQgdGFnIG5hbWUgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZVJjZGF0YUVuZFRhZ05hbWUoY3ApIHtcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlU3BlY2lhbEVuZFRhZyhjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPC8nKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5SQ0RBVEE7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZVJjZGF0YShjcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUkFXVEVYVCBsZXNzLXRoYW4gc2lnbiBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlUmF3dGV4dExlc3NUaGFuU2lnbihjcCkge1xuICAgICAgICBpZiAoY3AgPT09IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5TT0xJRFVTKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuUkFXVEVYVF9FTkRfVEFHX09QRU47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwnKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5SQVdURVhUO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGVSYXd0ZXh0KGNwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBSQVdURVhUIGVuZCB0YWcgb3BlbiBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlUmF3dGV4dEVuZFRhZ09wZW4oY3ApIHtcbiAgICAgICAgaWYgKGlzQXNjaWlMZXR0ZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuUkFXVEVYVF9FTkRfVEFHX05BTUU7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZVJhd3RleHRFbmRUYWdOYW1lKGNwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPC8nKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5SQVdURVhUO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGVSYXd0ZXh0KGNwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBSQVdURVhUIGVuZCB0YWcgbmFtZSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlUmF3dGV4dEVuZFRhZ05hbWUoY3ApIHtcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlU3BlY2lhbEVuZFRhZyhjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPC8nKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5SQVdURVhUO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGVSYXd0ZXh0KGNwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTY3JpcHQgZGF0YSBsZXNzLXRoYW4gc2lnbiBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlU2NyaXB0RGF0YUxlc3NUaGFuU2lnbihjcCkge1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5TT0xJRFVTOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0VORF9UQUdfT1BFTjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVYQ0xBTUFUSU9OX01BUks6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEFfRVNDQVBFX1NUQVJUO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPCEnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEE7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVTY3JpcHREYXRhKGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTY3JpcHQgZGF0YSBlbmQgdGFnIG9wZW4gc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZVNjcmlwdERhdGFFbmRUYWdPcGVuKGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpTGV0dGVyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0VORF9UQUdfTkFNRTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlU2NyaXB0RGF0YUVuZFRhZ05hbWUoY3ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8LycpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGVTY3JpcHREYXRhKGNwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTY3JpcHQgZGF0YSBlbmQgdGFnIG5hbWUgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZVNjcmlwdERhdGFFbmRUYWdOYW1lKGNwKSB7XG4gICAgICAgIGlmICh0aGlzLmhhbmRsZVNwZWNpYWxFbmRUYWcoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwvJyk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEE7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZVNjcmlwdERhdGEoY3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNjcmlwdCBkYXRhIGVzY2FwZSBzdGFydCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlU2NyaXB0RGF0YUVzY2FwZVN0YXJ0KGNwKSB7XG4gICAgICAgIGlmIChjcCA9PT0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkhZUEhFTl9NSU5VUykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0VTQ0FQRV9TVEFSVF9EQVNIO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCctJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEE7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZVNjcmlwdERhdGEoY3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNjcmlwdCBkYXRhIGVzY2FwZSBzdGFydCBkYXNoIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVTY3JpcHREYXRhRXNjYXBlU3RhcnREYXNoKGNwKSB7XG4gICAgICAgIGlmIChjcCA9PT0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkhZUEhFTl9NSU5VUykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0VTQ0FQRURfREFTSF9EQVNIO1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCctJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEE7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZVNjcmlwdERhdGEoY3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNjcmlwdCBkYXRhIGVzY2FwZWQgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZVNjcmlwdERhdGFFc2NhcGVkKGNwKSB7XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkhZUEhFTl9NSU5VUzoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5TQ1JJUFRfREFUQV9FU0NBUEVEX0RBU0g7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCctJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MRVNTX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5TQ1JJUFRfREFUQV9FU0NBUEVEX0xFU1NfVEhBTl9TSUdOO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTlVMTDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKHVuaWNvZGVfanNfMS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluU2NyaXB0SHRtbENvbW1lbnRMaWtlVGV4dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2NyaXB0IGRhdGEgZXNjYXBlZCBkYXNoIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVTY3JpcHREYXRhRXNjYXBlZERhc2goY3ApIHtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuSFlQSEVOX01JTlVTOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0VTQ0FQRURfREFTSF9EQVNIO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnLScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTEVTU19USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEFfRVNDQVBFRF9MRVNTX1RIQU5fU0lHTjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLk5VTEw6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5TQ1JJUFRfREFUQV9FU0NBUEVEO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycyh1bmljb2RlX2pzXzEuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5lb2ZJblNjcmlwdEh0bWxDb21tZW50TGlrZVRleHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5TQ1JJUFRfREFUQV9FU0NBUEVEO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNjcmlwdCBkYXRhIGVzY2FwZWQgZGFzaCBkYXNoIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVTY3JpcHREYXRhRXNjYXBlZERhc2hEYXNoKGNwKSB7XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkhZUEhFTl9NSU5VUzoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnLScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTEVTU19USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEFfRVNDQVBFRF9MRVNTX1RIQU5fU0lHTjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTlVMTDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0VTQ0FQRUQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKHVuaWNvZGVfanNfMS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluU2NyaXB0SHRtbENvbW1lbnRMaWtlVGV4dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0VTQ0FQRUQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENvZGVQb2ludChjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2NyaXB0IGRhdGEgZXNjYXBlZCBsZXNzLXRoYW4gc2lnbiBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlU2NyaXB0RGF0YUVzY2FwZWRMZXNzVGhhblNpZ24oY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU09MSURVUykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0VTQ0FQRURfRU5EX1RBR19PUEVOO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXNjaWlMZXR0ZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwnKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5TQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFX1NUQVJUO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGVTY3JpcHREYXRhRG91YmxlRXNjYXBlU3RhcnQoY3ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8Jyk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEFfRVNDQVBFRDtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlU2NyaXB0RGF0YUVzY2FwZWQoY3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNjcmlwdCBkYXRhIGVzY2FwZWQgZW5kIHRhZyBvcGVuIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVTY3JpcHREYXRhRXNjYXBlZEVuZFRhZ09wZW4oY3ApIHtcbiAgICAgICAgaWYgKGlzQXNjaWlMZXR0ZXIoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEFfRVNDQVBFRF9FTkRfVEFHX05BTUU7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZVNjcmlwdERhdGFFc2NhcGVkRW5kVGFnTmFtZShjcCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwvJyk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEFfRVNDQVBFRDtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlU2NyaXB0RGF0YUVzY2FwZWQoY3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNjcmlwdCBkYXRhIGVzY2FwZWQgZW5kIHRhZyBuYW1lIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVTY3JpcHREYXRhRXNjYXBlZEVuZFRhZ05hbWUoY3ApIHtcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlU3BlY2lhbEVuZFRhZyhjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPC8nKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5TQ1JJUFRfREFUQV9FU0NBUEVEO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGVTY3JpcHREYXRhRXNjYXBlZChjcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2NyaXB0IGRhdGEgZG91YmxlIGVzY2FwZSBzdGFydCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlU2NyaXB0RGF0YURvdWJsZUVzY2FwZVN0YXJ0KGNwKSB7XG4gICAgICAgIGlmICh0aGlzLnByZXByb2Nlc3Nvci5zdGFydHNXaXRoKHVuaWNvZGVfanNfMS5TRVFVRU5DRVMuU0NSSVBULCBmYWxzZSkgJiZcbiAgICAgICAgICAgIGlzU2NyaXB0RGF0YURvdWJsZUVzY2FwZVNlcXVlbmNlRW5kKHRoaXMucHJlcHJvY2Vzc29yLnBlZWsodW5pY29kZV9qc18xLlNFUVVFTkNFUy5TQ1JJUFQubGVuZ3RoKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bmljb2RlX2pzXzEuU0VRVUVOQ0VTLlNDUklQVC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQodGhpcy5fY29uc3VtZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5TQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGhpcy5fZW5zdXJlSGliZXJuYXRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0VTQ0FQRUQ7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZVNjcmlwdERhdGFFc2NhcGVkKGNwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTY3JpcHQgZGF0YSBkb3VibGUgZXNjYXBlZCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlU2NyaXB0RGF0YURvdWJsZUVzY2FwZWQoY3ApIHtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuSFlQSEVOX01JTlVTOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0RBU0g7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCctJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MRVNTX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5TQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRF9MRVNTX1RIQU5fU0lHTjtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJzwnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLk5VTEw6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycyh1bmljb2RlX2pzXzEuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5lb2ZJblNjcmlwdEh0bWxDb21tZW50TGlrZVRleHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNjcmlwdCBkYXRhIGRvdWJsZSBlc2NhcGVkIGRhc2ggc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZVNjcmlwdERhdGFEb3VibGVFc2NhcGVkRGFzaChjcCkge1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5IWVBIRU5fTUlOVVM6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfREFTSF9EQVNIO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnLScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTEVTU19USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRURfTEVTU19USEFOX1NJR047XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc8Jyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVUxMOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRUQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKHVuaWNvZGVfanNfMS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluU2NyaXB0SHRtbENvbW1lbnRMaWtlVGV4dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNjcmlwdCBkYXRhIGRvdWJsZSBlc2NhcGVkIGRhc2ggZGFzaCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlU2NyaXB0RGF0YURvdWJsZUVzY2FwZWREYXNoRGFzaChjcCkge1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5IWVBIRU5fTUlOVVM6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJy0nKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxFU1NfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEX0xFU1NfVEhBTl9TSUdOO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnPCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuR1JFQVRFUl9USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEE7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKCc+Jyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVUxMOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRUQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYXJzKHVuaWNvZGVfanNfMS5SRVBMQUNFTUVOVF9DSEFSQUNURVIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluU2NyaXB0SHRtbENvbW1lbnRMaWtlVGV4dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNDUklQVF9EQVRBX0RPVUJMRV9FU0NBUEVEO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNjcmlwdCBkYXRhIGRvdWJsZSBlc2NhcGVkIGxlc3MtdGhhbiBzaWduIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVTY3JpcHREYXRhRG91YmxlRXNjYXBlZExlc3NUaGFuU2lnbihjcCkge1xuICAgICAgICBpZiAoY3AgPT09IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5TT0xJRFVTKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRV9FTkQ7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJy8nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5TQ1JJUFRfREFUQV9ET1VCTEVfRVNDQVBFRDtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlU2NyaXB0RGF0YURvdWJsZUVzY2FwZWQoY3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNjcmlwdCBkYXRhIGRvdWJsZSBlc2NhcGUgZW5kIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVTY3JpcHREYXRhRG91YmxlRXNjYXBlRW5kKGNwKSB7XG4gICAgICAgIGlmICh0aGlzLnByZXByb2Nlc3Nvci5zdGFydHNXaXRoKHVuaWNvZGVfanNfMS5TRVFVRU5DRVMuU0NSSVBULCBmYWxzZSkgJiZcbiAgICAgICAgICAgIGlzU2NyaXB0RGF0YURvdWJsZUVzY2FwZVNlcXVlbmNlRW5kKHRoaXMucHJlcHJvY2Vzc29yLnBlZWsodW5pY29kZV9qc18xLlNFUVVFTkNFUy5TQ1JJUFQubGVuZ3RoKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQoY3ApO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bmljb2RlX2pzXzEuU0VRVUVOQ0VTLlNDUklQVC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDb2RlUG9pbnQodGhpcy5fY29uc3VtZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5TQ1JJUFRfREFUQV9FU0NBUEVEO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9lbnN1cmVIaWJlcm5hdGlvbigpKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuU0NSSVBUX0RBVEFfRE9VQkxFX0VTQ0FQRUQ7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZVNjcmlwdERhdGFEb3VibGVFc2NhcGVkKGNwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCZWZvcmUgYXR0cmlidXRlIG5hbWUgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUJlZm9yZUF0dHJpYnV0ZU5hbWUoY3ApIHtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU1BBQ0U6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MSU5FX0ZFRUQ6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5UQUJVTEFUSU9OOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRk9STV9GRUVEOiB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlNPTElEVVM6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5BRlRFUl9BVFRSSUJVVEVfTkFNRTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUFmdGVyQXR0cmlidXRlTmFtZShjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FUVVBTFNfU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi51bmV4cGVjdGVkRXF1YWxzU2lnbkJlZm9yZUF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUF0dHIoJz0nKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQVRUUklCVVRFX05BTUU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlQXR0cignJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkFUVFJJQlVURV9OQU1FO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQXR0cmlidXRlTmFtZShjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXR0cmlidXRlIG5hbWUgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUF0dHJpYnV0ZU5hbWUoY3ApIHtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU1BBQ0U6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MSU5FX0ZFRUQ6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5UQUJVTEFUSU9OOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRk9STV9GRUVEOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU09MSURVUzpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGVhdmVBdHRyTmFtZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5BRlRFUl9BVFRSSUJVVEVfTkFNRTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUFmdGVyQXR0cmlidXRlTmFtZShjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FUVVBTFNfU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xlYXZlQXR0ck5hbWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQkVGT1JFX0FUVFJJQlVURV9WQUxVRTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlFVT1RBVElPTl9NQVJLOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuQVBPU1RST1BIRTpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxFU1NfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLnVuZXhwZWN0ZWRDaGFyYWN0ZXJJbkF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEF0dHIubmFtZSArPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVUxMOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLm5hbWUgKz0gdW5pY29kZV9qc18xLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLm5hbWUgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoaXNBc2NpaVVwcGVyKGNwKSA/IHRvQXNjaWlMb3dlcihjcCkgOiBjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQWZ0ZXIgYXR0cmlidXRlIG5hbWUgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUFmdGVyQXR0cmlidXRlTmFtZShjcCkge1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5TUEFDRTpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxJTkVfRkVFRDpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlRBQlVMQVRJT046XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5GT1JNX0ZFRUQ6IHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgd2hpdGVzcGFjZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU09MSURVUzoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5TRUxGX0NMT1NJTkdfU1RBUlRfVEFHO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRVFVQUxTX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQkVGT1JFX0FUVFJJQlVURV9WQUxVRTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRBVEE7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudFRhZ1Rva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FT0Y6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuZW9mSW5UYWcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUF0dHIoJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5BVFRSSUJVVEVfTkFNRTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUF0dHJpYnV0ZU5hbWUoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJlZm9yZSBhdHRyaWJ1dGUgdmFsdWUgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUJlZm9yZUF0dHJpYnV0ZVZhbHVlKGNwKSB7XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlNQQUNFOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTElORV9GRUVEOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuVEFCVUxBVElPTjpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkZPUk1fRkVFRDoge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yZSB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5RVU9UQVRJT05fTUFSSzoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5BVFRSSUJVVEVfVkFMVUVfRE9VQkxFX1FVT1RFRDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkFQT1NUUk9QSEU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQVRUUklCVVRFX1ZBTFVFX1NJTkdMRV9RVU9URUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNzaW5nQXR0cmlidXRlVmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnRUYWdUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5BVFRSSUJVVEVfVkFMVUVfVU5RVU9URUQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBdHRyaWJ1dGUgdmFsdWUgKGRvdWJsZS1xdW90ZWQpIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVBdHRyaWJ1dGVWYWx1ZURvdWJsZVF1b3RlZChjcCkge1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5RVU9UQVRJT05fTUFSSzoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5BRlRFUl9BVFRSSUJVVEVfVkFMVUVfUVVPVEVEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuQU1QRVJTQU5EOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXR1cm5TdGF0ZSA9IFN0YXRlLkFUVFJJQlVURV9WQUxVRV9ET1VCTEVfUVVPVEVEO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5DSEFSQUNURVJfUkVGRVJFTkNFO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTlVMTDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QXR0ci52YWx1ZSArPSB1bmljb2RlX2pzXzEuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluVGFnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLnZhbHVlICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBdHRyaWJ1dGUgdmFsdWUgKHNpbmdsZS1xdW90ZWQpIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVBdHRyaWJ1dGVWYWx1ZVNpbmdsZVF1b3RlZChjcCkge1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5BUE9TVFJPUEhFOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkFGVEVSX0FUVFJJQlVURV9WQUxVRV9RVU9URUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5BTVBFUlNBTkQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJldHVyblN0YXRlID0gU3RhdGUuQVRUUklCVVRFX1ZBTFVFX1NJTkdMRV9RVU9URUQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNIQVJBQ1RFUl9SRUZFUkVOQ0U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVUxMOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLnZhbHVlICs9IHVuaWNvZGVfanNfMS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FT0Y6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuZW9mSW5UYWcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEF0dHIudmFsdWUgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEF0dHJpYnV0ZSB2YWx1ZSAodW5xdW90ZWQpIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKGNwKSB7XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlNQQUNFOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTElORV9GRUVEOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuVEFCVUxBVElPTjpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkZPUk1fRkVFRDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xlYXZlQXR0clZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkJFRk9SRV9BVFRSSUJVVEVfTkFNRTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkFNUEVSU0FORDoge1xuICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuU3RhdGUgPSBTdGF0ZS5BVFRSSUJVVEVfVkFMVUVfVU5RVU9URUQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNIQVJBQ1RFUl9SRUZFUkVOQ0U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xlYXZlQXR0clZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRBVEE7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudFRhZ1Rva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVUxMOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLnZhbHVlICs9IHVuaWNvZGVfanNfMS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5RVU9UQVRJT05fTUFSSzpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkFQT1NUUk9QSEU6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MRVNTX1RIQU5fU0lHTjpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVRVUFMU19TSUdOOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuR1JBVkVfQUNDRU5UOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLnVuZXhwZWN0ZWRDaGFyYWN0ZXJJblVucXVvdGVkQXR0cmlidXRlVmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEF0dHIudmFsdWUgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY3ApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluVGFnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBdHRyLnZhbHVlICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBZnRlciBhdHRyaWJ1dGUgdmFsdWUgKHF1b3RlZCkgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUFmdGVyQXR0cmlidXRlVmFsdWVRdW90ZWQoY3ApIHtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU1BBQ0U6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MSU5FX0ZFRUQ6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5UQUJVTEFUSU9OOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRk9STV9GRUVEOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGVhdmVBdHRyVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQkVGT1JFX0FUVFJJQlVURV9OQU1FO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU09MSURVUzoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xlYXZlQXR0clZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLlNFTEZfQ0xPU0lOR19TVEFSVF9UQUc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xlYXZlQXR0clZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRBVEE7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudFRhZ1Rva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FT0Y6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuZW9mSW5UYWcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNzaW5nV2hpdGVzcGFjZUJldHdlZW5BdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQkVGT1JFX0FUVFJJQlVURV9OQU1FO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQmVmb3JlQXR0cmlidXRlTmFtZShjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2VsZi1jbG9zaW5nIHN0YXJ0IHRhZyBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlU2VsZkNsb3NpbmdTdGFydFRhZyhjcCkge1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW47XG4gICAgICAgICAgICAgICAgdG9rZW4uc2VsZkNsb3NpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnRUYWdUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluVGFnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIudW5leHBlY3RlZFNvbGlkdXNJblRhZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkJFRk9SRV9BVFRSSUJVVEVfTkFNRTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUJlZm9yZUF0dHJpYnV0ZU5hbWUoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJvZ3VzIGNvbW1lbnQgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUJvZ3VzQ29tbWVudChjcCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY3VycmVudFRva2VuO1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnRDb21tZW50KHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnRDb21tZW50KHRva2VuKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLk5VTEw6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgICAgIHRva2VuLmRhdGEgKz0gdW5pY29kZV9qc18xLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0b2tlbi5kYXRhICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNYXJrdXAgZGVjbGFyYXRpb24gb3BlbiBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlTWFya3VwRGVjbGFyYXRpb25PcGVuKGNwKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb25zdW1lU2VxdWVuY2VJZk1hdGNoKHVuaWNvZGVfanNfMS5TRVFVRU5DRVMuREFTSF9EQVNILCB0cnVlKSkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlQ29tbWVudFRva2VuKHVuaWNvZGVfanNfMS5TRVFVRU5DRVMuREFTSF9EQVNILmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNPTU1FTlRfU1RBUlQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fY29uc3VtZVNlcXVlbmNlSWZNYXRjaCh1bmljb2RlX2pzXzEuU0VRVUVOQ0VTLkRPQ1RZUEUsIGZhbHNlKSkge1xuICAgICAgICAgICAgLy8gTk9URTogRG9jdHlwZXMgdG9rZW5zIGFyZSBjcmVhdGVkIHdpdGhvdXQgZml4ZWQgb2Zmc2V0cy4gV2Uga2VlcCB0cmFjayBvZiB0aGUgbW9tZW50IGEgZG9jdHlwZSAqbWlnaHQqIHN0YXJ0IGhlcmUuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMb2NhdGlvbiA9IHRoaXMuZ2V0Q3VycmVudExvY2F0aW9uKHVuaWNvZGVfanNfMS5TRVFVRU5DRVMuRE9DVFlQRS5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5ET0NUWVBFO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2NvbnN1bWVTZXF1ZW5jZUlmTWF0Y2godW5pY29kZV9qc18xLlNFUVVFTkNFUy5DREFUQV9TVEFSVCwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluRm9yZWlnbk5vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQ0RBVEFfU0VDVElPTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5jZGF0YUluSHRtbENvbnRlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUNvbW1lbnRUb2tlbih1bmljb2RlX2pzXzEuU0VRVUVOQ0VTLkNEQVRBX1NUQVJULmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuLmRhdGEgPSAnW0NEQVRBWyc7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkJPR1VTX0NPTU1FTlQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9OT1RFOiBTZXF1ZW5jZSBsb29rdXBzIGNhbiBiZSBhYnJ1cHRlZCBieSBoaWJlcm5hdGlvbi4gSW4gdGhhdCBjYXNlLCBsb29rdXBcbiAgICAgICAgLy9yZXN1bHRzIGFyZSBubyBsb25nZXIgdmFsaWQgYW5kIHdlIHdpbGwgbmVlZCB0byBzdGFydCBvdmVyLlxuICAgICAgICBlbHNlIGlmICghdGhpcy5fZW5zdXJlSGliZXJuYXRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmluY29ycmVjdGx5T3BlbmVkQ29tbWVudCk7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVDb21tZW50VG9rZW4oMik7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQk9HVVNfQ09NTUVOVDtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlQm9ndXNDb21tZW50KGNwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb21tZW50IHN0YXJ0IHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVDb21tZW50U3RhcnQoY3ApIHtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuSFlQSEVOX01JTlVTOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNPTU1FTlRfU1RBUlRfREFTSDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmFicnVwdENsb3NpbmdPZkVtcHR5Q29tbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRBVEE7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1cnJlbnRUb2tlbjtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50Q29tbWVudCh0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNPTU1FTlQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVDb21tZW50KGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb21tZW50IHN0YXJ0IGRhc2ggc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUNvbW1lbnRTdGFydERhc2goY3ApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1cnJlbnRUb2tlbjtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuSFlQSEVOX01JTlVTOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNPTU1FTlRfRU5EO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuR1JFQVRFUl9USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuYWJydXB0Q2xvc2luZ09mRW1wdHlDb21tZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuREFUQTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50Q29tbWVudCh0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FT0Y6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuZW9mSW5Db21tZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50Q29tbWVudCh0b2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdG9rZW4uZGF0YSArPSAnLSc7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNPTU1FTlQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVDb21tZW50KGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb21tZW50IHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVDb21tZW50KGNwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW47XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkhZUEhFTl9NSU5VUzoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5DT01NRU5UX0VORF9EQVNIO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTEVTU19USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0b2tlbi5kYXRhICs9ICc8JztcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQ09NTUVOVF9MRVNTX1RIQU5fU0lHTjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLk5VTEw6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgICAgIHRva2VuLmRhdGEgKz0gdW5pY29kZV9qc18xLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5lb2ZJbkNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnRDb21tZW50KHRva2VuKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0b2tlbi5kYXRhICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb21tZW50IGxlc3MtdGhhbiBzaWduIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVDb21tZW50TGVzc1RoYW5TaWduKGNwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW47XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVYQ0xBTUFUSU9OX01BUks6IHtcbiAgICAgICAgICAgICAgICB0b2tlbi5kYXRhICs9ICchJztcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQ09NTUVOVF9MRVNTX1RIQU5fU0lHTl9CQU5HO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTEVTU19USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0b2tlbi5kYXRhICs9ICc8JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQ09NTUVOVDtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUNvbW1lbnQoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvbW1lbnQgbGVzcy10aGFuIHNpZ24gYmFuZyBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlQ29tbWVudExlc3NUaGFuU2lnbkJhbmcoY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuSFlQSEVOX01JTlVTKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQ09NTUVOVF9MRVNTX1RIQU5fU0lHTl9CQU5HX0RBU0g7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQ09NTUVOVDtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlQ29tbWVudChjcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ29tbWVudCBsZXNzLXRoYW4gc2lnbiBiYW5nIGRhc2ggc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUNvbW1lbnRMZXNzVGhhblNpZ25CYW5nRGFzaChjcCkge1xuICAgICAgICBpZiAoY3AgPT09IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5IWVBIRU5fTUlOVVMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5DT01NRU5UX0xFU1NfVEhBTl9TSUdOX0JBTkdfREFTSF9EQVNIO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNPTU1FTlRfRU5EX0RBU0g7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZUNvbW1lbnRFbmREYXNoKGNwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb21tZW50IGxlc3MtdGhhbiBzaWduIGJhbmcgZGFzaCBkYXNoIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVDb21tZW50TGVzc1RoYW5TaWduQmFuZ0Rhc2hEYXNoKGNwKSB7XG4gICAgICAgIGlmIChjcCAhPT0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOICYmIGNwICE9PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIubmVzdGVkQ29tbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNPTU1FTlRfRU5EO1xuICAgICAgICB0aGlzLl9zdGF0ZUNvbW1lbnRFbmQoY3ApO1xuICAgIH1cbiAgICAvLyBDb21tZW50IGVuZCBkYXNoIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVDb21tZW50RW5kRGFzaChjcCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY3VycmVudFRva2VuO1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5IWVBIRU5fTUlOVVM6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQ09NTUVOVF9FTkQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FT0Y6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuZW9mSW5Db21tZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50Q29tbWVudCh0b2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdG9rZW4uZGF0YSArPSAnLSc7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNPTU1FTlQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVDb21tZW50KGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDb21tZW50IGVuZCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlQ29tbWVudEVuZChjcCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY3VycmVudFRva2VuO1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnRDb21tZW50KHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVYQ0xBTUFUSU9OX01BUks6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQ09NTUVOVF9FTkRfQkFORztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkhZUEhFTl9NSU5VUzoge1xuICAgICAgICAgICAgICAgIHRva2VuLmRhdGEgKz0gJy0nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluQ29tbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudENvbW1lbnQodG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRva2VuLmRhdGEgKz0gJy0tJztcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQ09NTUVOVDtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUNvbW1lbnQoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvbW1lbnQgZW5kIGJhbmcgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUNvbW1lbnRFbmRCYW5nKGNwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW47XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkhZUEhFTl9NSU5VUzoge1xuICAgICAgICAgICAgICAgIHRva2VuLmRhdGEgKz0gJy0tISc7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNPTU1FTlRfRU5EX0RBU0g7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5pbmNvcnJlY3RseUNsb3NlZENvbW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnRDb21tZW50KHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5lb2ZJbkNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnRDb21tZW50KHRva2VuKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0b2tlbi5kYXRhICs9ICctLSEnO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5DT01NRU5UO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQ29tbWVudChjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRE9DVFlQRSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlRG9jdHlwZShjcCkge1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5TUEFDRTpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxJTkVfRkVFRDpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlRBQlVMQVRJT046XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5GT1JNX0ZFRUQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQkVGT1JFX0RPQ1RZUEVfTkFNRTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkJFRk9SRV9ET0NUWVBFX05BTUU7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVCZWZvcmVEb2N0eXBlTmFtZShjcCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FT0Y6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuZW9mSW5Eb2N0eXBlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVEb2N0eXBlVG9rZW4obnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1cnJlbnRUb2tlbjtcbiAgICAgICAgICAgICAgICB0b2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudERvY3R5cGUodG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNzaW5nV2hpdGVzcGFjZUJlZm9yZURvY3R5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQkVGT1JFX0RPQ1RZUEVfTkFNRTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUJlZm9yZURvY3R5cGVOYW1lKGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCZWZvcmUgRE9DVFlQRSBuYW1lIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVCZWZvcmVEb2N0eXBlTmFtZShjcCkge1xuICAgICAgICBpZiAoaXNBc2NpaVVwcGVyKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlRG9jdHlwZVRva2VuKFN0cmluZy5mcm9tQ2hhckNvZGUodG9Bc2NpaUxvd2VyKGNwKSkpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRPQ1RZUEVfTkFNRTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU1BBQ0U6XG4gICAgICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTElORV9GRUVEOlxuICAgICAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlRBQlVMQVRJT046XG4gICAgICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRk9STV9GRUVEOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVUxMOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZURvY3R5cGVUb2tlbih1bmljb2RlX2pzXzEuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRPQ1RZUEVfTkFNRTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNzaW5nRG9jdHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVEb2N0eXBlVG9rZW4obnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudERvY3R5cGUodG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuREFUQTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuZW9mSW5Eb2N0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlRG9jdHlwZVRva2VuKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY3VycmVudFRva2VuO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnREb2N0eXBlKHRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZURvY3R5cGVUb2tlbihTdHJpbmcuZnJvbUNvZGVQb2ludChjcCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuRE9DVFlQRV9OQU1FO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgLy8gRE9DVFlQRSBuYW1lIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVEb2N0eXBlTmFtZShjcCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY3VycmVudFRva2VuO1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5TUEFDRTpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxJTkVfRkVFRDpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlRBQlVMQVRJT046XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5GT1JNX0ZFRUQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQUZURVJfRE9DVFlQRV9OQU1FO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuR1JFQVRFUl9USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuREFUQTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50RG9jdHlwZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVUxMOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5uYW1lICs9IHVuaWNvZGVfanNfMS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FT0Y6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuZW9mSW5Eb2N0eXBlKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudERvY3R5cGUodG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRva2VuLm5hbWUgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoaXNBc2NpaVVwcGVyKGNwKSA/IHRvQXNjaWlMb3dlcihjcCkgOiBjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQWZ0ZXIgRE9DVFlQRSBuYW1lIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVBZnRlckRvY3R5cGVOYW1lKGNwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW47XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlNQQUNFOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTElORV9GRUVEOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuVEFCVUxBVElPTjpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkZPUk1fRkVFRDoge1xuICAgICAgICAgICAgICAgIC8vIElnbm9yZSB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnREb2N0eXBlKHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5lb2ZJbkRvY3R5cGUpO1xuICAgICAgICAgICAgICAgIHRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50RG9jdHlwZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb25zdW1lU2VxdWVuY2VJZk1hdGNoKHVuaWNvZGVfanNfMS5TRVFVRU5DRVMuUFVCTElDLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkFGVEVSX0RPQ1RZUEVfUFVCTElDX0tFWVdPUkQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2NvbnN1bWVTZXF1ZW5jZUlmTWF0Y2godW5pY29kZV9qc18xLlNFUVVFTkNFUy5TWVNURU0sIGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQUZURVJfRE9DVFlQRV9TWVNURU1fS0VZV09SRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9OT1RFOiBzZXF1ZW5jZSBsb29rdXAgY2FuIGJlIGFicnVwdGVkIGJ5IGhpYmVybmF0aW9uLiBJbiB0aGF0IGNhc2UgbG9va3VwXG4gICAgICAgICAgICAgICAgLy9yZXN1bHRzIGFyZSBubyBsb25nZXIgdmFsaWQgYW5kIHdlIHdpbGwgbmVlZCB0byBzdGFydCBvdmVyLlxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLl9lbnN1cmVIaWJlcm5hdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5pbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2VBZnRlckRvY3R5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQk9HVVNfRE9DVFlQRTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVCb2d1c0RvY3R5cGUoY3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBZnRlciBET0NUWVBFIHB1YmxpYyBrZXl3b3JkIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVBZnRlckRvY3R5cGVQdWJsaWNLZXl3b3JkKGNwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW47XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlNQQUNFOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTElORV9GRUVEOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuVEFCVUxBVElPTjpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkZPUk1fRkVFRDoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5CRUZPUkVfRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlFVT1RBVElPTl9NQVJLOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLm1pc3NpbmdXaGl0ZXNwYWNlQWZ0ZXJEb2N0eXBlUHVibGljS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgdG9rZW4ucHVibGljSWQgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9ET1VCTEVfUVVPVEVEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuQVBPU1RST1BIRToge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNzaW5nV2hpdGVzcGFjZUFmdGVyRG9jdHlwZVB1YmxpY0tleXdvcmQpO1xuICAgICAgICAgICAgICAgIHRva2VuLnB1YmxpY0lkID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRPQ1RZUEVfUFVCTElDX0lERU5USUZJRVJfU0lOR0xFX1FVT1RFRDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLm1pc3NpbmdEb2N0eXBlUHVibGljSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgdG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnREb2N0eXBlKHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5lb2ZJbkRvY3R5cGUpO1xuICAgICAgICAgICAgICAgIHRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50RG9jdHlwZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLm1pc3NpbmdRdW90ZUJlZm9yZURvY3R5cGVQdWJsaWNJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkJPR1VTX0RPQ1RZUEU7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVCb2d1c0RvY3R5cGUoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJlZm9yZSBET0NUWVBFIHB1YmxpYyBpZGVudGlmaWVyIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVCZWZvcmVEb2N0eXBlUHVibGljSWRlbnRpZmllcihjcCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY3VycmVudFRva2VuO1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5TUEFDRTpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxJTkVfRkVFRDpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlRBQlVMQVRJT046XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5GT1JNX0ZFRUQ6IHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgd2hpdGVzcGFjZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuUVVPVEFUSU9OX01BUks6IHtcbiAgICAgICAgICAgICAgICB0b2tlbi5wdWJsaWNJZCA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5ET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSX0RPVUJMRV9RVU9URUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5BUE9TVFJPUEhFOiB7XG4gICAgICAgICAgICAgICAgdG9rZW4ucHVibGljSWQgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuRE9DVFlQRV9QVUJMSUNfSURFTlRJRklFUl9TSU5HTEVfUVVPVEVEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuR1JFQVRFUl9USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIubWlzc2luZ0RvY3R5cGVQdWJsaWNJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRBVEE7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudERvY3R5cGUodG9rZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluRG9jdHlwZSk7XG4gICAgICAgICAgICAgICAgdG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnREb2N0eXBlKHRva2VuKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIubWlzc2luZ1F1b3RlQmVmb3JlRG9jdHlwZVB1YmxpY0lkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgIHRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQk9HVVNfRE9DVFlQRTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUJvZ3VzRG9jdHlwZShjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRE9DVFlQRSBwdWJsaWMgaWRlbnRpZmllciAoZG91YmxlLXF1b3RlZCkgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZURvY3R5cGVQdWJsaWNJZGVudGlmaWVyRG91YmxlUXVvdGVkKGNwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW47XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlFVT1RBVElPTl9NQVJLOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkFGVEVSX0RPQ1RZUEVfUFVCTElDX0lERU5USUZJRVI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVUxMOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5wdWJsaWNJZCArPSB1bmljb2RlX2pzXzEuUkVQTEFDRU1FTlRfQ0hBUkFDVEVSO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuR1JFQVRFUl9USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuYWJydXB0RG9jdHlwZVB1YmxpY0lkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgIHRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50RG9jdHlwZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRBVEE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FT0Y6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuZW9mSW5Eb2N0eXBlKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudERvY3R5cGUodG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRva2VuLnB1YmxpY0lkICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBET0NUWVBFIHB1YmxpYyBpZGVudGlmaWVyIChzaW5nbGUtcXVvdGVkKSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTaW5nbGVRdW90ZWQoY3ApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1cnJlbnRUb2tlbjtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuQVBPU1RST1BIRToge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5BRlRFUl9ET0NUWVBFX1BVQkxJQ19JREVOVElGSUVSO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTlVMTDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgdG9rZW4ucHVibGljSWQgKz0gdW5pY29kZV9qc18xLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmFicnVwdERvY3R5cGVQdWJsaWNJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudERvY3R5cGUodG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluRG9jdHlwZSk7XG4gICAgICAgICAgICAgICAgdG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnREb2N0eXBlKHRva2VuKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0b2tlbi5wdWJsaWNJZCArPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQWZ0ZXIgRE9DVFlQRSBwdWJsaWMgaWRlbnRpZmllciBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlQWZ0ZXJEb2N0eXBlUHVibGljSWRlbnRpZmllcihjcCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY3VycmVudFRva2VuO1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5TUEFDRTpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxJTkVfRkVFRDpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlRBQlVMQVRJT046XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5GT1JNX0ZFRUQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQkVUV0VFTl9ET0NUWVBFX1BVQkxJQ19BTkRfU1lTVEVNX0lERU5USUZJRVJTO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuR1JFQVRFUl9USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuREFUQTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50RG9jdHlwZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5RVU9UQVRJT05fTUFSSzoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNzaW5nV2hpdGVzcGFjZUJldHdlZW5Eb2N0eXBlUHVibGljQW5kU3lzdGVtSWRlbnRpZmllcnMpO1xuICAgICAgICAgICAgICAgIHRva2VuLnN5c3RlbUlkID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfRE9VQkxFX1FVT1RFRDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkFQT1NUUk9QSEU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIubWlzc2luZ1doaXRlc3BhY2VCZXR3ZWVuRG9jdHlwZVB1YmxpY0FuZFN5c3RlbUlkZW50aWZpZXJzKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5zeXN0ZW1JZCA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NJTkdMRV9RVU9URUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FT0Y6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuZW9mSW5Eb2N0eXBlKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudERvY3R5cGUodG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNzaW5nUXVvdGVCZWZvcmVEb2N0eXBlU3lzdGVtSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgdG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5CT0dVU19ET0NUWVBFO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQm9ndXNEb2N0eXBlKGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCZXR3ZWVuIERPQ1RZUEUgcHVibGljIGFuZCBzeXN0ZW0gaWRlbnRpZmllcnMgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUJldHdlZW5Eb2N0eXBlUHVibGljQW5kU3lzdGVtSWRlbnRpZmllcnMoY3ApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1cnJlbnRUb2tlbjtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU1BBQ0U6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MSU5FX0ZFRUQ6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5UQUJVTEFUSU9OOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRk9STV9GRUVEOiB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudERvY3R5cGUodG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuUVVPVEFUSU9OX01BUks6IHtcbiAgICAgICAgICAgICAgICB0b2tlbi5zeXN0ZW1JZCA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX0RPVUJMRV9RVU9URUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5BUE9TVFJPUEhFOiB7XG4gICAgICAgICAgICAgICAgdG9rZW4uc3lzdGVtSWQgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9TSU5HTEVfUVVPVEVEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluRG9jdHlwZSk7XG4gICAgICAgICAgICAgICAgdG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnREb2N0eXBlKHRva2VuKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIubWlzc2luZ1F1b3RlQmVmb3JlRG9jdHlwZVN5c3RlbUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgIHRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQk9HVVNfRE9DVFlQRTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUJvZ3VzRG9jdHlwZShjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQWZ0ZXIgRE9DVFlQRSBzeXN0ZW0ga2V5d29yZCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlQWZ0ZXJEb2N0eXBlU3lzdGVtS2V5d29yZChjcCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY3VycmVudFRva2VuO1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5TUEFDRTpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxJTkVfRkVFRDpcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlRBQlVMQVRJT046XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5GT1JNX0ZFRUQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQkVGT1JFX0RPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5RVU9UQVRJT05fTUFSSzoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNzaW5nV2hpdGVzcGFjZUFmdGVyRG9jdHlwZVN5c3RlbUtleXdvcmQpO1xuICAgICAgICAgICAgICAgIHRva2VuLnN5c3RlbUlkID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfRE9VQkxFX1FVT1RFRDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkFQT1NUUk9QSEU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIubWlzc2luZ1doaXRlc3BhY2VBZnRlckRvY3R5cGVTeXN0ZW1LZXl3b3JkKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5zeXN0ZW1JZCA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSX1NJTkdMRV9RVU9URUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNzaW5nRG9jdHlwZVN5c3RlbUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgIHRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuREFUQTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50RG9jdHlwZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5FT0Y6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuZW9mSW5Eb2N0eXBlKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudERvY3R5cGUodG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRFT0ZUb2tlbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5taXNzaW5nUXVvdGVCZWZvcmVEb2N0eXBlU3lzdGVtSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgdG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5CT0dVU19ET0NUWVBFO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQm9ndXNEb2N0eXBlKGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCZWZvcmUgRE9DVFlQRSBzeXN0ZW0gaWRlbnRpZmllciBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlQmVmb3JlRG9jdHlwZVN5c3RlbUlkZW50aWZpZXIoY3ApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1cnJlbnRUb2tlbjtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU1BBQ0U6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MSU5FX0ZFRUQ6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5UQUJVTEFUSU9OOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRk9STV9GRUVEOiB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlFVT1RBVElPTl9NQVJLOiB7XG4gICAgICAgICAgICAgICAgdG9rZW4uc3lzdGVtSWQgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUl9ET1VCTEVfUVVPVEVEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuQVBPU1RST1BIRToge1xuICAgICAgICAgICAgICAgIHRva2VuLnN5c3RlbUlkID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRPQ1RZUEVfU1lTVEVNX0lERU5USUZJRVJfU0lOR0xFX1FVT1RFRDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLm1pc3NpbmdEb2N0eXBlU3lzdGVtSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgdG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnREb2N0eXBlKHRva2VuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5lb2ZJbkRvY3R5cGUpO1xuICAgICAgICAgICAgICAgIHRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50RG9jdHlwZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLm1pc3NpbmdRdW90ZUJlZm9yZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkJPR1VTX0RPQ1RZUEU7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVCb2d1c0RvY3R5cGUoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIERPQ1RZUEUgc3lzdGVtIGlkZW50aWZpZXIgKGRvdWJsZS1xdW90ZWQpIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVEb2N0eXBlU3lzdGVtSWRlbnRpZmllckRvdWJsZVF1b3RlZChjcCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY3VycmVudFRva2VuO1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5RVU9UQVRJT05fTUFSSzoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5BRlRFUl9ET0NUWVBFX1NZU1RFTV9JREVOVElGSUVSO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTlVMTDoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi51bmV4cGVjdGVkTnVsbENoYXJhY3Rlcik7XG4gICAgICAgICAgICAgICAgdG9rZW4uc3lzdGVtSWQgKz0gdW5pY29kZV9qc18xLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmFicnVwdERvY3R5cGVTeXN0ZW1JZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICB0b2tlbi5mb3JjZVF1aXJrcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudERvY3R5cGUodG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluRG9jdHlwZSk7XG4gICAgICAgICAgICAgICAgdG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnREb2N0eXBlKHRva2VuKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0b2tlbi5zeXN0ZW1JZCArPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRE9DVFlQRSBzeXN0ZW0gaWRlbnRpZmllciAoc2luZ2xlLXF1b3RlZCkgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZURvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU2luZ2xlUXVvdGVkKGNwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5jdXJyZW50VG9rZW47XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkFQT1NUUk9QSEU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQUZURVJfRE9DVFlQRV9TWVNURU1fSURFTlRJRklFUjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLk5VTEw6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIudW5leHBlY3RlZE51bGxDaGFyYWN0ZXIpO1xuICAgICAgICAgICAgICAgIHRva2VuLnN5c3RlbUlkICs9IHVuaWNvZGVfanNfMS5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5hYnJ1cHREb2N0eXBlU3lzdGVtSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgdG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnREb2N0eXBlKHRva2VuKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuREFUQTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5lb2ZJbkRvY3R5cGUpO1xuICAgICAgICAgICAgICAgIHRva2VuLmZvcmNlUXVpcmtzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50RG9jdHlwZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdEVPRlRva2VuKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdG9rZW4uc3lzdGVtSWQgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEFmdGVyIERPQ1RZUEUgc3lzdGVtIGlkZW50aWZpZXIgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUFmdGVyRG9jdHlwZVN5c3RlbUlkZW50aWZpZXIoY3ApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1cnJlbnRUb2tlbjtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuU1BBQ0U6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MSU5FX0ZFRUQ6XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5UQUJVTEFUSU9OOlxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRk9STV9GRUVEOiB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkdSRUFURVJfVEhBTl9TSUdOOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q3VycmVudERvY3R5cGUodG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuRU9GOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmVvZkluRG9jdHlwZSk7XG4gICAgICAgICAgICAgICAgdG9rZW4uZm9yY2VRdWlya3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnREb2N0eXBlKHRva2VuKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIudW5leHBlY3RlZENoYXJhY3RlckFmdGVyRG9jdHlwZVN5c3RlbUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5CT0dVU19ET0NUWVBFO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlQm9ndXNEb2N0eXBlKGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCb2d1cyBET0NUWVBFIHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVCb2d1c0RvY3R5cGUoY3ApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmN1cnJlbnRUb2tlbjtcbiAgICAgICAgc3dpdGNoIChjcCkge1xuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuR1JFQVRFUl9USEFOX1NJR046IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDdXJyZW50RG9jdHlwZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRBVEE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVUxMOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLnVuZXhwZWN0ZWROdWxsQ2hhcmFjdGVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEN1cnJlbnREb2N0eXBlKHRva2VuKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBEbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ0RBVEEgc2VjdGlvbiBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlQ2RhdGFTZWN0aW9uKGNwKSB7XG4gICAgICAgIHN3aXRjaCAoY3ApIHtcbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlJJR0hUX1NRVUFSRV9CUkFDS0VUOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNEQVRBX1NFQ1RJT05fQlJBQ0tFVDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjoge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5lb2ZJbkNkYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0RU9GVG9rZW4oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0Q29kZVBvaW50KGNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDREFUQSBzZWN0aW9uIGJyYWNrZXQgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUNkYXRhU2VjdGlvbkJyYWNrZXQoY3ApIHtcbiAgICAgICAgaWYgKGNwID09PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuUklHSFRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5DREFUQV9TRUNUSU9OX0VORDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFycygnXScpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNEQVRBX1NFQ1RJT047XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZUNkYXRhU2VjdGlvbihjcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ0RBVEEgc2VjdGlvbiBlbmQgc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUNkYXRhU2VjdGlvbkVuZChjcCkge1xuICAgICAgICBzd2l0Y2ggKGNwKSB7XG4gICAgICAgICAgICBjYXNlIHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5HUkVBVEVSX1RIQU5fU0lHTjoge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5EQVRBO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuUklHSFRfU1FVQVJFX0JSQUNLRVQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJ10nKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0Q2hhcnMoJ11dJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkNEQVRBX1NFQ1RJT047XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGVDZGF0YVNlY3Rpb24oY3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENoYXJhY3RlciByZWZlcmVuY2Ugc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUNoYXJhY3RlclJlZmVyZW5jZShjcCkge1xuICAgICAgICBpZiAoY3AgPT09IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVU1CRVJfU0lHTikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLk5VTUVSSUNfQ0hBUkFDVEVSX1JFRkVSRU5DRTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FzY2lpQWxwaGFOdW1lcmljKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLk5BTUVEX0NIQVJBQ1RFUl9SRUZFUkVOQ0U7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZU5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlKGNwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2ZsdXNoQ29kZVBvaW50Q29uc3VtZWRBc0NoYXJhY3RlclJlZmVyZW5jZSh1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuQU1QRVJTQU5EKTtcbiAgICAgICAgICAgIHRoaXMuX3JlY29uc3VtZUluU3RhdGUodGhpcy5yZXR1cm5TdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTmFtZWQgY2hhcmFjdGVyIHJlZmVyZW5jZSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2UoY3ApIHtcbiAgICAgICAgY29uc3QgbWF0Y2hSZXN1bHQgPSB0aGlzLl9tYXRjaE5hbWVkQ2hhcmFjdGVyUmVmZXJlbmNlKGNwKTtcbiAgICAgICAgLy9OT1RFOiBNYXRjaGluZyBjYW4gYmUgYWJydXB0ZWQgYnkgaGliZXJuYXRpb24uIEluIHRoYXQgY2FzZSwgbWF0Y2hcbiAgICAgICAgLy9yZXN1bHRzIGFyZSBubyBsb25nZXIgdmFsaWQgYW5kIHdlIHdpbGwgbmVlZCB0byBzdGFydCBvdmVyLlxuICAgICAgICBpZiAodGhpcy5fZW5zdXJlSGliZXJuYXRpb24oKSkge1xuICAgICAgICAgICAgLy8gU3RheSBpbiB0aGUgc3RhdGUsIHRyeSBhZ2Fpbi5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXRjaFJlc3VsdCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaFJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZsdXNoQ29kZVBvaW50Q29uc3VtZWRBc0NoYXJhY3RlclJlZmVyZW5jZShtYXRjaFJlc3VsdFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5yZXR1cm5TdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2ZsdXNoQ29kZVBvaW50Q29uc3VtZWRBc0NoYXJhY3RlclJlZmVyZW5jZSh1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuQU1QRVJTQU5EKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5BTUJJR1VPVVNfQU1QRVJTQU5EO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEFtYmlndW9zIGFtcGVyc2FuZCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlQW1iaWd1b3VzQW1wZXJzYW5kKGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpQWxwaGFOdW1lcmljKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5fZmx1c2hDb2RlUG9pbnRDb25zdW1lZEFzQ2hhcmFjdGVyUmVmZXJlbmNlKGNwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjcCA9PT0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlNFTUlDT0xPTikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi51bmtub3duTmFtZWRDaGFyYWN0ZXJSZWZlcmVuY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVjb25zdW1lSW5TdGF0ZSh0aGlzLnJldHVyblN0YXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBOdW1lcmljIGNoYXJhY3RlciByZWZlcmVuY2Ugc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZU51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2UoY3ApIHtcbiAgICAgICAgdGhpcy5jaGFyUmVmQ29kZSA9IDA7XG4gICAgICAgIGlmIChjcCA9PT0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxBVElOX1NNQUxMX1ggfHwgY3AgPT09IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5MQVRJTl9DQVBJVEFMX1gpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5IRVhBREVNSUNBTF9DSEFSQUNURVJfUkVGRVJFTkNFX1NUQVJUO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLkRFQ0lNQUxfQ0hBUkFDVEVSX1JFRkVSRU5DRV9TVEFSVDtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlRGVjaW1hbENoYXJhY3RlclJlZmVyZW5jZVN0YXJ0KGNwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBIZXhhZGVtaWNhbCBjaGFyYWN0ZXIgcmVmZXJlbmNlIHN0YXJ0IHN0YXRlXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfc3RhdGVIZXhhZGVtaWNhbENoYXJhY3RlclJlZmVyZW5jZVN0YXJ0KGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpSGV4RGlnaXQoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuSEVYQURFTUlDQUxfQ0hBUkFDVEVSX1JFRkVSRU5DRTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlSGV4YWRlbWljYWxDaGFyYWN0ZXJSZWZlcmVuY2UoY3ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmFic2VuY2VPZkRpZ2l0c0luTnVtZXJpY0NoYXJhY3RlclJlZmVyZW5jZSk7XG4gICAgICAgICAgICB0aGlzLl9mbHVzaENvZGVQb2ludENvbnN1bWVkQXNDaGFyYWN0ZXJSZWZlcmVuY2UodW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkFNUEVSU0FORCk7XG4gICAgICAgICAgICB0aGlzLl9mbHVzaENvZGVQb2ludENvbnN1bWVkQXNDaGFyYWN0ZXJSZWZlcmVuY2UodW5pY29kZV9qc18xLkNPREVfUE9JTlRTLk5VTUJFUl9TSUdOKTtcbiAgICAgICAgICAgIHRoaXMuX3VuY29uc3VtZSgyKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnJldHVyblN0YXRlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIERlY2ltYWwgY2hhcmFjdGVyIHJlZmVyZW5jZSBzdGFydCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlRGVjaW1hbENoYXJhY3RlclJlZmVyZW5jZVN0YXJ0KGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpRGlnaXQoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuREVDSU1BTF9DSEFSQUNURVJfUkVGRVJFTkNFO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGVEZWNpbWFsQ2hhcmFjdGVyUmVmZXJlbmNlKGNwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5hYnNlbmNlT2ZEaWdpdHNJbk51bWVyaWNDaGFyYWN0ZXJSZWZlcmVuY2UpO1xuICAgICAgICAgICAgdGhpcy5fZmx1c2hDb2RlUG9pbnRDb25zdW1lZEFzQ2hhcmFjdGVyUmVmZXJlbmNlKHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5BTVBFUlNBTkQpO1xuICAgICAgICAgICAgdGhpcy5fZmx1c2hDb2RlUG9pbnRDb25zdW1lZEFzQ2hhcmFjdGVyUmVmZXJlbmNlKHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVU1CRVJfU0lHTik7XG4gICAgICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKHRoaXMucmV0dXJuU3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEhleGFkZW1pY2FsIGNoYXJhY3RlciByZWZlcmVuY2Ugc3RhdGVcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIF9zdGF0ZUhleGFkZW1pY2FsQ2hhcmFjdGVyUmVmZXJlbmNlKGNwKSB7XG4gICAgICAgIGlmIChpc0FzY2lpVXBwZXJIZXhEaWdpdChjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhclJlZkNvZGUgPSB0aGlzLmNoYXJSZWZDb2RlICogMTYgKyBjcCAtIDB4Mzc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNBc2NpaUxvd2VySGV4RGlnaXQoY3ApKSB7XG4gICAgICAgICAgICB0aGlzLmNoYXJSZWZDb2RlID0gdGhpcy5jaGFyUmVmQ29kZSAqIDE2ICsgY3AgLSAweDU3O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXNjaWlEaWdpdChjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhclJlZkNvZGUgPSB0aGlzLmNoYXJSZWZDb2RlICogMTYgKyBjcCAtIDB4MzA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3AgPT09IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5TRU1JQ09MT04pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5OVU1FUklDX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfRU5EO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLm1pc3NpbmdTZW1pY29sb25BZnRlckNoYXJhY3RlclJlZmVyZW5jZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuTlVNRVJJQ19DSEFSQUNURVJfUkVGRVJFTkNFX0VORDtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlTnVtZXJpY0NoYXJhY3RlclJlZmVyZW5jZUVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIERlY2ltYWwgY2hhcmFjdGVyIHJlZmVyZW5jZSBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlRGVjaW1hbENoYXJhY3RlclJlZmVyZW5jZShjcCkge1xuICAgICAgICBpZiAoaXNBc2NpaURpZ2l0KGNwKSkge1xuICAgICAgICAgICAgdGhpcy5jaGFyUmVmQ29kZSA9IHRoaXMuY2hhclJlZkNvZGUgKiAxMCArIGNwIC0gMHgzMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjcCA9PT0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlNFTUlDT0xPTikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlLk5VTUVSSUNfQ0hBUkFDVEVSX1JFRkVSRU5DRV9FTkQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIubWlzc2luZ1NlbWljb2xvbkFmdGVyQ2hhcmFjdGVyUmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5OVU1FUklDX0NIQVJBQ1RFUl9SRUZFUkVOQ0VfRU5EO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGVOdW1lcmljQ2hhcmFjdGVyUmVmZXJlbmNlRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTnVtZXJpYyBjaGFyYWN0ZXIgcmVmZXJlbmNlIGVuZCBzdGF0ZVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgX3N0YXRlTnVtZXJpY0NoYXJhY3RlclJlZmVyZW5jZUVuZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhclJlZkNvZGUgPT09IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5OVUxMKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIubnVsbENoYXJhY3RlclJlZmVyZW5jZSk7XG4gICAgICAgICAgICB0aGlzLmNoYXJSZWZDb2RlID0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLlJFUExBQ0VNRU5UX0NIQVJBQ1RFUjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNoYXJSZWZDb2RlID4gMTExNDExMSkge1xuICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmNoYXJhY3RlclJlZmVyZW5jZU91dHNpZGVVbmljb2RlUmFuZ2UpO1xuICAgICAgICAgICAgdGhpcy5jaGFyUmVmQ29kZSA9IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKDAsIHVuaWNvZGVfanNfMS5pc1N1cnJvZ2F0ZSkodGhpcy5jaGFyUmVmQ29kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5zdXJyb2dhdGVDaGFyYWN0ZXJSZWZlcmVuY2UpO1xuICAgICAgICAgICAgdGhpcy5jaGFyUmVmQ29kZSA9IHVuaWNvZGVfanNfMS5DT0RFX1BPSU5UUy5SRVBMQUNFTUVOVF9DSEFSQUNURVI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKDAsIHVuaWNvZGVfanNfMS5pc1VuZGVmaW5lZENvZGVQb2ludCkodGhpcy5jaGFyUmVmQ29kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5ub25jaGFyYWN0ZXJDaGFyYWN0ZXJSZWZlcmVuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCgwLCB1bmljb2RlX2pzXzEuaXNDb250cm9sQ29kZVBvaW50KSh0aGlzLmNoYXJSZWZDb2RlKSB8fCB0aGlzLmNoYXJSZWZDb2RlID09PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuQ0FSUklBR0VfUkVUVVJOKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuY29udHJvbENoYXJhY3RlclJlZmVyZW5jZSk7XG4gICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9IEMxX0NPTlRST0xTX1JFRkVSRU5DRV9SRVBMQUNFTUVOVFMuZ2V0KHRoaXMuY2hhclJlZkNvZGUpO1xuICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJSZWZDb2RlID0gcmVwbGFjZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZmx1c2hDb2RlUG9pbnRDb25zdW1lZEFzQ2hhcmFjdGVyUmVmZXJlbmNlKHRoaXMuY2hhclJlZkNvZGUpO1xuICAgICAgICB0aGlzLl9yZWNvbnN1bWVJblN0YXRlKHRoaXMucmV0dXJuU3RhdGUpO1xuICAgIH1cbn1cbmV4cG9ydHMuVG9rZW5pemVyID0gVG9rZW5pemVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlByZXByb2Nlc3NvciA9IHZvaWQgMDtcbmNvbnN0IHVuaWNvZGVfanNfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vdW5pY29kZS5qc1wiKTtcbmNvbnN0IGVycm9yX2NvZGVzX2pzXzEgPSByZXF1aXJlKFwiLi4vY29tbW9uL2Vycm9yLWNvZGVzLmpzXCIpO1xuLy9Db25zdFxuY29uc3QgREVGQVVMVF9CVUZGRVJfV0FURVJMSU5FID0gMSA8PCAxNjtcbi8vUHJlcHJvY2Vzc29yXG4vL05PVEU6IEhUTUwgaW5wdXQgcHJlcHJvY2Vzc2luZ1xuLy8oc2VlOiBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9wYXJzaW5nLmh0bWwjcHJlcHJvY2Vzc2luZy10aGUtaW5wdXQtc3RyZWFtKVxuY2xhc3MgUHJlcHJvY2Vzc29yIHtcbiAgICBjb25zdHJ1Y3RvcihoYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgIHRoaXMuaHRtbCA9ICcnO1xuICAgICAgICB0aGlzLnBvcyA9IC0xO1xuICAgICAgICAvLyBOT1RFOiBJbml0aWFsIGBsYXN0R2FwUG9zYCBpcyAtMiwgdG8gZW5zdXJlIGBjb2xgIG9uIGluaXRpYWxpc2F0aW9uIGlzIDBcbiAgICAgICAgdGhpcy5sYXN0R2FwUG9zID0gLTI7XG4gICAgICAgIHRoaXMuZ2FwU3RhY2sgPSBbXTtcbiAgICAgICAgdGhpcy5za2lwTmV4dE5ld0xpbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sYXN0Q2h1bmtXcml0dGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW5kT2ZDaHVua0hpdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJ1ZmZlcldhdGVybGluZSA9IERFRkFVTFRfQlVGRkVSX1dBVEVSTElORTtcbiAgICAgICAgdGhpcy5pc0VvbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxpbmVTdGFydFBvcyA9IDA7XG4gICAgICAgIHRoaXMuZHJvcHBlZEJ1ZmZlclNpemUgPSAwO1xuICAgICAgICB0aGlzLmxpbmUgPSAxO1xuICAgICAgICAvL05PVEU6IGF2b2lkIHJlcG9ydGluZyBlcnJvcnMgdHdpY2Ugb24gYWR2YW5jZS9yZXRyZWF0XG4gICAgICAgIHRoaXMubGFzdEVyck9mZnNldCA9IC0xO1xuICAgIH1cbiAgICAvKiogVGhlIGNvbHVtbiBvbiB0aGUgY3VycmVudCBsaW5lLiBJZiB3ZSBqdXN0IHNhdyBhIGdhcCAoZWcuIGEgc3Vycm9nYXRlIHBhaXIpLCByZXR1cm4gdGhlIGluZGV4IGJlZm9yZS4gKi9cbiAgICBnZXQgY29sKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgLSB0aGlzLmxpbmVTdGFydFBvcyArIE51bWJlcih0aGlzLmxhc3RHYXBQb3MgIT09IHRoaXMucG9zKTtcbiAgICB9XG4gICAgZ2V0IG9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcHBlZEJ1ZmZlclNpemUgKyB0aGlzLnBvcztcbiAgICB9XG4gICAgZ2V0RXJyb3IoY29kZSkge1xuICAgICAgICBjb25zdCB7IGxpbmUsIGNvbCwgb2Zmc2V0IH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIHN0YXJ0TGluZTogbGluZSxcbiAgICAgICAgICAgIGVuZExpbmU6IGxpbmUsXG4gICAgICAgICAgICBzdGFydENvbDogY29sLFxuICAgICAgICAgICAgZW5kQ29sOiBjb2wsXG4gICAgICAgICAgICBzdGFydE9mZnNldDogb2Zmc2V0LFxuICAgICAgICAgICAgZW5kT2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9lcnIoY29kZSkge1xuICAgICAgICBpZiAodGhpcy5oYW5kbGVyLm9uUGFyc2VFcnJvciAmJiB0aGlzLmxhc3RFcnJPZmZzZXQgIT09IHRoaXMub2Zmc2V0KSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RFcnJPZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlci5vblBhcnNlRXJyb3IodGhpcy5nZXRFcnJvcihjb2RlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2FkZEdhcCgpIHtcbiAgICAgICAgdGhpcy5nYXBTdGFjay5wdXNoKHRoaXMubGFzdEdhcFBvcyk7XG4gICAgICAgIHRoaXMubGFzdEdhcFBvcyA9IHRoaXMucG9zO1xuICAgIH1cbiAgICBfcHJvY2Vzc1N1cnJvZ2F0ZShjcCkge1xuICAgICAgICAvL05PVEU6IHRyeSB0byBwZWVrIGEgc3Vycm9nYXRlIHBhaXJcbiAgICAgICAgaWYgKHRoaXMucG9zICE9PSB0aGlzLmh0bWwubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgY29uc3QgbmV4dENwID0gdGhpcy5odG1sLmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICAgICAgICAgIGlmICgoMCwgdW5pY29kZV9qc18xLmlzU3Vycm9nYXRlUGFpcikobmV4dENwKSkge1xuICAgICAgICAgICAgICAgIC8vTk9URTogd2UgaGF2ZSBhIHN1cnJvZ2F0ZSBwYWlyLiBQZWVrIHBhaXIgY2hhcmFjdGVyIGFuZCByZWNhbGN1bGF0ZSBjb2RlIHBvaW50LlxuICAgICAgICAgICAgICAgIHRoaXMucG9zKys7XG4gICAgICAgICAgICAgICAgLy9OT1RFOiBhZGQgYSBnYXAgdGhhdCBzaG91bGQgYmUgYXZvaWRlZCBkdXJpbmcgcmV0cmVhdFxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZEdhcCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAoMCwgdW5pY29kZV9qc18xLmdldFN1cnJvZ2F0ZVBhaXJDb2RlUG9pbnQpKGNwLCBuZXh0Q3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vTk9URTogd2UgYXJlIGF0IHRoZSBlbmQgb2YgYSBjaHVuaywgdGhlcmVmb3JlIHdlIGNhbid0IGluZmVyIHRoZSBzdXJyb2dhdGUgcGFpciB5ZXQuXG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmxhc3RDaHVua1dyaXR0ZW4pIHtcbiAgICAgICAgICAgIHRoaXMuZW5kT2ZDaHVua0hpdCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjtcbiAgICAgICAgfVxuICAgICAgICAvL05PVEU6IGlzb2xhdGVkIHN1cnJvZ2F0ZVxuICAgICAgICB0aGlzLl9lcnIoZXJyb3JfY29kZXNfanNfMS5FUlIuc3Vycm9nYXRlSW5JbnB1dFN0cmVhbSk7XG4gICAgICAgIHJldHVybiBjcDtcbiAgICB9XG4gICAgd2lsbERyb3BQYXJzZWRDaHVuaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zID4gdGhpcy5idWZmZXJXYXRlcmxpbmU7XG4gICAgfVxuICAgIGRyb3BQYXJzZWRDaHVuaygpIHtcbiAgICAgICAgaWYgKHRoaXMud2lsbERyb3BQYXJzZWRDaHVuaygpKSB7XG4gICAgICAgICAgICB0aGlzLmh0bWwgPSB0aGlzLmh0bWwuc3Vic3RyaW5nKHRoaXMucG9zKTtcbiAgICAgICAgICAgIHRoaXMubGluZVN0YXJ0UG9zIC09IHRoaXMucG9zO1xuICAgICAgICAgICAgdGhpcy5kcm9wcGVkQnVmZmVyU2l6ZSArPSB0aGlzLnBvcztcbiAgICAgICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgICAgIHRoaXMubGFzdEdhcFBvcyA9IC0yO1xuICAgICAgICAgICAgdGhpcy5nYXBTdGFjay5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdyaXRlKGNodW5rLCBpc0xhc3RDaHVuaykge1xuICAgICAgICBpZiAodGhpcy5odG1sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuaHRtbCArPSBjaHVuaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaHRtbCA9IGNodW5rO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5kT2ZDaHVua0hpdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxhc3RDaHVua1dyaXR0ZW4gPSBpc0xhc3RDaHVuaztcbiAgICB9XG4gICAgaW5zZXJ0SHRtbEF0Q3VycmVudFBvcyhjaHVuaykge1xuICAgICAgICB0aGlzLmh0bWwgPSB0aGlzLmh0bWwuc3Vic3RyaW5nKDAsIHRoaXMucG9zICsgMSkgKyBjaHVuayArIHRoaXMuaHRtbC5zdWJzdHJpbmcodGhpcy5wb3MgKyAxKTtcbiAgICAgICAgdGhpcy5lbmRPZkNodW5rSGl0ID0gZmFsc2U7XG4gICAgfVxuICAgIHN0YXJ0c1dpdGgocGF0dGVybiwgY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICAvLyBDaGVjayBpZiBvdXIgYnVmZmVyIGhhcyBlbm91Z2ggY2hhcmFjdGVyc1xuICAgICAgICBpZiAodGhpcy5wb3MgKyBwYXR0ZXJuLmxlbmd0aCA+IHRoaXMuaHRtbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kT2ZDaHVua0hpdCA9ICF0aGlzLmxhc3RDaHVua1dyaXR0ZW47XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhc2VTZW5zaXRpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0bWwuc3RhcnRzV2l0aChwYXR0ZXJuLCB0aGlzLnBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjcCA9IHRoaXMuaHRtbC5jaGFyQ29kZUF0KHRoaXMucG9zICsgaSkgfCAweDIwO1xuICAgICAgICAgICAgaWYgKGNwICE9PSBwYXR0ZXJuLmNoYXJDb2RlQXQoaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHBlZWsob2Zmc2V0KSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zICsgb2Zmc2V0O1xuICAgICAgICBpZiAocG9zID49IHRoaXMuaHRtbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kT2ZDaHVua0hpdCA9ICF0aGlzLmxhc3RDaHVua1dyaXR0ZW47XG4gICAgICAgICAgICByZXR1cm4gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5odG1sLmNoYXJDb2RlQXQocG9zKTtcbiAgICB9XG4gICAgYWR2YW5jZSgpIHtcbiAgICAgICAgdGhpcy5wb3MrKztcbiAgICAgICAgLy9OT1RFOiBMRiBzaG91bGQgYmUgaW4gdGhlIGxhc3QgY29sdW1uIG9mIHRoZSBsaW5lXG4gICAgICAgIGlmICh0aGlzLmlzRW9sKSB7XG4gICAgICAgICAgICB0aGlzLmlzRW9sID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmxpbmUrKztcbiAgICAgICAgICAgIHRoaXMubGluZVN0YXJ0UG9zID0gdGhpcy5wb3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMuaHRtbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kT2ZDaHVua0hpdCA9ICF0aGlzLmxhc3RDaHVua1dyaXR0ZW47XG4gICAgICAgICAgICByZXR1cm4gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkVPRjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3AgPSB0aGlzLmh0bWwuY2hhckNvZGVBdCh0aGlzLnBvcyk7XG4gICAgICAgIC8vTk9URTogYWxsIFUrMDAwRCBDQVJSSUFHRSBSRVRVUk4gKENSKSBjaGFyYWN0ZXJzIG11c3QgYmUgY29udmVydGVkIHRvIFUrMDAwQSBMSU5FIEZFRUQgKExGKSBjaGFyYWN0ZXJzXG4gICAgICAgIGlmIChjcCA9PT0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkNBUlJJQUdFX1JFVFVSTikge1xuICAgICAgICAgICAgdGhpcy5pc0VvbCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNraXBOZXh0TmV3TGluZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxJTkVfRkVFRDtcbiAgICAgICAgfVxuICAgICAgICAvL05PVEU6IGFueSBVKzAwMEEgTElORSBGRUVEIChMRikgY2hhcmFjdGVycyB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvdyBhIFUrMDAwRCBDQVJSSUFHRSBSRVRVUk4gKENSKSBjaGFyYWN0ZXJcbiAgICAgICAgLy9tdXN0IGJlIGlnbm9yZWQuXG4gICAgICAgIGlmIChjcCA9PT0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkxJTkVfRkVFRCkge1xuICAgICAgICAgICAgdGhpcy5pc0VvbCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5za2lwTmV4dE5ld0xpbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBgbGluZWAgd2lsbCBiZSBidW1wZWQgYWdhaW4gaW4gdGhlIHJlY3Vyc2l2ZSBjYWxsLlxuICAgICAgICAgICAgICAgIHRoaXMubGluZS0tO1xuICAgICAgICAgICAgICAgIHRoaXMuc2tpcE5leHROZXdMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkR2FwKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2tpcE5leHROZXdMaW5lID0gZmFsc2U7XG4gICAgICAgIGlmICgoMCwgdW5pY29kZV9qc18xLmlzU3Vycm9nYXRlKShjcCkpIHtcbiAgICAgICAgICAgIGNwID0gdGhpcy5fcHJvY2Vzc1N1cnJvZ2F0ZShjcCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9PUFRJTUlaQVRJT046IGZpcnN0IGNoZWNrIGlmIGNvZGUgcG9pbnQgaXMgaW4gdGhlIGNvbW1vbiBhbGxvd2VkXG4gICAgICAgIC8vcmFuZ2UgKEFTQ0lJIGFscGhhbnVtZXJpYywgd2hpdGVzcGFjZXMsIGJpZyBjaHVuayBvZiBCTVApXG4gICAgICAgIC8vYmVmb3JlIGdvaW5nIGludG8gZGV0YWlsZWQgcGVyZm9ybWFuY2UgY29zdCB2YWxpZGF0aW9uLlxuICAgICAgICBjb25zdCBpc0NvbW1vblZhbGlkUmFuZ2UgPSB0aGlzLmhhbmRsZXIub25QYXJzZUVycm9yID09PSBudWxsIHx8XG4gICAgICAgICAgICAoY3AgPiAweDFmICYmIGNwIDwgMHg3ZikgfHxcbiAgICAgICAgICAgIGNwID09PSB1bmljb2RlX2pzXzEuQ09ERV9QT0lOVFMuTElORV9GRUVEIHx8XG4gICAgICAgICAgICBjcCA9PT0gdW5pY29kZV9qc18xLkNPREVfUE9JTlRTLkNBUlJJQUdFX1JFVFVSTiB8fFxuICAgICAgICAgICAgKGNwID4gMHg5ZiAmJiBjcCA8IDY0OTc2KTtcbiAgICAgICAgaWYgKCFpc0NvbW1vblZhbGlkUmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrRm9yUHJvYmxlbWF0aWNDaGFyYWN0ZXJzKGNwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3A7XG4gICAgfVxuICAgIF9jaGVja0ZvclByb2JsZW1hdGljQ2hhcmFjdGVycyhjcCkge1xuICAgICAgICBpZiAoKDAsIHVuaWNvZGVfanNfMS5pc0NvbnRyb2xDb2RlUG9pbnQpKGNwKSkge1xuICAgICAgICAgICAgdGhpcy5fZXJyKGVycm9yX2NvZGVzX2pzXzEuRVJSLmNvbnRyb2xDaGFyYWN0ZXJJbklucHV0U3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoMCwgdW5pY29kZV9qc18xLmlzVW5kZWZpbmVkQ29kZVBvaW50KShjcCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VycihlcnJvcl9jb2Rlc19qc18xLkVSUi5ub25jaGFyYWN0ZXJJbklucHV0U3RyZWFtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXRyZWF0KGNvdW50KSB7XG4gICAgICAgIHRoaXMucG9zIC09IGNvdW50O1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCB0aGlzLmxhc3RHYXBQb3MpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEdhcFBvcyA9IHRoaXMuZ2FwU3RhY2sucG9wKCk7XG4gICAgICAgICAgICB0aGlzLnBvcy0tO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNFb2wgPSBmYWxzZTtcbiAgICB9XG59XG5leHBvcnRzLlByZXByb2Nlc3NvciA9IFByZXByb2Nlc3Nvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByZXByb2Nlc3Nvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdFRyZWVBZGFwdGVyID0gZXhwb3J0cy5Ob2RlVHlwZSA9IHZvaWQgMDtcbmNvbnN0IGh0bWxfanNfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vaHRtbC5qc1wiKTtcbnZhciBOb2RlVHlwZTtcbihmdW5jdGlvbiAoTm9kZVR5cGUpIHtcbiAgICBOb2RlVHlwZVtcIkRvY3VtZW50XCJdID0gXCIjZG9jdW1lbnRcIjtcbiAgICBOb2RlVHlwZVtcIkRvY3VtZW50RnJhZ21lbnRcIl0gPSBcIiNkb2N1bWVudC1mcmFnbWVudFwiO1xuICAgIE5vZGVUeXBlW1wiQ29tbWVudFwiXSA9IFwiI2NvbW1lbnRcIjtcbiAgICBOb2RlVHlwZVtcIlRleHRcIl0gPSBcIiN0ZXh0XCI7XG4gICAgTm9kZVR5cGVbXCJEb2N1bWVudFR5cGVcIl0gPSBcIiNkb2N1bWVudFR5cGVcIjtcbn0pKE5vZGVUeXBlID0gZXhwb3J0cy5Ob2RlVHlwZSB8fCAoZXhwb3J0cy5Ob2RlVHlwZSA9IHt9KSk7XG5mdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSh2YWx1ZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVOYW1lOiBOb2RlVHlwZS5UZXh0LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcGFyZW50Tm9kZTogbnVsbCxcbiAgICB9O1xufVxuZXhwb3J0cy5kZWZhdWx0VHJlZUFkYXB0ZXIgPSB7XG4gICAgLy9Ob2RlIGNvbnN0cnVjdGlvblxuICAgIGNyZWF0ZURvY3VtZW50KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZU5hbWU6IE5vZGVUeXBlLkRvY3VtZW50LFxuICAgICAgICAgICAgbW9kZTogaHRtbF9qc18xLkRPQ1VNRU5UX01PREUuTk9fUVVJUktTLFxuICAgICAgICAgICAgY2hpbGROb2RlczogW10sXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBjcmVhdGVEb2N1bWVudEZyYWdtZW50KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZU5hbWU6IE5vZGVUeXBlLkRvY3VtZW50RnJhZ21lbnQsXG4gICAgICAgICAgICBjaGlsZE5vZGVzOiBbXSxcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSwgbmFtZXNwYWNlVVJJLCBhdHRycykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZU5hbWU6IHRhZ05hbWUsXG4gICAgICAgICAgICB0YWdOYW1lLFxuICAgICAgICAgICAgYXR0cnMsXG4gICAgICAgICAgICBuYW1lc3BhY2VVUkksXG4gICAgICAgICAgICBjaGlsZE5vZGVzOiBbXSxcbiAgICAgICAgICAgIHBhcmVudE5vZGU6IG51bGwsXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBjcmVhdGVDb21tZW50Tm9kZShkYXRhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlTmFtZTogTm9kZVR5cGUuQ29tbWVudCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXJlbnROb2RlOiBudWxsLFxuICAgICAgICB9O1xuICAgIH0sXG4gICAgLy9UcmVlIG11dGF0aW9uXG4gICAgYXBwZW5kQ2hpbGQocGFyZW50Tm9kZSwgbmV3Tm9kZSkge1xuICAgICAgICBwYXJlbnROb2RlLmNoaWxkTm9kZXMucHVzaChuZXdOb2RlKTtcbiAgICAgICAgbmV3Tm9kZS5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcbiAgICB9LFxuICAgIGluc2VydEJlZm9yZShwYXJlbnROb2RlLCBuZXdOb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gICAgICAgIGNvbnN0IGluc2VydGlvbklkeCA9IHBhcmVudE5vZGUuY2hpbGROb2Rlcy5pbmRleE9mKHJlZmVyZW5jZU5vZGUpO1xuICAgICAgICBwYXJlbnROb2RlLmNoaWxkTm9kZXMuc3BsaWNlKGluc2VydGlvbklkeCwgMCwgbmV3Tm9kZSk7XG4gICAgICAgIG5ld05vZGUucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XG4gICAgfSxcbiAgICBzZXRUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGVFbGVtZW50LCBjb250ZW50RWxlbWVudCkge1xuICAgICAgICB0ZW1wbGF0ZUVsZW1lbnQuY29udGVudCA9IGNvbnRlbnRFbGVtZW50O1xuICAgIH0sXG4gICAgZ2V0VGVtcGxhdGVDb250ZW50KHRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGVtcGxhdGVFbGVtZW50LmNvbnRlbnQ7XG4gICAgfSxcbiAgICBzZXREb2N1bWVudFR5cGUoZG9jdW1lbnQsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkge1xuICAgICAgICBjb25zdCBkb2N0eXBlTm9kZSA9IGRvY3VtZW50LmNoaWxkTm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5ub2RlTmFtZSA9PT0gTm9kZVR5cGUuRG9jdW1lbnRUeXBlKTtcbiAgICAgICAgaWYgKGRvY3R5cGVOb2RlKSB7XG4gICAgICAgICAgICBkb2N0eXBlTm9kZS5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIGRvY3R5cGVOb2RlLnB1YmxpY0lkID0gcHVibGljSWQ7XG4gICAgICAgICAgICBkb2N0eXBlTm9kZS5zeXN0ZW1JZCA9IHN5c3RlbUlkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHtcbiAgICAgICAgICAgICAgICBub2RlTmFtZTogTm9kZVR5cGUuRG9jdW1lbnRUeXBlLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgcHVibGljSWQsXG4gICAgICAgICAgICAgICAgc3lzdGVtSWQsXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZTogbnVsbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBleHBvcnRzLmRlZmF1bHRUcmVlQWRhcHRlci5hcHBlbmRDaGlsZChkb2N1bWVudCwgbm9kZSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHNldERvY3VtZW50TW9kZShkb2N1bWVudCwgbW9kZSkge1xuICAgICAgICBkb2N1bWVudC5tb2RlID0gbW9kZTtcbiAgICB9LFxuICAgIGdldERvY3VtZW50TW9kZShkb2N1bWVudCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQubW9kZTtcbiAgICB9LFxuICAgIGRldGFjaE5vZGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBub2RlLnBhcmVudE5vZGUuY2hpbGROb2Rlcy5pbmRleE9mKG5vZGUpO1xuICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLmNoaWxkTm9kZXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICBub2RlLnBhcmVudE5vZGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBpbnNlcnRUZXh0KHBhcmVudE5vZGUsIHRleHQpIHtcbiAgICAgICAgaWYgKHBhcmVudE5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2Tm9kZSA9IHBhcmVudE5vZGUuY2hpbGROb2Rlc1twYXJlbnROb2RlLmNoaWxkTm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAoZXhwb3J0cy5kZWZhdWx0VHJlZUFkYXB0ZXIuaXNUZXh0Tm9kZShwcmV2Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICBwcmV2Tm9kZS52YWx1ZSArPSB0ZXh0O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBleHBvcnRzLmRlZmF1bHRUcmVlQWRhcHRlci5hcHBlbmRDaGlsZChwYXJlbnROb2RlLCBjcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7XG4gICAgfSxcbiAgICBpbnNlcnRUZXh0QmVmb3JlKHBhcmVudE5vZGUsIHRleHQsIHJlZmVyZW5jZU5vZGUpIHtcbiAgICAgICAgY29uc3QgcHJldk5vZGUgPSBwYXJlbnROb2RlLmNoaWxkTm9kZXNbcGFyZW50Tm9kZS5jaGlsZE5vZGVzLmluZGV4T2YocmVmZXJlbmNlTm9kZSkgLSAxXTtcbiAgICAgICAgaWYgKHByZXZOb2RlICYmIGV4cG9ydHMuZGVmYXVsdFRyZWVBZGFwdGVyLmlzVGV4dE5vZGUocHJldk5vZGUpKSB7XG4gICAgICAgICAgICBwcmV2Tm9kZS52YWx1ZSArPSB0ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXhwb3J0cy5kZWZhdWx0VHJlZUFkYXB0ZXIuaW5zZXJ0QmVmb3JlKHBhcmVudE5vZGUsIGNyZWF0ZVRleHROb2RlKHRleHQpLCByZWZlcmVuY2VOb2RlKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgYWRvcHRBdHRyaWJ1dGVzKHJlY2lwaWVudCwgYXR0cnMpIHtcbiAgICAgICAgY29uc3QgcmVjaXBpZW50QXR0cnNNYXAgPSBuZXcgU2V0KHJlY2lwaWVudC5hdHRycy5tYXAoKGF0dHIpID0+IGF0dHIubmFtZSkpO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoIXJlY2lwaWVudEF0dHJzTWFwLmhhcyhhdHRyc1tqXS5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHJlY2lwaWVudC5hdHRycy5wdXNoKGF0dHJzW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy9UcmVlIHRyYXZlcnNpbmdcbiAgICBnZXRGaXJzdENoaWxkKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGROb2Rlc1swXTtcbiAgICB9LFxuICAgIGdldENoaWxkTm9kZXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzO1xuICAgIH0sXG4gICAgZ2V0UGFyZW50Tm9kZShub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLnBhcmVudE5vZGU7XG4gICAgfSxcbiAgICBnZXRBdHRyTGlzdChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmF0dHJzO1xuICAgIH0sXG4gICAgLy9Ob2RlIGRhdGFcbiAgICBnZXRUYWdOYW1lKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudGFnTmFtZTtcbiAgICB9LFxuICAgIGdldE5hbWVzcGFjZVVSSShlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50Lm5hbWVzcGFjZVVSSTtcbiAgICB9LFxuICAgIGdldFRleHROb2RlQ29udGVudCh0ZXh0Tm9kZSkge1xuICAgICAgICByZXR1cm4gdGV4dE5vZGUudmFsdWU7XG4gICAgfSxcbiAgICBnZXRDb21tZW50Tm9kZUNvbnRlbnQoY29tbWVudE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbW1lbnROb2RlLmRhdGE7XG4gICAgfSxcbiAgICBnZXREb2N1bWVudFR5cGVOb2RlTmFtZShkb2N0eXBlTm9kZSkge1xuICAgICAgICByZXR1cm4gZG9jdHlwZU5vZGUubmFtZTtcbiAgICB9LFxuICAgIGdldERvY3VtZW50VHlwZU5vZGVQdWJsaWNJZChkb2N0eXBlTm9kZSkge1xuICAgICAgICByZXR1cm4gZG9jdHlwZU5vZGUucHVibGljSWQ7XG4gICAgfSxcbiAgICBnZXREb2N1bWVudFR5cGVOb2RlU3lzdGVtSWQoZG9jdHlwZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGRvY3R5cGVOb2RlLnN5c3RlbUlkO1xuICAgIH0sXG4gICAgLy9Ob2RlIHR5cGVzXG4gICAgaXNUZXh0Tm9kZShub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLm5vZGVOYW1lID09PSAnI3RleHQnO1xuICAgIH0sXG4gICAgaXNDb21tZW50Tm9kZShub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLm5vZGVOYW1lID09PSAnI2NvbW1lbnQnO1xuICAgIH0sXG4gICAgaXNEb2N1bWVudFR5cGVOb2RlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUubm9kZU5hbWUgPT09IE5vZGVUeXBlLkRvY3VtZW50VHlwZTtcbiAgICB9LFxuICAgIGlzRWxlbWVudE5vZGUobm9kZSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsICd0YWdOYW1lJyk7XG4gICAgfSxcbiAgICAvLyBTb3VyY2UgY29kZSBsb2NhdGlvblxuICAgIHNldE5vZGVTb3VyY2VDb2RlTG9jYXRpb24obm9kZSwgbG9jYXRpb24pIHtcbiAgICAgICAgbm9kZS5zb3VyY2VDb2RlTG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICB9LFxuICAgIGdldE5vZGVTb3VyY2VDb2RlTG9jYXRpb24obm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5zb3VyY2VDb2RlTG9jYXRpb247XG4gICAgfSxcbiAgICB1cGRhdGVOb2RlU291cmNlQ29kZUxvY2F0aW9uKG5vZGUsIGVuZExvY2F0aW9uKSB7XG4gICAgICAgIG5vZGUuc291cmNlQ29kZUxvY2F0aW9uID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBub2RlLnNvdXJjZUNvZGVMb2NhdGlvbiksIGVuZExvY2F0aW9uKTtcbiAgICB9LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZmF1bHQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlY29kZVhNTCA9IGV4cG9ydHMuZGVjb2RlSFRNTFN0cmljdCA9IGV4cG9ydHMuZGVjb2RlSFRNTCA9IGV4cG9ydHMuZGV0ZXJtaW5lQnJhbmNoID0gZXhwb3J0cy5CaW5UcmllRmxhZ3MgPSBleHBvcnRzLmZyb21Db2RlUG9pbnQgPSBleHBvcnRzLnJlcGxhY2VDb2RlUG9pbnQgPSBleHBvcnRzLmRlY29kZUNvZGVQb2ludCA9IGV4cG9ydHMueG1sRGVjb2RlVHJlZSA9IGV4cG9ydHMuaHRtbERlY29kZVRyZWUgPSB2b2lkIDA7XG52YXIgZGVjb2RlX2RhdGFfaHRtbF9qc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2dlbmVyYXRlZC9kZWNvZGUtZGF0YS1odG1sLmpzXCIpKTtcbmV4cG9ydHMuaHRtbERlY29kZVRyZWUgPSBkZWNvZGVfZGF0YV9odG1sX2pzXzEuZGVmYXVsdDtcbnZhciBkZWNvZGVfZGF0YV94bWxfanNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9nZW5lcmF0ZWQvZGVjb2RlLWRhdGEteG1sLmpzXCIpKTtcbmV4cG9ydHMueG1sRGVjb2RlVHJlZSA9IGRlY29kZV9kYXRhX3htbF9qc18xLmRlZmF1bHQ7XG52YXIgZGVjb2RlX2NvZGVwb2ludF9qc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlY29kZV9jb2RlcG9pbnQuanNcIikpO1xuZXhwb3J0cy5kZWNvZGVDb2RlUG9pbnQgPSBkZWNvZGVfY29kZXBvaW50X2pzXzEuZGVmYXVsdDtcbnZhciBkZWNvZGVfY29kZXBvaW50X2pzXzIgPSByZXF1aXJlKFwiLi9kZWNvZGVfY29kZXBvaW50LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicmVwbGFjZUNvZGVQb2ludFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGVjb2RlX2NvZGVwb2ludF9qc18yLnJlcGxhY2VDb2RlUG9pbnQ7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJmcm9tQ29kZVBvaW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkZWNvZGVfY29kZXBvaW50X2pzXzIuZnJvbUNvZGVQb2ludDsgfSB9KTtcbnZhciBDaGFyQ29kZXM7XG4oZnVuY3Rpb24gKENoYXJDb2Rlcykge1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJOVU1cIl0gPSAzNV0gPSBcIk5VTVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJTRU1JXCJdID0gNTldID0gXCJTRU1JXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIlpFUk9cIl0gPSA0OF0gPSBcIlpFUk9cIjtcbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiTklORVwiXSA9IDU3XSA9IFwiTklORVwiO1xuICAgIENoYXJDb2Rlc1tDaGFyQ29kZXNbXCJMT1dFUl9BXCJdID0gOTddID0gXCJMT1dFUl9BXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxPV0VSX0ZcIl0gPSAxMDJdID0gXCJMT1dFUl9GXCI7XG4gICAgQ2hhckNvZGVzW0NoYXJDb2Rlc1tcIkxPV0VSX1hcIl0gPSAxMjBdID0gXCJMT1dFUl9YXCI7XG4gICAgLyoqIEJpdCB0aGF0IG5lZWRzIHRvIGJlIHNldCB0byBjb252ZXJ0IGFuIHVwcGVyIGNhc2UgQVNDSUkgY2hhcmFjdGVyIHRvIGxvd2VyIGNhc2UgKi9cbiAgICBDaGFyQ29kZXNbQ2hhckNvZGVzW1wiVG9fTE9XRVJfQklUXCJdID0gMzJdID0gXCJUb19MT1dFUl9CSVRcIjtcbn0pKENoYXJDb2RlcyB8fCAoQ2hhckNvZGVzID0ge30pKTtcbnZhciBCaW5UcmllRmxhZ3M7XG4oZnVuY3Rpb24gKEJpblRyaWVGbGFncykge1xuICAgIEJpblRyaWVGbGFnc1tCaW5UcmllRmxhZ3NbXCJWQUxVRV9MRU5HVEhcIl0gPSA0OTE1Ml0gPSBcIlZBTFVFX0xFTkdUSFwiO1xuICAgIEJpblRyaWVGbGFnc1tCaW5UcmllRmxhZ3NbXCJCUkFOQ0hfTEVOR1RIXCJdID0gMTYyNTZdID0gXCJCUkFOQ0hfTEVOR1RIXCI7XG4gICAgQmluVHJpZUZsYWdzW0JpblRyaWVGbGFnc1tcIkpVTVBfVEFCTEVcIl0gPSAxMjddID0gXCJKVU1QX1RBQkxFXCI7XG59KShCaW5UcmllRmxhZ3MgPSBleHBvcnRzLkJpblRyaWVGbGFncyB8fCAoZXhwb3J0cy5CaW5UcmllRmxhZ3MgPSB7fSkpO1xuZnVuY3Rpb24gZ2V0RGVjb2RlcihkZWNvZGVUcmVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGRlY29kZUhUTUxCaW5hcnkoc3RyLCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIHJldCA9IFwiXCI7XG4gICAgICAgIHZhciBsYXN0SWR4ID0gMDtcbiAgICAgICAgdmFyIHN0cklkeCA9IDA7XG4gICAgICAgIHdoaWxlICgoc3RySWR4ID0gc3RyLmluZGV4T2YoXCImXCIsIHN0cklkeCkpID49IDApIHtcbiAgICAgICAgICAgIHJldCArPSBzdHIuc2xpY2UobGFzdElkeCwgc3RySWR4KTtcbiAgICAgICAgICAgIGxhc3RJZHggPSBzdHJJZHg7XG4gICAgICAgICAgICAvLyBTa2lwIHRoZSBcIiZcIlxuICAgICAgICAgICAgc3RySWR4ICs9IDE7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgbnVtZXJpYyBlbnRpdHksIGhhbmRsZSB0aGlzIHNlcGFyYXRlbHkuXG4gICAgICAgICAgICBpZiAoc3RyLmNoYXJDb2RlQXQoc3RySWR4KSA9PT0gQ2hhckNvZGVzLk5VTSkge1xuICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGxlYWRpbmcgXCImI1wiLiBGb3IgaGV4IGVudGl0aWVzLCBhbHNvIHNraXAgdGhlIGxlYWRpbmcgXCJ4XCIuXG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc3RySWR4ICsgMTtcbiAgICAgICAgICAgICAgICB2YXIgYmFzZSA9IDEwO1xuICAgICAgICAgICAgICAgIHZhciBjcCA9IHN0ci5jaGFyQ29kZUF0KHN0YXJ0KTtcbiAgICAgICAgICAgICAgICBpZiAoKGNwIHwgQ2hhckNvZGVzLlRvX0xPV0VSX0JJVCkgPT09IENoYXJDb2Rlcy5MT1dFUl9YKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhc2UgPSAxNjtcbiAgICAgICAgICAgICAgICAgICAgc3RySWR4ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvXG4gICAgICAgICAgICAgICAgICAgIGNwID0gc3RyLmNoYXJDb2RlQXQoKytzdHJJZHgpO1xuICAgICAgICAgICAgICAgIHdoaWxlICgoY3AgPj0gQ2hhckNvZGVzLlpFUk8gJiYgY3AgPD0gQ2hhckNvZGVzLk5JTkUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChiYXNlID09PSAxNiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNwIHwgQ2hhckNvZGVzLlRvX0xPV0VSX0JJVCkgPj0gQ2hhckNvZGVzLkxPV0VSX0EgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChjcCB8IENoYXJDb2Rlcy5Ub19MT1dFUl9CSVQpIDw9IENoYXJDb2Rlcy5MT1dFUl9GKSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9PSBzdHJJZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVudGl0eSA9IHN0ci5zdWJzdHJpbmcoc3RhcnQsIHN0cklkeCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChlbnRpdHksIGJhc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RyLmNoYXJDb2RlQXQoc3RySWR4KSA9PT0gQ2hhckNvZGVzLlNFTUkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cklkeCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0ICs9ICgwLCBkZWNvZGVfY29kZXBvaW50X2pzXzEuZGVmYXVsdCkocGFyc2VkKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdElkeCA9IHN0cklkeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVzdWx0SWR4ID0gMDtcbiAgICAgICAgICAgIHZhciBleGNlc3MgPSAxO1xuICAgICAgICAgICAgdmFyIHRyZWVJZHggPSAwO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBkZWNvZGVUcmVlW3RyZWVJZHhdO1xuICAgICAgICAgICAgZm9yICg7IHN0cklkeCA8IHN0ci5sZW5ndGg7IHN0cklkeCsrLCBleGNlc3MrKykge1xuICAgICAgICAgICAgICAgIHRyZWVJZHggPSBkZXRlcm1pbmVCcmFuY2goZGVjb2RlVHJlZSwgY3VycmVudCwgdHJlZUlkeCArIDEsIHN0ci5jaGFyQ29kZUF0KHN0cklkeCkpO1xuICAgICAgICAgICAgICAgIGlmICh0cmVlSWR4IDwgMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGRlY29kZVRyZWVbdHJlZUlkeF07XG4gICAgICAgICAgICAgICAgdmFyIG1hc2tlZCA9IGN1cnJlbnQgJiBCaW5UcmllRmxhZ3MuVkFMVUVfTEVOR1RIO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBicmFuY2ggaXMgYSB2YWx1ZSwgc3RvcmUgaXQgYW5kIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgaWYgKG1hc2tlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgbGVnYWN5IGVudGl0eSB3aGlsZSBwYXJzaW5nIHN0cmljdGx5LCBqdXN0IHNraXAgdGhlIG51bWJlciBvZiBieXRlc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmljdCB8fCBzdHIuY2hhckNvZGVBdChzdHJJZHgpID09PSBDaGFyQ29kZXMuU0VNSSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0SWR4ID0gdHJlZUlkeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VzcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG1hc2sgaXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiB0aGUgdmFsdWUsIGluY2x1ZGluZyB0aGUgY3VycmVudCBieXRlLlxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVMZW5ndGggPSAobWFza2VkID4+IDE0KSAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB0cmVlSWR4ICs9IHZhbHVlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHRJZHggIT09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVMZW5ndGggPSAoZGVjb2RlVHJlZVtyZXN1bHRJZHhdICYgQmluVHJpZUZsYWdzLlZBTFVFX0xFTkdUSCkgPj4gMTQ7XG4gICAgICAgICAgICAgICAgcmV0ICs9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlTGVuZ3RoID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFN0cmluZy5mcm9tQ2hhckNvZGUoZGVjb2RlVHJlZVtyZXN1bHRJZHhdICYgfkJpblRyaWVGbGFncy5WQUxVRV9MRU5HVEgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlTGVuZ3RoID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGRlY29kZVRyZWVbcmVzdWx0SWR4ICsgMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKGRlY29kZVRyZWVbcmVzdWx0SWR4ICsgMV0sIGRlY29kZVRyZWVbcmVzdWx0SWR4ICsgMl0pO1xuICAgICAgICAgICAgICAgIGxhc3RJZHggPSBzdHJJZHggLSBleGNlc3MgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQgKyBzdHIuc2xpY2UobGFzdElkeCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGRldGVybWluZUJyYW5jaChkZWNvZGVUcmVlLCBjdXJyZW50LCBub2RlSWR4LCBjaGFyKSB7XG4gICAgdmFyIGJyYW5jaENvdW50ID0gKGN1cnJlbnQgJiBCaW5UcmllRmxhZ3MuQlJBTkNIX0xFTkdUSCkgPj4gNztcbiAgICB2YXIganVtcE9mZnNldCA9IGN1cnJlbnQgJiBCaW5UcmllRmxhZ3MuSlVNUF9UQUJMRTtcbiAgICAvLyBDYXNlIDE6IFNpbmdsZSBicmFuY2ggZW5jb2RlZCBpbiBqdW1wIG9mZnNldFxuICAgIGlmIChicmFuY2hDb3VudCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ganVtcE9mZnNldCAhPT0gMCAmJiBjaGFyID09PSBqdW1wT2Zmc2V0ID8gbm9kZUlkeCA6IC0xO1xuICAgIH1cbiAgICAvLyBDYXNlIDI6IE11bHRpcGxlIGJyYW5jaGVzIGVuY29kZWQgaW4ganVtcCB0YWJsZVxuICAgIGlmIChqdW1wT2Zmc2V0KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGNoYXIgLSBqdW1wT2Zmc2V0O1xuICAgICAgICByZXR1cm4gdmFsdWUgPCAwIHx8IHZhbHVlID4gYnJhbmNoQ291bnRcbiAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgIDogZGVjb2RlVHJlZVtub2RlSWR4ICsgdmFsdWVdIC0gMTtcbiAgICB9XG4gICAgLy8gQ2FzZSAzOiBNdWx0aXBsZSBicmFuY2hlcyBlbmNvZGVkIGluIGRpY3Rpb25hcnlcbiAgICAvLyBCaW5hcnkgc2VhcmNoIGZvciB0aGUgY2hhcmFjdGVyLlxuICAgIHZhciBsbyA9IG5vZGVJZHg7XG4gICAgdmFyIGhpID0gbG8gKyBicmFuY2hDb3VudCAtIDE7XG4gICAgd2hpbGUgKGxvIDw9IGhpKSB7XG4gICAgICAgIHZhciBtaWQgPSAobG8gKyBoaSkgPj4+IDE7XG4gICAgICAgIHZhciBtaWRWYWwgPSBkZWNvZGVUcmVlW21pZF07XG4gICAgICAgIGlmIChtaWRWYWwgPCBjaGFyKSB7XG4gICAgICAgICAgICBsbyA9IG1pZCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWlkVmFsID4gY2hhcikge1xuICAgICAgICAgICAgaGkgPSBtaWQgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRlY29kZVRyZWVbbWlkICsgYnJhbmNoQ291bnRdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbmV4cG9ydHMuZGV0ZXJtaW5lQnJhbmNoID0gZGV0ZXJtaW5lQnJhbmNoO1xudmFyIGh0bWxEZWNvZGVyID0gZ2V0RGVjb2RlcihkZWNvZGVfZGF0YV9odG1sX2pzXzEuZGVmYXVsdCk7XG52YXIgeG1sRGVjb2RlciA9IGdldERlY29kZXIoZGVjb2RlX2RhdGFfeG1sX2pzXzEuZGVmYXVsdCk7XG5mdW5jdGlvbiBkZWNvZGVIVE1MKHN0cikge1xuICAgIHJldHVybiBodG1sRGVjb2RlcihzdHIsIGZhbHNlKTtcbn1cbmV4cG9ydHMuZGVjb2RlSFRNTCA9IGRlY29kZUhUTUw7XG5mdW5jdGlvbiBkZWNvZGVIVE1MU3RyaWN0KHN0cikge1xuICAgIHJldHVybiBodG1sRGVjb2RlcihzdHIsIHRydWUpO1xufVxuZXhwb3J0cy5kZWNvZGVIVE1MU3RyaWN0ID0gZGVjb2RlSFRNTFN0cmljdDtcbmZ1bmN0aW9uIGRlY29kZVhNTChzdHIpIHtcbiAgICByZXR1cm4geG1sRGVjb2RlcihzdHIsIHRydWUpO1xufVxuZXhwb3J0cy5kZWNvZGVYTUwgPSBkZWNvZGVYTUw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWNvZGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvaGUvYmxvYi8zNmFmZTE3OTM5MjIyNmNmMWI2Y2NkYjE2ZWJiYjdhNWE4NDRkOTNhL3NyYy9oZS5qcyNMMTA2LUwxMzRcbnZhciBfYTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVwbGFjZUNvZGVQb2ludCA9IGV4cG9ydHMuZnJvbUNvZGVQb2ludCA9IHZvaWQgMDtcbnZhciBkZWNvZGVNYXAgPSBuZXcgTWFwKFtcbiAgICBbMCwgNjU1MzNdLFxuICAgIFsxMjgsIDgzNjRdLFxuICAgIFsxMzAsIDgyMThdLFxuICAgIFsxMzEsIDQwMl0sXG4gICAgWzEzMiwgODIyMl0sXG4gICAgWzEzMywgODIzMF0sXG4gICAgWzEzNCwgODIyNF0sXG4gICAgWzEzNSwgODIyNV0sXG4gICAgWzEzNiwgNzEwXSxcbiAgICBbMTM3LCA4MjQwXSxcbiAgICBbMTM4LCAzNTJdLFxuICAgIFsxMzksIDgyNDldLFxuICAgIFsxNDAsIDMzOF0sXG4gICAgWzE0MiwgMzgxXSxcbiAgICBbMTQ1LCA4MjE2XSxcbiAgICBbMTQ2LCA4MjE3XSxcbiAgICBbMTQ3LCA4MjIwXSxcbiAgICBbMTQ4LCA4MjIxXSxcbiAgICBbMTQ5LCA4MjI2XSxcbiAgICBbMTUwLCA4MjExXSxcbiAgICBbMTUxLCA4MjEyXSxcbiAgICBbMTUyLCA3MzJdLFxuICAgIFsxNTMsIDg0ODJdLFxuICAgIFsxNTQsIDM1M10sXG4gICAgWzE1NSwgODI1MF0sXG4gICAgWzE1NiwgMzM5XSxcbiAgICBbMTU4LCAzODJdLFxuICAgIFsxNTksIDM3Nl0sXG5dKTtcbmV4cG9ydHMuZnJvbUNvZGVQb2ludCA9IFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24sIG5vZGUvbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvZXMtYnVpbHRpbnNcbihfYSA9IFN0cmluZy5mcm9tQ29kZVBvaW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmdW5jdGlvbiAoY29kZVBvaW50KSB7XG4gICAgdmFyIG91dHB1dCA9IFwiXCI7XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4ZmZmZikge1xuICAgICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcbiAgICAgICAgb3V0cHV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjb2RlUG9pbnQgPj4+IDEwKSAmIDB4M2ZmKSB8IDB4ZDgwMCk7XG4gICAgICAgIGNvZGVQb2ludCA9IDB4ZGMwMCB8IChjb2RlUG9pbnQgJiAweDNmZik7XG4gICAgfVxuICAgIG91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG4gICAgcmV0dXJuIG91dHB1dDtcbn07XG5mdW5jdGlvbiByZXBsYWNlQ29kZVBvaW50KGNvZGVQb2ludCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoKGNvZGVQb2ludCA+PSAweGQ4MDAgJiYgY29kZVBvaW50IDw9IDB4ZGZmZikgfHwgY29kZVBvaW50ID4gMHgxMGZmZmYpIHtcbiAgICAgICAgcmV0dXJuIDB4ZmZmZDtcbiAgICB9XG4gICAgcmV0dXJuIChfYSA9IGRlY29kZU1hcC5nZXQoY29kZVBvaW50KSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY29kZVBvaW50O1xufVxuZXhwb3J0cy5yZXBsYWNlQ29kZVBvaW50ID0gcmVwbGFjZUNvZGVQb2ludDtcbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludChjb2RlUG9pbnQpIHtcbiAgICByZXR1cm4gKDAsIGV4cG9ydHMuZnJvbUNvZGVQb2ludCkocmVwbGFjZUNvZGVQb2ludChjb2RlUG9pbnQpKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlY29kZUNvZGVQb2ludDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlY29kZV9jb2RlcG9pbnQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmVzY2FwZVRleHQgPSBleHBvcnRzLmVzY2FwZUF0dHJpYnV0ZSA9IGV4cG9ydHMuZXNjYXBlVVRGOCA9IGV4cG9ydHMuZXNjYXBlID0gZXhwb3J0cy5lbmNvZGVYTUwgPSBleHBvcnRzLmdldENvZGVQb2ludCA9IGV4cG9ydHMueG1sUmVwbGFjZXIgPSB2b2lkIDA7XG5leHBvcnRzLnhtbFJlcGxhY2VyID0gL1tcIiYnPD4kXFx4ODAtXFx1RkZGRl0vZztcbnZhciB4bWxDb2RlTWFwID0gbmV3IE1hcChbXG4gICAgWzM0LCBcIiZxdW90O1wiXSxcbiAgICBbMzgsIFwiJmFtcDtcIl0sXG4gICAgWzM5LCBcIiZhcG9zO1wiXSxcbiAgICBbNjAsIFwiJmx0O1wiXSxcbiAgICBbNjIsIFwiJmd0O1wiXSxcbl0pO1xuLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub2RlIDwgNCwgd2Ugd3JhcCBgY29kZVBvaW50QXRgXG5leHBvcnRzLmdldENvZGVQb2ludCA9IFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cblN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXQgIT0gbnVsbFxuICAgID8gZnVuY3Rpb24gKHN0ciwgaW5kZXgpIHsgcmV0dXJuIHN0ci5jb2RlUG9pbnRBdChpbmRleCk7IH1cbiAgICA6IC8vIGh0dHA6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmcjc3Vycm9nYXRlLWZvcm11bGFlXG4gICAgICAgIGZ1bmN0aW9uIChjLCBpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIChjLmNoYXJDb2RlQXQoaW5kZXgpICYgMHhmYzAwKSA9PT0gMHhkODAwXG4gICAgICAgICAgICAgICAgPyAoYy5jaGFyQ29kZUF0KGluZGV4KSAtIDB4ZDgwMCkgKiAweDQwMCArXG4gICAgICAgICAgICAgICAgICAgIGMuY2hhckNvZGVBdChpbmRleCArIDEpIC1cbiAgICAgICAgICAgICAgICAgICAgMHhkYzAwICtcbiAgICAgICAgICAgICAgICAgICAgMHgxMDAwMFxuICAgICAgICAgICAgICAgIDogYy5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgfTtcbi8qKlxuICogRW5jb2RlcyBhbGwgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIGFzIHdlbGwgYXMgY2hhcmFjdGVycyBub3QgdmFsaWQgaW4gWE1MXG4gKiBkb2N1bWVudHMgdXNpbmcgWE1MIGVudGl0aWVzLlxuICpcbiAqIElmIGEgY2hhcmFjdGVyIGhhcyBubyBlcXVpdmFsZW50IGVudGl0eSwgYVxuICogbnVtZXJpYyBoZXhhZGVjaW1hbCByZWZlcmVuY2UgKGVnLiBgJiN4ZmM7YCkgd2lsbCBiZSB1c2VkLlxuICovXG5mdW5jdGlvbiBlbmNvZGVYTUwoc3RyKSB7XG4gICAgdmFyIHJldCA9IFwiXCI7XG4gICAgdmFyIGxhc3RJZHggPSAwO1xuICAgIHZhciBtYXRjaDtcbiAgICB3aGlsZSAoKG1hdGNoID0gZXhwb3J0cy54bWxSZXBsYWNlci5leGVjKHN0cikpICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBpID0gbWF0Y2guaW5kZXg7XG4gICAgICAgIHZhciBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHZhciBuZXh0ID0geG1sQ29kZU1hcC5nZXQoY2hhcik7XG4gICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldCArPSBzdHIuc3Vic3RyaW5nKGxhc3RJZHgsIGkpICsgbmV4dDtcbiAgICAgICAgICAgIGxhc3RJZHggPSBpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldCArPSBcIlwiLmNvbmNhdChzdHIuc3Vic3RyaW5nKGxhc3RJZHgsIGkpLCBcIiYjeFwiKS5jb25jYXQoKDAsIGV4cG9ydHMuZ2V0Q29kZVBvaW50KShzdHIsIGkpLnRvU3RyaW5nKDE2KSwgXCI7XCIpO1xuICAgICAgICAgICAgLy8gSW5jcmVhc2UgYnkgMSBpZiB3ZSBoYXZlIGEgc3Vycm9nYXRlIHBhaXJcbiAgICAgICAgICAgIGxhc3RJZHggPSBleHBvcnRzLnhtbFJlcGxhY2VyLmxhc3RJbmRleCArPSBOdW1iZXIoKGNoYXIgJiAweGZjMDApID09PSAweGQ4MDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQgKyBzdHIuc3Vic3RyKGxhc3RJZHgpO1xufVxuZXhwb3J0cy5lbmNvZGVYTUwgPSBlbmNvZGVYTUw7XG4vKipcbiAqIEVuY29kZXMgYWxsIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBhcyB3ZWxsIGFzIGNoYXJhY3RlcnMgbm90IHZhbGlkIGluIFhNTFxuICogZG9jdW1lbnRzIHVzaW5nIG51bWVyaWMgaGV4YWRlY2ltYWwgcmVmZXJlbmNlIChlZy4gYCYjeGZjO2ApLlxuICpcbiAqIEhhdmUgYSBsb29rIGF0IGBlc2NhcGVVVEY4YCBpZiB5b3Ugd2FudCBhIG1vcmUgY29uY2lzZSBvdXRwdXQgYXQgdGhlIGV4cGVuc2VcbiAqIG9mIHJlZHVjZWQgdHJhbnNwb3J0YWJpbGl0eS5cbiAqXG4gKiBAcGFyYW0gZGF0YSBTdHJpbmcgdG8gZXNjYXBlLlxuICovXG5leHBvcnRzLmVzY2FwZSA9IGVuY29kZVhNTDtcbmZ1bmN0aW9uIGdldEVzY2FwZXIocmVnZXgsIG1hcCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBlc2NhcGUoZGF0YSkge1xuICAgICAgICB2YXIgbWF0Y2g7XG4gICAgICAgIHZhciBsYXN0SWR4ID0gMDtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKGRhdGEpKSkge1xuICAgICAgICAgICAgaWYgKGxhc3RJZHggIT09IG1hdGNoLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGRhdGEuc3Vic3RyaW5nKGxhc3RJZHgsIG1hdGNoLmluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGlzIGNoYXJhcmN0ZXIgd2lsbCBiZSBpbiB0aGUgbWFwLlxuICAgICAgICAgICAgcmVzdWx0ICs9IG1hcC5nZXQobWF0Y2hbMF0uY2hhckNvZGVBdCgwKSk7XG4gICAgICAgICAgICAvLyBFdmVyeSBtYXRjaCB3aWxsIGJlIG9mIGxlbmd0aCAxXG4gICAgICAgICAgICBsYXN0SWR4ID0gbWF0Y2guaW5kZXggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBkYXRhLnN1YnN0cmluZyhsYXN0SWR4KTtcbiAgICB9O1xufVxuLyoqXG4gKiBFbmNvZGVzIGFsbCBjaGFyYWN0ZXJzIG5vdCB2YWxpZCBpbiBYTUwgZG9jdW1lbnRzIHVzaW5nIFhNTCBlbnRpdGllcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIG91dHB1dCB3aWxsIGJlIGNoYXJhY3Rlci1zZXQgZGVwZW5kZW50LlxuICpcbiAqIEBwYXJhbSBkYXRhIFN0cmluZyB0byBlc2NhcGUuXG4gKi9cbmV4cG9ydHMuZXNjYXBlVVRGOCA9IGdldEVzY2FwZXIoL1smPD4nXCJdL2csIHhtbENvZGVNYXApO1xuLyoqXG4gKiBFbmNvZGVzIGFsbCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSB0byBiZSBlc2NhcGVkIGluIEhUTUwgYXR0cmlidXRlcyxcbiAqIGZvbGxvd2luZyB7QGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvcGFyc2luZy5odG1sI2VzY2FwaW5nU3RyaW5nfS5cbiAqXG4gKiBAcGFyYW0gZGF0YSBTdHJpbmcgdG8gZXNjYXBlLlxuICovXG5leHBvcnRzLmVzY2FwZUF0dHJpYnV0ZSA9IGdldEVzY2FwZXIoL1tcIiZcXHUwMEEwXS9nLCBuZXcgTWFwKFtcbiAgICBbMzQsIFwiJnF1b3Q7XCJdLFxuICAgIFszOCwgXCImYW1wO1wiXSxcbiAgICBbMTYwLCBcIiZuYnNwO1wiXSxcbl0pKTtcbi8qKlxuICogRW5jb2RlcyBhbGwgY2hhcmFjdGVycyB0aGF0IGhhdmUgdG8gYmUgZXNjYXBlZCBpbiBIVE1MIHRleHQsXG4gKiBmb2xsb3dpbmcge0BsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3BhcnNpbmcuaHRtbCNlc2NhcGluZ1N0cmluZ30uXG4gKlxuICogQHBhcmFtIGRhdGEgU3RyaW5nIHRvIGVzY2FwZS5cbiAqL1xuZXhwb3J0cy5lc2NhcGVUZXh0ID0gZ2V0RXNjYXBlcigvWyY8PlxcdTAwQTBdL2csIG5ldyBNYXAoW1xuICAgIFszOCwgXCImYW1wO1wiXSxcbiAgICBbNjAsIFwiJmx0O1wiXSxcbiAgICBbNjIsIFwiJmd0O1wiXSxcbiAgICBbMTYwLCBcIiZuYnNwO1wiXSxcbl0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzY2FwZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8vIEdlbmVyYXRlZCB1c2luZyBzY3JpcHRzL3dyaXRlLWRlY29kZS1tYXAudHNcbi8vIHByZXR0aWVyLWlnbm9yZVxuZXhwb3J0cy5kZWZhdWx0ID0gbmV3IFVpbnQxNkFycmF5KFs3NDg5LCA2MCwgMjEzLCAzMDUsIDY1MCwgMTE4MSwgMTQwMywgMTQ4OCwgMTY1MywgMTc1OCwgMTk1NCwgMjAwNiwgMjA2MywgMjYzNCwgMjcwNSwgMzQ4OSwgMzY5MywgMzg0OSwgMzg3OCwgNDI5OCwgNDY0OCwgNDgzMywgNTE0MSwgNTI3NywgNTMxNSwgNTM0MywgNTQxMywgMCwgMCwgMCwgMCwgMCwgMCwgNTQ4MywgNTgzNywgNjU0MSwgNzE4NiwgNzY0NSwgODA2MiwgODI4OCwgODYyNCwgODg0NSwgOTE1MiwgOTIxMSwgOTI4MiwgMTAyNzYsIDEwNTE0LCAxMTUyOCwgMTE4NDgsIDEyMjM4LCAxMjMxMCwgMTI5ODYsIDEzODgxLCAxNDI1MiwgMTQ1OTAsIDE0ODg4LCAxNDk2MSwgMTUwNzIsIDE1MTUwLCAyMDQ4LCA2OSwgNzcsIDk3LCA5OCwgOTksIDEwMiwgMTAzLCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTE0LCAxMTUsIDExNiwgMTE3LCA5MiwgOTgsIDEwMiwgMTA5LCAxMTUsIDEyNywgMTMyLCAxMzksIDE0NCwgMTQ5LCAxNTIsIDE2NiwgMTc5LCAxODUsIDIwMCwgMjA3LCAxMDgsIDEwNSwgMTAzLCAzMjgyNywgMTk4LCAxNjU4MiwgODAsIDMyODI3LCAzOCwgMTY0MjIsIDk5LCAxMTcsIDExNiwgMTAxLCAzMjgyNywgMTkzLCAxNjU3NywgMTE0LCAxMDEsIDExOCwgMTAxLCA1OSwgMTY2NDIsIDI1NiwgMTA1LCAxMjEsIDEyMCwgMTI1LCAxMTQsIDk5LCAzMjgyNywgMTk0LCAxNjU3OCwgNTksIDE3NDI0LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NTgwLCAxMTQsIDk3LCAxMTgsIDEwMSwgMzI4MjcsIDE5MiwgMTY1NzYsIDExMiwgMTA0LCA5NywgNTksIDE3Mjk3LCA5NywgOTksIDExNCwgNTksIDE2NjQwLCAxMDAsIDU5LCAyNzIxOSwgMjU2LCAxMDMsIDExMiwgMTU3LCAxNjEsIDExMSwgMTEwLCA1OSwgMTY2NDQsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MzIsIDExMiwgMTA4LCAxMjEsIDcwLCAxMTcsIDExMCwgOTksIDExNiwgMTA1LCAxMTEsIDExMCwgNTksIDI0NjczLCAxMDUsIDExMCwgMTAzLCAzMjgyNywgMTk3LCAxNjU4MSwgMjU2LCA5OSwgMTE1LCAxOTAsIDE5NSwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjQ3NiwgMTA1LCAxMDMsIDExMCwgNTksIDI1MTcyLCAxMDUsIDEwOCwgMTAwLCAxMDEsIDMyODI3LCAxOTUsIDE2NTc5LCAxMDksIDEwOCwgMzI4MjcsIDE5NiwgMTY1ODAsIDEwMjQsIDk3LCA5OSwgMTAxLCAxMDIsIDExMSwgMTE0LCAxMTUsIDExNywgMjI5LCAyNTEsIDI1NCwgMjc5LCAyODQsIDI5MCwgMjk1LCAyOTgsIDI1NiwgOTksIDExNCwgMjM0LCAyNDIsIDEwNywgMTE1LCAxMDgsIDk3LCAxMTUsIDEwNCwgNTksIDI1MTEwLCAzNzQsIDI0NiwgMjQ4LCA1OSwgMjczNjcsIDEwMSwgMTAwLCA1OSwgMjUzNTAsIDEyMSwgNTksIDE3NDI1LCAzODQsIDk5LCAxMTQsIDExNiwgMjYxLCAyNjcsIDI3NiwgOTcsIDExNywgMTE1LCAxMDEsIDU5LCAyNTE0MSwgMTEwLCAxMTEsIDExNywgMTA4LCAxMDgsIDEwNSwgMTE1LCA1OSwgMjQ4NzYsIDk3LCA1OSwgMTcyOTgsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1ODEsIDExMiwgMTAyLCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYzMywgMTAxLCAxMTgsIDEwMSwgNTksIDE3MTEyLCA5OSwgMjQyLCAyNzUsIDEwOSwgMTEyLCAxMDEsIDExMywgNTksIDI1MTY2LCAxNzkyLCA3MiwgNzksIDk3LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTA0LCAxMDUsIDEwOCwgMTExLCAxMTQsIDExNSwgMTE3LCAzMzMsIDMzNywgMzQyLCAzODQsIDQxNCwgNDE4LCA0MzcsIDQzOSwgNDQyLCA0NzYsIDUzMywgNjI3LCA2MzIsIDYzOCwgOTksIDEyMSwgNTksIDE3NDQ3LCA4MCwgODksIDMyODI3LCAxNjksIDE2NTUzLCAzODQsIDk5LCAxMTIsIDEyMSwgMzQ5LCAzNTQsIDM3OCwgMTE3LCAxMTYsIDEwMSwgNTksIDE2NjQ2LCAyNTYsIDU5LCAxMDUsIDM1OSwgMzYwLCAyNTI5OCwgMTE2LCA5NywgMTA4LCA2OCwgMTA1LCAxMDIsIDEwMiwgMTAxLCAxMTQsIDEwMSwgMTEwLCAxMTYsIDEwNSwgOTcsIDEwOCwgNjgsIDU5LCAyNDkwMSwgMTA4LCAxMDEsIDEyMSwgMTE1LCA1OSwgMjQ4NzcsIDUxMiwgOTcsIDEwMSwgMTA1LCAxMTEsIDM5MywgMzk4LCA0MDQsIDQwOCwgMTE0LCAxMTEsIDExMCwgNTksIDE2NjUyLCAxMDAsIDEwNSwgMTA4LCAzMjgyNywgMTk5LCAxNjU4MywgMTE0LCA5OSwgNTksIDE2NjQ4LCAxMTAsIDEwNSwgMTEwLCAxMTYsIDU5LCAyNTEzNiwgMTExLCAxMTYsIDU5LCAxNjY1MCwgMjU2LCAxMDAsIDExMCwgNDIzLCA0MjksIDEwNSwgMTA4LCAxMDgsIDk3LCA1OSwgMTY1NjgsIDExNiwgMTAxLCAxMTQsIDY4LCAxMTEsIDExNiwgNTksIDE2NTY3LCAyNDIsIDM4MywgMTA1LCA1OSwgMTczMTksIDExNCwgOTksIDEwOCwgMTAxLCA1MTIsIDY4LCA3NywgODAsIDg0LCA0NTUsIDQ1OSwgNDY1LCA0NzAsIDExMSwgMTE2LCA1OSwgMjUyNDEsIDEwNSwgMTEwLCAxMTcsIDExNSwgNTksIDI1MjM4LCAxMDgsIDExNywgMTE1LCA1OSwgMjUyMzcsIDEwNSwgMTA5LCAxMDEsIDExNSwgNTksIDI1MjM5LCAxMTEsIDI1NiwgOTksIDExNSwgNDgyLCA1MDQsIDEwNywgMTE5LCAxMDUsIDExNSwgMTAxLCA2NywgMTExLCAxMTAsIDExNiwgMTExLCAxMTcsIDExNCwgNzMsIDExMCwgMTE2LCAxMDEsIDEwMywgMTE0LCA5NywgMTA4LCA1OSwgMjUxMzgsIDEwMSwgNjcsIDExNywgMTE0LCAxMDgsIDEyMSwgMjU2LCA2OCwgODEsIDUxNSwgNTI3LCAxMTEsIDExNywgOTgsIDEwOCwgMTAxLCA4MSwgMTE3LCAxMTEsIDExNiwgMTAxLCA1OSwgMjQ2MDUsIDExNywgMTExLCAxMTYsIDEwMSwgNTksIDI0NjAxLCA1MTIsIDEwOCwgMTEwLCAxMTIsIDExNywgNTQyLCA1NTIsIDU4MywgNTk3LCAxMTEsIDExMCwgMjU2LCA1OSwgMTAxLCA1NDksIDU1MCwgMjUxNDMsIDU5LCAyNzI1MiwgMzg0LCAxMDMsIDEwNSwgMTE2LCA1NTksIDU2NiwgNTcwLCAxMTQsIDExNywgMTAxLCAxMTAsIDExNiwgNTksIDI1MTg1LCAxMTAsIDExNiwgNTksIDI1MTM1LCAxMTEsIDExNywgMTE0LCA3MywgMTEwLCAxMTYsIDEwMSwgMTAzLCAxMTQsIDk3LCAxMDgsIDU5LCAyNTEzNCwgMjU2LCAxMDIsIDExNCwgNTg4LCA1OTAsIDU5LCAyNDgzNCwgMTExLCAxMDAsIDExNywgOTksIDExNiwgNTksIDI1MTA0LCAxMTAsIDExNiwgMTAxLCAxMTQsIDY3LCAxMDgsIDExMSwgOTksIDEwNywgMTE5LCAxMDUsIDExNSwgMTAxLCA2NywgMTExLCAxMTAsIDExNiwgMTExLCAxMTcsIDExNCwgNzMsIDExMCwgMTE2LCAxMDEsIDEwMywgMTE0LCA5NywgMTA4LCA1OSwgMjUxMzksIDExMSwgMTE1LCAxMTUsIDU5LCAyNzE4MywgOTksIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY0NzgsIDExMiwgMjU2LCA1OSwgNjcsIDY0NCwgNjQ1LCAyNTI5OSwgOTcsIDExMiwgNTksIDI1MTY1LCAxNDA4LCA2OCwgNzQsIDgzLCA5MCwgOTcsIDk5LCAxMDEsIDEwMiwgMTA1LCAxMTEsIDExNSwgNjcyLCA2ODQsIDY4OCwgNjkyLCA2OTYsIDcxNSwgNzI3LCA3MzcsIDc0MiwgODE5LCAxMTY1LCAyNTYsIDU5LCAxMTEsIDM3NywgNjc3LCAxMTYsIDExNCwgOTcsIDEwNCwgMTAwLCA1OSwgMjY4OTcsIDk5LCAxMjEsIDU5LCAxNzQxMCwgOTksIDEyMSwgNTksIDE3NDEzLCA5OSwgMTIxLCA1OSwgMTc0MjMsIDM4NCwgMTAzLCAxMTQsIDExNSwgNzAzLCA3MDgsIDcxMSwgMTAzLCAxMDEsIDExNCwgNTksIDI0NjA5LCAxMTQsIDU5LCAyNDk5MywgMTA0LCAxMTgsIDU5LCAyNzM2NCwgMjU2LCA5NywgMTIxLCA3MjAsIDcyNSwgMTE0LCAxMTEsIDExMCwgNTksIDE2NjU0LCA1OSwgMTc0MjgsIDEwOCwgMjU2LCA1OSwgMTE2LCA3MzMsIDczNCwgMjUwOTUsIDk3LCA1OSwgMTczMDAsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1ODMsIDI1NiwgOTcsIDEwMiwgNzQ3LCA4MDcsIDI1NiwgOTksIDEwOSwgNzUyLCA4MDIsIDExNCwgMTA1LCAxMTYsIDEwNSwgOTksIDk3LCAxMDgsIDUxMiwgNjUsIDY4LCA3MSwgODQsIDc2OCwgNzc0LCA3OTAsIDc5NiwgOTksIDExNywgMTE2LCAxMDEsIDU5LCAxNjU2NCwgMTExLCAzNzIsIDc3OSwgNzgxLCA1OSwgMTcxMTMsIDk4LCAxMDgsIDEwMSwgNjUsIDk5LCAxMTcsIDExNiwgMTAxLCA1OSwgMTcxMTcsIDExNCwgOTcsIDExOCwgMTAxLCA1OSwgMTY0ODAsIDEwNSwgMTA4LCAxMDAsIDEwMSwgNTksIDE3MTE2LCAxMTEsIDExMCwgMTAwLCA1OSwgMjUyODQsIDEwMiwgMTAxLCAxMTQsIDEwMSwgMTEwLCAxMTYsIDEwNSwgOTcsIDEwOCwgNjgsIDU5LCAyNDkwMiwgMTEzNiwgODI5LCAwLCAwLCAwLCA4MzQsIDg1MiwgMCwgMTAyOSwgMTAyLCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYzNSwgMzg0LCA1OSwgNjgsIDY5LCA4NDAsIDg0MSwgODQ1LCAxNjU1MiwgMTExLCAxMTYsIDU5LCAyNDc5NiwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNTE2OCwgOTgsIDEwOCwgMTAxLCA3NjgsIDY3LCA2OCwgNzYsIDgyLCA4NSwgODYsIDg2NywgODgyLCA4OTgsIDk3NSwgOTk0LCAxMDE2LCAxMTEsIDExMCwgMTE2LCAxMTEsIDExNywgMTE0LCA3MywgMTEwLCAxMTYsIDEwMSwgMTAzLCAxMTQsIDk3LCAyMzYsIDU2OSwgMTExLCA2MjgsIDg4OSwgMCwgMCwgODkxLCAxODcsIDg0MSwgMTEwLCA2NSwgMTE0LCAxMTQsIDExMSwgMTE5LCA1OSwgMjUwNDMsIDI1NiwgMTAxLCAxMTEsIDkwMywgOTMyLCAxMDIsIDExNiwgMzg0LCA2NSwgODIsIDg0LCA5MTIsIDkxOCwgOTI5LCAxMTQsIDExNCwgMTExLCAxMTksIDU5LCAyNTA0MCwgMTA1LCAxMDMsIDEwNCwgMTE2LCA2NSwgMTE0LCAxMTQsIDExMSwgMTE5LCA1OSwgMjUwNDQsIDEwMSwgMjI5LCA3MTQsIDExMCwgMTAzLCAyNTYsIDc2LCA4MiwgOTM5LCA5NjQsIDEwMSwgMTAyLCAxMTYsIDI1NiwgNjUsIDgyLCA5NDcsIDk1MywgMTE0LCAxMTQsIDExMSwgMTE5LCA1OSwgMjY2MTYsIDEwNSwgMTAzLCAxMDQsIDExNiwgNjUsIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI2NjE4LCAxMDUsIDEwMywgMTA0LCAxMTYsIDY1LCAxMTQsIDExNCwgMTExLCAxMTksIDU5LCAyNjYxNywgMTA1LCAxMDMsIDEwNCwgMTE2LCAyNTYsIDY1LCA4NCwgOTg0LCA5OTAsIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI1MDQyLCAxMDEsIDEwMSwgNTksIDI1MjU2LCAxMTIsIDU3NywgMTAwMSwgMCwgMCwgMTAwNywgMTE0LCAxMTQsIDExMSwgMTE5LCA1OSwgMjUwNDEsIDExMSwgMTE5LCAxMTAsIDY1LCAxMTQsIDExNCwgMTExLCAxMTksIDU5LCAyNTA0NSwgMTAxLCAxMTQsIDExNiwgMTA1LCA5OSwgOTcsIDEwOCwgNjYsIDk3LCAxMTQsIDU5LCAyNTEyNSwgMTEwLCA3NjgsIDY1LCA2NiwgNzYsIDgyLCA4NCwgOTcsIDEwNDIsIDEwNjYsIDEwNzIsIDExMTgsIDExNTEsIDg5MiwgMTE0LCAxMTQsIDExMSwgMTE5LCAzODQsIDU5LCA2NiwgODUsIDEwNTMsIDEwNTQsIDEwNTgsIDI0OTc5LCA5NywgMTE0LCA1OSwgMjY4OTksIDExMiwgNjUsIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI1MDc3LCAxMTQsIDEwMSwgMTE4LCAxMDEsIDU5LCAxNzE2OSwgMTAxLCAxMDIsIDExNiwgNzIyLCAxMDgyLCAwLCAxMDk0LCAwLCAxMTA0LCAxMDUsIDEwMywgMTA0LCAxMTYsIDg2LCAxMDEsIDk5LCAxMTYsIDExMSwgMTE0LCA1OSwgMjY5NjAsIDEwMSwgMTAxLCA4NiwgMTAxLCA5OSwgMTE2LCAxMTEsIDExNCwgNTksIDI2OTc0LCAxMDEsIDk5LCAxMTYsIDExMSwgMTE0LCAyNTYsIDU5LCA2NiwgMTExMywgMTExNCwgMjUwMjEsIDk3LCAxMTQsIDU5LCAyNjk2NiwgMTA1LCAxMDMsIDEwNCwgMTE2LCA0NjgsIDExMjcsIDAsIDExMzcsIDEwMSwgMTAxLCA4NiwgMTAxLCA5OSwgMTE2LCAxMTEsIDExNCwgNTksIDI2OTc1LCAxMDEsIDk5LCAxMTYsIDExMSwgMTE0LCAyNTYsIDU5LCA2NiwgMTE0NiwgMTE0NywgMjUwMjUsIDk3LCAxMTQsIDU5LCAyNjk2NywgMTAxLCAxMDEsIDI1NiwgNTksIDY1LCAxMTU4LCAxMTU5LCAyNTI1MiwgMTE0LCAxMTQsIDExMSwgMTE5LCA1OSwgMjQ5OTksIDI1NiwgOTksIDExNiwgMTE3MCwgMTE3NSwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjQ3OSwgMTE0LCAxMTEsIDEwNywgNTksIDE2NjU2LCAyMDQ4LCA3OCwgODQsIDk3LCA5OSwgMTAwLCAxMDIsIDEwMywgMTA4LCAxMDksIDExMSwgMTEyLCAxMTMsIDExNSwgMTE2LCAxMTcsIDEyMCwgMTIxMywgMTIxNiwgMTIyMCwgMTIyNywgMTI0NiwgMTI1MCwgMTI1NSwgMTI2MiwgMTI2OSwgMTMxMywgMTMyNywgMTMzNCwgMTM2MiwgMTM3MywgMTM3NiwgMTM4MSwgNzEsIDU5LCAxNjcxNCwgNzIsIDMyODI3LCAyMDgsIDE2NTkyLCA5OSwgMTE3LCAxMTYsIDEwMSwgMzI4MjcsIDIwMSwgMTY1ODUsIDM4NCwgOTcsIDEwNSwgMTIxLCAxMjM0LCAxMjM5LCAxMjQ0LCAxMTQsIDExMSwgMTEwLCA1OSwgMTY2NjYsIDExNCwgOTksIDMyODI3LCAyMDIsIDE2NTg2LCA1OSwgMTc0NTMsIDExMSwgMTE2LCA1OSwgMTY2NjIsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1ODQsIDExNCwgOTcsIDExOCwgMTAxLCAzMjgyNywgMjAwLCAxNjU4NCwgMTAxLCAxMDksIDEwMSwgMTEwLCAxMTYsIDU5LCAyNTA5NiwgMjU2LCA5NywgMTEyLCAxMjc0LCAxMjc4LCA5OSwgMTE0LCA1OSwgMTY2NTgsIDExNiwgMTIxLCA1OTUsIDEyODYsIDAsIDAsIDEyOTgsIDEwOSwgOTcsIDEwOCwgMTA4LCA4MywgMTEzLCAxMTcsIDk3LCAxMTQsIDEwMSwgNTksIDI2MTA3LCAxMDEsIDExNCwgMTIxLCA4MywgMTA5LCA5NywgMTA4LCAxMDgsIDgzLCAxMTMsIDExNywgOTcsIDExNCwgMTAxLCA1OSwgMjYwMjcsIDI1NiwgMTAzLCAxMTIsIDEzMTgsIDEzMjIsIDExMSwgMTEwLCA1OSwgMTY2NjQsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MzYsIDExNSwgMTA1LCAxMDgsIDExMSwgMTEwLCA1OSwgMTczMDEsIDExNywgMjU2LCA5NywgMTA1LCAxMzQwLCAxMzUzLCAxMDgsIDI1NiwgNTksIDg0LCAxMzQ2LCAxMzQ3LCAyNzI1MywgMTA1LCAxMDgsIDEwMCwgMTAxLCA1OSwgMjUxNTQsIDEwOCwgMTA1LCA5OCwgMTE0LCAxMDUsIDExNywgMTA5LCA1OSwgMjUwMzYsIDI1NiwgOTksIDEwNSwgMTM2NywgMTM3MCwgMTE0LCA1OSwgMjQ4ODAsIDEwOSwgNTksIDI3MjUxLCA5NywgNTksIDE3MzAzLCAxMDksIDEwOCwgMzI4MjcsIDIwMywgMTY1ODcsIDI1NiwgMTA1LCAxMTIsIDEzODYsIDEzOTEsIDExNSwgMTE2LCAxMTUsIDU5LCAyNTA5MSwgMTExLCAxMTAsIDEwMSwgMTEwLCAxMTYsIDEwNSwgOTcsIDEwOCwgNjksIDU5LCAyNDkwMywgNjQwLCA5OSwgMTAyLCAxMDUsIDExMSwgMTE1LCAxNDEzLCAxNDE2LCAxNDIxLCAxNDU4LCAxNDg0LCAxMjEsIDU5LCAxNzQ0NCwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjU4NSwgMTA4LCAxMDgsIDEwMSwgMTAwLCA1OTUsIDE0MzEsIDAsIDAsIDE0NDMsIDEwOSwgOTcsIDEwOCwgMTA4LCA4MywgMTEzLCAxMTcsIDk3LCAxMTQsIDEwMSwgNTksIDI2MTA4LCAxMDEsIDExNCwgMTIxLCA4MywgMTA5LCA5NywgMTA4LCAxMDgsIDgzLCAxMTMsIDExNywgOTcsIDExNCwgMTAxLCA1OSwgMjYwMjYsIDg4MCwgMTQ2NiwgMCwgMTQ3MSwgMCwgMCwgMTQ3NiwgMTAyLCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYzNywgNjUsIDEwOCwgMTA4LCA1OSwgMjUwODgsIDExNCwgMTA1LCAxMDEsIDExNCwgMTE2LCAxMTQsIDEwMiwgNTksIDI0ODgxLCA5OSwgMjQyLCAxNDgzLCAxNTM2LCA3NCwgODQsIDk3LCA5OCwgOTksIDEwMCwgMTAyLCAxMDMsIDExMSwgMTE0LCAxMTUsIDExNiwgMTUxMiwgMTUxNiwgMTUxOSwgMTUzMCwgMTUzNiwgMTU1NCwgMTU1OCwgMTU2MywgMTU2NSwgMTU3MSwgMTY0NCwgMTY1MCwgOTksIDEyMSwgNTksIDE3NDExLCAzMjgyNywgNjIsIDE2NDQ2LCAxMDksIDEwOSwgOTcsIDI1NiwgNTksIDEwMCwgMTUyNywgMTUyOCwgMTcyOTksIDU5LCAxNzM3MiwgMTE0LCAxMDEsIDExOCwgMTAxLCA1OSwgMTY2NzAsIDM4NCwgMTAxLCAxMDUsIDEyMSwgMTU0MywgMTU0OCwgMTU1MiwgMTAwLCAxMDUsIDEwOCwgNTksIDE2Njc0LCAxMTQsIDk5LCA1OSwgMTY2NjgsIDU5LCAxNzQyNywgMTExLCAxMTYsIDU5LCAxNjY3MiwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjU4NiwgNTksIDI1MzA1LCAxMTIsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MzgsIDEwMSwgOTcsIDExNiwgMTAxLCAxMTQsIDc2OCwgNjksIDcwLCA3MSwgNzYsIDgzLCA4NCwgMTU4OSwgMTYwNCwgMTYxNCwgMTYyMiwgMTYyNywgMTYzOCwgMTEzLCAxMTcsIDk3LCAxMDgsIDI1NiwgNTksIDc2LCAxNTk4LCAxNTk5LCAyNTE4OSwgMTAxLCAxMTUsIDExNSwgNTksIDI1MzA3LCAxMTcsIDEwOCwgMTA4LCA2OSwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNTE5MSwgMTE0LCAxMDEsIDk3LCAxMTYsIDEwMSwgMTE0LCA1OSwgMjcyOTgsIDEwMSwgMTE1LCAxMTUsIDU5LCAyNTIwNywgMTA4LCA5NywgMTEwLCAxMTYsIDY5LCAxMTMsIDExNywgOTcsIDEwOCwgNTksIDI3MjYyLCAxMDUsIDEwOCwgMTAwLCAxMDEsIDU5LCAyNTIwMywgOTksIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY0ODIsIDU5LCAyNTE5NSwgMTAyNCwgNjUsIDk3LCA5OSwgMTAyLCAxMDUsIDExMSwgMTE1LCAxMTcsIDE2NjksIDE2NzUsIDE2ODYsIDE2OTEsIDE2OTQsIDE3MDYsIDE3MjYsIDE3MzgsIDgyLCA2OCwgOTksIDEyMSwgNTksIDE3NDUwLCAyNTYsIDk5LCAxMTYsIDE2ODAsIDE2ODQsIDEwMSwgMTA3LCA1OSwgMTcwOTUsIDU5LCAxNjQ3OCwgMTA1LCAxMTQsIDk5LCA1OSwgMTY2NzYsIDExNCwgNTksIDI0ODQ0LCAxMDgsIDk4LCAxMDEsIDExNCwgMTE2LCA4MywgMTEyLCA5NywgOTksIDEwMSwgNTksIDI0ODQzLCA0OTYsIDE3MTEsIDAsIDE3MTQsIDEwMiwgNTksIDI0ODQ1LCAxMDUsIDEyMiwgMTExLCAxMTAsIDExNiwgOTcsIDEwOCwgNzYsIDEwNSwgMTEwLCAxMDEsIDU5LCAyNTg1NiwgMjU2LCA5OSwgMTE2LCAxNzMxLCAxNzMzLCAyNDIsIDE3MDUsIDExNCwgMTExLCAxMDcsIDU5LCAxNjY3OCwgMTA5LCAxMTIsIDMyNCwgMTc0NCwgMTc1MiwgMTExLCAxMTksIDExMCwgNzIsIDExNywgMTA5LCAyNDAsIDMwMywgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNTE2NywgMTc5MiwgNjksIDc0LCA3OSwgOTcsIDk5LCAxMDAsIDEwMiwgMTAzLCAxMDksIDExMCwgMTExLCAxMTUsIDExNiwgMTE3LCAxNzg2LCAxNzkwLCAxNzk1LCAxNzk5LCAxODA2LCAxODE4LCAxODIyLCAxODI1LCAxODMyLCAxODYwLCAxOTEyLCAxOTMxLCAxOTM1LCAxOTQxLCA5OSwgMTIxLCA1OSwgMTc0MjksIDEwOCwgMTA1LCAxMDMsIDU5LCAxNjY5MCwgOTksIDEyMSwgNTksIDE3NDA5LCA5OSwgMTE3LCAxMTYsIDEwMSwgMzI4MjcsIDIwNSwgMTY1ODksIDI1NiwgMTA1LCAxMjEsIDE4MTEsIDE4MTYsIDExNCwgOTksIDMyODI3LCAyMDYsIDE2NTkwLCA1OSwgMTc0MzIsIDExMSwgMTE2LCA1OSwgMTY2ODgsIDExNCwgNTksIDI0ODQ5LCAxMTQsIDk3LCAxMTgsIDEwMSwgMzI4MjcsIDIwNCwgMTY1ODgsIDM4NCwgNTksIDk3LCAxMTIsIDE4MjQsIDE4MzksIDE4NTUsIDI1NiwgOTksIDEwMywgMTg0NCwgMTg0NywgMTE0LCA1OSwgMTY2ODIsIDEwNSwgMTEwLCA5NywgMTE0LCAxMjEsIDczLCA1OSwgMjQ5MDQsIDEwOCwgMTA1LCAxMDEsIDI0MywgOTg5LCA1MDAsIDE4NjUsIDAsIDE4OTAsIDI1NiwgNTksIDEwMSwgMTg2OSwgMTg3MCwgMjUxMzIsIDI1NiwgMTAzLCAxMTQsIDE4NzUsIDE4ODAsIDExNCwgOTcsIDEwOCwgNTksIDI1MTMxLCAxMTUsIDEwMSwgOTksIDExNiwgMTA1LCAxMTEsIDExMCwgNTksIDI1MjgyLCAxMDUsIDExNSwgMTA1LCA5OCwgMTA4LCAxMDEsIDI1NiwgNjcsIDg0LCAxOTAwLCAxOTA2LCAxMTEsIDEwOSwgMTA5LCA5NywgNTksIDI0Njc1LCAxMDUsIDEwOSwgMTAxLCAxMTUsIDU5LCAyNDY3NCwgMzg0LCAxMDMsIDExMiwgMTE2LCAxOTE5LCAxOTIzLCAxOTI4LCAxMTEsIDExMCwgNTksIDE2Njg2LCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjQwLCA5NywgNTksIDE3MzA1LCA5OSwgMTE0LCA1OSwgMjQ4NDgsIDEwNSwgMTA4LCAxMDAsIDEwMSwgNTksIDE2NjgwLCA0OTEsIDE5NDYsIDAsIDE5NTAsIDk5LCAxMjEsIDU5LCAxNzQxNCwgMTA4LCAzMjgyNywgMjA3LCAxNjU5MSwgNjQwLCA5OSwgMTAyLCAxMTEsIDExNSwgMTE3LCAxOTY0LCAxOTc1LCAxOTgwLCAxOTg2LCAyMDAwLCAyNTYsIDEwNSwgMTIxLCAxOTY5LCAxOTczLCAxMTQsIDk5LCA1OSwgMTY2OTIsIDU5LCAxNzQzMywgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjU4OSwgMTEyLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjQxLCA0ODMsIDE5OTEsIDAsIDE5OTYsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY0ODUsIDExNCwgOTksIDEyMSwgNTksIDE3NDE2LCAxMDcsIDk5LCAxMjEsIDU5LCAxNzQxMiwgODk2LCA3MiwgNzQsIDk3LCA5OSwgMTAyLCAxMTEsIDExNSwgMjAyMCwgMjAyNCwgMjAyOCwgMjAzMywgMjA0NSwgMjA1MCwgMjA1NiwgOTksIDEyMSwgNTksIDE3NDQ1LCA5OSwgMTIxLCA1OSwgMTc0MjAsIDExMiwgMTEyLCA5NywgNTksIDE3MzA2LCAyNTYsIDEwMSwgMTIxLCAyMDM4LCAyMDQzLCAxMDAsIDEwNSwgMTA4LCA1OSwgMTY2OTQsIDU5LCAxNzQzNCwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjU5MCwgMTEyLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjQyLCA5OSwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjQ4NiwgMTQwOCwgNzQsIDg0LCA5NywgOTksIDEwMSwgMTAyLCAxMDgsIDEwOSwgMTExLCAxMTUsIDExNiwgMjA4NSwgMjA4OSwgMjA5MiwgMjEyOCwgMjE0NywgMjQ4MywgMjQ4OCwgMjUwMywgMjUwOSwgMjYxNSwgMjYzMSwgOTksIDEyMSwgNTksIDE3NDE3LCAzMjgyNywgNjAsIDE2NDQ0LCA2NDAsIDk5LCAxMDksIDExMCwgMTEyLCAxMTQsIDIxMDMsIDIxMDgsIDIxMTMsIDIxMTYsIDIxMjUsIDExNywgMTE2LCAxMDEsIDU5LCAxNjY5NywgOTgsIDEwMCwgOTcsIDU5LCAxNzMwNywgMTAzLCA1OSwgMjY2MDIsIDEwOCwgOTcsIDk5LCAxMDEsIDExNiwgMTE0LCAxMDIsIDU5LCAyNDg1MCwgMTE0LCA1OSwgMjQ5OTAsIDM4NCwgOTcsIDEwMSwgMTIxLCAyMTM1LCAyMTQwLCAyMTQ1LCAxMTQsIDExMSwgMTEwLCA1OSwgMTY3MDEsIDEwMCwgMTA1LCAxMDgsIDU5LCAxNjY5OSwgNTksIDE3NDM1LCAyNTYsIDEwMiwgMTE1LCAyMTUyLCAyNDE2LCAxMTYsIDEyODAsIDY1LCA2NywgNjgsIDcwLCA4MiwgODQsIDg1LCA4NiwgOTcsIDExNCwgMjE3NCwgMjIxNywgMjIyNSwgMjI3MiwgMjI3OCwgMjMwMCwgMjM1MSwgMjM5NSwgOTEyLCAyNDEwLCAyNTYsIDExMCwgMTE0LCAyMTc5LCAyMTkxLCAxMDMsIDEwOCwgMTAxLCA2NiwgMTE0LCA5NywgOTksIDEwNywgMTAxLCAxMTYsIDU5LCAyNjYwMCwgMTE0LCAxMTEsIDExOSwgMzg0LCA1OSwgNjYsIDgyLCAyMjAxLCAyMjAyLCAyMjA2LCAyNDk3NiwgOTcsIDExNCwgNTksIDI1MDYwLCAxMDUsIDEwMywgMTA0LCAxMTYsIDY1LCAxMTQsIDExNCwgMTExLCAxMTksIDU5LCAyNTAzMCwgMTAxLCAxMDUsIDEwOCwgMTA1LCAxMTAsIDEwMywgNTksIDI1MzUyLCAxMTEsIDUwMSwgMjIzMSwgMCwgMjI0MywgOTgsIDEwOCwgMTAxLCA2NiwgMTE0LCA5NywgOTksIDEwNywgMTAxLCAxMTYsIDU5LCAyNjU5OCwgMTEwLCA0NjgsIDIyNDgsIDAsIDIyNTgsIDEwMSwgMTAxLCA4NiwgMTAxLCA5OSwgMTE2LCAxMTEsIDExNCwgNTksIDI2OTc3LCAxMDEsIDk5LCAxMTYsIDExMSwgMTE0LCAyNTYsIDU5LCA2NiwgMjI2NywgMjI2OCwgMjUwMjcsIDk3LCAxMTQsIDU5LCAyNjk2OSwgMTA4LCAxMTEsIDExMSwgMTE0LCA1OSwgMjUzNTQsIDEwNSwgMTAzLCAxMDQsIDExNiwgMjU2LCA2NSwgODYsIDIyODcsIDIyOTMsIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI0OTgwLCAxMDEsIDk5LCAxMTYsIDExMSwgMTE0LCA1OSwgMjY5NTgsIDI1NiwgMTAxLCAxMTQsIDIzMDUsIDIzMjcsIDEwMSwgMzg0LCA1OSwgNjUsIDg2LCAyMzEzLCAyMzE0LCAyMzIwLCAyNTI1MSwgMTE0LCAxMTQsIDExMSwgMTE5LCA1OSwgMjQ5OTYsIDEwMSwgOTksIDExNiwgMTExLCAxMTQsIDU5LCAyNjk3MCwgMTA1LCA5NywgMTEwLCAxMDMsIDEwOCwgMTAxLCAzODQsIDU5LCA2NiwgNjksIDIzNDAsIDIzNDEsIDIzNDUsIDI1MjY2LCA5NywgMTE0LCA1OSwgMjcwODcsIDExMywgMTE3LCA5NywgMTA4LCA1OSwgMjUyNjgsIDExMiwgMzg0LCA2OCwgODQsIDg2LCAyMzU5LCAyMzcwLCAyMzgwLCAxMTEsIDExOSwgMTEwLCA4NiwgMTAxLCA5OSwgMTE2LCAxMTEsIDExNCwgNTksIDI2OTYxLCAxMDEsIDEwMSwgODYsIDEwMSwgOTksIDExNiwgMTExLCAxMTQsIDU5LCAyNjk3NiwgMTAxLCA5OSwgMTE2LCAxMTEsIDExNCwgMjU2LCA1OSwgNjYsIDIzOTAsIDIzOTEsIDI1MDIzLCA5NywgMTE0LCA1OSwgMjY5NjgsIDEwMSwgOTksIDExNiwgMTExLCAxMTQsIDI1NiwgNTksIDY2LCAyNDA1LCAyNDA2LCAyNTAyMCwgOTcsIDExNCwgNTksIDI2OTYyLCAxMDUsIDEwMywgMTA0LCAxMTYsIDIyNSwgOTI0LCAxMTUsIDc2OCwgNjksIDcwLCA3MSwgNzYsIDgzLCA4NCwgMjQzMCwgMjQ0MywgMjQ1MywgMjQ2MSwgMjQ2NiwgMjQ3NywgMTEzLCAxMTcsIDk3LCAxMDgsIDcxLCAxMTQsIDEwMSwgOTcsIDExNiwgMTAxLCAxMTQsIDU5LCAyNTMwNiwgMTE3LCAxMDgsIDEwOCwgNjksIDExMywgMTE3LCA5NywgMTA4LCA1OSwgMjUxOTAsIDExNCwgMTAxLCA5NywgMTE2LCAxMDEsIDExNCwgNTksIDI1MjA2LCAxMDEsIDExNSwgMTE1LCA1OSwgMjcyOTcsIDEwOCwgOTcsIDExMCwgMTE2LCA2OSwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNzI2MSwgMTA1LCAxMDgsIDEwMCwgMTAxLCA1OSwgMjUyMDIsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1OTEsIDI1NiwgNTksIDEwMSwgMjQ5MywgMjQ5NCwgMjUzMDQsIDEwMiwgMTE2LCA5NywgMTE0LCAxMTQsIDExMSwgMTE5LCA1OSwgMjUwNTAsIDEwNSwgMTAwLCAxMTEsIDExNiwgNTksIDE2NzAzLCAzODQsIDExMCwgMTEyLCAxMTksIDI1MTYsIDI1ODIsIDI1ODcsIDEwMywgNTEyLCA3NiwgODIsIDEwOCwgMTE0LCAyNTI2LCAyNTUxLCAyNTYyLCAyNTc2LCAxMDEsIDEwMiwgMTE2LCAyNTYsIDY1LCA4MiwgMjUzNCwgMjU0MCwgMTE0LCAxMTQsIDExMSwgMTE5LCA1OSwgMjY2MTMsIDEwNSwgMTAzLCAxMDQsIDExNiwgNjUsIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI2NjE1LCAxMDUsIDEwMywgMTA0LCAxMTYsIDY1LCAxMTQsIDExNCwgMTExLCAxMTksIDU5LCAyNjYxNCwgMTAxLCAxMDIsIDExNiwgMjU2LCA5NywgMTE0LCA5NDcsIDI1NzAsIDEwNSwgMTAzLCAxMDQsIDExNiwgMjI1LCA5NTksIDEwNSwgMTAzLCAxMDQsIDExNiwgMjI1LCA5NzAsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NDMsIDEwMSwgMTE0LCAyNTYsIDc2LCA4MiwgMjU5NCwgMjYwNCwgMTAxLCAxMDIsIDExNiwgNjUsIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI0OTg1LCAxMDUsIDEwMywgMTA0LCAxMTYsIDY1LCAxMTQsIDExNCwgMTExLCAxMTksIDU5LCAyNDk4NCwgMzg0LCA5OSwgMTA0LCAxMTYsIDI2MjIsIDI2MjQsIDI2MjYsIDI0MiwgMjEyNCwgNTksIDI1MDA4LCAxMTQsIDExMSwgMTA3LCA1OSwgMTY3MDUsIDU5LCAyNTE5NCwgMTAyNCwgOTcsIDk5LCAxMDEsIDEwMiwgMTA1LCAxMTEsIDExNSwgMTE3LCAyNjUwLCAyNjUzLCAyNjU2LCAyNjc5LCAyNjg0LCAyNjkzLCAyNjk5LCAyNzAyLCAxMTIsIDU5LCAyNjg4NSwgMTIxLCA1OSwgMTc0MzYsIDI1NiwgMTAwLCAxMDgsIDI2NjEsIDI2NzEsIDEwNSwgMTE3LCAxMDksIDgzLCAxMTIsIDk3LCA5OSwgMTAxLCA1OSwgMjQ2NzEsIDEwOCwgMTA1LCAxMTAsIDExNiwgMTE0LCAxMDIsIDU5LCAyNDg4MywgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjU5MiwgMTEwLCAxMTcsIDExNSwgODAsIDEwOCwgMTE3LCAxMTUsIDU5LCAyNTEwNywgMTEyLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjQ0LCA5OSwgMjQyLCAyNjc4LCA1OSwgMTczMDgsIDExNTIsIDc0LCA5NywgOTksIDEwMSwgMTAyLCAxMTEsIDExNSwgMTE2LCAxMTcsIDI3MjMsIDI3MjcsIDI3MzMsIDI3NTIsIDI4MzYsIDI4NDEsIDM0NzMsIDM0NzksIDM0ODYsIDk5LCAxMjEsIDU5LCAxNzQxOCwgOTksIDExNywgMTE2LCAxMDEsIDU5LCAxNjcwNywgMzg0LCA5NywgMTAxLCAxMjEsIDI3NDAsIDI3NDUsIDI3NTAsIDExNCwgMTExLCAxMTAsIDU5LCAxNjcxMSwgMTAwLCAxMDUsIDEwOCwgNTksIDE2NzA5LCA1OSwgMTc0MzcsIDM4NCwgMTAzLCAxMTUsIDExOSwgMjc1OSwgMjgwMCwgMjgzMCwgOTcsIDExNiwgMTA1LCAxMTgsIDEwMSwgMzg0LCA3NywgODQsIDg2LCAyNzcxLCAyNzgzLCAyNzkyLCAxMDEsIDEwMCwgMTA1LCAxMTcsIDEwOSwgODMsIDExMiwgOTcsIDk5LCAxMDEsIDU5LCAyNDU4NywgMTA0LCAxMDUsIDI1NiwgOTksIDExMCwgMjc5MCwgMjc3NiwgMjM1LCAyNzc3LCAxMDEsIDExNCwgMTIxLCA4NCwgMTA0LCAxMDUsIDIzOCwgMjc3NywgMTE2LCAxMDEsIDEwMCwgMjU2LCA3MSwgNzYsIDI4MDgsIDI4MjIsIDExNCwgMTAxLCA5NywgMTE2LCAxMDEsIDExNCwgNzEsIDExNCwgMTAxLCA5NywgMTE2LCAxMDEsIDI0MiwgMTY1MSwgMTAxLCAxMTUsIDExNSwgNzYsIDEwMSwgMTE1LCAyNDMsIDI2MzIsIDc2LCAxMDUsIDExMCwgMTAxLCA1OSwgMTYzOTQsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1OTMsIDUxMiwgNjYsIDExMCwgMTEyLCAxMTYsIDI4NTAsIDI4NTYsIDI4NzEsIDI4NzQsIDExNCwgMTAxLCA5NywgMTA3LCA1OSwgMjQ2NzIsIDY2LCAxMTQsIDEwMSwgOTcsIDEwNywgMTA1LCAxMTAsIDEwMywgODMsIDExMiwgOTcsIDk5LCAxMDEsIDU5LCAxNjU0NCwgMTAyLCA1OSwgMjQ4NTMsIDE2NjQsIDU5LCA2NywgNjgsIDY5LCA3MSwgNzIsIDc2LCA3OCwgODAsIDgyLCA4MywgODQsIDg2LCAyOTAxLCAyOTAyLCAyOTIyLCAyOTQwLCAyOTc3LCAzMDUxLCAzMDc2LCAzMTY2LCAzMjA0LCAzMjM4LCAzMjg4LCAzNDI1LCAzNDYxLCAyNzM3MiwgMjU2LCAxMTEsIDExNywgMjkwNywgMjkxNiwgMTEwLCAxMDMsIDExNCwgMTE3LCAxMDEsIDExMCwgMTE2LCA1OSwgMjUxODYsIDExMiwgNjcsIDk3LCAxMTIsIDU5LCAyNTE5NywgMTExLCAxMTcsIDk4LCAxMDgsIDEwMSwgODYsIDEwMSwgMTE0LCAxMTYsIDEwNSwgOTksIDk3LCAxMDgsIDY2LCA5NywgMTE0LCA1OSwgMjUxMjYsIDM4NCwgMTA4LCAxMTMsIDEyMCwgMjk0NywgMjk1NCwgMjk3MSwgMTAxLCAxMDksIDEwMSwgMTEwLCAxMTYsIDU5LCAyNTA5NywgMTE3LCA5NywgMTA4LCAyNTYsIDU5LCA4NCwgMjk2MiwgMjk2MywgMjUxODQsIDEwNSwgMTA4LCAxMDAsIDEwMSwgNTksIDQ5MTUyLCA4NzcwLCA4MjQsIDEwNSwgMTE1LCAxMTYsIDExNSwgNTksIDI1MDkyLCAxMTQsIDEwMSwgOTcsIDExNiwgMTAxLCAxMTQsIDg5NiwgNTksIDY5LCA3MCwgNzEsIDc2LCA4MywgODQsIDI5OTgsIDI5OTksIDMwMDUsIDMwMTcsIDMwMjcsIDMwMzIsIDMwNDUsIDI1MTk5LCAxMTMsIDExNywgOTcsIDEwOCwgNTksIDI1MjAxLCAxMTcsIDEwOCwgMTA4LCA2OSwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCA0OTE1MiwgODgwNywgODI0LCAxMTQsIDEwMSwgOTcsIDExNiwgMTAxLCAxMTQsIDU5LCA0OTE1MiwgODgxMSwgODI0LCAxMDEsIDExNSwgMTE1LCA1OSwgMjUyMDksIDEwOCwgOTcsIDExMCwgMTE2LCA2OSwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCA0OTE1MiwgMTA4NzgsIDgyNCwgMTA1LCAxMDgsIDEwMCwgMTAxLCA1OSwgMjUyMDUsIDExNywgMTA5LCAxMTIsIDMyNCwgMzA1OCwgMzA2OSwgMTExLCAxMTksIDExMCwgNzIsIDExNywgMTA5LCAxMTIsIDU5LCA0OTE1MiwgODc4MiwgODI0LCAxMTMsIDExNywgOTcsIDEwOCwgNTksIDQ5MTUyLCA4NzgzLCA4MjQsIDEwMSwgMjU2LCAxMDIsIDExNSwgMzA4MiwgMzExMSwgMTE2LCA4NCwgMTE0LCAxMDUsIDk3LCAxMTAsIDEwMywgMTA4LCAxMDEsIDM4NCwgNTksIDY2LCA2OSwgMzA5OCwgMzA5OSwgMzEwNSwgMjUzMjIsIDk3LCAxMTQsIDU5LCA0OTE1MiwgMTA3MDMsIDgyNCwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNTMyNCwgMTE1LCA3NjgsIDU5LCA2OSwgNzEsIDc2LCA4MywgODQsIDMxMjUsIDMxMjYsIDMxMzIsIDMxNDAsIDMxNDcsIDMxNjAsIDI1MTk4LCAxMTMsIDExNywgOTcsIDEwOCwgNTksIDI1MjAwLCAxMTQsIDEwMSwgOTcsIDExNiwgMTAxLCAxMTQsIDU5LCAyNTIwOCwgMTAxLCAxMTUsIDExNSwgNTksIDQ5MTUyLCA4ODEwLCA4MjQsIDEwOCwgOTcsIDExMCwgMTE2LCA2OSwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCA0OTE1MiwgMTA4NzcsIDgyNCwgMTA1LCAxMDgsIDEwMCwgMTAxLCA1OSwgMjUyMDQsIDEwMSwgMTE1LCAxMTYsIDEwMSwgMTAwLCAyNTYsIDcxLCA3NiwgMzE3NiwgMzE5MywgMTE0LCAxMDEsIDk3LCAxMTYsIDEwMSwgMTE0LCA3MSwgMTE0LCAxMDEsIDk3LCAxMTYsIDEwMSwgMTE0LCA1OSwgNDkxNTIsIDEwOTE0LCA4MjQsIDEwMSwgMTE1LCAxMTUsIDc2LCAxMDEsIDExNSwgMTE1LCA1OSwgNDkxNTIsIDEwOTEzLCA4MjQsIDExNCwgMTAxLCA5OSwgMTAxLCAxMDAsIDEwMSwgMTE1LCAzODQsIDU5LCA2OSwgODMsIDMyMTgsIDMyMTksIDMyMjcsIDI1MjE2LCAxMTMsIDExNywgOTcsIDEwOCwgNTksIDQ5MTUyLCAxMDkyNywgODI0LCAxMDgsIDk3LCAxMTAsIDExNiwgNjksIDExMywgMTE3LCA5NywgMTA4LCA1OSwgMjUzMTIsIDI1NiwgMTAxLCAxMDUsIDMyNDMsIDMyNTcsIDExOCwgMTAxLCAxMTQsIDExNSwgMTAxLCA2OSwgMTA4LCAxMDEsIDEwOSwgMTAxLCAxMTAsIDExNiwgNTksIDI1MTAwLCAxMDMsIDEwNCwgMTE2LCA4NCwgMTE0LCAxMDUsIDk3LCAxMTAsIDEwMywgMTA4LCAxMDEsIDM4NCwgNTksIDY2LCA2OSwgMzI3NSwgMzI3NiwgMzI4MiwgMjUzMjMsIDk3LCAxMTQsIDU5LCA0OTE1MiwgMTA3MDQsIDgyNCwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNTMyNSwgMjU2LCAxMTMsIDExNywgMzI5MywgMzM0MCwgMTE3LCA5NywgMTE0LCAxMDEsIDgzLCAxMTcsIDI1NiwgOTgsIDExMiwgMzMwNCwgMzMyMSwgMTE1LCAxMDEsIDExNiwgMjU2LCA1OSwgNjksIDMzMTIsIDMzMTUsIDQ5MTUyLCA4ODQ3LCA4MjQsIDExMywgMTE3LCA5NywgMTA4LCA1OSwgMjUzMTQsIDEwMSwgMTE0LCAxMTUsIDEwMSwgMTE2LCAyNTYsIDU5LCA2OSwgMzMzMSwgMzMzNCwgNDkxNTIsIDg4NDgsIDgyNCwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNTMxNSwgMzg0LCA5OCwgOTksIDExMiwgMzM0NywgMzM2NCwgMzQwNiwgMTE1LCAxMDEsIDExNiwgMjU2LCA1OSwgNjksIDMzNTUsIDMzNTgsIDQ5MTUyLCA4ODM0LCA4NDAyLCAxMTMsIDExNywgOTcsIDEwOCwgNTksIDI1MjI0LCA5OSwgMTAxLCAxMDEsIDEwMCwgMTE1LCA1MTIsIDU5LCA2OSwgODMsIDg0LCAzMzc4LCAzMzc5LCAzMzg3LCAzMzk4LCAyNTIxNywgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCA0OTE1MiwgMTA5MjgsIDgyNCwgMTA4LCA5NywgMTEwLCAxMTYsIDY5LCAxMTMsIDExNywgOTcsIDEwOCwgNTksIDI1MzEzLCAxMDUsIDEwOCwgMTAwLCAxMDEsIDU5LCA0OTE1MiwgODgzMSwgODI0LCAxMDEsIDExNCwgMTE1LCAxMDEsIDExNiwgMjU2LCA1OSwgNjksIDM0MTYsIDM0MTksIDQ5MTUyLCA4ODM1LCA4NDAyLCAxMTMsIDExNywgOTcsIDEwOCwgNTksIDI1MjI1LCAxMDUsIDEwOCwgMTAwLCAxMDEsIDUxMiwgNTksIDY5LCA3MCwgODQsIDM0MzgsIDM0MzksIDM0NDUsIDM0NTUsIDI1MTUzLCAxMTMsIDExNywgOTcsIDEwOCwgNTksIDI1MTU2LCAxMTcsIDEwOCwgMTA4LCA2OSwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNTE1OSwgMTA1LCAxMDgsIDEwMCwgMTAxLCA1OSwgMjUxNjEsIDEwMSwgMTE0LCAxMTYsIDEwNSwgOTksIDk3LCAxMDgsIDY2LCA5NywgMTE0LCA1OSwgMjUxMjQsIDk5LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NDg5LCAxMDUsIDEwOCwgMTAwLCAxMDEsIDMyODI3LCAyMDksIDE2NTkzLCA1OSwgMTczMDksIDE3OTIsIDY5LCA5NywgOTksIDEwMCwgMTAyLCAxMDMsIDEwOSwgMTExLCAxMTIsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAzNTE3LCAzNTIyLCAzNTI5LCAzNTQxLCAzNTQ3LCAzNTUyLCAzNTU5LCAzNTgwLCAzNTg2LCAzNjE2LCAzNjE4LCAzNjM0LCAzNjQ3LCAzNjUyLCAxMDgsIDEwNSwgMTAzLCA1OSwgMTY3MjIsIDk5LCAxMTcsIDExNiwgMTAxLCAzMjgyNywgMjExLCAxNjU5NSwgMjU2LCAxMDUsIDEyMSwgMzUzNCwgMzUzOSwgMTE0LCA5OSwgMzI4MjcsIDIxMiwgMTY1OTYsIDU5LCAxNzQzOCwgOTgsIDEwOCwgOTcsIDk5LCA1OSwgMTY3MjAsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1OTQsIDExNCwgOTcsIDExOCwgMTAxLCAzMjgyNywgMjEwLCAxNjU5NCwgMzg0LCA5NywgMTAxLCAxMDUsIDM1NjYsIDM1NzAsIDM1NzQsIDk5LCAxMTQsIDU5LCAxNjcxNiwgMTAzLCA5NywgNTksIDE3MzIxLCA5OSwgMTE0LCAxMTEsIDExMCwgNTksIDE3MzExLCAxMTIsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NDYsIDEwMSwgMTEwLCA2NywgMTE3LCAxMTQsIDEwOCwgMTIxLCAyNTYsIDY4LCA4MSwgMzU5OCwgMzYxMCwgMTExLCAxMTcsIDk4LCAxMDgsIDEwMSwgODEsIDExNywgMTExLCAxMTYsIDEwMSwgNTksIDI0NjA0LCAxMTcsIDExMSwgMTE2LCAxMDEsIDU5LCAyNDYwMCwgNTksIDI3MjIwLCAyNTYsIDk5LCAxMDgsIDM2MjMsIDM2MjgsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY0OTAsIDk3LCAxMTUsIDEwNCwgMzI4MjcsIDIxNiwgMTY2MDAsIDEwNSwgMzY0LCAzNjM5LCAzNjQ0LCAxMDAsIDEwMSwgMzI4MjcsIDIxMywgMTY1OTcsIDEwMSwgMTE1LCA1OSwgMjcxOTEsIDEwOSwgMTA4LCAzMjgyNywgMjE0LCAxNjU5OCwgMTAxLCAxMTQsIDI1NiwgNjYsIDgwLCAzNjU5LCAzNjgwLCAyNTYsIDk3LCAxMTQsIDM2NjQsIDM2NjcsIDExNCwgNTksIDI0NjM4LCA5NywgOTksIDI1NiwgMTAxLCAxMDcsIDM2NzQsIDM2NzYsIDU5LCAyNTU2NiwgMTAxLCAxMTYsIDU5LCAyNTUyNCwgOTcsIDExNCwgMTAxLCAxMTAsIDExNiwgMTA0LCAxMDEsIDExNSwgMTA1LCAxMTUsIDU5LCAyNTU2NCwgMTE1MiwgOTcsIDk5LCAxMDIsIDEwNCwgMTA1LCAxMDgsIDExMSwgMTE0LCAxMTUsIDM3MTEsIDM3MTksIDM3MjIsIDM3MjcsIDM3MzAsIDM3MzIsIDM3NDEsIDM3NjAsIDM4MzYsIDExNCwgMTE2LCAxMDUsIDk3LCAxMDgsIDY4LCA1OSwgMjUwOTAsIDEyMSwgNTksIDE3NDM5LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NTk1LCAxMDUsIDU5LCAxNzMxOCwgNTksIDE3MzEyLCAxMTcsIDExNSwgNzcsIDEwNSwgMTEwLCAxMTcsIDExNSwgNTksIDE2NTYxLCAyNTYsIDEwNSwgMTEyLCAzNzQ2LCAzNzU3LCAxMTAsIDk5LCA5NywgMTE0LCAxMDEsIDExMiwgMTA4LCA5NywgMTEwLCAyMjksIDE2OTMsIDEwMiwgNTksIDI0ODU3LCA1MTIsIDU5LCAxMDEsIDEwNSwgMTExLCAzNzY5LCAzNzcwLCAzODA4LCAzODEyLCAyNzMyMywgOTksIDEwMSwgMTAwLCAxMDEsIDExNSwgNTEyLCA1OSwgNjksIDgzLCA4NCwgMzc4NCwgMzc4NSwgMzc5MSwgMzgwMiwgMjUyMTAsIDExMywgMTE3LCA5NywgMTA4LCA1OSwgMjczMTEsIDEwOCwgOTcsIDExMCwgMTE2LCA2OSwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNTIxMiwgMTA1LCAxMDgsIDEwMCwgMTAxLCA1OSwgMjUyMTQsIDEwOSwgMTAxLCA1OSwgMjQ2MjcsIDI1NiwgMTAwLCAxMTIsIDM4MTcsIDM4MjIsIDExNywgOTksIDExNiwgNTksIDI1MTAzLCAxMTEsIDExNCwgMTE2LCAxMDUsIDExMSwgMTEwLCAyNTYsIDU5LCA5NywgNTQ5LCAzODMzLCAxMDgsIDU5LCAyNTExNywgMjU2LCA5OSwgMTA1LCAzODQxLCAzODQ2LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NDkxLCA1OSwgMTczMjAsIDUxMiwgODUsIDEwMiwgMTExLCAxMTUsIDM4NTcsIDM4NjIsIDM4NjcsIDM4NzEsIDc5LCA4NCwgMzI4MjcsIDM0LCAxNjQxOCwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjU5NiwgMTEyLCAxMDIsIDU5LCAyNDg1OCwgOTksIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY0OTIsIDE1MzYsIDY2LCA2OSwgOTcsIDk5LCAxMDEsIDEwMiwgMTA0LCAxMDUsIDExMSwgMTE0LCAxMTUsIDExNywgMzkwMiwgMzkwNywgMzkxMSwgMzkzNiwgMzk1NSwgNDAwNywgNDAxMCwgNDAxMywgNDI0NiwgNDI2NSwgNDI3NiwgNDI4NiwgOTcsIDExNCwgMTE0LCA1OSwgMjY4OTYsIDcxLCAzMjgyNywgMTc0LCAxNjU1OCwgMzg0LCA5OSwgMTEwLCAxMTQsIDM5MTgsIDM5MjMsIDM5MjYsIDExNywgMTE2LCAxMDEsIDU5LCAxNjcyNCwgMTAzLCA1OSwgMjY2MDMsIDExNCwgMjU2LCA1OSwgMTE2LCAzOTMyLCAzOTMzLCAyNDk5MiwgMTA4LCA1OSwgMjY5MDIsIDM4NCwgOTcsIDEwMSwgMTIxLCAzOTQzLCAzOTQ4LCAzOTUzLCAxMTQsIDExMSwgMTEwLCA1OSwgMTY3MjgsIDEwMCwgMTA1LCAxMDgsIDU5LCAxNjcyNiwgNTksIDE3NDQwLCAyNTYsIDU5LCAxMTgsIDM5NjAsIDM5NjEsIDI0ODYwLCAxMDEsIDExNCwgMTE1LCAxMDEsIDI1NiwgNjksIDg1LCAzOTcwLCAzOTkzLCAyNTYsIDEwOCwgMTEzLCAzOTc1LCAzOTgyLCAxMDEsIDEwOSwgMTAxLCAxMTAsIDExNiwgNTksIDI1MDk5LCAxMTcsIDEwNSwgMTA4LCAxMDUsIDk4LCAxMTQsIDEwNSwgMTE3LCAxMDksIDU5LCAyNTAzNSwgMTEyLCA2OSwgMTEzLCAxMTcsIDEwNSwgMTA4LCAxMDUsIDk4LCAxMTQsIDEwNSwgMTE3LCAxMDksIDU5LCAyNjk5MSwgMTE0LCAxODcsIDM5NjEsIDExMSwgNTksIDE3MzEzLCAxMDMsIDEwNCwgMTE2LCAxMDI0LCA2NSwgNjcsIDY4LCA3MCwgODQsIDg1LCA4NiwgOTcsIDQwMzMsIDQwNzUsIDQwODMsIDQxMzAsIDQxMzYsIDQxODcsIDQyMzEsIDk4NCwgMjU2LCAxMTAsIDExNCwgNDAzOCwgNDA1MCwgMTAzLCAxMDgsIDEwMSwgNjYsIDExNCwgOTcsIDk5LCAxMDcsIDEwMSwgMTE2LCA1OSwgMjY2MDEsIDExNCwgMTExLCAxMTksIDM4NCwgNTksIDY2LCA3NiwgNDA2MCwgNDA2MSwgNDA2NSwgMjQ5NzgsIDk3LCAxMTQsIDU5LCAyNTA2MSwgMTAxLCAxMDIsIDExNiwgNjUsIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI1MDI4LCAxMDEsIDEwNSwgMTA4LCAxMDUsIDExMCwgMTAzLCA1OSwgMjUzNTMsIDExMSwgNTAxLCA0MDg5LCAwLCA0MTAxLCA5OCwgMTA4LCAxMDEsIDY2LCAxMTQsIDk3LCA5OSwgMTA3LCAxMDEsIDExNiwgNTksIDI2NTk5LCAxMTAsIDQ2OCwgNDEwNiwgMCwgNDExNiwgMTAxLCAxMDEsIDg2LCAxMDEsIDk5LCAxMTYsIDExMSwgMTE0LCA1OSwgMjY5NzMsIDEwMSwgOTksIDExNiwgMTExLCAxMTQsIDI1NiwgNTksIDY2LCA0MTI1LCA0MTI2LCAyNTAyNiwgOTcsIDExNCwgNTksIDI2OTY1LCAxMDgsIDExMSwgMTExLCAxMTQsIDU5LCAyNTM1NSwgMjU2LCAxMDEsIDExNCwgNDE0MSwgNDE2MywgMTAxLCAzODQsIDU5LCA2NSwgODYsIDQxNDksIDQxNTAsIDQxNTYsIDI1MjUwLCAxMTQsIDExNCwgMTExLCAxMTksIDU5LCAyNDk5OCwgMTAxLCA5OSwgMTE2LCAxMTEsIDExNCwgNTksIDI2OTcxLCAxMDUsIDk3LCAxMTAsIDEwMywgMTA4LCAxMDEsIDM4NCwgNTksIDY2LCA2OSwgNDE3NiwgNDE3NywgNDE4MSwgMjUyNjcsIDk3LCAxMTQsIDU5LCAyNzA4OCwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNTI2OSwgMTEyLCAzODQsIDY4LCA4NCwgODYsIDQxOTUsIDQyMDYsIDQyMTYsIDExMSwgMTE5LCAxMTAsIDg2LCAxMDEsIDk5LCAxMTYsIDExMSwgMTE0LCA1OSwgMjY5NTksIDEwMSwgMTAxLCA4NiwgMTAxLCA5OSwgMTE2LCAxMTEsIDExNCwgNTksIDI2OTcyLCAxMDEsIDk5LCAxMTYsIDExMSwgMTE0LCAyNTYsIDU5LCA2NiwgNDIyNiwgNDIyNywgMjUwMjIsIDk3LCAxMTQsIDU5LCAyNjk2NCwgMTAxLCA5OSwgMTE2LCAxMTEsIDExNCwgMjU2LCA1OSwgNjYsIDQyNDEsIDQyNDIsIDI1MDI0LCA5NywgMTE0LCA1OSwgMjY5NjMsIDI1NiwgMTEyLCAxMTcsIDQyNTEsIDQyNTQsIDEwMiwgNTksIDI0ODYxLCAxMTAsIDEwMCwgNzMsIDEwOSwgMTEyLCAxMDgsIDEwNSwgMTAxLCAxMTUsIDU5LCAyNjk5MiwgMTA1LCAxMDMsIDEwNCwgMTE2LCA5NywgMTE0LCAxMTQsIDExMSwgMTE5LCA1OSwgMjUwNTEsIDI1NiwgOTksIDEwNCwgNDI4MSwgNDI4NCwgMTE0LCA1OSwgMjQ4NTksIDU5LCAyNTAwOSwgMTA4LCAxMDEsIDY4LCAxMDEsIDEwOCwgOTcsIDEyMSwgMTAxLCAxMDAsIDU5LCAyNzEyNCwgMTY2NCwgNzIsIDc5LCA5NywgOTksIDEwMiwgMTA0LCAxMDUsIDEwOSwgMTExLCAxMTMsIDExNSwgMTE2LCAxMTcsIDQzMjQsIDQzMzcsIDQzNDMsIDQzNDksIDQzNzcsIDQzODIsIDQ0MzMsIDQ0MzgsIDQ0NDksIDQ0NTUsIDQ1MzMsIDQ1MzksIDQ1NDMsIDI1NiwgNjcsIDk5LCA0MzI5LCA0MzM0LCA3MiwgOTksIDEyMSwgNTksIDE3NDQ5LCAxMjEsIDU5LCAxNzQ0OCwgNzAsIDg0LCA5OSwgMTIxLCA1OSwgMTc0NTIsIDk5LCAxMTcsIDExNiwgMTAxLCA1OSwgMTY3MzAsIDY0MCwgNTksIDk3LCAxMDEsIDEwNSwgMTIxLCA0MzYwLCA0MzYxLCA0MzY2LCA0MzcxLCA0Mzc1LCAyNzMyNCwgMTE0LCAxMTEsIDExMCwgNTksIDE2NzM2LCAxMDAsIDEwNSwgMTA4LCA1OSwgMTY3MzQsIDExNCwgOTksIDU5LCAxNjczMiwgNTksIDE3NDQxLCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NTk4LCAxMTEsIDExNCwgMTE2LCA1MTIsIDY4LCA3NiwgODIsIDg1LCA0Mzk0LCA0NDA0LCA0NDE0LCA0NDI1LCAxMTEsIDExOSwgMTEwLCA2NSwgMTE0LCAxMTQsIDExMSwgMTE5LCAxODcsIDEwNTQsIDEwMSwgMTAyLCAxMTYsIDY1LCAxMTQsIDExNCwgMTExLCAxMTksIDE4NywgMjIwMiwgMTA1LCAxMDMsIDEwNCwgMTE2LCA2NSwgMTE0LCAxMTQsIDExMSwgMTE5LCAxODcsIDQwNjEsIDExMiwgNjUsIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI0OTc3LCAxMDMsIDEwOSwgOTcsIDU5LCAxNzMxNSwgOTcsIDEwOCwgMTA4LCA2NywgMTA1LCAxMTQsIDk5LCAxMDgsIDEwMSwgNTksIDI1MTEyLCAxMTIsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NTAsIDYyNiwgNDQ2MSwgMCwgMCwgNDQ2NCwgMTE2LCA1OSwgMjUxMTQsIDk3LCAxMTQsIDEwMSwgNTEyLCA1OSwgNzMsIDgzLCA4NSwgNDQ3NSwgNDQ3NiwgNDQ4OSwgNDUyNywgMjYwMTcsIDExMCwgMTE2LCAxMDEsIDExNCwgMTE1LCAxMDEsIDk5LCAxMTYsIDEwNSwgMTExLCAxMTAsIDU5LCAyNTIzNSwgMTE3LCAyNTYsIDk4LCAxMTIsIDQ0OTUsIDQ1MTAsIDExNSwgMTAxLCAxMTYsIDI1NiwgNTksIDY5LCA0NTAzLCA0NTA0LCAyNTIzMSwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNTIzMywgMTAxLCAxMTQsIDExNSwgMTAxLCAxMTYsIDI1NiwgNTksIDY5LCA0NTIwLCA0NTIxLCAyNTIzMiwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNTIzNCwgMTEwLCAxMDUsIDExMSwgMTEwLCA1OSwgMjUyMzYsIDk5LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NDk0LCA5NywgMTE0LCA1OSwgMjUyODYsIDUxMiwgOTgsIDk5LCAxMDksIDExMiwgNDU1MiwgNDU3MSwgNDYxNywgNDYxOSwgMjU2LCA1OSwgMTE1LCA0NTU3LCA0NTU4LCAyNTI5NiwgMTAxLCAxMTYsIDI1NiwgNTksIDY5LCA0NTU3LCA0NTY1LCAxMTMsIDExNywgOTcsIDEwOCwgNTksIDI1MjIyLCAyNTYsIDk5LCAxMDQsIDQ1NzYsIDQ2MTMsIDEwMSwgMTAxLCAxMDAsIDExNSwgNTEyLCA1OSwgNjksIDgzLCA4NCwgNDU4OSwgNDU5MCwgNDU5NiwgNDYwNywgMjUyMTEsIDExMywgMTE3LCA5NywgMTA4LCA1OSwgMjczMTIsIDEwOCwgOTcsIDExMCwgMTE2LCA2OSwgMTEzLCAxMTcsIDk3LCAxMDgsIDU5LCAyNTIxMywgMTA1LCAxMDgsIDEwMCwgMTAxLCA1OSwgMjUyMTUsIDg0LCAxMDQsIDIyNSwgMzk4MCwgNTksIDI1MTA1LCAzODQsIDU5LCAxMDEsIDExNSwgNDYyNiwgNDYyNywgNDY0MywgMjUyOTcsIDExNCwgMTE1LCAxMDEsIDExNiwgMjU2LCA1OSwgNjksIDQ2MzYsIDQ2MzcsIDI1MjE5LCAxMTMsIDExNywgOTcsIDEwOCwgNTksIDI1MjIzLCAxMDEsIDExNiwgMTg3LCA0NjI3LCAxNDA4LCA3MiwgODIsIDgzLCA5NywgOTksIDEwMiwgMTA0LCAxMDUsIDExMSwgMTE0LCAxMTUsIDQ2NzAsIDQ2NzYsIDQ2ODEsIDQ2OTMsIDQ3MDIsIDQ3MjEsIDQ3MjYsIDQ3NjcsIDQ4MDIsIDQ4MDgsIDQ4MTcsIDc5LCA4MiwgNzgsIDMyODI3LCAyMjIsIDE2NjA2LCA2NSwgNjgsIDY5LCA1OSwgMjQ4NjYsIDI1NiwgNzIsIDk5LCA0Njg2LCA0NjkwLCA5OSwgMTIxLCA1OSwgMTc0MTksIDEyMSwgNTksIDE3NDQ2LCAyNTYsIDk4LCAxMTcsIDQ2OTgsIDQ3MDAsIDU5LCAxNjM5MywgNTksIDE3MzE2LCAzODQsIDk3LCAxMDEsIDEyMSwgNDcwOSwgNDcxNCwgNDcxOSwgMTE0LCAxMTEsIDExMCwgNTksIDE2NzQwLCAxMDAsIDEwNSwgMTA4LCA1OSwgMTY3MzgsIDU5LCAxNzQ0MiwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjU5OSwgMjU2LCAxMDEsIDEwNSwgNDczMSwgNDc0NSwgNDk4LCA0NzM2LCAwLCA0NzQzLCAxMDEsIDEwMiwgMTExLCAxMTQsIDEwMSwgNTksIDI1MTQwLCA5NywgNTksIDE3MzA0LCAyNTYsIDk5LCAxMTAsIDQ3NTAsIDQ3NjAsIDEwNywgODMsIDExMiwgOTcsIDk5LCAxMDEsIDU5LCA0OTE1MiwgODI4NywgODIwMiwgODMsIDExMiwgOTcsIDk5LCAxMDEsIDU5LCAyNDU4NSwgMTA4LCAxMDAsIDEwMSwgNTEyLCA1OSwgNjksIDcwLCA4NCwgNDc3OSwgNDc4MCwgNDc4NiwgNDc5NiwgMjUxNDgsIDExMywgMTE3LCA5NywgMTA4LCA1OSwgMjUxNTUsIDExNywgMTA4LCAxMDgsIDY5LCAxMTMsIDExNywgOTcsIDEwOCwgNTksIDI1MTU3LCAxMDUsIDEwOCwgMTAwLCAxMDEsIDU5LCAyNTE2MCwgMTEyLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjUxLCAxMDUsIDExMiwgMTA4LCAxMDEsIDY4LCAxMTEsIDExNiwgNTksIDI0Nzk1LCAyNTYsIDk5LCAxMTYsIDQ4MjIsIDQ4MjcsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY0OTUsIDExNCwgMTExLCAxMDcsIDU5LCAxNjc0MiwgMjc4NSwgNDg1NSwgNDg3OCwgNDg5MCwgNDkwMiwgMCwgNDkwOCwgNDkxMywgMCwgMCwgMCwgMCwgMCwgNDkyMCwgNDkyNSwgNDk4MywgNDk5NywgMCwgNTExOSwgNTEyNCwgNTEzMCwgNTEzNiwgMjU2LCA5OSwgMTE0LCA0ODU5LCA0ODY1LCAxMTcsIDExNiwgMTAxLCAzMjgyNywgMjE4LCAxNjYwMiwgMTE0LCAyNTYsIDU5LCAxMTEsIDQ4NzEsIDQ4NzIsIDI0OTkxLCA5OSwgMTA1LCAxMTQsIDU5LCAyNjk1MywgMTE0LCA0ODMsIDQ4ODMsIDAsIDQ4ODYsIDEyMSwgNTksIDE3NDIyLCAxMTgsIDEwMSwgNTksIDE2NzQ4LCAyNTYsIDEwNSwgMTIxLCA0ODk0LCA0ODk5LCAxMTQsIDk5LCAzMjgyNywgMjE5LCAxNjYwMywgNTksIDE3NDQzLCA5OCwgMTA4LCA5NywgOTksIDU5LCAxNjc1MiwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYwMCwgMTE0LCA5NywgMTE4LCAxMDEsIDMyODI3LCAyMTcsIDE2NjAxLCA5NywgOTksIDExNCwgNTksIDE2NzQ2LCAyNTYsIDEwMCwgMTA1LCA0OTI5LCA0OTY5LCAxMDEsIDExNCwgMjU2LCA2NiwgODAsIDQ5MzYsIDQ5NTcsIDI1NiwgOTcsIDExNCwgNDk0MSwgNDk0NCwgMTE0LCA1OSwgMTY0NzksIDk3LCA5OSwgMjU2LCAxMDEsIDEwNywgNDk1MSwgNDk1MywgNTksIDI1NTY3LCAxMDEsIDExNiwgNTksIDI1NTI1LCA5NywgMTE0LCAxMDEsIDExMCwgMTE2LCAxMDQsIDEwMSwgMTE1LCAxMDUsIDExNSwgNTksIDI1NTY1LCAxMTEsIDExMCwgMjU2LCA1OSwgODAsIDQ5NzYsIDQ5NzcsIDI1MjgzLCAxMDgsIDExNywgMTE1LCA1OSwgMjUyMzAsIDI1NiwgMTAzLCAxMTIsIDQ5ODcsIDQ5OTEsIDExMSwgMTEwLCA1OSwgMTY3NTQsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NTIsIDEwMjQsIDY1LCA2OCwgNjksIDg0LCA5NywgMTAwLCAxMTIsIDExNSwgNTAxMywgNTAzOCwgNTA0OCwgNTA2MCwgMTAwMCwgNTA3NCwgNTA3OSwgNTEwNywgMTE0LCAxMTQsIDExMSwgMTE5LCAzODQsIDU5LCA2NiwgNjgsIDQ0MzIsIDUwMjQsIDUwMjgsIDk3LCAxMTQsIDU5LCAyNjg5OCwgMTExLCAxMTksIDExMCwgNjUsIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI1MDI5LCAxMTEsIDExOSwgMTEwLCA2NSwgMTE0LCAxMTQsIDExMSwgMTE5LCA1OSwgMjQ5ODEsIDExMywgMTE3LCAxMDUsIDEwOCwgMTA1LCA5OCwgMTE0LCAxMDUsIDExNywgMTA5LCA1OSwgMjY5OTAsIDEwMSwgMTAxLCAyNTYsIDU5LCA2NSwgNTA2NywgNTA2OCwgMjUyNTMsIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI0OTk3LCAxMTEsIDExOSwgMTEwLCAyMjUsIDEwMTEsIDEwMSwgMTE0LCAyNTYsIDc2LCA4MiwgNTA4NiwgNTA5NiwgMTAxLCAxMDIsIDExNiwgNjUsIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI0OTgyLCAxMDUsIDEwMywgMTA0LCAxMTYsIDY1LCAxMTQsIDExNCwgMTExLCAxMTksIDU5LCAyNDk4MywgMTA1LCAyNTYsIDU5LCAxMDgsIDUxMTMsIDUxMTQsIDE3MzYyLCAxMTEsIDExMCwgNTksIDE3MzE3LCAxMDUsIDExMCwgMTAzLCA1OSwgMTY3NTAsIDk5LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NDk2LCAxMDUsIDEwOCwgMTAwLCAxMDEsIDU5LCAxNjc0NCwgMTA5LCAxMDgsIDMyODI3LCAyMjAsIDE2NjA0LCAxMTUyLCA2OCwgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMTEsIDExNSwgMTE4LCA1MTU5LCA1MTY0LCA1MTY4LCA1MTcxLCA1MTgyLCA1MjUzLCA1MjU4LCA1MjY0LCA1MjcwLCA5NywgMTE1LCAxMDQsIDU5LCAyNTI1OSwgOTcsIDExNCwgNTksIDI3MzcxLCAxMjEsIDU5LCAxNzQyNiwgOTcsIDExNSwgMTA0LCAyNTYsIDU5LCAxMDgsIDUxNzksIDUxODAsIDI1MjU3LCA1OSwgMjczNjYsIDI1NiwgMTAxLCAxMTQsIDUxODcsIDUxODksIDU5LCAyNTI4MSwgMzg0LCA5OCwgMTE2LCAxMjEsIDUxOTYsIDUyMDAsIDUyNDIsIDk3LCAxMTQsIDU5LCAyNDU5OCwgMjU2LCA1OSwgMTA1LCA1MTk5LCA1MjA1LCA5OSwgOTcsIDEwOCwgNTEyLCA2NiwgNzYsIDgzLCA4NCwgNTIxNywgNTIyMSwgNTIyNiwgNTIzNiwgOTcsIDExNCwgNTksIDI1MTIzLCAxMDUsIDExMCwgMTAxLCA1OSwgMTY1MDgsIDEwMSwgMTEyLCA5NywgMTE0LCA5NywgMTE2LCAxMTEsIDExNCwgNTksIDI2NDU2LCAxMDUsIDEwOCwgMTAwLCAxMDEsIDU5LCAyNTE1MiwgODQsIDEwNCwgMTA1LCAxMTAsIDgzLCAxMTIsIDk3LCA5OSwgMTAxLCA1OSwgMjQ1ODYsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MDEsIDExMiwgMTAyLCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjY1MywgOTksIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY0OTcsIDEwMCwgOTcsIDExNSwgMTA0LCA1OSwgMjUyNTgsIDY0MCwgOTksIDEwMSwgMTAyLCAxMTEsIDExNSwgNTI4NywgNTI5MiwgNTI5NywgNTMwMiwgNTMwOCwgMTA1LCAxMTQsIDk5LCA1OSwgMTY3NTYsIDEwMCwgMTAzLCAxMDEsIDU5LCAyNTI4MCwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYwMiwgMTEyLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjU0LCA5OSwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjQ5OCwgNTEyLCAxMDIsIDEwNSwgMTExLCAxMTUsIDUzMjMsIDUzMjgsIDUzMzAsIDUzMzYsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MDMsIDU5LCAxNzMxMCwgMTEyLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjU1LCA5OSwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjQ5OSwgMTE1MiwgNjUsIDczLCA4NSwgOTcsIDk5LCAxMDIsIDExMSwgMTE1LCAxMTcsIDUzNjEsIDUzNjUsIDUzNjksIDUzNzMsIDUzODAsIDUzOTEsIDUzOTYsIDU0MDIsIDU0MDgsIDk5LCAxMjEsIDU5LCAxNzQ1NSwgOTksIDEyMSwgNTksIDE3NDE1LCA5OSwgMTIxLCA1OSwgMTc0NTQsIDk5LCAxMTcsIDExNiwgMTAxLCAzMjgyNywgMjIxLCAxNjYwNSwgMjU2LCAxMDUsIDEyMSwgNTM4NSwgNTM4OSwgMTE0LCA5OSwgNTksIDE2NzU4LCA1OSwgMTc0NTEsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MDQsIDExMiwgMTAyLCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjY1NiwgOTksIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1MDAsIDEwOSwgMTA4LCA1OSwgMTY3NjAsIDEwMjQsIDcyLCA5NywgOTksIDEwMCwgMTAxLCAxMDIsIDExMSwgMTE1LCA1NDI5LCA1NDMzLCA1NDM5LCA1NDUxLCA1NDU1LCA1NDY5LCA1NDcyLCA1NDc2LCA5OSwgMTIxLCA1OSwgMTc0MzAsIDk5LCAxMTcsIDExNiwgMTAxLCA1OSwgMTY3NjEsIDI1NiwgOTcsIDEyMSwgNTQ0NCwgNTQ0OSwgMTE0LCAxMTEsIDExMCwgNTksIDE2NzY1LCA1OSwgMTc0MzEsIDExMSwgMTE2LCA1OSwgMTY3NjMsIDQ5OCwgNTQ2MCwgMCwgNTQ2NywgMTExLCA4NywgMTA1LCAxMDAsIDExNiwgMjMyLCAyNzc3LCA5NywgNTksIDE3MzAyLCAxMTQsIDU5LCAyNDg3MiwgMTEyLCAxMDIsIDU5LCAyNDg2OCwgOTksIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1MDEsIDMwNDEsIDU1MDcsIDU1MTQsIDU1MjAsIDAsIDU1NTIsIDU1NTgsIDU1NjcsIDAsIDAsIDAsIDAsIDU1NzQsIDU1OTUsIDU2MTEsIDU3MjcsIDU3NDEsIDAsIDU3ODEsIDU3ODcsIDU4MTAsIDU4MTcsIDAsIDU4MjIsIDk5LCAxMTcsIDExNiwgMTAxLCAzMjgyNywgMjI1LCAxNjYwOSwgMTE0LCAxMDEsIDExOCwgMTAxLCA1OSwgMTY2NDMsIDc2OCwgNTksIDY5LCAxMDAsIDEwNSwgMTE3LCAxMjEsIDU1MzIsIDU1MzMsIDU1MzcsIDU1MzksIDU1NDQsIDU1NDksIDI1MTUwLCA1OSwgNDkxNTIsIDg3NjYsIDgxOSwgNTksIDI1MTUxLCAxMTQsIDk5LCAzMjgyNywgMjI2LCAxNjYxMCwgMTE2LCAxMDEsIDMyOTU1LCAxODAsIDc3NCwgNTksIDE3NDU2LCAxMDgsIDEwNSwgMTAzLCAzMjgyNywgMjMwLCAxNjYxNCwgMjU2LCA1OSwgMTE0LCAxNzgsIDU1NjIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjA2LCAxMTQsIDk3LCAxMTgsIDEwMSwgMzI4MjcsIDIyNCwgMTY2MDgsIDI1NiwgMTAxLCAxMTIsIDU1NzgsIDU1OTAsIDI1NiwgMTAyLCAxMTIsIDU1ODMsIDU1ODgsIDExNSwgMTIxLCAxMDksIDU5LCAyNDg4NSwgMjMyLCA1NTg3LCAxMDQsIDk3LCA1OSwgMTczMjksIDI1NiwgOTcsIDExMiwgNTU5OSwgOTksIDI1NiwgOTksIDEwOCwgNTYwNCwgNTYwNywgMTE0LCA1OSwgMTY2NDEsIDEwMywgNTksIDI3MTk5LCA2MTIsIDU2MTYsIDAsIDAsIDU2NDIsIDY0MCwgNTksIDk3LCAxMDAsIDExNSwgMTE4LCA1NjI2LCA1NjI3LCA1NjMxLCA1NjMzLCA1NjM5LCAyNTEyNywgMTEwLCAxMDAsIDU5LCAyNzIyMSwgNTksIDI3MjI4LCAxMDgsIDExMSwgMTEyLCAxMDEsIDU5LCAyNzIyNCwgNTksIDI3MjI2LCA4OTYsIDU5LCAxMDEsIDEwOCwgMTA5LCAxMTQsIDExNSwgMTIyLCA1NjU2LCA1NjU3LCA1NjU5LCA1NjYyLCA1Njk1LCA1NzExLCA1NzIxLCAyNTEyMCwgNTksIDI3MDQ0LCAxMDEsIDE4NywgNTY1NywgMTE1LCAxMDAsIDI1NiwgNTksIDk3LCA1NjY5LCA1NjcwLCAyNTEyMSwgMTEyMSwgNTY4MCwgNTY4MiwgNTY4NCwgNTY4NiwgNTY4OCwgNTY5MCwgNTY5MiwgNTY5NCwgNTksIDI3MDQ4LCA1OSwgMjcwNDksIDU5LCAyNzA1MCwgNTksIDI3MDUxLCA1OSwgMjcwNTIsIDU5LCAyNzA1MywgNTksIDI3MDU0LCA1OSwgMjcwNTUsIDExNiwgMjU2LCA1OSwgMTE4LCA1NzAxLCA1NzAyLCAyNTExOSwgOTgsIDI1NiwgNTksIDEwMCwgNTcwOCwgNTcwOSwgMjUyNzgsIDU5LCAyNzAzNywgMjU2LCAxMTIsIDExNiwgNTcxNiwgNTcxOSwgMTA0LCA1OSwgMjUxMjIsIDE4NywgMTg1LCA5NywgMTE0LCAxMTQsIDU5LCAyNTQ2OCwgMjU2LCAxMDMsIDExMiwgNTczMSwgNTczNSwgMTExLCAxMTAsIDU5LCAxNjY0NSwgMTAyLCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjY1OCwgODk2LCA1OSwgNjksIDk3LCAxMDEsIDEwNSwgMTExLCAxMTIsIDQ4MDEsIDU3NTUsIDU3NTcsIDU3NjIsIDU3NjQsIDU3NjcsIDU3NzAsIDU5LCAyNzI0OCwgOTksIDEwNSwgMTE0LCA1OSwgMjcyNDcsIDU5LCAyNTE2MiwgMTAwLCA1OSwgMjUxNjMsIDExNSwgNTksIDE2NDIzLCAxMTQsIDExMSwgMTIwLCAyNTYsIDU5LCAxMDEsIDQ4MDEsIDU3NzgsIDI0MSwgNTc2MywgMTA1LCAxMTAsIDEwMywgMzI4MjcsIDIyOSwgMTY2MTMsIDM4NCwgOTksIDExNiwgMTIxLCA1NzkzLCA1Nzk4LCA1ODAwLCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NTAyLCA1OSwgMTY0MjYsIDEwOSwgMTEyLCAyNTYsIDU5LCAxMDEsIDQ4MDEsIDU4MDcsIDI0MSwgNjQ4LCAxMDUsIDEwOCwgMTAwLCAxMDEsIDMyODI3LCAyMjcsIDE2NjExLCAxMDksIDEwOCwgMzI4MjcsIDIyOCwgMTY2MTIsIDI1NiwgOTksIDEwNSwgNTgyNiwgNTgzMiwgMTExLCAxMTAsIDEwNSwgMTEwLCAyNDQsIDYyNiwgMTEwLCAxMTYsIDU5LCAyNzE1MywgMjA0OCwgNzgsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwNSwgMTA3LCAxMDgsIDExMCwgMTExLCAxMTIsIDExNCwgMTE1LCAxMTcsIDU4NjksIDU4NzMsIDU5MzYsIDU5NDgsIDU5NTUsIDU5NjAsIDYwMDgsIDYwMTMsIDYxMTIsIDYxMTgsIDYyMDEsIDYyMjQsIDU5MDEsIDY0NjEsIDY0NzIsIDY1MTIsIDExMSwgMTE2LCA1OSwgMjczNzMsIDI1NiwgOTksIDExNCwgNTg3OCwgNTkxOCwgMTA3LCA1MTIsIDk5LCAxMDEsIDExMiwgMTE1LCA1ODg4LCA1ODkzLCA1OTAxLCA1OTA3LCAxMTEsIDExMCwgMTAzLCA1OSwgMjUxNjQsIDExMiwgMTE1LCAxMDUsIDEwOCwgMTExLCAxMTAsIDU5LCAxNzM5OCwgMTE0LCAxMDUsIDEwOSwgMTAxLCA1OSwgMjQ2MjksIDEwNSwgMTA5LCAyNTYsIDU5LCAxMDEsIDU5MTQsIDU5MTUsIDI1MTQ5LCAxMTMsIDU5LCAyNTI5MywgMzc0LCA1OTIyLCA1OTI2LCAxMDEsIDEwMSwgNTksIDI1Mjc3LCAxMDEsIDEwMCwgMjU2LCA1OSwgMTAzLCA1OTMyLCA1OTMzLCAyNTM0OSwgMTAxLCAxODcsIDU5MzMsIDExNCwgMTA3LCAyNTYsIDU5LCAxMTYsIDQ5NTYsIDU5NDMsIDk4LCAxMTQsIDEwNywgNTksIDI1NTI2LCAyNTYsIDExMSwgMTIxLCA1ODg5LCA1OTUzLCA1OSwgMTc0NTcsIDExMywgMTE3LCAxMTEsIDU5LCAyNDYwNiwgNjQwLCA5OSwgMTA5LCAxMTIsIDExNCwgMTE2LCA1OTcxLCA1OTc5LCA1OTg1LCA1OTg4LCA1OTkyLCA5NywgMTE3LCAxMTUsIDI1NiwgNTksIDEwMSwgMjY2LCAyNjUsIDExMiwgMTE2LCAxMjEsIDExOCwgNTksIDI3MDU2LCAxMTUsIDIzMywgNTkwMCwgMTEwLCAxMTEsIDI0NSwgMjc1LCAzODQsIDk3LCAxMDQsIDExOSwgNTk5OSwgNjAwMSwgNjAwMywgNTksIDE3MzMwLCA1OSwgMjQ4ODYsIDEwMSwgMTAxLCAxMTAsIDU5LCAyNTE5NiwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYwNywgMTAzLCA4OTYsIDk5LCAxMTEsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCA2MDI5LCA2MDQ1LCA2MDY3LCA2MDgxLCA2MTAxLCA2MTA3LCA2MTEwLCAzODQsIDk3LCAxMDUsIDExNywgNjAzNiwgNjAzOCwgNjA0MiwgMjQwLCAxODg4LCAxMTQsIDk5LCA1OSwgMjYwOTUsIDExMiwgMTg3LCA0OTc3LCAzODQsIDEwMCwgMTEyLCAxMTYsIDYwNTIsIDYwNTYsIDYwNjEsIDExMSwgMTE2LCA1OSwgMjcxMzYsIDEwOCwgMTE3LCAxMTUsIDU5LCAyNzEzNywgMTA1LCAxMDksIDEwMSwgMTE1LCA1OSwgMjcxMzgsIDYyNSwgNjA3MywgMCwgMCwgNjA3OCwgOTksIDExNywgMTEyLCA1OSwgMjcxNDIsIDk3LCAxMTQsIDU5LCAyNjExNywgMTE0LCAxMDUsIDk3LCAxMTAsIDEwMywgMTA4LCAxMDEsIDI1NiwgMTAwLCAxMTcsIDYwOTMsIDYwOTgsIDExMSwgMTE5LCAxMTAsIDU5LCAyNjA0NSwgMTEyLCA1OSwgMjYwMzUsIDExMiwgMTA4LCAxMTcsIDExNSwgNTksIDI3MTQwLCAxMDEsIDIyOSwgNTE4OCwgMjI5LCA1MjkzLCA5NywgMTE0LCAxMTEsIDExOSwgNTksIDI2ODkzLCAzODQsIDk3LCAxMDcsIDExMSwgNjEyNSwgNjE4MiwgNjE5NywgMjU2LCA5OSwgMTEwLCA2MTMwLCA2MTc5LCAxMDcsIDM4NCwgMTA4LCAxMTUsIDExNiwgNjEzOCwgMTQ1MSwgNjE0NiwgMTExLCAxMjIsIDEwMSwgMTEwLCAxMDMsIDEwMSwgNTksIDI3MTE1LCAxMTQsIDEwNSwgOTcsIDExMCwgMTAzLCAxMDgsIDEwMSwgNTEyLCA1OSwgMTAwLCAxMDgsIDExNCwgNjE2MiwgNjE2MywgNjE2OCwgNjE3MywgMjYwMzYsIDExMSwgMTE5LCAxMTAsIDU5LCAyNjA0NiwgMTAxLCAxMDIsIDExNiwgNTksIDI2MDUwLCAxMDUsIDEwMywgMTA0LCAxMTYsIDU5LCAyNjA0MCwgMTA3LCA1OSwgMjU2MzUsIDQzMywgNjE4NywgMCwgNjE5NSwgNDM0LCA2MTkxLCAwLCA2MTkzLCA1OSwgMjYwMDIsIDU5LCAyNjAwMSwgNTIsIDU5LCAyNjAwMywgOTksIDEwNywgNTksIDI1OTkyLCAyNTYsIDEwMSwgMTExLCA2MjA2LCA2MjIxLCAyNTYsIDU5LCAxMTMsIDYyMTEsIDYyMTQsIDQ5MTUyLCA2MSwgODQyMSwgMTE3LCAxMDUsIDExOCwgNTksIDQ5MTUyLCA4ODAxLCA4NDIxLCAxMTYsIDU5LCAyNTM2MCwgNTEyLCAxMTIsIDExNiwgMTE5LCAxMjAsIDYyMzMsIDYyMzgsIDYyNDcsIDYyNTIsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NTksIDI1NiwgNTksIDExNiwgNTA2NywgNjI0MywgMTExLCAxMDksIDE4NywgNTA2OCwgMTE2LCAxMDUsIDEwMSwgNTksIDI1Mjg4LCAxNTM2LCA2OCwgNzIsIDg1LCA4NiwgOTgsIDEwMCwgMTA0LCAxMDksIDExMiwgMTE2LCAxMTcsIDExOCwgNjI3NywgNjI5NCwgNjMxNCwgNjMzMSwgNjM1OSwgNjM2MywgNjM4MCwgNjM5OSwgNjQwNSwgNjQxMCwgNjQxNiwgNjQzMywgNTEyLCA3NiwgODIsIDEwOCwgMTE0LCA2Mjg2LCA2Mjg4LCA2MjkwLCA2MjkyLCA1OSwgMjU5NDMsIDU5LCAyNTk0MCwgNTksIDI1OTQyLCA1OSwgMjU5MzksIDY0MCwgNTksIDY4LCA4NSwgMTAwLCAxMTcsIDYzMDUsIDYzMDYsIDYzMDgsIDYzMTAsIDYzMTIsIDI1OTM2LCA1OSwgMjU5NTgsIDU5LCAyNTk2MSwgNTksIDI1OTU2LCA1OSwgMjU5NTksIDUxMiwgNzYsIDgyLCAxMDgsIDExNCwgNjMyMywgNjMyNSwgNjMyNywgNjMyOSwgNTksIDI1OTQ5LCA1OSwgMjU5NDYsIDU5LCAyNTk0OCwgNTksIDI1OTQ1LCA4OTYsIDU5LCA3MiwgNzYsIDgyLCAxMDQsIDEwOCwgMTE0LCA2MzQ2LCA2MzQ3LCA2MzQ5LCA2MzUxLCA2MzUzLCA2MzU1LCA2MzU3LCAyNTkzNywgNTksIDI1OTY0LCA1OSwgMjU5NTUsIDU5LCAyNTk1MiwgNTksIDI1OTYzLCA1OSwgMjU5NTQsIDU5LCAyNTk1MSwgMTExLCAxMjAsIDU5LCAyNzA4MSwgNTEyLCA3NiwgODIsIDEwOCwgMTE0LCA2MzcyLCA2Mzc0LCA2Mzc2LCA2Mzc4LCA1OSwgMjU5NDEsIDU5LCAyNTkzOCwgNTksIDI1ODcyLCA1OSwgMjU4NjgsIDY0MCwgNTksIDY4LCA4NSwgMTAwLCAxMTcsIDE3MjUsIDYzOTEsIDYzOTMsIDYzOTUsIDYzOTcsIDU5LCAyNTk1NywgNTksIDI1OTYwLCA1OSwgMjU5MDAsIDU5LCAyNTkwOCwgMTA1LCAxMTAsIDExNywgMTE1LCA1OSwgMjUyNDcsIDEwOCwgMTE3LCAxMTUsIDU5LCAyNTI0NiwgMTA1LCAxMDksIDEwMSwgMTE1LCA1OSwgMjUyNDgsIDUxMiwgNzYsIDgyLCAxMDgsIDExNCwgNjQyNSwgNjQyNywgNjQyOSwgNjQzMSwgNTksIDI1OTQ3LCA1OSwgMjU5NDQsIDU5LCAyNTg4MCwgNTksIDI1ODc2LCA4OTYsIDU5LCA3MiwgNzYsIDgyLCAxMDQsIDEwOCwgMTE0LCA2NDQ4LCA2NDQ5LCA2NDUxLCA2NDUzLCA2NDU1LCA2NDU3LCA2NDU5LCAyNTg1OCwgNTksIDI1OTYyLCA1OSwgMjU5NTMsIDU5LCAyNTk1MCwgNTksIDI1OTE2LCA1OSwgMjU4OTIsIDU5LCAyNTg4NCwgMjU2LCAxMDEsIDExOCwgMjkxLCA2NDY2LCA5OCwgOTcsIDExNCwgMzI4MjcsIDE2NiwgMTY1NTAsIDUxMiwgOTksIDEwMSwgMTA1LCAxMTEsIDY0ODEsIDY0ODYsIDY0OTAsIDY0OTYsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1MDMsIDEwOSwgMTA1LCA1OSwgMjQ2NTUsIDEwOSwgMjU2LCA1OSwgMTAxLCA1OTE0LCA1OTE2LCAxMDgsIDM4NCwgNTksIDk4LCAxMDQsIDY1MDQsIDY1MDUsIDY1MDcsIDE2NDc2LCA1OSwgMjcwNzcsIDExNSwgMTE3LCA5OCwgNTksIDI2NTY4LCAzNjQsIDY1MTYsIDY1MjYsIDEwOCwgMjU2LCA1OSwgMTAxLCA2NTIxLCA2NTIyLCAyNDYxMCwgMTE2LCAxODcsIDY1MjIsIDExMiwgMzg0LCA1OSwgNjksIDEwMSwgMzAzLCA2NTMzLCA2NTM1LCA1OSwgMjczMTAsIDI1NiwgNTksIDExMywgMTc1NiwgMTc1NSwgMzI5NywgNjU2NywgMCwgNjYzMiwgNjY3MywgNjY3NywgNjcwNiwgMCwgNjcxMSwgNjczNiwgMCwgMCwgNjgzNiwgMCwgMCwgNjg0OSwgMCwgMCwgNjk0NSwgNjk1OCwgNjk4OSwgNjk5NCwgMCwgNzE2NSwgMCwgNzE4MCwgMzg0LCA5OSwgMTEyLCAxMTQsIDY1NzMsIDY1NzgsIDY2MjEsIDExNywgMTE2LCAxMDEsIDU5LCAxNjY0NywgNzY4LCA1OSwgOTcsIDk4LCA5OSwgMTAwLCAxMTUsIDY1OTEsIDY1OTIsIDY1OTYsIDY2MDIsIDY2MTMsIDY2MTcsIDI1MTI5LCAxMTAsIDEwMCwgNTksIDI3MjA0LCAxMTQsIDk5LCAxMTcsIDExMiwgNTksIDI3MjA5LCAyNTYsIDk3LCAxMTcsIDY2MDcsIDY2MTAsIDExMiwgNTksIDI3MjExLCAxMTIsIDU5LCAyNzIwNywgMTExLCAxMTYsIDU5LCAyNzIwMCwgNTksIDQ5MTUyLCA4NzQ1LCA2NTAyNCwgMjU2LCAxMDEsIDExMSwgNjYyNiwgNjYyOSwgMTE2LCA1OSwgMjQ2NDEsIDIzOCwgMTY4MywgNTEyLCA5NywgMTAxLCAxMDUsIDExNywgNjY0MCwgNjY1MSwgNjY1NywgNjY2MSwgNDk2LCA2NjQ1LCAwLCA2NjQ4LCAxMTUsIDU5LCAyNzIxMywgMTExLCAxMTAsIDU5LCAxNjY1MywgMTAwLCAxMDUsIDEwOCwgMzI4MjcsIDIzMSwgMTY2MTUsIDExNCwgOTksIDU5LCAxNjY0OSwgMTEyLCAxMTUsIDI1NiwgNTksIDExNSwgNjY2OCwgNjY2OSwgMjcyMTIsIDEwOSwgNTksIDI3MjE2LCAxMTEsIDExNiwgNTksIDE2NjUxLCAzODQsIDEwMCwgMTA5LCAxMTAsIDY2ODMsIDY2ODgsIDY2OTQsIDEwNSwgMTA4LCAzMjk1NSwgMTg0LCA0MjksIDExMiwgMTE2LCAxMjEsIDExOCwgNTksIDI3MDU4LCAxMTYsIDMzMDI0LCAxNjIsIDU5LCAxMDEsIDY3MDEsIDY3MDIsIDE2NTQ2LCAxMTQsIDIyOCwgNDM0LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjA4LCAzODQsIDk5LCAxMDEsIDEwNSwgNjcxNywgNjcyMCwgNjczMywgMTIxLCA1OSwgMTc0NzksIDk5LCAxMDcsIDI1NiwgNTksIDEwOSwgNjcyNywgNjcyOCwgMjYzODcsIDk3LCAxMTQsIDEwNywgMTg3LCA2NzI4LCA1OSwgMTczNTEsIDExNCwgODk2LCA1OSwgNjksIDk5LCAxMDEsIDEwMiwgMTA5LCAxMTUsIDY3NTEsIDY3NTIsIDY3NTQsIDY3NjMsIDY4MjAsIDY4MjYsIDY4MzAsIDI2MDU5LCA1OSwgMjcwNzUsIDM4NCwgNTksIDEwMSwgMTA4LCA2NzYxLCA2NzYyLCA2NzY1LCAxNzA5NCwgMTEzLCA1OSwgMjUxNzUsIDEwMSwgNjA5LCA2NzcyLCAwLCAwLCA2NzkyLCAxMTQsIDExNCwgMTExLCAxMTksIDI1NiwgMTA4LCAxMTQsIDY3ODAsIDY3ODUsIDEwMSwgMTAyLCAxMTYsIDU5LCAyNTAxOCwgMTA1LCAxMDMsIDEwNCwgMTE2LCA1OSwgMjUwMTksIDY0MCwgODIsIDgzLCA5NywgOTksIDEwMCwgNjgwMiwgNjgwNCwgNjgwNiwgNjgxMCwgNjgxNSwgMTg3LCAzOTExLCA1OSwgMjU4MDAsIDExNSwgMTE2LCA1OSwgMjUyNDMsIDEwNSwgMTE0LCA5OSwgNTksIDI1MjQyLCA5NywgMTE1LCAxMDQsIDU5LCAyNTI0NSwgMTEwLCAxMDUsIDExMCwgMTE2LCA1OSwgMjcxNTIsIDEwNSwgMTAwLCA1OSwgMjczNzUsIDk5LCAxMDUsIDExNCwgNTksIDI3MDc0LCAxMTcsIDk4LCAxMTUsIDI1NiwgNTksIDExNywgNjg0MywgNjg0NCwgMjYyMTEsIDEwNSwgMTE2LCAxODcsIDY4NDQsIDc0OCwgNjg1NSwgNjg2OCwgNjkwNiwgMCwgNjkyMiwgMTExLCAxMTAsIDI1NiwgNTksIDEwMSwgNjg2MSwgNjg2MiwgMTY0NDIsIDI1NiwgNTksIDExMywgMTk5LCAxOTgsIDYyMSwgNjg3MywgMCwgMCwgNjg4MiwgOTcsIDI1NiwgNTksIDExNiwgNjg3OCwgNjg3OSwgMTY0MjgsIDU5LCAxNjQ0OCwgMzg0LCA1OSwgMTAyLCAxMDgsIDY4ODgsIDY4ODksIDY4OTEsIDI1MDg5LCAyMzgsIDQ0NDgsIDEwMSwgMjU2LCAxMDksIDEyMCwgNjg5NywgNjkwMiwgMTAxLCAxMTAsIDExNiwgMTg3LCA2ODg5LCAxMDEsIDI0MywgNTg5LCA0ODcsIDY5MTAsIDAsIDY5MTksIDI1NiwgNTksIDEwMCwgNDc5NSwgNjkxNCwgMTExLCAxMTYsIDU5LCAyNzI0NSwgMTEwLCAyNDQsIDU4MiwgMzg0LCAxMDIsIDExNCwgMTIxLCA2OTI4LCA2OTMyLCA2OTM1LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjY2MCwgMTExLCAyMjgsIDU5NiwgMzMwMjQsIDE2OSwgNTksIDExNSwgMzQxLCA2OTQxLCAxMTQsIDU5LCAyNDg1NSwgMjU2LCA5NywgMTExLCA2OTQ5LCA2OTUzLCAxMTQsIDExNCwgNTksIDI1MDEzLCAxMTUsIDExNSwgNTksIDI2MzkxLCAyNTYsIDk5LCAxMTcsIDY5NjIsIDY5NjcsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1MDQsIDI1NiwgOTgsIDExMiwgNjk3MiwgNjk4MCwgMjU2LCA1OSwgMTAxLCA2OTc3LCA2OTc4LCAyNzM0MywgNTksIDI3MzQ1LCAyNTYsIDU5LCAxMDEsIDY5ODUsIDY5ODYsIDI3MzQ0LCA1OSwgMjczNDYsIDEwMCwgMTExLCAxMTYsIDU5LCAyNTMyNywgODk2LCAxMDAsIDEwMSwgMTA4LCAxMTIsIDExNCwgMTE4LCAxMTksIDcwMDgsIDcwMjAsIDcwMzEsIDcwNDIsIDcwODQsIDcxMjQsIDcxNjEsIDk3LCAxMTQsIDExNCwgMjU2LCAxMDgsIDExNCwgNzAxNiwgNzAxOCwgNTksIDI2OTM2LCA1OSwgMjY5MzMsIDYyNCwgNzAyNiwgMCwgMCwgNzAyOSwgMTE0LCA1OSwgMjUzMTAsIDk5LCA1OSwgMjUzMTEsIDk3LCAxMTQsIDExNCwgMjU2LCA1OSwgMTEyLCA3MDM5LCA3MDQwLCAyNTAxNCwgNTksIDI2OTQxLCA3NjgsIDU5LCA5OCwgOTksIDEwMCwgMTExLCAxMTUsIDcwNTUsIDcwNTYsIDcwNjIsIDcwNzMsIDcwNzcsIDcwODAsIDI1MTMwLCAxMTQsIDk5LCA5NywgMTEyLCA1OSwgMjcyMDgsIDI1NiwgOTcsIDExNywgNzA2NywgNzA3MCwgMTEyLCA1OSwgMjcyMDYsIDExMiwgNTksIDI3MjEwLCAxMTEsIDExNiwgNTksIDI1MjI5LCAxMTQsIDU5LCAyNzIwNSwgNTksIDQ5MTUyLCA4NzQ2LCA2NTAyNCwgNTEyLCA5NywgMTA4LCAxMTQsIDExOCwgNzA5MywgNzEwMywgNzEzNCwgNzEzOSwgMTE0LCAxMTQsIDI1NiwgNTksIDEwOSwgNzEwMCwgNzEwMSwgMjUwMTUsIDU5LCAyNjk0MCwgMTIxLCAzODQsIDEwMSwgMTE4LCAxMTksIDcxMTEsIDcxMjQsIDcxMjgsIDExMywgNjI0LCA3MTE4LCAwLCAwLCA3MTIyLCAxMTQsIDEwMSwgMjI3LCA3MDI3LCAxMTcsIDIyNywgNzAyOSwgMTAxLCAxMDEsIDU5LCAyNTI5NCwgMTAxLCAxMDAsIDEwMywgMTAxLCA1OSwgMjUyOTUsIDEwMSwgMTEwLCAzMjgyNywgMTY0LCAxNjU0OCwgMTAxLCA5NywgMTE0LCAxMTQsIDExMSwgMTE5LCAyNTYsIDEwOCwgMTE0LCA3MTUwLCA3MTU1LCAxMDEsIDEwMiwgMTE2LCAxODcsIDcwNDAsIDEwNSwgMTAzLCAxMDQsIDExNiwgMTg3LCA3MTAxLCAxMDEsIDIyOCwgNzEzMywgMjU2LCA5OSwgMTA1LCA3MTY5LCA3MTc1LCAxMTEsIDExMCwgMTA1LCAxMTAsIDI0NCwgNTAzLCAxMTAsIDExNiwgNTksIDI1MTM3LCAxMDgsIDk5LCAxMTYsIDEyMSwgNTksIDI1Mzg5LCAyNDMyLCA2NSwgNzIsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwNCwgMTA1LCAxMDYsIDEwOCwgMTExLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOSwgMTIyLCA3MjI0LCA3MjI3LCA3MjMxLCA3MjYxLCA3MjczLCA3Mjg1LCA3MzA2LCA3MzI2LCA3MzQwLCA3MzUxLCA3NDE5LCA3NDIzLCA3NDM3LCA3NTQ3LCA3NTY5LCA3NTk1LCA3NjExLCA3NjIyLCA3NjI5LCAxMTQsIDI0MiwgODk3LCA5NywgMTE0LCA1OSwgMjY5ODEsIDUxMiwgMTAzLCAxMDgsIDExNCwgMTE1LCA3MjQwLCA3MjQ1LCA3MjUwLCA3MjUyLCAxMDMsIDEwMSwgMTE0LCA1OSwgMjQ2MDgsIDEwMSwgMTE2LCAxMDQsIDU5LCAyNDg4OCwgMjQyLCA0NDAzLCAxMDQsIDI1NiwgNTksIDExOCwgNzI1OCwgNzI1OSwgMjQ1OTIsIDE4NywgMjMxNCwgMzYzLCA3MjY1LCA3MjcxLCA5NywgMTE0LCAxMTEsIDExOSwgNTksIDI2ODk1LCA5NywgMjI3LCA3ODksIDI1NiwgOTcsIDEyMSwgNzI3OCwgNzI4MywgMTE0LCAxMTEsIDExMCwgNTksIDE2NjU1LCA1OSwgMTc0NjAsIDM4NCwgNTksIDk3LCAxMTEsIDgxOCwgNzI5MiwgNzMwMCwgMjU2LCAxMDMsIDExNCwgNzAzLCA3Mjk3LCAxMTQsIDU5LCAyNTAzNCwgMTE2LCAxMTUsIDEwMSwgMTEzLCA1OSwgMjcyNTUsIDM4NCwgMTAzLCAxMDgsIDEwOSwgNzMxMywgNzMxNiwgNzMyMCwgMzI4MjcsIDE3NiwgMTY1NjAsIDExNiwgOTcsIDU5LCAxNzMzMiwgMTEyLCAxMTYsIDEyMSwgMTE4LCA1OSwgMjcwNTcsIDI1NiwgMTA1LCAxMTQsIDczMzEsIDczMzYsIDExNSwgMTA0LCAxMTYsIDU5LCAyNzAwNywgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MDksIDk3LCAxMTQsIDI1NiwgMTA4LCAxMTQsIDczNDcsIDczNDksIDE4NywgMjI2OCwgMTg3LCA0MTI2LCA2NDAsIDk3LCAxMDEsIDEwMywgMTE1LCAxMTgsIDczNjIsIDg4OCwgNzM4MiwgNzM4OCwgNzM5MiwgMTA5LCAzODQsIDU5LCAxMTEsIDExNSwgODA2LCA3MzcwLCA3MzgwLCAxMTAsIDEwMCwgMjU2LCA1OSwgMTE1LCA4MDYsIDczNzcsIDExNywgMTA1LCAxMTYsIDU5LCAyNjIxNCwgOTcsIDEwOSwgMTA5LCA5NywgNTksIDE3MzczLCAxMDUsIDExMCwgNTksIDI1MzMwLCAzODQsIDU5LCAxMDUsIDExMSwgNzM5OSwgNzQwMCwgNzQxNiwgMTY2MzEsIDEwMCwgMTAxLCAzMzAyNCwgMjQ3LCA1OSwgMTExLCA3Mzk5LCA3NDA4LCAxMTAsIDExNiwgMTA1LCAxMDksIDEwMSwgMTE1LCA1OSwgMjUyODcsIDExMCwgMjQ4LCA3NDE1LCA5OSwgMTIxLCA1OSwgMTc0OTAsIDk5LCA2MjMsIDc0MzAsIDAsIDAsIDc0MzQsIDExNCwgMTEwLCA1OSwgMjUzNzQsIDExMSwgMTEyLCA1OSwgMjUzNTcsIDY0MCwgMTA4LCAxMTIsIDExNiwgMTE3LCAxMTksIDc0NDgsIDc0NTMsIDc0NTgsIDc0OTcsIDc1MDksIDEwOCwgOTcsIDExNCwgNTksIDE2NDIwLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjYxLCA2NDAsIDU5LCAxMDEsIDEwOSwgMTEyLCAxMTUsIDc3OSwgNzQ2OSwgNzQ3OSwgNzQ4NSwgNzQ5MCwgMTEzLCAyNTYsIDU5LCAxMDAsIDg1MCwgNzQ3NSwgMTExLCAxMTYsIDU5LCAyNTE2OSwgMTA1LCAxMTAsIDExNywgMTE1LCA1OSwgMjUxNDQsIDEwOCwgMTE3LCAxMTUsIDU5LCAyNTEwOCwgMTEzLCAxMTcsIDk3LCAxMTQsIDEwMSwgNTksIDI1MjQ5LCA5OCwgMTA4LCAxMDEsIDk4LCA5NywgMTE0LCAxMTksIDEwMSwgMTAwLCAxMDMsIDIyOSwgMjUwLCAxMTAsIDM4NCwgOTcsIDEwMCwgMTA0LCA0Mzk4LCA3NTE3LCA3NTI3LCAxMTEsIDExOSwgMTEwLCA5NywgMTE0LCAxMTQsIDExMSwgMTE5LCAyNDMsIDcyOTksIDk3LCAxMTQsIDExMiwgMTExLCAxMTEsIDExMCwgMjU2LCAxMDgsIDExNCwgNzUzOCwgNzU0MiwgMTAxLCAxMDIsIDI0NCwgNzM0OCwgMTA1LCAxMDMsIDEwNCwgMjQ0LCA3MzUwLCAzNTQsIDc1NTEsIDc1NTcsIDEwNywgOTcsIDExNCwgMTExLCAyNDcsIDM5MDYsIDYyMywgNzU2MiwgMCwgMCwgNzU2NiwgMTE0LCAxMTAsIDU5LCAyNTM3NSwgMTExLCAxMTIsIDU5LCAyNTM1NiwgMzg0LCA5OSwgMTExLCAxMTYsIDc1NzYsIDc1ODcsIDc1OTAsIDI1NiwgMTE0LCAxMjEsIDc1ODEsIDc1ODUsIDU5LCA0OTE1MiwgNTUzNDksIDU2NTA1LCA1OSwgMTc0OTMsIDEwOCwgNTksIDI3MTI2LCAxMTQsIDExMSwgMTA3LCA1OSwgMTY2NTcsIDI1NiwgMTAwLCAxMTQsIDc2MDAsIDc2MDQsIDExMSwgMTE2LCA1OSwgMjUzMjksIDEwNSwgMjU2LCA1OSwgMTAyLCA3NjEwLCA2MTY2LCAyNjA0NywgMjU2LCA5NywgMTA0LCA3NjE2LCA3NjE5LCAxMTQsIDI0MiwgMTA2NSwgOTcsIDI0MiwgNDAwNiwgOTcsIDExMCwgMTAzLCAxMDgsIDEwMSwgNTksIDI3MDQ2LCAyNTYsIDk5LCAxMDUsIDc2MzQsIDc2MzcsIDEyMSwgNTksIDE3NTAzLCAxMDMsIDExNCwgOTcsIDExNCwgMTE0LCA1OSwgMjY2MjMsIDIzMDQsIDY4LCA5NywgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMjAsIDc2ODEsIDc2ODksIDc3MDUsIDc3MzYsIDE0MDAsIDc3NDAsIDc3NTMsIDc3NzcsIDc4MDYsIDc4NDUsIDc4NTUsIDc4NjksIDc5MDUsIDc5NzgsIDc5OTEsIDgwMDQsIDgwMTQsIDgwMjYsIDI1NiwgNjgsIDExMSwgNzY4NiwgNzQ3NiwgMTExLCAyNDQsIDczMDUsIDI1NiwgOTksIDExNSwgNzY5NCwgNzcwMCwgMTE3LCAxMTYsIDEwMSwgMzI4MjcsIDIzMywgMTY2MTcsIDExNiwgMTAxLCAxMTQsIDU5LCAyNzI0NiwgNTEyLCA5NywgMTA1LCAxMTEsIDEyMSwgNzcxNCwgNzcxOSwgNzcyOSwgNzczNCwgMTE0LCAxMTEsIDExMCwgNTksIDE2NjY3LCAxMTQsIDI1NiwgNTksIDk5LCA3NzI1LCA3NzI2LCAyNTE3NCwgMzI4MjcsIDIzNCwgMTY2MTgsIDEwOCwgMTExLCAxMTAsIDU5LCAyNTE3MywgNTksIDE3NDg1LCAxMTEsIDExNiwgNTksIDE2NjYzLCAyNTYsIDY4LCAxMTQsIDc3NDUsIDc3NDksIDExMSwgMTE2LCA1OSwgMjUxNzAsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjEwLCAzODQsIDU5LCAxMTQsIDExNSwgNzc2MCwgNzc2MSwgNzc2NywgMjcyOTAsIDk3LCAxMTgsIDEwMSwgMzI4MjcsIDIzMiwgMTY2MTYsIDI1NiwgNTksIDEwMCwgNzc3MiwgNzc3MywgMjcyODYsIDExMSwgMTE2LCA1OSwgMjcyODgsIDUxMiwgNTksIDEwNSwgMTA4LCAxMTUsIDc3ODYsIDc3ODcsIDc3OTQsIDc3OTYsIDI3Mjg5LCAxMTAsIDExNiwgMTAxLCAxMTQsIDExNSwgNTksIDI1NTc1LCA1OSwgMjQ4NTEsIDI1NiwgNTksIDEwMCwgNzgwMSwgNzgwMiwgMjcyODUsIDExMSwgMTE2LCA1OSwgMjcyODcsIDM4NCwgOTcsIDExMiwgMTE1LCA3ODEzLCA3ODE3LCA3ODMxLCA5OSwgMTE0LCA1OSwgMTY2NTksIDExNiwgMTIxLCAzODQsIDU5LCAxMTUsIDExOCwgNzgyNiwgNzgyNywgNzgyOSwgMjUwOTMsIDEwMSwgMTE2LCAxODcsIDc4MjcsIDExMiwgMjU2LCA0OSwgNTksIDc4MzcsIDc4NDQsIDMwNywgNzg0MSwgNzg0MywgNTksIDI0NTgwLCA1OSwgMjQ1ODEsIDI0NTc5LCAyNTYsIDEwMywgMTE1LCA3ODUwLCA3ODUyLCA1OSwgMTY3MTUsIDExMiwgNTksIDI0NTc4LCAyNTYsIDEwMywgMTEyLCA3ODYwLCA3ODY0LCAxMTEsIDExMCwgNTksIDE2NjY1LCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjYyLCAzODQsIDk3LCAxMDgsIDExNSwgNzg3NiwgNzg4NiwgNzg5MCwgMTE0LCAyNTYsIDU5LCAxMTUsIDc4ODIsIDc4ODMsIDI1MzAxLCAxMDgsIDU5LCAyNzEwNywgMTE3LCAxMTUsIDU5LCAyNzI0OSwgMTA1LCAzODQsIDU5LCAxMDgsIDExOCwgNzg5OCwgNzg5OSwgNzkwMywgMTczMzMsIDExMSwgMTEwLCAxODcsIDc4OTksIDU5LCAxNzM5NywgNTEyLCA5OSwgMTE1LCAxMTcsIDExOCwgNzkxNCwgNzkyMywgNzk0NywgNzk3MSwgMjU2LCAxMDUsIDExMSwgNzkxOSwgNzcyOSwgMTE0LCA5OSwgMTg3LCA3NzI2LCA2MTcsIDc5MjksIDAsIDAsIDc5MzEsIDIzNywgMTM1MiwgOTcsIDExMCwgMTE2LCAyNTYsIDEwMywgMTA4LCA3OTM4LCA3OTQyLCAxMTYsIDExNCwgMTg3LCA3NzczLCAxMDEsIDExNSwgMTE1LCAxODcsIDc4MDIsIDM4NCwgOTcsIDEwMSwgMTA1LCA3OTU0LCA3OTU4LCA3OTYyLCAxMDgsIDExNSwgNTksIDE2NDQ1LCAxMTUsIDExNiwgNTksIDI1MTgzLCAxMTgsIDI1NiwgNTksIDY4LCA1NjUsIDc5NjgsIDY4LCA1OSwgMjcyNTYsIDExMiwgOTcsIDExNCwgMTE1LCAxMDgsIDU5LCAyNzEwOSwgMjU2LCA2OCwgOTcsIDc5ODMsIDc5ODcsIDExMSwgMTE2LCA1OSwgMjUxNzEsIDExNCwgMTE0LCA1OSwgMjY5OTMsIDM4NCwgOTksIDEwMCwgMTA1LCA3OTk4LCA4MDAxLCA3OTI4LCAxMTQsIDU5LCAyNDg3OSwgMTExLCAyNDQsIDg1MCwgMjU2LCA5NywgMTA0LCA4MDA5LCA4MDExLCA1OSwgMTczMzUsIDMyODI3LCAyNDAsIDE2NjI0LCAyNTYsIDEwOSwgMTE0LCA4MDE5LCA4MDIzLCAxMDgsIDMyODI3LCAyMzUsIDE2NjE5LCAxMTEsIDU5LCAyNDc0OCwgMzg0LCA5OSwgMTA1LCAxMTIsIDgwMzMsIDgwMzYsIDgwMzksIDEwOCwgNTksIDE2NDE3LCAxMTUsIDI0NCwgMTM5MCwgMjU2LCAxMDEsIDExMSwgODA0NCwgODA1MiwgOTksIDExNiwgOTcsIDExNiwgMTA1LCAxMTEsIDIzOCwgMTM2OSwgMTEwLCAxMDEsIDExMCwgMTE2LCAxMDUsIDk3LCAxMDgsIDIyOSwgMTQwMSwgMjUyOSwgODA4MiwgMCwgODA5NCwgMCwgODA5NywgODEwMywgMCwgMCwgODEzNCwgODE0MCwgMCwgODE0NywgMCwgODE2NiwgODE3MCwgODE5MiwgMCwgODIwMCwgODI4MiwgMTA4LCAxMDgsIDEwNSwgMTEwLCAxMDMsIDEwMCwgMTExLCAxMTYsIDExNSwgMTAxLCAyNDEsIDc3NDgsIDEyMSwgNTksIDE3NDc2LCAxMDksIDk3LCAxMDgsIDEwMSwgNTksIDI2MTc2LCAzODQsIDEwNSwgMTA4LCAxMTQsIDgxMDksIDgxMTUsIDgxMjksIDEwOCwgMTA1LCAxMDMsIDU5LCAzMjc2OCwgNjQyNTksIDYxNywgODEyMSwgMCwgMCwgODEyNSwgMTAzLCA1OSwgMzI3NjgsIDY0MjU2LCAxMDUsIDEwMywgNTksIDMyNzY4LCA2NDI2MCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MTEsIDEwOCwgMTA1LCAxMDMsIDU5LCAzMjc2OCwgNjQyNTcsIDEwOCwgMTA1LCAxMDMsIDU5LCA0OTE1MiwgMTAyLCAxMDYsIDM4NCwgOTcsIDEwOCwgMTE2LCA4MTUzLCA4MTU2LCA4MTYxLCAxMTYsIDU5LCAyNjIyMSwgMTA1LCAxMDMsIDU5LCAzMjc2OCwgNjQyNTgsIDExMCwgMTE1LCA1OSwgMjYwMzMsIDExMSwgMTAyLCA1OSwgMTY3ODYsIDQ5NiwgODE3NCwgMCwgODE3OSwgMTAyLCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjY2MywgMjU2LCA5NywgMTA3LCAxNDcxLCA4MTgzLCAyNTYsIDU5LCAxMTgsIDgxODgsIDgxODksIDI1MzAwLCA1OSwgMjczNTMsIDk3LCAxMTQsIDExNiwgMTA1LCAxMTAsIDExNiwgNTksIDI3MTQ5LCAyNTYsIDk3LCAxMTEsIDgyMDQsIDgyNzcsIDI1NiwgOTksIDExNSwgODIwOSwgODI3NCwgOTQ1LCA4MjE4LCA4MjQwLCA4MjQ4LCA4MjYxLCA4MjY0LCAwLCA4MjcyLCA5NDYsIDgyMjYsIDgyMjksIDgyMzEsIDgyMzQsIDgyMzYsIDAsIDgyMzgsIDMyODI3LCAxODksIDE2NTczLCA1OSwgMjQ5MTUsIDMyODI3LCAxODgsIDE2NTcyLCA1OSwgMjQ5MTcsIDU5LCAyNDkyMSwgNTksIDI0OTIzLCA0MzUsIDgyNDQsIDAsIDgyNDYsIDU5LCAyNDkxNiwgNTksIDI0OTE4LCA2OTIsIDgyNTQsIDgyNTcsIDAsIDAsIDgyNTksIDMyODI3LCAxOTAsIDE2NTc0LCA1OSwgMjQ5MTksIDU5LCAyNDkyNCwgNTMsIDU5LCAyNDkyMCwgNDM4LCA4MjY4LCAwLCA4MjcwLCA1OSwgMjQ5MjIsIDU5LCAyNDkyNSwgNTYsIDU5LCAyNDkyNiwgMTA4LCA1OSwgMjQ2NDQsIDExOSwgMTEwLCA1OSwgMjUzNzgsIDk5LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NTA3LCAyMTc2LCA2OSwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDUsIDEwNiwgMTA4LCAxMTAsIDExMSwgMTE0LCAxMTUsIDExNiwgMTE4LCA4MzIyLCA4MzI5LCA4MzUxLCA4MzU3LCA4MzY4LCA4MzcyLCA4NDMyLCA4NDM3LCA4NDQyLCA4NDQ3LCA4NDUxLCA4NDY2LCA4NTA0LCA3OTEsIDg1MTAsIDg1MzAsIDg2MDYsIDI1NiwgNTksIDEwOCwgMTYxMywgODMyNywgNTksIDI3Mjc2LCAzODQsIDk5LCAxMDksIDExMiwgODMzNiwgODM0MSwgODM0OSwgMTE3LCAxMTYsIDEwMSwgNTksIDE2ODg1LCAxMDksIDk3LCAyNTYsIDU5LCAxMDAsIDgzNDgsIDczODYsIDE3MzMxLCA1OSwgMjcyNzAsIDExNCwgMTAxLCAxMTgsIDEwMSwgNTksIDE2NjcxLCAyNTYsIDEwNSwgMTIxLCA4MzYyLCA4MzY2LCAxMTQsIDk5LCA1OSwgMTY2NjksIDU5LCAxNzQ1OSwgMTExLCAxMTYsIDU5LCAxNjY3MywgNTEyLCA1OSwgMTA4LCAxMTMsIDExNSwgMTU5OCwgMTYwMiwgODM4MSwgODM5MywgMzg0LCA1OSwgMTEzLCAxMTUsIDE1OTgsIDE2MTIsIDgzODgsIDEwOCwgOTcsIDExMCwgMjQ0LCAxNjM3LCA1MTIsIDU5LCA5OSwgMTAwLCAxMDgsIDE2MzcsIDg0MDIsIDg0MDUsIDg0MjEsIDk5LCA1OSwgMjczMDUsIDExMSwgMTE2LCAyNTYsIDU5LCAxMTEsIDg0MTIsIDg0MTMsIDI3MjY0LCAyNTYsIDU5LCAxMDgsIDg0MTgsIDg0MTksIDI3MjY2LCA1OSwgMjcyNjgsIDI1NiwgNTksIDEwMSwgODQyNiwgODQyOSwgNDkxNTIsIDg5MjMsIDY1MDI0LCAxMTUsIDU5LCAyNzI4NCwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYxMiwgMjU2LCA1OSwgMTAzLCAxNjUxLCAxNTYzLCAxMDksIDEwMSwgMTA4LCA1OSwgMjQ4ODcsIDk5LCAxMjEsIDU5LCAxNzQ5MSwgNTEyLCA1OSwgNjksIDk3LCAxMDYsIDE2MjYsIDg0NjAsIDg0NjIsIDg0NjQsIDU5LCAyNzI4MiwgNTksIDI3MzAxLCA1OSwgMjczMDAsIDUxMiwgNjksIDk3LCAxMDEsIDExNSwgODQ3NSwgODQ3NywgODQ4OSwgODUwMCwgNTksIDI1MTkzLCAxMTIsIDI1NiwgNTksIDExMiwgODQ4MywgODQ4NCwgMjcyNzQsIDExNCwgMTExLCAxMjAsIDE4NywgODQ4NCwgMjU2LCA1OSwgMTEzLCA4NDk0LCA4NDk1LCAyNzI3MiwgMjU2LCA1OSwgMTEzLCA4NDk0LCA4NDc1LCAxMDUsIDEwOSwgNTksIDI1MzE5LCAxMTIsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NjQsIDI1NiwgOTksIDEwNSwgODUxNSwgODUxOCwgMTE0LCA1OSwgMjQ4NDIsIDEwOSwgMzg0LCA1OSwgMTAxLCAxMDgsIDE2NDMsIDg1MjYsIDg1MjgsIDU5LCAyNzI3OCwgNTksIDI3MjgwLCAzMzUzNiwgNjIsIDU5LCA5OSwgMTAwLCAxMDgsIDExMywgMTE0LCAxNTE4LCA4NTQ0LCA4NTU0LCA4NTU4LCA4NTYzLCA4NTY5LCAyNTYsIDk5LCAxMDUsIDg1NDksIDg1NTEsIDU5LCAyNzMwMywgMTE0LCA1OSwgMjcyNTgsIDExMSwgMTE2LCA1OSwgMjUzMDMsIDgwLCA5NywgMTE0LCA1OSwgMjcwMjksIDExNywgMTAxLCAxMTUsIDExNiwgNTksIDI3MjYwLCA2NDAsIDk3LCAxMDAsIDEwMSwgMTA4LCAxMTUsIDg1ODAsIDg1NTQsIDg1OTIsIDE2MjIsIDg2MDMsIDQ5NiwgODU4NSwgMCwgODU5MCwgMTEyLCAxMTQsIDExMSwgMjQ4LCA4MzUwLCAxMTQsIDU5LCAyNzAwMCwgMTEzLCAyNTYsIDEwOCwgMTEzLCAxNTk5LCA4NTk4LCAxMDgsIDEwMSwgMTE1LCAyNDMsIDgzMjgsIDEwNSwgMjM3LCAxNjQzLCAyNTYsIDEwMSwgMTEwLCA4NjExLCA4NjIxLCAxMTQsIDExNiwgMTEwLCAxMDEsIDExMywgMTEzLCA1OSwgNDkxNTIsIDg4MDksIDY1MDI0LCAxOTcsIDg2MTgsIDEyODAsIDY1LCA5NywgOTgsIDk5LCAxMDEsIDEwMiwgMTA3LCAxMTEsIDExNSwgMTIxLCA4NjQ0LCA4NjQ3LCA4Njg5LCA4NjkzLCA4Njk4LCA4NzI4LCA4NzMzLCA4NzUxLCA4ODA4LCA4ODI5LCAxMTQsIDI0MiwgOTI4LCA1MTIsIDEwNSwgMTA4LCAxMDksIDExNCwgODY1NiwgODY2MCwgODY2MywgODY2NywgMTE0LCAxMTUsIDI0MCwgNTI1MiwgMTAyLCAxODcsIDgyMjgsIDEwNSwgMTA4LCAyNDQsIDE3MDUsIDI1NiwgMTAwLCAxMTQsIDg2NzIsIDg2NzYsIDk5LCAxMjEsIDU5LCAxNzQ4MiwgMzg0LCA1OSwgOTksIDExOSwgMjI5MiwgODY4MywgODY4NywgMTA1LCAxMTQsIDU5LCAyNjk1MiwgNTksIDI1MDA1LCA5NywgMTE0LCA1OSwgMjQ4NDcsIDEwNSwgMTE0LCA5OSwgNTksIDE2Njc3LCAzODQsIDk3LCAxMDgsIDExNCwgODcwNSwgODcxOCwgODcyMywgMTE0LCAxMTYsIDExNSwgMjU2LCA1OSwgMTE3LCA4NzEzLCA4NzE0LCAyNjIxMywgMTA1LCAxMTYsIDE4NywgODcxNCwgMTA4LCAxMDUsIDExMiwgNTksIDI0NjE0LCA5OSwgMTExLCAxMTAsIDU5LCAyNTI3MywgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYxMywgMTE1LCAyNTYsIDEwMSwgMTE5LCA4NzM5LCA4NzQ1LCA5NywgMTE0LCAxMTEsIDExOSwgNTksIDI2OTE3LCA5NywgMTE0LCAxMTEsIDExOSwgNTksIDI2OTE4LCA2NDAsIDk3LCAxMDksIDExMSwgMTEyLCAxMTQsIDg3NjIsIDg3NjYsIDg3NzEsIDg3OTgsIDg4MDMsIDExNCwgMTE0LCA1OSwgMjUwODcsIDExNiwgMTA0LCAxMTYsIDU5LCAyNTE0NywgMTA3LCAyNTYsIDEwOCwgMTE0LCA4Nzc3LCA4Nzg3LCAxMDEsIDEwMiwgMTE2LCA5NywgMTE0LCAxMTQsIDExMSwgMTE5LCA1OSwgMjUwMDEsIDEwNSwgMTAzLCAxMDQsIDExNiwgOTcsIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI1MDAyLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjY1LCA5OCwgOTcsIDExNCwgNTksIDI0NTk3LCAzODQsIDk5LCAxMDgsIDExNiwgODgxNSwgODgyMCwgODgyNCwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjUwOSwgOTcsIDExNSwgMjMyLCA4NjkyLCAxMTQsIDExMSwgMTA3LCA1OSwgMTY2NzksIDI1NiwgOTgsIDExMiwgODgzNCwgODgzOSwgMTE3LCAxMDgsIDEwOCwgNTksIDI0NjQzLCAxMDQsIDEwMSwgMTEwLCAxODcsIDcyNTksIDI3ODUsIDg4NjcsIDAsIDg4NzQsIDAsIDg4ODgsIDg5MDEsIDg5MTAsIDAsIDg5MTcsIDg5NDcsIDAsIDAsIDg5NTIsIDg5OTQsIDkwNjMsIDkwNTgsIDkwODcsIDAsIDkwOTQsIDkxMzAsIDkxNDAsIDk5LCAxMTcsIDExNiwgMTAxLCAzMjgyNywgMjM3LCAxNjYyMSwgMzg0LCA1OSwgMTA1LCAxMjEsIDE5MDUsIDg4ODAsIDg4ODUsIDExNCwgOTksIDMyODI3LCAyMzgsIDE2NjIyLCA1OSwgMTc0NjQsIDI1NiwgOTksIDEyMCwgODg5MiwgODg5NSwgMTIxLCA1OSwgMTc0NjEsIDk5LCAxMDgsIDMyODI3LCAxNjEsIDE2NTQ1LCAyNTYsIDEwMiwgMTE0LCA5MjcsIDg5MDUsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjE0LCAxMTQsIDk3LCAxMTgsIDEwMSwgMzI4MjcsIDIzNiwgMTY2MjAsIDUxMiwgNTksIDEwNSwgMTEwLCAxMTEsIDE4NTQsIDg5MjUsIDg5MzcsIDg5NDIsIDI1NiwgMTA1LCAxMTAsIDg5MzAsIDg5MzQsIDExMCwgMTE2LCA1OSwgMjcxNDgsIDExNiwgNTksIDI1MTMzLCAxMDIsIDEwNSwgMTEwLCA1OSwgMjcxMDAsIDExNiwgOTcsIDU5LCAyNDg3MywgMTA4LCAxMDUsIDEwMywgNTksIDE2NjkxLCAzODQsIDk3LCAxMTEsIDExMiwgODk1OCwgODk4NiwgODk4OSwgMzg0LCA5OSwgMTAzLCAxMTYsIDg5NjUsIDg5NjgsIDg5ODMsIDExNCwgNTksIDE2NjgzLCAzODQsIDEwMSwgMTA4LCAxMTIsIDE4MjMsIDg5NzUsIDg5NzksIDEwNSwgMTEwLCAyMjksIDE5MzQsIDk3LCAxMTQsIDI0NCwgMTgyNCwgMTA0LCA1OSwgMTY2ODksIDEwMiwgNTksIDI1MjcxLCAxMDEsIDEwMCwgNTksIDE2ODIxLCA2NDAsIDU5LCA5OSwgMTAyLCAxMTEsIDExNiwgMTI2OCwgOTAwNCwgOTAwOSwgOTAyMSwgOTAyNSwgOTcsIDExNCwgMTAxLCA1OSwgMjQ4MzcsIDEwNSwgMTEwLCAyNTYsIDU5LCAxMTYsIDkwMTYsIDkwMTcsIDI1MTE4LCAxMDUsIDEwMSwgNTksIDI3MTAxLCAxMDAsIDExMSwgMjQ0LCA4OTg1LCA2NDAsIDU5LCA5OSwgMTAxLCAxMDgsIDExMiwgMTg3OSwgOTAzNiwgOTA0MCwgOTA1MSwgOTA1NywgOTcsIDEwOCwgNTksIDI1Mjc0LCAyNTYsIDEwMywgMTE0LCA5MDQ1LCA5MDQ5LCAxMDEsIDExNCwgMjQzLCA1NDc1LCAyMjcsIDkwMzcsIDk3LCAxMTQsIDEwNCwgMTA3LCA1OSwgMjcxNTksIDExNCwgMTExLCAxMDAsIDU5LCAyNzE5NiwgNTEyLCA5OSwgMTAzLCAxMTIsIDExNiwgOTA3MSwgOTA3NCwgOTA3OCwgOTA4MywgMTIxLCA1OSwgMTc0ODksIDExMSwgMTEwLCA1OSwgMTY2ODcsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NjYsIDk3LCA1OSwgMTczMzcsIDExNywgMTAxLCAxMTUsIDExNiwgMzI4MjcsIDE5MSwgMTY1NzUsIDI1NiwgOTksIDEwNSwgOTA5OCwgOTEwMywgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjUxMCwgMTEwLCA2NDAsIDU5LCA2OSwgMTAwLCAxMTUsIDExOCwgMTI2OCwgOTExNSwgOTExNywgOTEyMSwgMTI2NywgNTksIDI1MzM3LCAxMTEsIDExNiwgNTksIDI1MzMzLCAyNTYsIDU5LCAxMTgsIDkxMjYsIDkxMjcsIDI1MzMyLCA1OSwgMjUzMzEsIDI1NiwgNTksIDEwNSwgMTkxMSwgOTEzNCwgMTA4LCAxMDAsIDEwMSwgNTksIDE2NjgxLCA0OTEsIDkxNDQsIDAsIDkxNDgsIDk5LCAxMjEsIDU5LCAxNzQ5NCwgMTA4LCAzMjgyNywgMjM5LCAxNjYyMywgNzY4LCA5OSwgMTAyLCAxMDksIDExMSwgMTE1LCAxMTcsIDkxNjQsIDkxNzUsIDkxODAsIDkxODUsIDkxOTEsIDkyMDUsIDI1NiwgMTA1LCAxMjEsIDkxNjksIDkxNzMsIDExNCwgOTksIDU5LCAxNjY5MywgNTksIDE3NDY1LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjE1LCA5NywgMTE2LCAxMDQsIDU5LCAxNjk1MSwgMTEyLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjY3LCA0ODMsIDkxOTYsIDAsIDkyMDEsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1MTEsIDExNCwgOTksIDEyMSwgNTksIDE3NDk2LCAxMDcsIDk5LCAxMjEsIDU5LCAxNzQ5MiwgMTAyNCwgOTcsIDk5LCAxMDIsIDEwMywgMTA0LCAxMDYsIDExMSwgMTE1LCA5MjI3LCA5MjM4LCA5MjUwLCA5MjU1LCA5MjYxLCA5MjY1LCA5MjY5LCA5Mjc1LCAxMTIsIDExMiwgOTcsIDI1NiwgNTksIDExOCwgOTIzNSwgOTIzNiwgMTczMzgsIDU5LCAxNzM5MiwgMjU2LCAxMDEsIDEyMSwgOTI0MywgOTI0OCwgMTAwLCAxMDUsIDEwOCwgNTksIDE2Njk1LCA1OSwgMTc0NjYsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MTYsIDExNCwgMTAxLCAxMDEsIDExMCwgNTksIDE2Njk2LCA5OSwgMTIxLCA1OSwgMTc0NzcsIDk5LCAxMjEsIDU5LCAxNzUwMCwgMTEyLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjY4LCA5OSwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjUxMiwgMjk0NCwgNjUsIDY2LCA2OSwgNzIsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDYsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgOTMyOCwgOTM0NSwgOTM1MCwgOTM1NywgOTM2MSwgOTQ4NiwgOTUzMywgOTU2MiwgOTYwMCwgOTgwNiwgOTgyMiwgOTgyOSwgOTg0OSwgOTg1MywgOTg4MiwgOTkwNiwgOTk0NCwgMTAwNzcsIDEwMDg4LCAxMDEyMywgMTAxNzYsIDEwMjQxLCAxMDI1OCwgMzg0LCA5NywgMTE0LCAxMTYsIDkzMzUsIDkzMzgsIDkzNDAsIDExNCwgMjQyLCAyNTAyLCAyNDIsIDkxNywgOTcsIDEwNSwgMTA4LCA1OSwgMjY5MDcsIDk3LCAxMTQsIDExNCwgNTksIDI2ODk0LCAyNTYsIDU5LCAxMDMsIDI0NTIsIDkzNTUsIDU5LCAyNzI3NSwgOTcsIDExNCwgNTksIDI2OTc4LCAyNDAzLCA5MzgxLCAwLCA5Mzg2LCAwLCA5MzkzLCAwLCAwLCAwLCAwLCAwLCA5Mzk3LCA5NDAyLCAwLCA5NDE0LCA5NDE2LCA5NDIxLCAwLCA5NDY1LCAxMTcsIDExNiwgMTAxLCA1OSwgMTY2OTgsIDEwOSwgMTEyLCAxMTYsIDEyMSwgMTE4LCA1OSwgMjcwNjAsIDExNCwgOTcsIDIzOCwgMjEyNCwgOTgsIDEwMCwgOTcsIDU5LCAxNzMzOSwgMTAzLCAzODQsIDU5LCAxMDAsIDEwOCwgMjE5MCwgOTQwOSwgOTQxMSwgNTksIDI3MDI1LCAyMjksIDIxOTAsIDU5LCAyNzI2OSwgMTE3LCAxMTEsIDMyODI3LCAxNzEsIDE2NTU1LCAxMTQsIDEwMjQsIDU5LCA5OCwgMTAyLCAxMDQsIDEwOCwgMTEyLCAxMTUsIDExNiwgMjIwMSwgOTQzOCwgOTQ0NiwgOTQ0OSwgOTQ1MSwgOTQ1NCwgOTQ1NywgOTQ2MSwgMjU2LCA1OSwgMTAyLCAyMjA1LCA5NDQzLCAxMTUsIDU5LCAyNjkxMSwgMTE1LCA1OSwgMjY5MDksIDIzNSwgODc4NiwgMTEyLCA1OSwgMjUwMDMsIDEwOCwgNTksIDI2OTM3LCAxMDUsIDEwOSwgNTksIDI2OTk1LCAxMDgsIDU5LCAyNDk5NCwgMzg0LCA1OSwgOTcsIDEwMSwgOTQ3MSwgOTQ3MiwgOTQ3NiwgMjczMDcsIDEwNSwgMTA4LCA1OSwgMjY5MDUsIDI1NiwgNTksIDExNSwgOTQ4MSwgOTQ4MiwgMjczMDksIDU5LCA0OTE1MiwgMTA5MjUsIDY1MDI0LCAzODQsIDk3LCA5OCwgMTE0LCA5NDkzLCA5NDk3LCA5NTAxLCAxMTQsIDExNCwgNTksIDI2ODkyLCAxMTQsIDEwNywgNTksIDI2NDgyLCAyNTYsIDk3LCAxMDcsIDk1MDYsIDk1MTYsIDk5LCAyNTYsIDEwMSwgMTA3LCA5NTEyLCA5NTE0LCA1OSwgMTY1MDcsIDU5LCAxNjQ3NSwgMjU2LCAxMDEsIDExNSwgOTUyMSwgOTUyMywgNTksIDI3MDE5LCAxMDgsIDI1NiwgMTAwLCAxMTcsIDk1MjksIDk1MzEsIDU5LCAyNzAyMywgNTksIDI3MDIxLCA1MTIsIDk3LCAxMDEsIDExNywgMTIxLCA5NTQyLCA5NTQ3LCA5NTU4LCA5NTYwLCAxMTQsIDExMSwgMTEwLCA1OSwgMTY3MDIsIDI1NiwgMTAwLCAxMDUsIDk1NTIsIDk1NTYsIDEwNSwgMTA4LCA1OSwgMTY3MDAsIDIzNiwgMjIyNCwgMjI2LCA5NTEzLCA1OSwgMTc0NjcsIDUxMiwgOTksIDExMywgMTE0LCAxMTUsIDk1NzEsIDk1NzQsIDk1ODEsIDk1OTcsIDk3LCA1OSwgMjY5MzQsIDExNywgMTExLCAyNTYsIDU5LCAxMTQsIDM2MDksIDU5NTgsIDI1NiwgMTAwLCAxMTcsIDk1ODYsIDk1OTEsIDEwNCwgOTcsIDExNCwgNTksIDI2OTgzLCAxMTUsIDEwNCwgOTcsIDExNCwgNTksIDI2OTU1LCAxMDQsIDU5LCAyNTAxMCwgNjQwLCA1OSwgMTAyLCAxMDMsIDExMywgMTE1LCA5NjExLCA5NjEyLCAyNDQxLCA5NzE1LCA5NzI3LCAyNTE4OCwgMTE2LCA2NDAsIDk3LCAxMDQsIDEwOCwgMTE0LCAxMTYsIDk2MjQsIDk2MzYsIDk2NTUsIDk2NjYsIDk3MDQsIDExNCwgMTE0LCAxMTEsIDExOSwgMjU2LCA1OSwgMTE2LCAyMjAxLCA5NjMzLCA5NywgMjMzLCA5NDYyLCA5NywgMTE0LCAxMTIsIDExMSwgMTExLCAxMTAsIDI1NiwgMTAwLCAxMTcsIDk2NDcsIDk2NTIsIDExMSwgMTE5LCAxMTAsIDE4NywgMTExNCwgMTEyLCAxODcsIDI0MDYsIDEwMSwgMTAyLCAxMTYsIDk3LCAxMTQsIDExNCwgMTExLCAxMTksIDExNSwgNTksIDI1MDMxLCAxMDUsIDEwMywgMTA0LCAxMTYsIDM4NCwgOTcsIDEwNCwgMTE1LCA5Njc3LCA5Njg2LCA5Njk0LCAxMTQsIDExNCwgMTExLCAxMTksIDI1NiwgNTksIDExNSwgMjI5MiwgMjIxNSwgOTcsIDExNCwgMTEyLCAxMTEsIDExMSwgMTEwLCAyNDMsIDM5OTIsIDExMywgMTE3LCAxMDUsIDEwMywgOTcsIDExNCwgMTE0LCAxMTEsIDI0NywgODY4OCwgMTA0LCAxMTQsIDEwMSwgMTAxLCAxMTYsIDEwNSwgMTA5LCAxMDEsIDExNSwgNTksIDI1MjkxLCAzODQsIDU5LCAxMTMsIDExNSwgOTYxMSwgMjQ1MSwgOTcyMiwgMTA4LCA5NywgMTEwLCAyNDQsIDI0NzYsIDY0MCwgNTksIDk5LCAxMDAsIDEwMywgMTE1LCAyNDc2LCA5NzM4LCA5NzQxLCA5NzU3LCA5NzY4LCA5OSwgNTksIDI3MzA0LCAxMTEsIDExNiwgMjU2LCA1OSwgMTExLCA5NzQ4LCA5NzQ5LCAyNzI2MywgMjU2LCA1OSwgMTE0LCA5NzU0LCA5NzU1LCAyNzI2NSwgNTksIDI3MjY3LCAyNTYsIDU5LCAxMDEsIDk3NjIsIDk3NjUsIDQ5MTUyLCA4OTIyLCA2NTAyNCwgMTE1LCA1OSwgMjcyODMsIDY0MCwgOTcsIDEwMCwgMTAxLCAxMDMsIDExNSwgOTc3OSwgOTc4NSwgOTc4OSwgOTgwMSwgOTgwMywgMTEyLCAxMTIsIDExNCwgMTExLCAyNDgsIDk0MTQsIDExMSwgMTE2LCA1OSwgMjUzMDIsIDExMywgMjU2LCAxMDMsIDExMywgOTc5NSwgOTc5NywgMjQ0LCAyNDQxLCAxMDMsIDExNiwgMjQyLCA5MzU2LCAyNDQsIDI0NTksIDEwNSwgMjM3LCAyNDgyLCAzODQsIDEwNSwgMTA4LCAxMTQsIDk4MTMsIDIyNzMsIDk4MTgsIDExNSwgMTA0LCAxMTYsIDU5LCAyNzAwNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MTcsIDI1NiwgNTksIDY5LCAyNDYwLCA5ODI3LCA1OSwgMjcyODEsIDM1MywgOTgzMywgOTg0NiwgMTE0LCAyNTYsIDEwMCwgMTE3LCA5NjUwLCA5ODM4LCAyNTYsIDU5LCAxMDgsIDI0MDUsIDk4NDMsIDU5LCAyNjk4NiwgMTA4LCAxMDcsIDU5LCAyNTk4OCwgOTksIDEyMSwgNTksIDE3NDk3LCA2NDAsIDU5LCA5NywgOTksIDEwNCwgMTE2LCAyNjMyLCA5ODY0LCA5ODY3LCA5ODczLCA5ODc4LCAxMTQsIDI0MiwgOTY2NSwgMTExLCAxMTQsIDExMCwgMTAxLCAyNDIsIDc0MzIsIDk3LCAxMTQsIDEwMCwgNTksIDI2OTg3LCAxMTQsIDEwNSwgNTksIDI2MTA2LCAyNTYsIDEwNSwgMTExLCA5ODg3LCA5ODkyLCAxMDAsIDExMSwgMTE2LCA1OSwgMTY3MDQsIDExNywgMTE1LCAxMTYsIDI1NiwgNTksIDk3LCA5OTAwLCA5OTAxLCAyNTUyMCwgOTksIDEwNCwgMTAxLCAxODcsIDk5MDEsIDUxMiwgNjksIDk3LCAxMDEsIDExNSwgOTkxNSwgOTkxNywgOTkyOSwgOTk0MCwgNTksIDI1MTkyLCAxMTIsIDI1NiwgNTksIDExMiwgOTkyMywgOTkyNCwgMjcyNzMsIDExNCwgMTExLCAxMjAsIDE4NywgOTkyNCwgMjU2LCA1OSwgMTEzLCA5OTM0LCA5OTM1LCAyNzI3MSwgMjU2LCA1OSwgMTEzLCA5OTM0LCA5OTE1LCAxMDUsIDEwOSwgNTksIDI1MzE4LCAxMDI0LCA5NywgOTgsIDExMCwgMTExLCAxMTIsIDExNiwgMTE5LCAxMjIsIDk5NjEsIDk5NzIsIDk5NzUsIDEwMDEwLCAxMDAzMSwgMTAwNDksIDEwMDU1LCAxMDA2NCwgMjU2LCAxMTAsIDExNCwgOTk2NiwgOTk2OSwgMTAzLCA1OSwgMjY2MDQsIDExNCwgNTksIDI1MDg1LCAxMTQsIDIzNSwgMjI0MSwgMTAzLCAzODQsIDEwOCwgMTA5LCAxMTQsIDk5ODMsIDk5OTcsIDEwMDA0LCAxMDEsIDEwMiwgMTE2LCAyNTYsIDk3LCAxMTQsIDI1MzQsIDk5OTEsIDEwNSwgMTAzLCAxMDQsIDExNiwgMjI1LCAyNTQ2LCA5NywgMTEyLCAxMTUsIDExNiwgMTExLCA1OSwgMjY2MjAsIDEwNSwgMTAzLCAxMDQsIDExNiwgMjI1LCAyNTU3LCAxMTIsIDk3LCAxMTQsIDExNCwgMTExLCAxMTksIDI1NiwgMTA4LCAxMTQsIDEwMDIxLCAxMDAyNSwgMTAxLCAxMDIsIDI0NCwgOTQ1MywgMTA1LCAxMDMsIDEwNCwgMTE2LCA1OSwgMjUwMDQsIDM4NCwgOTcsIDEwMiwgMTA4LCAxMDAzOCwgMTAwNDEsIDEwMDQ1LCAxMTQsIDU5LCAyNzAxMywgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NjksIDExNywgMTE1LCA1OSwgMjcxODEsIDEwNSwgMTA5LCAxMDEsIDExNSwgNTksIDI3MTg4LCAzNTMsIDEwMDU5LCAxMDA2MywgMTE1LCAxMTYsIDU5LCAyNTExMSwgMjI1LCA0OTQyLCAzODQsIDU5LCAxMDEsIDEwMiwgMTAwNzEsIDEwMDcyLCA2MTQ0LCAyNjA1OCwgMTEwLCAxMDMsIDEwMSwgMTg3LCAxMDA3MiwgOTcsIDExNCwgMjU2LCA1OSwgMTA4LCAxMDA4NCwgMTAwODUsIDE2NDI0LCAxMTYsIDU5LCAyNzAyNywgNjQwLCA5NywgOTksIDEwNCwgMTA5LCAxMTYsIDEwMDk5LCAxMDEwMiwgMTAxMDgsIDEwMTE3LCAxMDExOSwgMTE0LCAyNDIsIDIyMTYsIDExMSwgMTE0LCAxMTAsIDEwMSwgMjQyLCA3NTY0LCA5NywgMTE0LCAyNTYsIDU5LCAxMDAsIDM5OTIsIDEwMTE1LCA1OSwgMjY5ODksIDU5LCAyNDU5MCwgMTE0LCAxMDUsIDU5LCAyNTI3OSwgNzY4LCA5NywgOTksIDEwNCwgMTA1LCAxMTMsIDExNiwgMTAxMzYsIDEwMTQxLCAyNjI0LCAxMDE0NiwgMTAxNTgsIDEwMTcxLCAxMTMsIDExNywgMTExLCA1OSwgMjQ2MzMsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1MTMsIDEwOSwgMzg0LCA1OSwgMTAxLCAxMDMsIDI0ODIsIDEwMTU0LCAxMDE1NiwgNTksIDI3Mjc3LCA1OSwgMjcyNzksIDI1NiwgOTgsIDExNywgOTUxNCwgMTAxNjMsIDExMSwgMjU2LCA1OSwgMTE0LCAzNjE1LCAxMDE2OSwgNTksIDI0NjAyLCAxMTQsIDExMSwgMTA3LCA1OSwgMTY3MDYsIDMzNzkyLCA2MCwgNTksIDk5LCAxMDAsIDEwNCwgMTA1LCAxMDgsIDExMywgMTE0LCAyMDkxLCAxMDE5NCwgOTc4NSwgMTAyMDQsIDEwMjA4LCAxMDIxMywgMTAyMTgsIDEwMjI0LCAyNTYsIDk5LCAxMDUsIDEwMTk5LCAxMDIwMSwgNTksIDI3MzAyLCAxMTQsIDU5LCAyNzI1NywgMTE0LCAxMDEsIDIyOSwgOTcxNCwgMTA5LCAxMDEsIDExNSwgNTksIDI1Mjg5LCA5NywgMTE0LCAxMTQsIDU5LCAyNjk5OCwgMTE3LCAxMDEsIDExNSwgMTE2LCA1OSwgMjcyNTksIDI1NiwgODAsIDEwNSwgMTAyMjksIDEwMjMzLCA5NywgMTE0LCA1OSwgMjcwMzAsIDM4NCwgNTksIDEwMSwgMTAyLCAxMDI0MCwgMjM0OSwgNjE3MSwgMjYwNTEsIDExNCwgMjU2LCAxMDAsIDExNywgMTAyNDcsIDEwMjUzLCAxMTUsIDEwNCwgOTcsIDExNCwgNTksIDI2OTU0LCAxMDQsIDk3LCAxMTQsIDU5LCAyNjk4MiwgMjU2LCAxMDEsIDExMCwgMTAyNjMsIDEwMjczLCAxMTQsIDExNiwgMTEwLCAxMDEsIDExMywgMTEzLCA1OSwgNDkxNTIsIDg4MDgsIDY1MDI0LCAxOTcsIDEwMjcwLCAxNzkyLCA2OCwgOTcsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDQsIDEwNSwgMTA4LCAxMTAsIDExMSwgMTEyLCAxMTUsIDExNywgMTAzMDQsIDEwMzA5LCAxMDM3MCwgMTAzODIsIDEwMzg3LCAxMDQwMCwgMTA0MDUsIDEwNDA4LCAxMDQ1OCwgMTA0NjYsIDEwNDY4LCAyNjkxLCAxMDQ4MywgMTA0OTgsIDY4LCAxMTEsIDExNiwgNTksIDI1MTQ2LCA1MTIsIDk5LCAxMDgsIDExMiwgMTE0LCAxMDMxOCwgMTAzMjIsIDEwMzM5LCAxMDM2NSwgMTE0LCAzMjgyNywgMTc1LCAxNjU1OSwgMjU2LCAxMDEsIDExNiwgMTAzMjcsIDEwMzI5LCA1OSwgMjYxNzgsIDI1NiwgNTksIDEwMSwgMTAzMzQsIDEwMzM1LCAyNjQwMCwgMTE1LCAxMDEsIDE4NywgMTAzMzUsIDI1NiwgNTksIDExNSwgNDE1NSwgMTAzNDQsIDExNiwgMTExLCA1MTIsIDU5LCAxMDAsIDEwOCwgMTE3LCA0MTU1LCAxMDM1NSwgMTAzNTksIDEwMzYzLCAxMTEsIDExOSwgMjM4LCAxMTY0LCAxMDEsIDEwMiwgMjQ0LCAyMzE5LCAyNDAsIDUwNzMsIDEwNywgMTAxLCAxMTQsIDU5LCAyNjAzMCwgMjU2LCAxMTEsIDEyMSwgMTAzNzUsIDEwMzgwLCAxMDksIDEwOSwgOTcsIDU5LCAyNzE3NywgNTksIDE3NDY4LCA5NywgMTE1LCAxMDQsIDU5LCAyNDU5NiwgOTcsIDExNSwgMTE3LCAxMTQsIDEwMSwgMTAwLCA5NywgMTEwLCAxMDMsIDEwOCwgMTAxLCAxODcsIDU2NzAsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MTgsIDExMSwgNTksIDI0ODcxLCAzODQsIDk5LCAxMDAsIDExMCwgMTA0MTUsIDEwNDIwLCAxMDQ0MSwgMTE0LCAxMTEsIDMyODI3LCAxODEsIDE2NTY1LCA1MTIsIDU5LCA5NywgOTksIDEwMCwgNTIyMCwgMTA0MjksIDEwNDMyLCAxMDQzNiwgMTE1LCAyNDQsIDU3OTksIDEwNSwgMTE0LCA1OSwgMjczNzYsIDExMSwgMTE2LCAzMjk1NSwgMTgzLCA0MzcsIDExNywgMTE1LCAzODQsIDU5LCA5OCwgMTAwLCAxMDQ1MCwgNjQwMywgMTA0NTEsIDI1MTA2LCAyNTYsIDU5LCAxMTcsIDc0ODQsIDEwNDU2LCA1OSwgMjcxNzgsIDM1NSwgMTA0NjIsIDEwNDY1LCAxMTIsIDU5LCAyNzM1NSwgMjQyLCA4NzIyLCAyNDAsIDI2ODksIDI1NiwgMTAwLCAxMTIsIDEwNDczLCAxMDQ3OCwgMTAxLCAxMDgsIDExNSwgNTksIDI1MjU1LCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjcwLCAyNTYsIDk5LCAxMTYsIDEwNDg4LCAxMDQ5MywgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjUxNCwgMTEyLCAxMTEsIDExNSwgMTg3LCA1NTMzLCAzODQsIDU5LCAxMDgsIDEwOSwgMTA1MDUsIDEwNTA2LCAxMDUwOSwgMTczNDAsIDExNiwgMTA1LCAxMDksIDk3LCAxMTIsIDU5LCAyNTI3MiwgMzA3MiwgNzEsIDc2LCA4MiwgODYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA4LCAxMDksIDExMSwgMTEyLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMDU2MiwgMTA1NzksIDEwNjIyLCAxMDYzMywgMTA2NDgsIDEwNzE0LCAxMDcyOSwgMTA3NzMsIDEwNzc4LCAxMDg0MCwgMTA4NDUsIDEwODgzLCAxMDkwMSwgMTA5MTYsIDEwOTIwLCAxMTAxMiwgMTEwMTUsIDExMDc2LCAxMTEzNSwgMTExODIsIDExMzE2LCAxMTM2NywgMTEzODgsIDExNDk3LCAyNTYsIDEwMywgMTE2LCAxMDU2NywgMTA1NzEsIDU5LCA0OTE1MiwgODkyMSwgODI0LCAyNTYsIDU5LCAxMTgsIDEwNTc2LCAzMDIzLCA0OTE1MiwgODgxMSwgODQwMiwgMzg0LCAxMDEsIDEwOCwgMTE2LCAxMDU4NiwgMTA2MTAsIDEwNjE0LCAxMDIsIDExNiwgMjU2LCA5NywgMTE0LCAxMDU5MywgMTA1OTksIDExNCwgMTE0LCAxMTEsIDExOSwgNTksIDI1MDM3LCAxMDUsIDEwMywgMTA0LCAxMTYsIDk3LCAxMTQsIDExNCwgMTExLCAxMTksIDU5LCAyNTAzOCwgNTksIDQ5MTUyLCA4OTIwLCA4MjQsIDI1NiwgNTksIDExOCwgMTA2MTksIDMxNDMsIDQ5MTUyLCA4ODEwLCA4NDAyLCAxMDUsIDEwMywgMTA0LCAxMTYsIDk3LCAxMTQsIDExNCwgMTExLCAxMTksIDU5LCAyNTAzOSwgMjU2LCA2OCwgMTAwLCAxMDYzOCwgMTA2NDMsIDk3LCAxMTUsIDEwNCwgNTksIDI1MjYzLCA5NywgMTE1LCAxMDQsIDU5LCAyNTI2MiwgNjQwLCA5OCwgOTksIDExMCwgMTEyLCAxMTYsIDEwNjU5LCAxMDY2MywgMTA2NjgsIDEwNjczLCAxMDcwMCwgMTA4LCA5NywgMTg3LCA3MzQsIDExNywgMTE2LCAxMDEsIDU5LCAxNjcwOCwgMTAzLCA1OSwgNDkxNTIsIDg3MzYsIDg0MDIsIDY0MCwgNTksIDY5LCAxMDUsIDExMSwgMTEyLCAzNDYwLCAxMDY4NCwgMTA2ODgsIDEwNjkzLCAxMDY5NiwgNTksIDQ5MTUyLCAxMDg2NCwgODI0LCAxMDAsIDU5LCA0OTE1MiwgODc3OSwgODI0LCAxMTUsIDU5LCAxNjcxMywgMTE0LCAxMTEsIDI0OCwgMzQ2MCwgMTE3LCAxMTQsIDI1NiwgNTksIDk3LCAxMDcwNywgMTA3MDgsIDI2MjIyLCAxMDgsIDI1NiwgNTksIDExNSwgMTA3MDcsIDI4NzIsIDQ5OSwgMTA3MTksIDAsIDEwNzIzLCAxMTIsIDMyOTU1LCAxNjAsIDI4NzEsIDEwOSwgMTEyLCAyNTYsIDU5LCAxMDEsIDMwNjUsIDMwNzIsIDY0MCwgOTcsIDEwMSwgMTExLCAxMTcsIDEyMSwgMTA3NDAsIDEwNzUwLCAxMDc1NSwgMTA3NjgsIDEwNzcxLCA0OTYsIDEwNzQ1LCAwLCAxMDc0NywgNTksIDI3MjAzLCAxMTEsIDExMCwgNTksIDE2NzEyLCAxMDAsIDEwNSwgMTA4LCA1OSwgMTY3MTAsIDExMCwgMTAzLCAyNTYsIDU5LCAxMDAsIDM0NTQsIDEwNzYyLCAxMTEsIDExNiwgNTksIDQ5MTUyLCAxMDg2MSwgODI0LCAxMTIsIDU5LCAyNzIwMiwgNTksIDE3NDY5LCA5NywgMTE1LCAxMDQsIDU5LCAyNDU5NSwgODk2LCA1OSwgNjUsIDk3LCAxMDAsIDExMywgMTE1LCAxMjAsIDI5NjIsIDEwNzkzLCAxMDc5NywgMTA4MTEsIDEwODE3LCAxMDgyMSwgMTA4MzIsIDExNCwgMTE0LCA1OSwgMjUwNDcsIDExNCwgMjU2LCAxMDQsIDExNCwgMTA4MDMsIDEwODA2LCAxMDcsIDU5LCAyNjkxNiwgMjU2LCA1OSwgMTExLCA1MTA2LCA1MTA0LCAxMTEsIDExNiwgNTksIDQ5MTUyLCA4Nzg0LCA4MjQsIDExNywgMTA1LCAyNDYsIDI5MTUsIDI1NiwgMTAxLCAxMDUsIDEwODI2LCAxMDgzMCwgOTcsIDExNCwgNTksIDI2OTIwLCAyMzcsIDI5NjgsIDEwNSwgMTE1LCAxMTYsIDI1NiwgNTksIDExNSwgMjk3NiwgMjk3NSwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYxOSwgNTEyLCA2OSwgMTAxLCAxMTUsIDExNiwgMzAxMywgMTA4NTQsIDEwODczLCAxMDg3NiwgMzg0LCA1OSwgMTEzLCAxMTUsIDMwMDQsIDEwODYxLCAzMDQxLCAzODQsIDU5LCAxMTMsIDExNSwgMzAwNCwgMzAxMywgMTA4NjgsIDEwOCwgOTcsIDExMCwgMjQ0LCAzMDQyLCAxMDUsIDIzNywgMzA1MCwgMjU2LCA1OSwgMTE0LCAyOTk4LCAxMDg4MSwgMTg3LCAyOTk5LCAzODQsIDY1LCA5NywgMTEyLCAxMDg5MCwgMTA4OTMsIDEwODk3LCAxMTQsIDI0MiwgMTA2MDksIDExNCwgMTE0LCA1OSwgMjUwMDYsIDk3LCAxMTQsIDU5LCAyNzM3OCwgMzg0LCA1OSwgMTE1LCAxMTgsIDM5ODEsIDEwOTA4LCAzOTgwLCAyNTYsIDU5LCAxMDAsIDEwOTEzLCAxMDkxNCwgMjUzNDAsIDU5LCAyNTMzOCwgOTksIDEyMSwgNTksIDE3NDk4LCA4OTYsIDY1LCA2OSwgOTcsIDEwMCwgMTAxLCAxMTUsIDExNiwgMTA5MzUsIDEwOTM4LCAxMDk0MiwgMTA5NDYsIDEwOTQ5LCAxMDk5OCwgMTEwMDEsIDExNCwgMjQyLCAxMDU5OCwgNTksIDQ5MTUyLCA4ODA2LCA4MjQsIDExNCwgMTE0LCA1OSwgMjQ5ODYsIDExNCwgNTksIDI0NjEzLCA1MTIsIDU5LCAxMDIsIDExMywgMTE1LCAzMTMxLCAxMDk1OCwgMTA5NzksIDEwOTkxLCAxMTYsIDI1NiwgOTcsIDExNCwgMTA5NjQsIDEwOTY5LCAxMTQsIDExNCwgMTExLCAyNDcsIDEwOTQ1LCAxMDUsIDEwMywgMTA0LCAxMTYsIDk3LCAxMTQsIDExNCwgMTExLCAyNDcsIDEwODk2LCAzODQsIDU5LCAxMTMsIDExNSwgMzEzMSwgMTA5MzgsIDEwOTg2LCAxMDgsIDk3LCAxMTAsIDI0NCwgMzE1NywgMjU2LCA1OSwgMTE1LCAzMTU3LCAxMDk5NiwgMTg3LCAzMTI2LCAxMDUsIDIzNywgMzE2NSwgMjU2LCA1OSwgMTE0LCAzMTI1LCAxMTAwNiwgMTA1LCAyNTYsIDU5LCAxMDEsIDMwOTgsIDMxMDksIDEwNSwgMjI4LCAzNDcyLCAyNTYsIDExMiwgMTE2LCAxMTAyMCwgMTEwMjUsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NzEsIDMzMTUyLCAxNzIsIDU5LCAxMDUsIDExMCwgMTEwMzMsIDExMDM0LCAxMTA2MiwgMTY1NTYsIDExMCwgNTEyLCA1OSwgNjksIDEwMCwgMTE4LCAyOTUzLCAxMTA0NCwgMTEwNDgsIDExMDU0LCA1OSwgNDkxNTIsIDg5NTMsIDgyNCwgMTExLCAxMTYsIDU5LCA0OTE1MiwgODk0OSwgODI0LCA0ODEsIDI5NTMsIDExMDU5LCAxMTA2MSwgNTksIDI1MzM1LCA1OSwgMjUzMzQsIDEwNSwgMjU2LCA1OSwgMTE4LCAzMjU2LCAxMTA2OCwgNDgxLCAzMjU2LCAxMTA3MywgMTEwNzUsIDU5LCAyNTM0MiwgNTksIDI1MzQxLCAzODQsIDk3LCAxMTEsIDExNCwgMTEwODMsIDExMTA3LCAxMTExMywgMTE0LCA1MTIsIDU5LCA5NywgMTE1LCAxMTYsIDI5MzksIDExMDkzLCAxMTA5OCwgMTExMDMsIDEwOCwgMTA4LCAxMDEsIDIzNiwgMjkzOSwgMTA4LCA1OSwgNDkxNTIsIDExMDA1LCA4NDIxLCA1OSwgNDkxNTIsIDg3MDYsIDgyNCwgMTA4LCAxMDUsIDExMCwgMTE2LCA1OSwgMjcxNTYsIDM4NCwgNTksIDk5LCAxMDEsIDMyMTgsIDExMTIwLCAxMTEyMywgMTE3LCAyMjksIDMyMzcsIDI1NiwgNTksIDk5LCAzMjI0LCAxMTEyOCwgMjU2LCA1OSwgMTAxLCAzMjE4LCAxMTEzMywgMjQxLCAzMjI0LCA1MTIsIDY1LCA5NywgMTA1LCAxMTYsIDExMTQ0LCAxMTE0NywgMTExNjUsIDExMTc1LCAxMTQsIDI0MiwgMTA2MzIsIDExNCwgMTE0LCAzODQsIDU5LCA5OSwgMTE5LCAxMTE1NiwgMTExNTcsIDExMTYxLCAyNDk4NywgNTksIDQ5MTUyLCAxMDU0NywgODI0LCA1OSwgNDkxNTIsIDg2MDUsIDgyNCwgMTAzLCAxMDQsIDExNiwgOTcsIDExNCwgMTE0LCAxMTEsIDExOSwgMTg3LCAxMTE1NywgMTE0LCAxMDUsIDI1NiwgNTksIDEwMSwgMzI3NSwgMzI4NiwgODk2LCA5OSwgMTA0LCAxMDUsIDEwOSwgMTEyLCAxMTMsIDExNywgMTExOTcsIDExMjEzLCAxMTIyNSwgMTEwMTIsIDI5MzYsIDExMjM2LCAxMTI0NywgNTEyLCA1OSwgOTksIDEwMSwgMTE0LCAzMzc4LCAxMTIwNiwgMzM4MywgMTEyMDksIDExNywgMjI5LCAzMzk3LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjUxNSwgMTExLCAxMTQsIDExNiwgNjIxLCAxMTAxMywgMCwgMCwgMTEyMjIsIDk3LCAxMTQsIDIyNSwgMTEwOTQsIDEwOSwgMjU2LCA1OSwgMTAxLCAzNDM4LCAxMTIzMSwgMjU2LCA1OSwgMTEzLCAzNDQ0LCAzNDQzLCAxMTUsIDExNywgMjU2LCA5OCwgMTEyLCAxMTI0MywgMTEyNDUsIDIyOSwgMzMyMCwgMjI5LCAzMzM5LCAzODQsIDk4LCA5OSwgMTEyLCAxMTI1NCwgMTEyODEsIDExMjg5LCA1MTIsIDU5LCA2OSwgMTAxLCAxMTUsIDExMjYzLCAxMTI2NCwgMzM2MiwgMTEyNjgsIDI1MjIwLCA1OSwgNDkxNTIsIDEwOTQ5LCA4MjQsIDEwMSwgMTE2LCAyNTYsIDU5LCAxMDEsIDMzNTUsIDExMjc1LCAxMTMsIDI1NiwgNTksIDExMywgMzM2MywgMTEyNjQsIDk5LCAyNTYsIDU5LCAxMDEsIDMzNzgsIDExMjg3LCAyNDEsIDMzODQsIDUxMiwgNTksIDY5LCAxMDEsIDExNSwgMTEyOTgsIDExMjk5LCAzNDIzLCAxMTMwMywgMjUyMjEsIDU5LCA0OTE1MiwgMTA5NTAsIDgyNCwgMTAxLCAxMTYsIDI1NiwgNTksIDEwMSwgMzQxNiwgMTEzMTAsIDExMywgMjU2LCA1OSwgMTEzLCAzNDI0LCAxMTI5OSwgNTEyLCAxMDMsIDEwNSwgMTA4LCAxMTQsIDExMzI1LCAxMTMyNywgMTEzMzMsIDExMzM1LCAyMzYsIDMwMzEsIDEwOCwgMTAwLCAxMDEsIDMyODI3LCAyNDEsIDE2NjI1LCAyMzEsIDMxMzksIDEwNSwgOTcsIDExMCwgMTAzLCAxMDgsIDEwMSwgMjU2LCAxMDgsIDExNCwgMTEzNDYsIDExMzU2LCAxMDEsIDEwMiwgMTE2LCAyNTYsIDU5LCAxMDEsIDMwOTgsIDExMzU0LCAyNDEsIDMxMTAsIDEwNSwgMTAzLCAxMDQsIDExNiwgMjU2LCA1OSwgMTAxLCAzMjc1LCAxMTM2NSwgMjQxLCAzMjg3LCAyNTYsIDU5LCAxMDksIDExMzcyLCAxMTM3MywgMTczNDEsIDM4NCwgNTksIDEwMSwgMTE1LCAxMTM4MCwgMTEzODEsIDExMzg1LCAxNjQxOSwgMTE0LCAxMTEsIDU5LCAyNDg1NCwgMTEyLCA1OSwgMjQ1ODMsIDExNTIsIDY4LCA3MiwgOTcsIDEwMCwgMTAzLCAxMDUsIDEwOCwgMTE0LCAxMTUsIDExNDA3LCAxMTQxMiwgMTE0MTcsIDExNDIyLCAxMTQyNywgMTE0NDAsIDExNDQ2LCAxMTQ3NSwgMTE0OTEsIDk3LCAxMTUsIDEwNCwgNTksIDI1MjYxLCA5NywgMTE0LCAxMTQsIDU5LCAyNjg4NCwgMTEyLCA1OSwgNDkxNTIsIDg3ODEsIDg0MDIsIDk3LCAxMTUsIDEwNCwgNTksIDI1MjYwLCAyNTYsIDEwMSwgMTE2LCAxMTQzMiwgMTE0MzYsIDU5LCA0OTE1MiwgODgwNSwgODQwMiwgNTksIDQ5MTUyLCA2MiwgODQwMiwgMTEwLCAxMDIsIDEwNSwgMTEwLCA1OSwgMjcxMDIsIDM4NCwgNjUsIDEwMSwgMTE2LCAxMTQ1MywgMTE0NTcsIDExNDYxLCAxMTQsIDExNCwgNTksIDI2ODgyLCA1OSwgNDkxNTIsIDg4MDQsIDg0MDIsIDI1NiwgNTksIDExNCwgMTE0NjYsIDExNDY5LCA0OTE1MiwgNjAsIDg0MDIsIDEwNSwgMTAxLCA1OSwgNDkxNTIsIDg4ODQsIDg0MDIsIDI1NiwgNjUsIDExNiwgMTE0ODAsIDExNDg0LCAxMTQsIDExNCwgNTksIDI2ODgzLCAxMTQsIDEwNSwgMTAxLCA1OSwgNDkxNTIsIDg4ODUsIDg0MDIsIDEwNSwgMTA5LCA1OSwgNDkxNTIsIDg3NjQsIDg0MDIsIDM4NCwgNjUsIDk3LCAxMTAsIDExNTA0LCAxMTUwOCwgMTE1MjIsIDExNCwgMTE0LCA1OSwgMjUwNDYsIDExNCwgMjU2LCAxMDQsIDExNCwgMTE1MTQsIDExNTE3LCAxMDcsIDU5LCAyNjkxNSwgMjU2LCA1OSwgMTExLCA1MDk1LCA1MDkzLCAxMDEsIDk3LCAxMTQsIDU5LCAyNjkxOSwgNDY5MSwgNjgwNSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMTE1NjUsIDAsIDExNTc2LCAxMTU5MiwgMTE2MTYsIDExNjIxLCAxMTYzNCwgMTE2NTIsIDY5MTksIDAsIDAsIDExNjYxLCAxMTY5MSwgMCwgMTE3MjAsIDExNzI2LCAwLCAxMTc0MCwgMTE4MDEsIDExODE5LCAxMTgzOCwgMTE4NDMsIDI1NiwgOTksIDExNSwgMTE1NjksIDY4MDcsIDExNywgMTE2LCAxMDEsIDMyODI3LCAyNDMsIDE2NjI3LCAyNTYsIDEwNSwgMTIxLCAxMTU4MCwgMTE1ODksIDExNCwgMjU2LCA1OSwgOTksIDY4MTQsIDExNTg2LCAzMjgyNywgMjQ0LCAxNjYyOCwgNTksIDE3NDcwLCA2NDAsIDk3LCA5OCwgMTA1LCAxMTEsIDExNSwgNjgxNiwgMTE2MDIsIDExNjA3LCA0NTYsIDExNjEwLCAxMDgsIDk3LCA5OSwgNTksIDE2NzIxLCAxMTgsIDU5LCAyNzE5MiwgMTExLCAxMDgsIDEwMCwgNTksIDI3MDY4LCAxMDgsIDEwNSwgMTAzLCA1OSwgMTY3MjMsIDI1NiwgOTksIDExNCwgMTE2MjUsIDExNjI5LCAxMDUsIDExNCwgNTksIDI3MDcxLCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYyMCwgODc5LCAxMTY0MSwgMCwgMCwgMTE2NDQsIDAsIDExNjUwLCAxMTAsIDU5LCAxNzExNSwgOTcsIDExOCwgMTAxLCAzMjgyNywgMjQyLCAxNjYyNiwgNTksIDI3MDczLCAyNTYsIDk4LCAxMDksIDExNjU2LCAzNTcyLCA5NywgMTE0LCA1OSwgMjcwNjEsIDUxMiwgOTcsIDk5LCAxMDUsIDExNiwgMTE2NjksIDExNjcyLCAxMTY4NSwgMTE2ODgsIDExNCwgMjQyLCA2Nzg0LCAyNTYsIDEwNSwgMTE0LCAxMTY3NywgMTE2ODAsIDExNCwgNTksIDI3MDcwLCAxMTEsIDExNSwgMTE1LCA1OSwgMjcwNjcsIDExMCwgMjI5LCAzNjY2LCA1OSwgMjcwNzIsIDM4NCwgOTcsIDEwMSwgMTA1LCAxMTY5NywgMTE3MDEsIDExNzA1LCA5OSwgMTE0LCA1OSwgMTY3MTcsIDEwMywgOTcsIDU5LCAxNzM1MywgMzg0LCA5OSwgMTAwLCAxMTAsIDExNzEyLCAxMTcxNywgNDYxLCAxMTQsIDExMSwgMTEwLCA1OSwgMTczNDMsIDU5LCAyNzA2MiwgMTEyLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjcyLCAzODQsIDk3LCAxMDEsIDEwOCwgMTE3MzIsIDExNzM1LCA0NjYsIDExNCwgNTksIDI3MDYzLCAxMTQsIDExMiwgNTksIDI3MDY1LCA4OTYsIDU5LCA5NywgMTAwLCAxMDUsIDExMSwgMTE1LCAxMTgsIDExNzU0LCAxMTc1NSwgMTE3NTgsIDExNzg0LCAxMTc4OSwgMTE3OTIsIDExNzk4LCAyNTEyOCwgMTE0LCAyNDIsIDY3OTAsIDUxMiwgNTksIDEwMSwgMTAyLCAxMDksIDExNzY3LCAxMTc2OCwgMTE3NzgsIDExNzgxLCAyNzIyOSwgMTE0LCAyNTYsIDU5LCAxMTEsIDExNzc0LCAxMTc3NSwgMjQ4ODQsIDEwMiwgMTg3LCAxMTc3NSwgMzI4MjcsIDE3MCwgMTY1NTQsIDMyODI3LCAxODYsIDE2NTcwLCAxMDMsIDExMSwgMTAyLCA1OSwgMjUyNzAsIDExNCwgNTksIDI3MjIyLCAxMDgsIDExMSwgMTEyLCAxMDEsIDU5LCAyNzIyMywgNTksIDI3MjI3LCAzODQsIDk5LCAxMDgsIDExMSwgMTE4MDcsIDExODA5LCAxMTgxNSwgMjQyLCAxMTc3NywgOTcsIDExNSwgMTA0LCAzMjgyNywgMjQ4LCAxNjYzMiwgMTA4LCA1OSwgMjUyNDAsIDEwNSwgMzY0LCAxMTgyMywgMTE4MjgsIDEwMCwgMTAxLCAzMjgyNywgMjQ1LCAxNjYyOSwgMTAxLCAxMTUsIDI1NiwgNTksIDk3LCA0NzUsIDExODM0LCAxMTUsIDU5LCAyNzE5MCwgMTA5LCAxMDgsIDMyODI3LCAyNDYsIDE2NjMwLCA5OCwgOTcsIDExNCwgNTksIDI1NDA1LCAyNzg1LCAxMTg3MCwgMCwgMTE5MDEsIDAsIDExOTA0LCAxMTkzMywgMCwgMTE5MzgsIDExOTYxLCAwLCAwLCAxMTk3OSwgMzc0MCwgMCwgMTIwNTEsIDAsIDAsIDEyMDc1LCAxMjIyMCwgMCwgMTIyMzIsIDExNCwgNTEyLCA1OSwgOTcsIDExNSwgMTE2LCAxMDI3LCAxMTg3OSwgMTE4OTAsIDM3MTcsIDMzMDI0LCAxODIsIDU5LCAxMDgsIDExODg1LCAxMTg4NiwgMTY1NjYsIDEwOCwgMTAxLCAyMzYsIDEwMjcsIDYxNywgMTE4OTYsIDAsIDAsIDExODk5LCAxMDksIDU5LCAyNzM3OSwgNTksIDI3Mzg5LCAxMjEsIDU5LCAxNzQ3MSwgMTE0LCA2NDAsIDk5LCAxMDUsIDEwOSwgMTEyLCAxMTYsIDExOTE1LCAxMTkxOSwgMTE5MjMsIDYyNDUsIDExOTI3LCAxMTAsIDExNiwgNTksIDE2NDIxLCAxMTEsIDEwMCwgNTksIDE2NDMwLCAxMDUsIDEwOCwgNTksIDI0NjI0LCAxMDEsIDExMCwgMTA3LCA1OSwgMjQ2MjUsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MjEsIDM4NCwgMTA1LCAxMDksIDExMSwgMTE5NDQsIDExOTUyLCAxMTk1NiwgMjU2LCA1OSwgMTE4LCAxMTk0OSwgMTE5NTAsIDE3MzUwLCA1OSwgMTczNjUsIDEwOSwgOTcsIDI0NCwgMjY3OCwgMTEwLCAxMDEsIDU5LCAyNjEyNiwgMzg0LCA1OSwgMTE2LCAxMTgsIDExOTY3LCAxMTk2OCwgMTE5NzYsIDE3MzQ0LCA5OSwgMTA0LCAxMDIsIDExMSwgMTE0LCAxMDcsIDE4NywgODE4OSwgNTksIDE3MzY2LCAyNTYsIDk3LCAxMTcsIDExOTgzLCAxMTk5OSwgMTEwLCAyNTYsIDk5LCAxMDcsIDExOTg5LCAxMTk5NywgMTA3LCAyNTYsIDU5LCAxMDQsIDg2OTIsIDExOTk1LCA1OSwgMjQ4NDYsIDI0NiwgODY5MiwgMTE1LCAxMTUyLCA1OSwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwOSwgMTE1LCAxMTYsIDEyMDE5LCAxMjAyMCwgNjQwOCwgMTIwMjUsIDEyMDI5LCAxMjAzNiwgMTIwMzgsIDEyMDQyLCAxMjA0NiwgMTY0MjcsIDk5LCAxMDUsIDExNCwgNTksIDI3MTcxLCAxMDUsIDExNCwgNTksIDI3MTcwLCAyNTYsIDExMSwgMTE3LCA3NDg4LCAxMjAzNCwgNTksIDI3MTczLCA1OSwgMjcyNTAsIDExMCwgMzI5NTUsIDE3NywgMzc0MSwgMTA1LCAxMDksIDU5LCAyNzE3NCwgMTE5LCAxMTEsIDU5LCAyNzE3NSwgMzg0LCAxMDUsIDExMiwgMTE3LCAxMjA1NywgMTIwNjQsIDEyMDY5LCAxMTAsIDExNiwgMTA1LCAxMTAsIDExNiwgNTksIDI3MTU3LCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjczLCAxMTAsIDEwMCwgMzI4MjcsIDE2MywgMTY1NDcsIDEyODAsIDU5LCA2OSwgOTcsIDk5LCAxMDEsIDEwNSwgMTEwLCAxMTEsIDExNSwgMTE3LCAzNzg0LCAxMjA5NSwgMTIwOTcsIDEyMTAwLCAxMjEwMywgMTIxNjEsIDEyMTY5LCAxMjE3OCwgMTIxNTgsIDEyMjE0LCA1OSwgMjczMTUsIDExMiwgNTksIDI3MzE5LCAxMTcsIDIyOSwgMzgwMSwgMjU2LCA1OSwgOTksIDM3OTAsIDEyMTA4LCA3NjgsIDU5LCA5NywgOTksIDEwMSwgMTEwLCAxMTUsIDM3ODQsIDEyMTIxLCAxMjEyNywgMTIxMzQsIDEyMTM2LCAxMjE1OCwgMTEyLCAxMTIsIDExNCwgMTExLCAyNDgsIDEyMDk5LCAxMTcsIDExNCwgMTA4LCAxMjEsIDEwMSwgMjQxLCAzODAxLCAyNDEsIDM3OTAsIDM4NCwgOTcsIDEwMSwgMTE1LCAxMjE0MywgMTIxNTAsIDEyMTU0LCAxMTIsIDExMiwgMTE0LCAxMTEsIDEyMCwgNTksIDI3MzIxLCAxMTMsIDExMywgNTksIDI3MzE3LCAxMDUsIDEwOSwgNTksIDI1MzIwLCAxMDUsIDIzNywgMzgwNywgMTA5LCAxMDEsIDI1NiwgNTksIDExNSwgMTIxNjgsIDM3NTgsIDI0NjI2LCAzODQsIDY5LCA5NywgMTE1LCAxMjE1MiwgMTIxNzYsIDEyMTU0LCAyNDAsIDEyMTQ5LCAzODQsIDEwMCwgMTAyLCAxMTIsIDM4MjAsIDEyMTg1LCAxMjIwNywgMzg0LCA5NywgMTA4LCAxMTUsIDEyMTkyLCAxMjE5NywgMTIyMDIsIDEwOCwgOTcsIDExNCwgNTksIDI1MzkwLCAxMDUsIDExMCwgMTAxLCA1OSwgMjUzNjIsIDExNywgMTE0LCAxMDIsIDU5LCAyNTM2MywgMjU2LCA1OSwgMTE2LCAzODM1LCAxMjIxMiwgMjM5LCAzODM1LCAxMTQsIDEwMSwgMTA4LCA1OSwgMjUyNjQsIDI1NiwgOTksIDEwNSwgMTIyMjQsIDEyMjI5LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NTE3LCA1OSwgMTczNTIsIDExMCwgOTksIDExNSwgMTEyLCA1OSwgMjQ1ODQsIDc2OCwgMTAyLCAxMDUsIDExMSwgMTEyLCAxMTUsIDExNywgMTIyNTAsIDg5MzAsIDEyMjU1LCAxMjI2MSwgMTIyNjcsIDEyMjczLCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjIyLCAxMTIsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NzQsIDExNCwgMTA1LCAxMDksIDEwMSwgNTksIDI0NjYzLCA5OSwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjUxOCwgMzg0LCA5NywgMTAxLCAxMTEsIDEyMjgwLCAxMjI5NywgMTIzMDcsIDExNiwgMjU2LCAxMDEsIDEwNSwgMTIyODYsIDEyMjkzLCAxMTQsIDExMCwgMTA1LCAxMTEsIDExMCwgMjQzLCAxNzEyLCAxMTAsIDExNiwgNTksIDI3MTU4LCAxMTUsIDExNiwgMjU2LCA1OSwgMTAxLCAxMjMwNCwgMTIzMDUsIDE2NDQ3LCAyNDEsIDc5NjEsIDI0NCwgMzg2MCwgMjY4OCwgNjUsIDY2LCA3MiwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTA0LCAxMDUsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTQsIDExNSwgMTE2LCAxMTcsIDEyMCwgMTIzNTIsIDEyMzY5LCAxMjM3MywgMTIzNzcsIDEyNTEyLCAxMjU1OCwgMTI1ODcsIDEyNjE1LCAxMjY0MiwgMTI2NTgsIDEyNjg2LCAxMjgwNiwgMTI4MjEsIDEyODM2LCAxMjg0MSwgMTI4ODgsIDEyOTEwLCAxMjkxNCwgMTI5NDQsIDEyOTc2LCAxMjk4MywgMzg0LCA5NywgMTE0LCAxMTYsIDEyMzU5LCAxMjM2MiwgMTIzNjQsIDExNCwgMjQyLCA0Mjc1LCAyNDIsIDk4OSwgOTcsIDEwNSwgMTA4LCA1OSwgMjY5MDgsIDk3LCAxMTQsIDI0MiwgNzI2OSwgOTcsIDExNCwgNTksIDI2OTgwLCA4OTYsIDk5LCAxMDAsIDEwMSwgMTEwLCAxMTMsIDExNCwgMTE2LCAxMjM5MiwgMTI0MDUsIDEyNDA4LCAxMjQxNSwgMTI0MzEsIDEyNDM2LCAxMjQ5MiwgMjU2LCAxMDEsIDExNywgMTIzOTcsIDEyNDAxLCA1OSwgNDkxNTIsIDg3NjUsIDgxNywgMTE2LCAxMDEsIDU5LCAxNjcyNSwgMTA1LCAyMjcsIDQ0NjIsIDEwOSwgMTEyLCAxMTYsIDEyMSwgMTE4LCA1OSwgMjcwNTksIDEwMywgNTEyLCA1OSwgMTAwLCAxMDEsIDEwOCwgNDA0OSwgMTI0MjUsIDEyNDI3LCAxMjQyOSwgNTksIDI3MDI2LCA1OSwgMjcwNDUsIDIyOSwgNDA0OSwgMTE3LCAxMTEsIDMyODI3LCAxODcsIDE2NTcxLCAxMTQsIDE0MDgsIDU5LCA5NywgOTgsIDk5LCAxMDIsIDEwNCwgMTA4LCAxMTIsIDExNSwgMTE2LCAxMTksIDQwNjAsIDEyNDYwLCAxMjQ2MywgMTI0NzEsIDEyNDczLCAxMjQ3NiwgMTI0NzgsIDEyNDgwLCAxMjQ4MywgMTI0ODcsIDEyNDkwLCAxMTIsIDU5LCAyNjk5NywgMjU2LCA1OSwgMTAyLCA0MDY0LCAxMjQ2OCwgMTE1LCA1OSwgMjY5MTIsIDU5LCAyNjkzMSwgMTE1LCA1OSwgMjY5MTAsIDIzNSwgODc5NywgMjQwLCAxMDAzMCwgMTA4LCA1OSwgMjY5NDksIDEwNSwgMTA5LCA1OSwgMjY5OTYsIDEwOCwgNTksIDI0OTk1LCA1OSwgMjQ5ODksIDI1NiwgOTcsIDEwNSwgMTI0OTcsIDEyNTAxLCAxMDUsIDEwOCwgNTksIDI2OTA2LCAxMTEsIDI1NiwgNTksIDExMCwgMTI1MDcsIDEyNTA4LCAyNTE0MiwgOTcsIDEwOCwgMjQzLCAzODcwLCAzODQsIDk3LCA5OCwgMTE0LCAxMjUxOSwgMTI1MjIsIDEyNTI2LCAxMTQsIDI0MiwgNjExNywgMTE0LCAxMDcsIDU5LCAyNjQ4MywgMjU2LCA5NywgMTA3LCAxMjUzMSwgMTI1NDEsIDk5LCAyNTYsIDEwMSwgMTA3LCAxMjUzNywgMTI1MzksIDU5LCAxNjUwOSwgNTksIDE2NDc3LCAyNTYsIDEwMSwgMTE1LCAxMjU0NiwgMTI1NDgsIDU5LCAyNzAyMCwgMTA4LCAyNTYsIDEwMCwgMTE3LCAxMjU1NCwgMTI1NTYsIDU5LCAyNzAyMiwgNTksIDI3MDI0LCA1MTIsIDk3LCAxMDEsIDExNywgMTIxLCAxMjU2NywgMTI1NzIsIDEyNTgzLCAxMjU4NSwgMTE0LCAxMTEsIDExMCwgNTksIDE2NzI5LCAyNTYsIDEwMCwgMTA1LCAxMjU3NywgMTI1ODEsIDEwNSwgMTA4LCA1OSwgMTY3MjcsIDIzNiwgNDA4MiwgMjI2LCAxMjUzOCwgNTksIDE3NDcyLCA1MTIsIDk5LCAxMDgsIDExMywgMTE1LCAxMjU5NiwgMTI1OTksIDEyNjA1LCAxMjYxMiwgOTcsIDU5LCAyNjkzNSwgMTAwLCAxMDQsIDk3LCAxMTQsIDU5LCAyNjk4NSwgMTE3LCAxMTEsIDI1NiwgNTksIDExNCwgNTI2LCA1MjUsIDEwNCwgNTksIDI1MDExLCAzODQsIDk3LCA5OSwgMTAzLCAxMjYyMiwgMTI2MzksIDM5MDgsIDEwOCwgNTEyLCA1OSwgMTA1LCAxMTIsIDExNSwgMzk2MCwgMTI2MzIsIDEyNjM1LCA0MjUyLCAxMTAsIDIyOSwgNDI4MywgOTcsIDExNCwgMjQ0LCA0MDA5LCAxMTYsIDU5LCAyNjAyOSwgMzg0LCAxMDUsIDEwOCwgMTE0LCAxMjY0OSwgNDEzMSwgMTI2NTQsIDExNSwgMTA0LCAxMTYsIDU5LCAyNzAwNSwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MjMsIDI1NiwgOTcsIDExMSwgMTI2NjMsIDEyNjc4LCAxMTQsIDI1NiwgMTAwLCAxMTcsIDEyNjY5LCAxMjY3MSwgMTg3LCAxMTQ3LCAyNTYsIDU5LCAxMDgsIDQyNDEsIDEyNjc2LCA1OSwgMjY5ODgsIDI1NiwgNTksIDExOCwgMTI2ODMsIDEyNjg0LCAxNzM0NSwgNTksIDE3MzkzLCAzODQsIDEwMywgMTEwLCAxMTUsIDEyNjkzLCAxMjc5MywgMTI3OTYsIDEwNCwgMTE2LCA3NjgsIDk3LCAxMDQsIDEwOCwgMTE0LCAxMTUsIDExNiwgMTI3MDgsIDEyNzIwLCAxMjczOCwgMTI3NjAsIDEyNzcyLCAxMjc4MiwgMTE0LCAxMTQsIDExMSwgMTE5LCAyNTYsIDU5LCAxMTYsIDQwNjAsIDEyNzE3LCA5NywgMjMzLCAxMjQ4OCwgOTcsIDExNCwgMTEyLCAxMTEsIDExMSwgMTEwLCAyNTYsIDEwMCwgMTE3LCAxMjczMSwgMTI3MzUsIDExMSwgMTE5LCAyMzgsIDEyNjcwLCAxMTIsIDE4NywgNDI0MiwgMTAxLCAxMDIsIDExNiwgMjU2LCA5NywgMTA0LCAxMjc0NiwgMTI3NTIsIDExNCwgMTE0LCAxMTEsIDExOSwgMjQzLCA0MDc0LCA5NywgMTE0LCAxMTIsIDExMSwgMTExLCAxMTAsIDI0MywgMTM2MSwgMTA1LCAxMDMsIDEwNCwgMTE2LCA5NywgMTE0LCAxMTQsIDExMSwgMTE5LCAxMTUsIDU5LCAyNTAzMywgMTEzLCAxMTcsIDEwNSwgMTAzLCA5NywgMTE0LCAxMTQsIDExMSwgMjQ3LCAxMjQ5MSwgMTA0LCAxMTQsIDEwMSwgMTAxLCAxMTYsIDEwNSwgMTA5LCAxMDEsIDExNSwgNTksIDI1MjkyLCAxMDMsIDU5LCAxNzExNCwgMTA1LCAxMTAsIDEwMywgMTAwLCAxMTEsIDExNiwgMTE1LCAxMDEsIDI0MSwgNzk4NiwgMzg0LCA5NywgMTA0LCAxMDksIDEyODEzLCAxMjgxNiwgMTI4MTksIDExNCwgMjQyLCA0MDc0LCA5NywgMjQyLCAxMzYxLCA1OSwgMjQ1OTEsIDExMSwgMTE3LCAxMTUsIDExNiwgMjU2LCA1OSwgOTcsIDEyODMwLCAxMjgzMSwgMjU1MjEsIDk5LCAxMDQsIDEwMSwgMTg3LCAxMjgzMSwgMTA5LCAxMDUsIDEwMCwgNTksIDI3Mzc0LCA1MTIsIDk3LCA5OCwgMTEyLCAxMTYsIDEyODUwLCAxMjg2MSwgMTI4NjQsIDEyODgyLCAyNTYsIDExMCwgMTE0LCAxMjg1NSwgMTI4NTgsIDEwMywgNTksIDI2NjA1LCAxMTQsIDU5LCAyNTA4NiwgMTE0LCAyMzUsIDQwOTksIDM4NCwgOTcsIDEwMiwgMTA4LCAxMjg3MSwgMTI4NzQsIDEyODc4LCAxMTQsIDU5LCAyNzAxNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NzUsIDExNywgMTE1LCA1OSwgMjcxODIsIDEwNSwgMTA5LCAxMDEsIDExNSwgNTksIDI3MTg5LCAyNTYsIDk3LCAxMTIsIDEyODkzLCAxMjkwMywgMTE0LCAyNTYsIDU5LCAxMDMsIDEyODk5LCAxMjkwMCwgMTY0MjUsIDExNiwgNTksIDI3MDI4LCAxMTEsIDEwOCwgMTA1LCAxMTAsIDExNiwgNTksIDI3MTU0LCA5NywgMTE0LCAyNDIsIDEyNzcxLCA1MTIsIDk3LCA5OSwgMTA0LCAxMTMsIDEyOTIzLCAxMjkyOCwgNDI4NCwgMTI5MzMsIDExMywgMTE3LCAxMTEsIDU5LCAyNDYzNCwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjUxOSwgMjU2LCA5OCwgMTE3LCAxMjUzOSwgMTI5MzgsIDExMSwgMjU2LCA1OSwgMTE0LCA1MzIsIDUzMSwgMzg0LCAxMDQsIDEwNSwgMTE0LCAxMjk1MSwgMTI5NTUsIDEyOTYwLCAxMTQsIDEwMSwgMjI5LCAxMjc5MiwgMTA5LCAxMDEsIDExNSwgNTksIDI1MjkwLCAxMDUsIDUxMiwgNTksIDEwMSwgMTAyLCAxMDgsIDEyOTcwLCA0MTg1LCA2MTc3LCAxMjk3MSwgMjYwNDEsIDExNiwgMTE0LCAxMDUsIDU5LCAyNzA4NiwgMTA4LCAxMTcsIDEwNCwgOTcsIDExNCwgNTksIDI2OTg0LCA1OSwgMjQ4NjIsIDM0MjUsIDEzMDEzLCAxMzAxOSwgMTMwMjMsIDEzMTAwLCAxMzExMiwgMTMxNjksIDAsIDEzMTc4LCAxMzIyMCwgMCwgMCwgMTMyOTIsIDEzMjk2LCAwLCAxMzM1MiwgMTMzODQsIDEzNDAyLCAxMzQ4NSwgMTM0ODksIDEzNTE0LCAxMzU1MywgMCwgMTM4NDYsIDAsIDAsIDEzODc1LCA5OSwgMTE3LCAxMTYsIDEwMSwgNTksIDE2NzMxLCAxMTMsIDExNywgMjM5LCAxMDE3MCwgMTI4MCwgNTksIDY5LCA5NywgOTksIDEwMSwgMTA1LCAxMTAsIDExMiwgMTE1LCAxMjEsIDQ1ODksIDEzMDQzLCAxMzA0NSwgMTMwNTUsIDEzMDU4LCAxMzA2NywgMTMwNzEsIDEzMDg3LCAxMzA5NCwgMTMwOTcsIDU5LCAyNzMxNiwgNDk2LCAxMzA1MCwgMCwgMTMwNTIsIDU5LCAyNzMyMCwgMTExLCAxMTAsIDU5LCAxNjczNywgMTE3LCAyMjksIDQ2MDYsIDI1NiwgNTksIDEwMCwgNDU5NSwgMTMwNjMsIDEwNSwgMTA4LCA1OSwgMTY3MzUsIDExNCwgOTksIDU5LCAxNjczMywgMzg0LCA2OSwgOTcsIDExNSwgMTMwNzgsIDEzMDgwLCAxMzA4MywgNTksIDI3MzE4LCAxMTIsIDU5LCAyNzMyMiwgMTA1LCAxMDksIDU5LCAyNTMyMSwgMTExLCAxMDgsIDEwNSwgMTEwLCAxMTYsIDU5LCAyNzE1NSwgMTA1LCAyMzcsIDQ2MTIsIDU5LCAxNzQ3MywgMTExLCAxMTYsIDM4NCwgNTksIDk4LCAxMDEsIDEzMTA4LCA3NDk1LCAxMzEwOSwgMjUyODUsIDU5LCAyNzIzOCwgODk2LCA2NSwgOTcsIDk5LCAxMDksIDExNSwgMTE2LCAxMjAsIDEzMTI2LCAxMzEzMCwgMTMxNDMsIDEzMTQ3LCAxMzE1MCwgMTMxNTUsIDEzMTY1LCAxMTQsIDExNCwgNTksIDI1MDQ4LCAxMTQsIDI1NiwgMTA0LCAxMTQsIDEzMTM2LCAxMzEzOCwgMjM1LCA4NzQ0LCAyNTYsIDU5LCAxMTEsIDI2MTQsIDI2MTIsIDExNiwgMzI4MjcsIDE2NywgMTY1NTEsIDEwNSwgNTksIDE2NDQzLCAxMTksIDk3LCAxMTQsIDU5LCAyNjkyMSwgMTA5LCAyNTYsIDEwNSwgMTEwLCAxMzE2MSwgMjQwLCAxMTAsIDExNywgMjQzLCAyNDEsIDExNiwgNTksIDI2NDIyLCAxMTQsIDI1NiwgNTksIDExMSwgMTMxNzQsIDgyNzcsIDQ5MTUyLCA1NTM0OSwgNTY2MjQsIDUxMiwgOTcsIDk5LCAxMTEsIDEyMSwgMTMxODYsIDEzMTkwLCAxMzIwMSwgMTMyMTYsIDExNCwgMTEyLCA1OSwgMjYyMjMsIDI1NiwgMTA0LCAxMjEsIDEzMTk1LCAxMzE5OSwgOTksIDEyMSwgNTksIDE3NDgxLCA1OSwgMTc0ODAsIDExNCwgMTE2LCA2MjEsIDEzMjA5LCAwLCAwLCAxMzIxMiwgMTA1LCAyMjgsIDUyMjAsIDk3LCAxMTQsIDk3LCAyMzYsIDExODg3LCAzMjgyNywgMTczLCAxNjU1NywgMjU2LCAxMDMsIDEwOSwgMTMyMjQsIDEzMjM2LCAxMDksIDk3LCAzODQsIDU5LCAxMDIsIDExOCwgMTMyMzMsIDEzMjM0LCAxMzIzNCwgMTczNDcsIDU5LCAxNzM0NiwgMTAyNCwgNTksIDEwMCwgMTAxLCAxMDMsIDEwOCwgMTEwLCAxMTIsIDExNCwgNDc3OSwgMTMyNTMsIDEzMjU3LCAxMzI2MiwgMTMyNzAsIDEzMjc4LCAxMzI4MSwgMTMyODYsIDExMSwgMTE2LCA1OSwgMjcyNDIsIDI1NiwgNTksIDExMywgNDc4NSwgNDc4NCwgMjU2LCA1OSwgNjksIDEzMjY3LCAxMzI2OCwgMjcyOTQsIDU5LCAyNzI5NiwgMjU2LCA1OSwgNjksIDEzMjc1LCAxMzI3NiwgMjcyOTMsIDU5LCAyNzI5NSwgMTAxLCA1OSwgMjUxNTgsIDEwOCwgMTE3LCAxMTUsIDU5LCAyNzE3MiwgOTcsIDExNCwgMTE0LCA1OSwgMjY5OTQsIDk3LCAxMTQsIDI0MiwgNDQxMywgNTEyLCA5NywgMTAxLCAxMDUsIDExNiwgMTMzMDQsIDEzMzIwLCAxMzMyNywgMTMzMzUsIDI1NiwgMTA4LCAxMTUsIDEzMzA5LCAxMzMxNiwgMTA4LCAxMTUsIDEwMSwgMTE2LCAxMDksIDIzMywgMTMxNjIsIDEwNCwgMTEyLCA1OSwgMjcxODcsIDExMiwgOTcsIDExNCwgMTE1LCAxMDgsIDU5LCAyNzEwOCwgMjU2LCAxMDAsIDEwOCwgNTIxOSwgMTMzMzIsIDEwMSwgNTksIDI1Mzc5LCAyNTYsIDU5LCAxMDEsIDEzMzQwLCAxMzM0MSwgMjczMDYsIDI1NiwgNTksIDExNSwgMTMzNDYsIDEzMzQ3LCAyNzMwOCwgNTksIDQ5MTUyLCAxMDkyNCwgNjUwMjQsIDM4NCwgMTAyLCAxMDgsIDExMiwgMTMzNTgsIDEzMzYzLCAxMzM3OCwgMTE2LCA5OSwgMTIxLCA1OSwgMTc0ODQsIDI1NiwgNTksIDk4LCAxMzM2OCwgMTMzNjksIDE2NDMxLCAyNTYsIDU5LCA5NywgMTMzNzQsIDEzMzc1LCAyNzA3NiwgMTE0LCA1OSwgMjU0MDcsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NzYsIDk3LCAyNTYsIDEwMCwgMTE0LCAxMzM4OSwgMTAyNiwgMTAxLCAxMTUsIDI1NiwgNTksIDExNywgMTMzOTYsIDEzMzk3LCAyNjIwOCwgMTA1LCAxMTYsIDE4NywgMTMzOTcsIDM4NCwgOTksIDExNSwgMTE3LCAxMzQwOCwgMTM0MzMsIDEzNDcxLCAyNTYsIDk3LCAxMTcsIDEzNDEzLCAxMzQyMywgMTEyLCAyNTYsIDU5LCAxMTUsIDQ0ODgsIDEzNDE5LCA1OSwgNDkxNTIsIDg4NTEsIDY1MDI0LCAxMTIsIDI1NiwgNTksIDExNSwgNDUzMiwgMTM0MjksIDU5LCA0OTE1MiwgODg1MiwgNjUwMjQsIDExNywgMjU2LCA5OCwgMTEyLCAxMzQzOSwgMTM0NTUsIDM4NCwgNTksIDEwMSwgMTE1LCA0NTAzLCA0NTA4LCAxMzQ0NiwgMTAxLCAxMTYsIDI1NiwgNTksIDEwMSwgNDUwMywgMTM0NTMsIDI0MSwgNDUwOSwgMzg0LCA1OSwgMTAxLCAxMTUsIDQ1MjAsIDQ1MjUsIDEzNDYyLCAxMDEsIDExNiwgMjU2LCA1OSwgMTAxLCA0NTIwLCAxMzQ2OSwgMjQxLCA0NTI2LCAzODQsIDU5LCA5NywgMTAyLCA0NDc1LCAxMzQ3OCwgMTQ1NiwgMTE0LCAzNTcsIDEzNDgzLCAxNDU3LCAxODcsIDQ0NzYsIDk3LCAxMTQsIDI0MiwgNDQyNCwgNTEyLCA5OSwgMTAxLCAxMDksIDExNiwgMTM0OTcsIDEzNTAyLCAxMzUwNiwgMTM1MDksIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1MjAsIDExNiwgMTA5LCAyMzgsIDI0MSwgMTA1LCAyMzYsIDEzMzMzLCA5NywgMTE0LCAyMzAsIDQ1NDIsIDI1NiwgOTcsIDExNCwgMTM1MTgsIDEzNTI1LCAxMTQsIDI1NiwgNTksIDEwMiwgMTM1MjQsIDYwNzksIDI2MTE4LCAyNTYsIDk3LCAxMTAsIDEzNTMwLCAxMzU0OSwgMTA1LCAxMDMsIDEwNCwgMTE2LCAyNTYsIDEwMSwgMTEyLCAxMzUzOSwgMTM1NDYsIDExMiwgMTE1LCAxMDUsIDEwOCwgMTExLCAyMzgsIDc5MDQsIDEwNCwgMjMzLCAxMTk1MSwgMTE1LCAxODcsIDEwMzIyLCA2NDAsIDk4LCA5OSwgMTA5LCAxMTAsIDExMiwgMTM1NjMsIDEzNjYyLCA0NjE3LCAxMzcwNywgMTM3MTAsIDExNTIsIDU5LCA2OSwgMTAwLCAxMDEsIDEwOSwgMTEwLCAxMTIsIDExNCwgMTE1LCAxMzU4MiwgMTM1ODMsIDEzNTg1LCAxMzU4OSwgMTM1OTgsIDEzNjAzLCAxMzYxMiwgMTM2MTcsIDEzNjIyLCAyNTIxOCwgNTksIDI3MzMzLCAxMTEsIDExNiwgNTksIDI3MzI1LCAyNTYsIDU5LCAxMDAsIDQ1NzAsIDEzNTk0LCAxMTEsIDExNiwgNTksIDI3MzMxLCAxMTcsIDEwOCwgMTE2LCA1OSwgMjczMjksIDI1NiwgNjksIDEwMSwgMTM2MDgsIDEzNjEwLCA1OSwgMjczMzksIDU5LCAyNTIyNiwgMTA4LCAxMTcsIDExNSwgNTksIDI3MzI3LCA5NywgMTE0LCAxMTQsIDU5LCAyNzAwMSwgMzg0LCAxMDEsIDEwNSwgMTE3LCAxMzYyOSwgMTM2NTAsIDEzNjUzLCAxMTYsIDM4NCwgNTksIDEwMSwgMTEwLCAxMzU4MiwgMTM2MzcsIDEzNjQzLCAxMTMsIDI1NiwgNTksIDExMywgNDU3MCwgMTM1ODMsIDEwMSwgMTEzLCAyNTYsIDU5LCAxMTMsIDEzNjExLCAxMzYwOCwgMTA5LCA1OSwgMjczMzUsIDI1NiwgOTgsIDExMiwgMTM2NTgsIDEzNjYwLCA1OSwgMjczNDksIDU5LCAyNzM0NywgOTksIDc2OCwgNTksIDk3LCA5OSwgMTAxLCAxMTAsIDExNSwgNDU4OSwgMTM2NzYsIDEzNjgyLCAxMzY4OSwgMTM2OTEsIDEzMDk0LCAxMTIsIDExMiwgMTE0LCAxMTEsIDI0OCwgMTMwNTAsIDExNywgMTE0LCAxMDgsIDEyMSwgMTAxLCAyNDEsIDQ2MDYsIDI0MSwgNDU5NSwgMzg0LCA5NywgMTAxLCAxMTUsIDEzNjk4LCAxMzcwNCwgMTMwODMsIDExMiwgMTEyLCAxMTQsIDExMSwgMjQ4LCAxMzA4MiwgMTEzLCAyNDEsIDEzMDc5LCAxMDMsIDU5LCAyNjIxOCwgMTY2NCwgNDksIDUwLCA1MSwgNTksIDY5LCAxMDAsIDEwMSwgMTA0LCAxMDgsIDEwOSwgMTEwLCAxMTIsIDExNSwgMTM3MzcsIDEzNzQwLCAxMzc0MywgNDYzNiwgMTM3NDYsIDEzNzQ4LCAxMzc2MCwgMTM3NjksIDEzNzgxLCAxMzc4NiwgMTM3OTEsIDEzODAwLCAxMzgwNSwgMzI4MjcsIDE4NSwgMTY1NjksIDMyODI3LCAxNzgsIDE2NTYyLCAzMjgyNywgMTc5LCAxNjU2MywgNTksIDI3MzM0LCAyNTYsIDExMSwgMTE1LCAxMzc1MywgMTM3NTYsIDExNiwgNTksIDI3MzI2LCAxMTcsIDk4LCA1OSwgMjczNTIsIDI1NiwgNTksIDEwMCwgNDY0MiwgMTM3NjUsIDExMSwgMTE2LCA1OSwgMjczMzIsIDExNSwgMjU2LCAxMTEsIDExNywgMTM3NzUsIDEzNzc4LCAxMDgsIDU5LCAyNjU2OSwgOTgsIDU5LCAyNzM1MSwgOTcsIDExNCwgMTE0LCA1OSwgMjcwMDMsIDExNywgMTA4LCAxMTYsIDU5LCAyNzMzMCwgMjU2LCA2OSwgMTAxLCAxMzc5NiwgMTM3OTgsIDU5LCAyNzM0MCwgNTksIDI1MjI3LCAxMDgsIDExNywgMTE1LCA1OSwgMjczMjgsIDM4NCwgMTAxLCAxMDUsIDExNywgMTM4MTIsIDEzODMzLCAxMzgzNiwgMTE2LCAzODQsIDU5LCAxMDEsIDExMCwgNDYzNiwgMTM4MjAsIDEzODI2LCAxMTMsIDI1NiwgNTksIDExMywgNDY0MiwgMTM3NDYsIDEwMSwgMTEzLCAyNTYsIDU5LCAxMTMsIDEzNzk5LCAxMzc5NiwgMTA5LCA1OSwgMjczMzYsIDI1NiwgOTgsIDExMiwgMTM4NDEsIDEzODQzLCA1OSwgMjczNDgsIDU5LCAyNzM1MCwgMzg0LCA2NSwgOTcsIDExMCwgMTM4NTIsIDEzODU2LCAxMzg2OSwgMTE0LCAxMTQsIDU5LCAyNTA0OSwgMTE0LCAyNTYsIDEwNCwgMTE0LCAxMzg2MiwgMTM4NjQsIDIzNSwgODc1MCwgMjU2LCA1OSwgMTExLCAyNjAzLCAyNjAxLCAxMTksIDk3LCAxMTQsIDU5LCAyNjkyMiwgMTA4LCAxMDUsIDEwMywgMzI4MjcsIDIyMywgMTY2MDcsIDMwNDEsIDEzOTA1LCAxMzkxNywgMTM5MjAsIDQ4MTQsIDEzOTM5LCAxMzk0NSwgMCwgMTM5NTAsIDE0MDE4LCAwLCAwLCAwLCAwLCAwLCAxNDA0MywgMTQwODMsIDAsIDE0MDg5LCAxNDE4OCwgMCwgMCwgMCwgMTQyMTUsIDYyNiwgMTM5MTAsIDAsIDAsIDEzOTE1LCAxMDMsIDEwMSwgMTE2LCA1OSwgMjUzNjYsIDU5LCAxNzM0OCwgMTE0LCAyMzUsIDM2NzksIDM4NCwgOTcsIDEwMSwgMTIxLCAxMzkyNiwgMTM5MzEsIDEzOTM2LCAxMTQsIDExMSwgMTEwLCA1OSwgMTY3NDEsIDEwMCwgMTA1LCAxMDgsIDU5LCAxNjczOSwgNTksIDE3NDc0LCAxMDgsIDExNCwgMTAxLCA5OSwgNTksIDI1MzY1LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjI1LCA1MTIsIDEwMSwgMTA1LCAxMDcsIDExMSwgMTM5NTgsIDEzOTgxLCAxNDAwNSwgMTQwMTIsIDQ5OCwgMTM5NjMsIDAsIDEzOTY5LCAxMDEsIDI1NiwgNTIsIDEwMiwgNDc0MCwgNDczNywgOTcsIDM4NCwgNTksIDExNSwgMTE4LCAxMzk3NiwgMTM5NzcsIDEzOTc5LCAxNzMzNiwgMTIxLCAxMDksIDU5LCAxNzM2MSwgMjU2LCA5OSwgMTEwLCAxMzk4NiwgMTQwMDIsIDEwNywgMjU2LCA5NywgMTE1LCAxMzk5MiwgMTM5OTgsIDExMiwgMTEyLCAxMTQsIDExMSwgMjQ4LCA0ODAxLCAxMDUsIDEwOSwgMTg3LCA0NzgwLCAxMTUsIDI0MCwgNDc2NiwgMjU2LCA5NywgMTE1LCAxNDAxMCwgMTM5OTgsIDI0MCwgNDgwMSwgMTE0LCAxMTAsIDMyODI3LCAyNTQsIDE2NjM4LCA0OTIsIDc5OSwgMTQwMjIsIDg5MzUsIDEwMSwgMTE1LCAzMzE1MiwgMjE1LCA1OSwgOTgsIDEwMCwgMTQwMzEsIDE0MDMyLCAxNDA0MCwgMTY1OTksIDI1NiwgNTksIDk3LCA2NDE1LCAxNDAzNywgMTE0LCA1OSwgMjcxODUsIDU5LCAyNzE4NCwgMzg0LCAxMDEsIDExMiwgMTE1LCAxNDA0OSwgMTQwNTEsIDE0MDgwLCAyMjUsIDEwODI5LCA1MTIsIDU5LCA5OCwgOTksIDEwMiwgMTE1OCwgMTQwNjAsIDE0MDY0LCAxNDA2OCwgMTExLCAxMTYsIDU5LCAyNTM5OCwgMTA1LCAxMTQsIDU5LCAyNzM3NywgMjU2LCA1OSwgMTExLCAxNDA3MywgMTQwNzYsIDQ5MTUyLCA1NTM0OSwgNTY2NzcsIDExNCwgMTA3LCA1OSwgMjczNTQsIDIyNSwgMTMxNTQsIDExNCwgMTA1LCAxMDksIDEwMSwgNTksIDI0NjI4LCAzODQsIDk3LCAxMDUsIDExMiwgMTQwOTUsIDE0MDk4LCAxNDE4MCwgMTAwLCAyMjksIDQ2ODAsIDg5NiwgOTcsIDEwMCwgMTAxLCAxMDksIDExMiwgMTE1LCAxMTYsIDE0MTEzLCAxNDE1NywgMTQxNDQsIDE0MTYxLCAxNDE2NywgMTQxNzIsIDE0MTc1LCAxMTAsIDEwMywgMTA4LCAxMDEsIDY0MCwgNTksIDEwMCwgMTA4LCAxMTMsIDExNCwgMTQxMjgsIDE0MTI5LCAxNDEzNCwgMTQxNDQsIDE0MTQ2LCAyNjAzNywgMTExLCAxMTksIDExMCwgMTg3LCA3NjExLCAxMDEsIDEwMiwgMTE2LCAyNTYsIDU5LCAxMDEsIDEwMjQwLCAxNDE0MiwgMjQxLCAyMzUwLCA1OSwgMjUxODAsIDEwNSwgMTAzLCAxMDQsIDExNiwgMjU2LCA1OSwgMTAxLCAxMjk3MCwgMTQxNTUsIDI0MSwgNDE4NiwgMTExLCAxMTYsIDU5LCAyNjA5MiwgMTA1LCAxMTAsIDExNywgMTE1LCA1OSwgMjcxOTQsIDEwOCwgMTE3LCAxMTUsIDU5LCAyNzE5MywgOTgsIDU5LCAyNzA4NSwgMTA1LCAxMDksIDEwMSwgNTksIDI3MTk1LCAxMDEsIDEyMiwgMTA1LCAxMTcsIDEwOSwgNTksIDI1NTcwLCAzODQsIDk5LCAxMDQsIDExNiwgMTQxOTQsIDE0MjA1LCAxNDIwOSwgMjU2LCAxMTQsIDEyMSwgMTQxOTksIDE0MjAzLCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjUyMSwgNTksIDE3NDc4LCA5OSwgMTIxLCA1OSwgMTc0OTksIDExNCwgMTExLCAxMDcsIDU5LCAxNjc0MywgMjU2LCAxMDUsIDExMSwgMTQyMTksIDE0MjIyLCAxMjAsIDI0NCwgNjAwNywgMTA0LCAxMDEsIDk3LCAxMDAsIDI1NiwgMTA4LCAxMTQsIDE0MjMxLCAxNDI0MCwgMTAxLCAxMDIsIDExNiwgOTcsIDExNCwgMTE0LCAxMTEsIDI0NywgMjEyNywgMTA1LCAxMDMsIDEwNCwgMTE2LCA5NywgMTE0LCAxMTQsIDExMSwgMTE5LCAxODcsIDM5MzMsIDIzMDQsIDY1LCA3MiwgOTcsIDk4LCA5OSwgMTAwLCAxMDIsIDEwMywgMTA0LCAxMDgsIDEwOSwgMTExLCAxMTIsIDExNCwgMTE1LCAxMTYsIDExNywgMTE5LCAxNDI4OCwgMTQyOTEsIDE0Mjk1LCAxNDMwOCwgMTQzMjAsIDE0MzMyLCAxNDM1MCwgMTQzNjQsIDE0MzcxLCAxNDM4OCwgMTQ0MTcsIDE0NDI5LCAxNDQ0MywgMTQ1MDUsIDE0NTQwLCAxNDU0NiwgMTQ1NzAsIDE0NTgyLCAxMTQsIDI0MiwgMTAwNSwgOTcsIDExNCwgNTksIDI2OTc5LCAyNTYsIDk5LCAxMTQsIDE0MzAwLCAxNDMwNiwgMTE3LCAxMTYsIDEwMSwgMzI4MjcsIDI1MCwgMTY2MzQsIDI0MiwgNDQzMiwgMTE0LCA0ODMsIDE0MzE0LCAwLCAxNDMxNywgMTIxLCA1OSwgMTc1MDIsIDExOCwgMTAxLCA1OSwgMTY3NDksIDI1NiwgMTA1LCAxMjEsIDE0MzI1LCAxNDMzMCwgMTE0LCA5OSwgMzI4MjcsIDI1MSwgMTY2MzUsIDU5LCAxNzQ3NSwgMzg0LCA5NywgOTgsIDEwNCwgMTQzMzksIDE0MzQyLCAxNDM0NywgMTE0LCAyNDIsIDUwMzcsIDEwOCwgOTcsIDk5LCA1OSwgMTY3NTMsIDk3LCAyNDIsIDUwNTksIDI1NiwgMTA1LCAxMTQsIDE0MzU1LCAxNDM2MCwgMTE1LCAxMDQsIDExNiwgNTksIDI3MDA2LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYyNiwgMTE0LCA5NywgMTE4LCAxMDEsIDMyODI3LCAyNDksIDE2NjMzLCAzNTMsIDE0Mzc1LCAxNDM4NSwgMTE0LCAyNTYsIDEwOCwgMTE0LCAxNDM4MCwgMTQzODIsIDE4NywgMjM5MSwgMTg3LCA0MjI3LCAxMDgsIDEwNywgNTksIDI1OTg0LCAyNTYsIDk5LCAxMTYsIDE0MzkzLCAxNDQxMywgNjIzLCAxNDM5OSwgMCwgMCwgMTQ0MTAsIDExNCwgMTEwLCAyNTYsIDU5LCAxMDEsIDE0NDA1LCAxNDQwNiwgMjUzNzIsIDExNCwgMTg3LCAxNDQwNiwgMTExLCAxMTIsIDU5LCAyNTM1OSwgMTE0LCAxMDUsIDU5LCAyNjEwNCwgMjU2LCA5NywgMTA4LCAxNDQyMiwgMTQ0MjYsIDk5LCAxMTQsIDU5LCAxNjc0NywgMzI5NTUsIDE2OCwgODQxLCAyNTYsIDEwMywgMTEyLCAxNDQzNCwgMTQ0MzgsIDExMSwgMTEwLCA1OSwgMTY3NTUsIDEwMiwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2NzgsIDc2OCwgOTcsIDEwMCwgMTA0LCAxMDgsIDExNSwgMTE3LCA0NDI3LCAxNDQ1NiwgMTQ0NjEsIDQ5NzgsIDE0NDgxLCAxNDQ5NiwgMTExLCAxMTksIDExMCwgMjI1LCA1MDQzLCA5NywgMTE0LCAxMTIsIDExMSwgMTExLCAxMTAsIDI1NiwgMTA4LCAxMTQsIDE0NDcyLCAxNDQ3NiwgMTAxLCAxMDIsIDI0NCwgMTQzODEsIDEwNSwgMTAzLCAxMDQsIDI0NCwgMTQzODMsIDEwNSwgMzg0LCA1OSwgMTA0LCAxMDgsIDE0NDg5LCAxNDQ5MCwgMTQ0OTIsIDE3MzQ5LCAxODcsIDUxMTQsIDExMSwgMTEwLCAxODcsIDE0NDkwLCAxMTIsIDk3LCAxMTQsIDExNCwgMTExLCAxMTksIDExNSwgNTksIDI1MDMyLCAzODQsIDk5LCAxMDUsIDExNiwgMTQ1MTIsIDE0NTMyLCAxNDUzNiwgNjIzLCAxNDUxOCwgMCwgMCwgMTQ1MjksIDExNCwgMTEwLCAyNTYsIDU5LCAxMDEsIDE0NTI0LCAxNDUyNSwgMjUzNzMsIDExNCwgMTg3LCAxNDUyNSwgMTExLCAxMTIsIDU5LCAyNTM1OCwgMTEwLCAxMDMsIDU5LCAxNjc1MSwgMTE0LCAxMDUsIDU5LCAyNjEwNSwgOTksIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1MjIsIDM4NCwgMTAwLCAxMDUsIDExNCwgMTQ1NTMsIDE0NTU3LCAxNDU2MiwgMTExLCAxMTYsIDU5LCAyNTMyOCwgMTA4LCAxMDAsIDEwMSwgNTksIDE2NzQ1LCAxMDUsIDI1NiwgNTksIDEwMiwgMTQxMjgsIDE0NTY4LCAxODcsIDYxNjMsIDI1NiwgOTcsIDEwOSwgMTQ1NzUsIDE0NTc4LCAxMTQsIDI0MiwgMTQ1MDQsIDEwOCwgMzI4MjcsIDI1MiwgMTY2MzYsIDk3LCAxMTAsIDEwMywgMTA4LCAxMDEsIDU5LCAyNzA0NywgMTkyMCwgNjUsIDY2LCA2OCwgOTcsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDgsIDExMCwgMTExLCAxMTIsIDExNCwgMTE1LCAxMjIsIDE0NjIwLCAxNDYyMywgMTQ2MzMsIDE0NjM3LCAxNDc3MywgMTQ3NzYsIDE0NzgxLCAxNDgxNSwgMTQ4MjAsIDE0ODI0LCAxNDgzNSwgMTQ4NDEsIDE0ODQ1LCAxNDg0OSwgMTQ4ODAsIDExNCwgMjQyLCAxMDE1LCA5NywgMTE0LCAyNTYsIDU5LCAxMTgsIDE0NjMwLCAxNDYzMSwgMjczNjgsIDU5LCAyNzM2OSwgOTcsIDExNSwgMjMyLCA5OTMsIDI1NiwgMTEwLCAxMTQsIDE0NjQyLCAxNDY0NywgMTAzLCAxMTQsIDExNiwgNTksIDI3MDM2LCA4OTYsIDEwMSwgMTA3LCAxMTAsIDExMiwgMTE0LCAxMTUsIDExNiwgMTM1MzksIDE0NjYyLCAxNDY2NywgMTQ2NzQsIDE0Njg1LCAxNDY5MiwgMTQ3NDIsIDk3LCAxMTIsIDExMiwgMjI1LCA5MjM3LCAxMTEsIDExNiwgMTA0LCAxMDUsIDExMCwgMjMxLCA3ODMwLCAzODQsIDEwNCwgMTA1LCAxMTQsIDEzNTQ3LCAxMTk3NiwgMTQ2ODEsIDExMSwgMTEyLCAyNDQsIDEyMjEzLCAyNTYsIDU5LCAxMDQsIDUwNDcsIDE0NjkwLCAyMzksIDEyNjg1LCAyNTYsIDEwNSwgMTE3LCAxNDY5NywgMTQ3MDEsIDEwMywgMTA5LCAyMjUsIDEzMjM1LCAyNTYsIDk4LCAxMTIsIDE0NzA2LCAxNDcyNCwgMTE1LCAxMDEsIDExNiwgMTEwLCAxMDEsIDExMywgMjU2LCA1OSwgMTEzLCAxNDcxNywgMTQ3MjAsIDQ5MTUyLCA4ODQyLCA2NTAyNCwgNTksIDQ5MTUyLCAxMDk1NSwgNjUwMjQsIDExNSwgMTAxLCAxMTYsIDExMCwgMTAxLCAxMTMsIDI1NiwgNTksIDExMywgMTQ3MzUsIDE0NzM4LCA0OTE1MiwgODg0MywgNjUwMjQsIDU5LCA0OTE1MiwgMTA5NTYsIDY1MDI0LCAyNTYsIDEwNCwgMTE0LCAxNDc0NywgMTQ3NTEsIDEwMSwgMTE2LCAyMjUsIDEzOTgwLCAxMDUsIDk3LCAxMTAsIDEwMywgMTA4LCAxMDEsIDI1NiwgMTA4LCAxMTQsIDE0NzYyLCAxNDc2NywgMTAxLCAxMDIsIDExNiwgMTg3LCAyMzQxLCAxMDUsIDEwMywgMTA0LCAxMTYsIDE4NywgNDE3NywgMTIxLCA1OSwgMTc0NTgsIDk3LCAxMTUsIDEwNCwgMTg3LCA0MTUwLCAzODQsIDEwMSwgMTA4LCAxMTQsIDE0Nzg4LCAxNDgwMiwgMTQ4MDcsIDM4NCwgNTksIDk4LCAxMDEsIDExNzU0LCAxNDc5NSwgMTQ3OTksIDk3LCAxMTQsIDU5LCAyNTI3NSwgMTEzLCA1OSwgMjUxNzgsIDEwOCwgMTA1LCAxMTIsIDU5LCAyNTMyNiwgMjU2LCA5OCwgMTE2LCAxNDgxMiwgNTIyNCwgOTcsIDI0MiwgNTIyNSwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYyNywgMTE2LCAxMTQsIDIzMywgMTQ3NjYsIDExNSwgMTE3LCAyNTYsIDk4LCAxMTIsIDE0ODMxLCAxNDgzMywgMTg3LCAzMzU2LCAxODcsIDM0MTcsIDExMiwgMTAyLCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjY3OSwgMTE0LCAxMTEsIDI0MCwgMzgzNSwgMTE2LCAxMTQsIDIzMywgMTQ3NzIsIDI1NiwgOTksIDExNywgMTQ4NTQsIDE0ODU5LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NTIzLCAyNTYsIDk4LCAxMTIsIDE0ODY0LCAxNDg3MiwgMTEwLCAyNTYsIDY5LCAxMDEsIDE0NzIwLCAxNDg3MCwgMTg3LCAxNDcxOCwgMTEwLCAyNTYsIDY5LCAxMDEsIDE0NzM4LCAxNDg3OCwgMTg3LCAxNDczNiwgMTA1LCAxMDMsIDEyMiwgOTcsIDEwMywgNTksIDI3MDM0LCA4OTYsIDk5LCAxMDEsIDEwMiwgMTExLCAxMTIsIDExNCwgMTE1LCAxNDkwMiwgMTQ5MDcsIDE0OTM0LCAxNDkzOSwgMTQ5MzIsIDE0OTQ1LCAxNDk1NCwgMTA1LCAxMTQsIDk5LCA1OSwgMTY3NTcsIDI1NiwgMTAwLCAxMDUsIDE0OTEyLCAxNDkyOSwgMjU2LCA5OCwgMTAzLCAxNDkxNywgMTQ5MjEsIDk3LCAxMTQsIDU5LCAyNzIzMSwgMTAxLCAyNTYsIDU5LCAxMTMsIDU2MjYsIDE0OTI3LCA1OSwgMjUxNzcsIDEwMSwgMTE0LCAxMTIsIDU5LCAyNDg1NiwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjYyOCwgMTEyLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjgwLCAyNTYsIDU5LCAxMDEsIDUyNDEsIDE0OTUwLCA5NywgMTE2LCAyMzIsIDUyNDEsIDk5LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NTI0LCAyNzg3LCA2MDMwLCAxNDk4MywgMCwgMTQ5ODcsIDAsIDE0OTkyLCAxNTAwMywgMCwgMCwgMTUwMDUsIDE1MDE2LCAxNTAxOSwgMTUwMjMsIDAsIDAsIDE1MDQzLCAxNTA1NCwgMCwgMTUwNjQsIDYxMDgsIDYxMTEsIDExNiwgMTE0LCAyMzMsIDYwOTcsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY2MjksIDI1NiwgNjUsIDk3LCAxNDk5NiwgMTQ5OTksIDExNCwgMjQyLCA5NjMsIDExNCwgMjQyLCAyNTUwLCA1OSwgMTczNDIsIDI1NiwgNjUsIDk3LCAxNTAwOSwgMTUwMTIsIDExNCwgMjQyLCA5NTIsIDExNCwgMjQyLCAyNTM5LCA5NywgMjQwLCAxMDAwMywgMTA1LCAxMTUsIDU5LCAyNTMzOSwgMzg0LCAxMDAsIDExMiwgMTE2LCA2MDUyLCAxNTAyOSwgMTUwMzgsIDI1NiwgMTAyLCAxMDgsIDE1MDM0LCA2MDU3LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjY4MSwgMTA1LCAxMDksIDIyOSwgNjA2NiwgMjU2LCA2NSwgOTcsIDE1MDQ3LCAxNTA1MCwgMTE0LCAyNDIsIDk3NCwgMTE0LCAyNDIsIDI1NjEsIDI1NiwgOTksIDExMywgMTUwNTgsIDYwNzIsIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1MjUsIDI1NiwgMTEyLCAxMTYsIDYxMDIsIDE1MDY4LCAxMTQsIDIzMywgNjEwMCwgMTAyNCwgOTcsIDk5LCAxMDEsIDEwMiwgMTA1LCAxMTEsIDExNSwgMTE3LCAxNTA4OCwgMTUxMDEsIDE1MTEyLCAxNTExNiwgMTUxMjEsIDE1MTI1LCAxNTEzMSwgMTUxMzcsIDk5LCAyNTYsIDExNywgMTIxLCAxNTA5NCwgMTUwOTksIDExNiwgMTAxLCAzMjgyNywgMjUzLCAxNjYzNywgNTksIDE3NDg3LCAyNTYsIDEwNSwgMTIxLCAxNTEwNiwgMTUxMTAsIDExNCwgOTksIDU5LCAxNjc1OSwgNTksIDE3NDgzLCAxMTAsIDMyODI3LCAxNjUsIDE2NTQ5LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjMwLCA5OSwgMTIxLCA1OSwgMTc0OTUsIDExMiwgMTAyLCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjY4MiwgOTksIDExNCwgNTksIDQ5MTUyLCA1NTM0OSwgNTY1MjYsIDI1NiwgOTksIDEwOSwgMTUxNDIsIDE1MTQ1LCAxMjEsIDU5LCAxNzQ4NiwgMTA4LCAzMjgyNywgMjU1LCAxNjYzOSwgMTI4MCwgOTcsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDQsIDEwNSwgMTExLCAxMTUsIDExOSwgMTUxNzAsIDE1MTc2LCAxNTE4OCwgMTUxOTIsIDE1MjA0LCAxNTIwOSwgMTUyMTMsIDE1MjIwLCAxNTIyNiwgMTUyMzIsIDk5LCAxMTcsIDExNiwgMTAxLCA1OSwgMTY3NjIsIDI1NiwgOTcsIDEyMSwgMTUxODEsIDE1MTg2LCAxMTQsIDExMSwgMTEwLCA1OSwgMTY3NjYsIDU5LCAxNzQ2MywgMTExLCAxMTYsIDU5LCAxNjc2NCwgMjU2LCAxMDEsIDExNiwgMTUxOTcsIDE1MjAxLCAxMTYsIDExNCwgMjMwLCA1NDcxLCA5NywgNTksIDE3MzM0LCAxMTQsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjMxLCA5OSwgMTIxLCA1OSwgMTc0NjIsIDEwMywgMTE0LCA5NywgMTE0LCAxMTQsIDU5LCAyNTA1MywgMTEyLCAxMDIsIDU5LCA0OTE1MiwgNTUzNDksIDU2NjgzLCA5OSwgMTE0LCA1OSwgNDkxNTIsIDU1MzQ5LCA1NjUyNywgMjU2LCAxMDYsIDExMCwgMTUyMzcsIDE1MjM5LCA1OSwgMjQ1ODksIDEwNiwgNTksIDI0NTg4XSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWNvZGUtZGF0YS1odG1sLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8gR2VuZXJhdGVkIHVzaW5nIHNjcmlwdHMvd3JpdGUtZGVjb2RlLW1hcC50c1xuLy8gcHJldHRpZXItaWdub3JlXG5leHBvcnRzLmRlZmF1bHQgPSBuZXcgVWludDE2QXJyYXkoWzUxMiwgOTcsIDEwMywgMTA4LCAxMTMsIDksIDIxLCAyNCwgMjcsIDYyMSwgMTUsIDAsIDAsIDE4LCAxMTIsIDU5LCAxNjQyMiwgMTExLCAxMTUsIDU5LCAxNjQyMywgMTE2LCA1OSwgMTY0NDYsIDExNiwgNTksIDE2NDQ0LCAxMTcsIDExMSwgMTE2LCA1OSwgMTY0MThdKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlY29kZS1kYXRhLXhtbC5qcy5tYXAiXX0= diff --git a/package-lock.json b/package-lock.json index 512d104f..70e4e208 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "fake-indexeddb": "^3.1.7", "html-validate": "^6.6.1", "jsdom": "^19.0.0", - "parse5": "^6.0.1", + "parse5": "^7.0.0", "stylelint": "^14.6.1", "stylelint-config-recommended": "^7.0.0", "web-ext": "^6.8.0" @@ -1627,6 +1627,12 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/cheerio/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "node_modules/chrome-launcher": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.0.tgz", @@ -5369,6 +5375,12 @@ } } }, + "node_modules/jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -6841,10 +6853,16 @@ } }, "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "dev": true, + "dependencies": { + "entities": "^4.3.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "6.0.1", @@ -6855,6 +6873,24 @@ "parse5": "^6.0.1" } }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parse5/node_modules/entities": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", + "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -11387,6 +11423,14 @@ "parse5": "^6.0.1", "parse5-htmlparser2-tree-adapter": "^6.0.1", "tslib": "^2.2.0" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } } }, "cheerio-select": { @@ -14336,6 +14380,14 @@ "whatwg-url": "^10.0.0", "ws": "^8.2.3", "xml-name-validator": "^4.0.0" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } } }, "json-buffer": { @@ -15519,10 +15571,21 @@ } }, "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "dev": true, + "requires": { + "entities": "^4.3.0" + }, + "dependencies": { + "entities": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", + "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==", + "dev": true + } + } }, "parse5-htmlparser2-tree-adapter": { "version": "6.0.1", @@ -15531,6 +15594,14 @@ "dev": true, "requires": { "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } } }, "parseurl": { diff --git a/package.json b/package.json index d1dede90..3e8950c4 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "fake-indexeddb": "^3.1.7", "html-validate": "^6.6.1", "jsdom": "^19.0.0", - "parse5": "^6.0.1", + "parse5": "^7.0.0", "stylelint": "^14.6.1", "stylelint-config-recommended": "^7.0.0", "web-ext": "^6.8.0" diff --git a/test/test-build-libs.js b/test/test-build-libs.js new file mode 100644 index 00000000..6305de04 --- /dev/null +++ b/test/test-build-libs.js @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2022 Yomichan Authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +const fs = require('fs'); +const assert = require('assert'); +const {getBuildTargets} = require('../dev/build-libs'); + +async function main() { + try { + for (const {path: path2, build} of getBuildTargets()) { + let expectedContent = await build(); + if (typeof expectedContent !== 'string') { + // Buffer + expectedContent = expectedContent.toString('utf8'); + } + const actualContent = fs.readFileSync(path2, {encoding: 'utf8'}); + assert.strictEqual(actualContent, expectedContent); + } + } catch (e) { + console.error(e); + process.exit(-1); + return; + } + process.exit(0); +} + +if (require.main === module) { main(); } |